Add contacts
Push one or up to 500 people into a job.
POST
/api/v2/jobs/{jobId}/contactskey or sessionThe job must allow manual contacts (a toggle on the job, on by default). Job status is not checked here, but only running jobs actually dial.
Body
One contact, or a contacts array. Both work.
{ "contactPhone": "+358401234567", "contactName": "Ada Lovelace" }{
"contacts": [
{ "contactPhone": "+358401234567", "contactName": "Ada" },
{ "contactEmail": "grace@example.com", "contactName": "Grace", "contactMetadata": { "plan": "pro" } }
]
}contactPhonestringE.164. Required unless
contactEmail is set.contactEmailstringRequired unless
contactPhone is set.contactNamestringcontactMetadataobjectAnything. The worker sees it during the conversation. Put order ids, CRM links, context here.
sourcestringFree text label.
trigger, manual, import are the conventional ones.default manualMax 500 per request. Retry attempts per contact come from the job's outbound strategy, not from you.
Response
201 all added, 207 some failed, 400 none added. Same body in every case:
{
"data": {
"jobId": "…",
"totalRequested": 2,
"successful": 1,
"failed": 1,
"results": [
{ "success": true, "id": "9f3c1a20-…" },
{ "success": false, "error": "Invalid phone number format (E.164 required, e.g. +14155552671)" }
]
},
"meta": { "timestamp": "…" }
}results is positional. Match by index.
Gotchas
- Not idempotent. Post the same phone twice, get two contacts, two calls. Dedupe on your side.
- 403 means the job has manual contacts switched off.
- 404 means wrong id or not your org.
- Needs
job:update. Viewers can't.
