List leads
const url = 'https://app.whatsetter.com/api/v1/leads?status=qualified&channel=whatsapp&source=instagram&limit=25';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://app.whatsetter.com/api/v1/leads?status=qualified&channel=whatsapp&source=instagram&limit=25' \ --header 'Authorization: Bearer <token>'Leads of the workspace, most recently active first.
Like the dashboard, the listing leaves out the participants of
group-purpose campaigns (purpose: group in GET /campaigns) unless
you filter on that campaign_id explicitly. Requires scope
leads:read.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Filter by status.
Filter by campaign. Accepts the campaign’s campaign_id slug or its document id (both returned by GET /campaigns).
Exact lookup by phone (international format, e.g. +33612345678).
Exact lookup by the id you sent on POST /campaigns/{id}/leads. The supported way to resolve “which WhatSetter lead is my record #4471?”.
Only leads reached on this channel. whatsapp also returns leads created before the channel column existed, so it always means “everything that is not Instagram”.
Only leads active after this ISO-8601 date (on last_message_at).
Where the lead came from (see the source field). Exact match on the stored value — leads created before origins were recorded stay out of a filtered listing.
Only leads brought by this tracked WhatsApp link (Dashboard → Liens).
Opaque cursor from the previous page’s pagination.next_cursor.
Responses
Section titled “Responses”Page of leads
object
object
Digits with country code, no +
Where the lead came from. A platform value means the prospect reached WhatsApp through one of your tracked links (Dashboard → Liens) and the platform was read on the click (direct = through a link, no platform signature); list = campaign sender, api = POST /campaigns/{id}/leads, webhook = form or integration push, inbound = wrote first without a matching click, instagram with channel: instagram = Instagram automation. null on leads created before origins were recorded — derive from list_id, external_reference and channel for those.
How the origin was established: certain (a dedicated number, a Meta ad signal, or the click’s fingerprint in the first message), probable (the most recent click on this number’s links within 45 minutes), null when no click was involved.
Id of the tracked WhatsApp link that brought this lead, when one did.
The id you sent on POST /campaigns/{id}/leads. null for leads created from the dashboard (lists, CSV import, sales-page forms).
Where this conversation happens. Always set — leads that predate the channel column are reported as whatsapp.
Instagram handle, without the @. null on WhatsApp, where phone carries the identity. On Instagram phone is meaningless: id_lead holds an IGSID, not a number.
Id of the team member who owns the lead (GET /team/members); null = nobody, the AI handles it.
Where the person is commercially, derived exactly like the dashboard: booked when a meeting is on the calendar, else from the status (qualified, not_interested, stopped, cold, waiting), else conversation if they replied, else contacted.
The outcome, set by people (PATCH /leads/{id}); null when never set.
object
Example
{ "data": [ { "status": "qualified", "source": "instagram", "source_confidence": "certain", "channel": "whatsapp", "stage": "contacted", "deal_status": "open", "lost_reason": "price", "last_message_direction": "inbound" } ]}Missing, unknown or revoked API key
object
object
Examplegenerated
{ "error": { "code": "example", "message": "example" }}The key lacks the required scope
object
object
Examplegenerated
{ "error": { "code": "example", "message": "example" }}Invalid parameter or body (also an invalid or expired cursor)
object
object
Examplegenerated
{ "error": { "code": "example", "message": "example" }}
