Use a matching 0.8.0 API host, check workspace capabilities, and handle
503 feature_unavailable as not enabled. This LinkedIn URL endpoint does not accept files; use the separate People CSV/XLSX import workflow for contact files.Save template settings
Templates are workspace-scoped. Usetemplates:read to list or read them and templates:write to create or update them. The API exposes saved regular and smart template fields. It does not run prompts, generate personalized content, approve content, or attach a template to a campaign.
Create a template with the fields you need:
/templates. Read a full saved template with GET /templates/{template_id}. The response includes an opaque revision that protects edits from overwriting newer changes.
To update, copy revision from a fresh GET into expected_revision and send only the changed fields:
409 stale_revision, read the template again and reconcile your edit before submitting a new logical update. For a timeout or uncertain response, follow idempotency and recovery. Do not treat a saved prompt or body as generated or approved copy.
Queue a bounded LinkedIn URL import
The import endpoint accepts 1 to 100 profile objects per request. Eachlinkedin_url must be an HTTPS linkedin.com/in/... profile URL. Optional first_name, last_name, and company values provide row context. File uploads, CSV imports, provider search, and campaign targeting are not part of this endpoint.
Before submitting, read the campaign configuration and use its latest revision as expected_revision. Reading the configuration requires campaigns:read; the import write requires campaigns:import. The campaign must be an inactive, manual-source LinkedIn draft with autopilot disabled, no execution history, and the sender selected in its configuration. The sender must be active, authorized for the current actor, and included in the workspace plan. Agency access also requires agency:read and current workspace membership.
202 with an opaque operation ID. The request queues work; it does not resolve profiles inline. Provider lookups can consume the workspace’s LinkedIn lookup quota. Keep each request within the 100-profile bound and account for that quota before submitting.
The HTTP request-body limit is 256 KiB, but the serialized durable command is limited to 64 KiB. Keep profile fields concise and split a larger list into separate, intentionally keyed imports; each request still accepts at most 100 profiles. Do not split or resubmit an import when its outcome is unknown.
Poll operation and row results
Read the operation with GET/operations/{operation_id}. It reports a status and aggregate result.counts; result.rows_path points to the paginated row endpoint. Operation reads and row reads require operations:read plus campaigns:read.
rows_path and pass next_cursor unchanged to read later pages:
queued, running, awaiting_user_action, succeeded, partially_succeeded, failed, needs_reconciliation, and cancelled. A needs_reconciliation result or an uncertain response means the outcome needs review. Read the operation and its rows. If the POST response was lost and you do not have its operation ID, inspect the workspace operation list. Never automatically submit a second import or create a new idempotency key to force another attempt.
You can cancel an operation only while it is queued or awaiting_user_action and before an external effect starts. Cancellation requires operations:write, campaigns:read, and the original campaigns:import grant. If cancellation returns 409 operation_not_cancellable, inspect operation and row results instead of retrying the import.

