Create one lead. Safe to call once per row, forever.
POST/api/v1/leads
Creates a single lead and fires the lead.created webhook so an automation can text them within a minute. Built for a no-code trigger (a Google Sheets "New Spreadsheet Row" Zap, a website form, a Meta lead relay) that runs once per row.
The list is reused, never created per call. Resolution order: (1) list_id, after checking it belongs to your account (a foreign or unknown id is a 404, never a silent new list); (2) list_name, which finds or creates ONE list with that name and reuses it on every later call, matched case-insensitively; (3) neither, which finds or creates your single default list, "Inbound Leads (API)". Two rows arriving at the same instant resolve to the same list. Contrast POST /v1/leads/bulk, which creates a NEW list on every call by design and would leave you with one list per spreadsheet row.
A repeat phone in the same list is not an error. It returns 200 with the lead that is already there and already_existed: true, and it does NOT fire lead.created, so re-saving a spreadsheet row never re-texts the customer. Dedupe is list-scoped: the same phone in a different list is a new lead. Send an Idempotency-Key header to also make network retries safe.
consent_acknowledged: true is required, the same contract POST /v1/leads/bulk and POST /v1/contacts use. Scope: write_crm.
Request
Responses
- 200
- 201
- 400
- 401
- 403
- 404
- 429
This phone was already in the list. Nothing was created and lead.created did NOT fire.
Lead created. lead.created fired.
Missing or invalid parameters
Invalid or missing API key
API key lacks the required scope for this endpoint
No lead list with that list_id exists in this account.
Rate limit exceeded