lemlist_lead
Lead lifecycle inside a campaign — read, edit, pause, qualify, remove.
oto_guide op=read slug="lemlist-playbook": build order, where each id comes from, and the doc↔API gaps.
A LEAD is a person's copy inside ONE campaign (its sending state, its
variables); the person themself is a contact (lemlist_contact).
Creating a lead is lemlist_create_lead; releasing one held for review
is lemlist_launch_lead.
Args by op:
get:lead_idoremail.list:campaign_id+ optionalstate(sent,replied,paused…) andlimit. ⚠️statedefaults to"all"HERE, which is NOT lemlist's own default: without it the API filters everything out and returns an empty list that reads as "no leads on this campaign". Pass a state only to narrow deliberately.update:campaign_id+lead_id+fields(firstName,lastName,companyName,jobTitle,preferredContactMethod).delete:campaign_id+lead_id/email— really removes it.unsubscribe: same arguments, but the lead STAYS on the campaign, marked unsubscribed. One lemlist route serves both, and its default is the soft one; here the two are named apart so neither is a surprise.pause:lead_id; WITHOUTcampaign_idit pauses the lead in EVERY campaign, not one.resume:lead_id— undoes a pause, so lemlist starts sending to that lead again (it does not skip a review; that islemlist_launch_lead).interested/not_interested:lead_idoremail; withcampaign_idit applies to that campaign, without it to all.vars_update:lead_id+variables.vars_delete:lead_id+variable_names(the values are erased).import_crm:campaign_id+crm+user_id+filter_id(fromlemlist_team(op="crm_filters")), optionalfilter_type,deduplicate.upload_audio:lead_id+step_id+audio— the audio of alinkedinVoiceNotestep.audiois a source dict:{"kind": "url", "url": …},{"kind": "drive", "file_id": …},{"kind": "gmail", "message_id": …, "filename": …},{"kind": "project_file", "project_id": …, "file_id": …}or a recording'ssourceas read ({"kind": "transit", "ref": …}). The server fetches it (≤ 20 MB) and forwards the bytes.
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": {
"op": "<op>"
},
"name": "lemlist_lead"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | ||
| crm | No | ||
| _org | No | Org (id) de CET APPEL. `oto_list_orgs()`. | |
| audio | No | ||
| No | |||
| limit | No | ||
| state | No | ||
| _group | No | Équipe (id) de CET APPEL, sous son org parente. | |
| fields | No | ||
| _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. | |
| lead_id | No | ||
| step_id | No | ||
| user_id | No | ||
| _project | No | Projet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`. | |
| _instance | No | Instance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`. | |
| filter_id | No | ||
| variables | No | ||
| campaign_id | No | ||
| deduplicate | No | ||
| filter_type | No | ||
| variable_names | No |