Skip to main content
POST
Create Lead in Campaign
This endpoint creates, it never updates. A contact that already has a lead in this campaign is refused with 400 LEAD_ALREADY_IN_CAMPAIGN, nothing written; use PATCH /campaigns/{campaignId}/leads/{leadId} instead. With deduplicate=true, a contact with a lead in another campaign is refused with 409 LEAD_ALREADY_IN_OTHER_CAMPAIGN; only this parameter drives that check, not the campaign’s “remove duplicates” setting.
The lead is always new, but the contact and the company it matches are updated with the fields you send; updateStrategy decides what they keep. overwrite (default): sent values replace stored ones, an empty value clears. overwriteIgnoreEmpty: same, empty values ignored. fillEmptyOnly: only empty fields are filled, identifiers, company link, owner and status kept, and the lead takes the values the contact kept. Kept values are listed in warnings (FIELDS_KEPT, params.fields, company fields prefixed with company).
Beyond the standard fields above, any additional key/value pair you send in the body is stored as a custom variable on the lead and can be used in your campaign with {{yourVariableName}}.In the example, companySize and customVariable1 are custom variables.Naming rules: only letters, digits, _, -, space and # are kept — any other character (e.g. . or $) is replaced by _. Values are stored as text.

Authorizations

Authorization
string
header
required

Basic authentication header of the form Basic <encoded-value>, where <encoded-value> is the base64-encoded string username:password.

Path Parameters

campaignId
string
required

The unique identifier of the campaign

Query Parameters

deduplicate
boolean

Refuse the lead with 409 LEAD_ALREADY_IN_OTHER_CAMPAIGN when the contact already has one in another campaign. Default: false. The campaign's own "remove duplicates" setting does not apply here.

linkedinEnrichment
boolean

Run the LinkedIn enrichment. Default: false

findEmail
boolean

Find verified email. Default: false

verifyEmail
boolean

Verify existing email (debounce). Default: false

findPhone
boolean

Find phone number. Default: false

updateStrategy
enum<string>
default:overwrite

What the matched contact and company keep (the lead is always created). overwrite (default): sent values replace stored ones, an empty string clears. overwriteIgnoreEmpty: empty values ignored. fillEmptyOnly: only empty fields filled, identifiers, links, owner and status kept. Other values: 400.

Available options:
overwrite,
overwriteIgnoreEmpty,
fillEmptyOnly

Body

application/json
email
string

Email of the lead

firstName
string

First name of the lead

lastName
string

Last name of the lead

companyName
string

Company name

jobTitle
string

Job title

linkedinUrl
string

LinkedIn profile URL

picture
string

Profile picture URL

phone
string

Phone number

companyDomain
string

Company domain

icebreaker
string

Personalized icebreaker message

timezone
string

Lead's timezone in IANA format (e.g., Europe/Paris, America/New_York)

contactOwner
string

Contact owner (user ID or user login email)

{key}
string

Response

Success

campaignId
string
campaignName
string
email
string<email>
firstName
string
lastName
string
companyName
string
jobTitle
string
companyDomain
string
_id
string
isPaused
boolean

Whether the lead is paused in the campaign

contactId
string

Associated contact ID

warnings
object[]

Non-blocking notices: the company part was skipped, or FIELDS_KEPT when the update strategy kept values you sent (params.fields names them, company fields prefixed with company).