lemlist_create_lead
Create a lead in a campaign.
Several leads: lemlist_push_rows reads them from a datastore table instead.
All lead fields are optional (lemlist accepts phone/LinkedIn-only
leads), but you'll usually pass at least email or linkedin_url.
custom_variables merges extra key-value pairs into the lead, used for
campaign personalization (e.g. {{variableName}} in a template). Each
value goes as text (a number or boolean written out, a list joined); an
object or null is refused (lemlist_custom_variable_value), and so is a
key that is a lead field such as email or firstName
(lemlist_custom_variable_collision) — pass it through its argument.
Enrichment flags (all default False, each may cost lemlist credits):
deduplicate skips the insert if the email already exists in another
campaign, linkedin_enrichment runs LinkedIn enrichment,
find_email/verify_email find or verify the email, find_phone
finds a phone number.
campaign_id is lemlist's campaign id as it returns it, WITH its cam_
prefix (cam_A1B2C3…) — an id without it is refused before any call.
Returns the created lead, including _id — pass it to
lemlist_launch_lead/lemlist_add_lead_variables. A response without a
lead _id is a named refusal (lemlist_lead_not_created), never a
success. review_state is always "unknown": lemlist's answer does not
say whether the lead is held for review or already in sequence (its
isPaused does not tell them apart, so it is removed). To know if it
will send, read lemlist_campaign(op="reports"): reviewedCount or
inSequenceLeadCount rising with the add means it goes out; only
totalCount rising means it is held for review until
lemlist_launch_lead.
A 404 « Campaign not found » is a named refusal
(lemlist_campaign_not_found): the campaign is not reachable by the key
in use for leads, even if its reports are.
A lead lemlist refuses as a DUPLICATE is not an error: the call returns
{created: false, reason, message, campaign_id, lead} with reason
already_in_other_campaign or already_in_campaign — nothing was
created; count the contact as already taken and move on.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"campaign_id": "<campaign_id>"
},
"name": "lemlist_create_lead"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| _org | No | Org (id) de CET APPEL. `oto_list_orgs()`. | |
| No | |||
| phone | No | ||
| _group | No | Équipe (id) de CET APPEL, sous son org parente. | |
| _run_id | No | OBLIGATOIRE à chaque appel dès `run_start` ou `data_claim_next` : sans lui, l'écriture sur une ligne réservée est refusée. Hérité seulement si le serveur tient un run actif — n'y compte pas. | |
| _project | No | Projet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`. | |
| timezone | No | ||
| _instance | No | Instance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`. | |
| job_title | No | ||
| last_name | No | ||
| find_email | No | ||
| find_phone | No | ||
| first_name | No | ||
| icebreaker | No | ||
| campaign_id | Yes | ||
| deduplicate | No | ||
| company_name | No | ||
| linkedin_url | No | ||
| verify_email | No | ||
| contact_owner | No | ||
| company_domain | No | ||
| custom_variables | No | ||
| linkedin_enrichment | No |