Leads in campaigns
POST
/campaigns/{id}/leads

Adds leads from a leads array of { profileUrl, ... } objects (or { email, ... } when the workspace has the email channel, see LeadInput), or imports a whole lead list with listId. The workspace lead is upserted from the fields you pass and enrolled in one call — you don't need to create leads separately first. Caller-supplied fields win over the best-effort LinkedIn lookup. Leads already in the campaign are skipped. Max 1000 leads per request.

Every enrolled lead is also saved to the campaign's own list, created on the first enrollment and named "'s leads" (exposed as listId on the campaign). That list and the campaign stay in step: adding leads to it enrolls them, removing leads from it removes them from the campaign. Leads imported with listId keep their source list too. The response's listId is the campaign's own list for a leads array, or the source list for a listId import.

Authorization

bearerAuth
AuthorizationBearer <token>

An API key created under Settings → API & Webhooks.

In: header

Path Parameters

id*string

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/campaigns/string/leads" \  -H "Content-Type: application/json" \  -d '{    "leads": [      {        "profileUrl": "https://www.linkedin.com/in/jane-doe",        "firstName": "Jane",        "lastName": "Doe"      },      {        "profileUrl": "https://www.linkedin.com/in/john-roe",        "company": "Acme",        "customVariables": {          "plan": "enterprise"        }      }    ]  }'
{  "data": {    "inserted": 0,    "skipped": 0,    "listId": "string"  }}