Candidates
phoneis a mobile number with 10 digits (98765 43210) or with a country code (+91 98765 43210). It is never returned by the API.external_idis your id for the candidate. It comes back on every result.metadataholds up to 10 fields of your own, such as an application id. It needsexternal_idand comes back unchanged on every result and event.- A number that cannot be used does not fail the batch. It comes back in
rejectedwith a reason:invalid_phone,duplicate_in_requestoralready_in_campaign. - Up to 1,000 candidates per call, 20,000 per campaign, and 2,000 different people per key per day (TEST keys: 200), reset at midnight IST.
Campaign status
Endpoints
Create a campaign
POST /campaigns
Send your candidates (name + phone) for a mandate. Record contacts and verifies them. Returns campaign_id.
Scope: campaigns:write · Idempotency-Key: required
data.campaign.campaign_id for the next step.
Can also return idempotency errors (
IDEMPOTENCY_KEY_REQUIRED, IDEMPOTENCY_IN_PROGRESS, IDEMPOTENCY_KEY_REUSED) and the common errors. Full schema
Get a campaign
GET /campaigns/{campaign_id}
See whether it has gone out, is waiting for the job’s questions, is paused or stuck, and how many are contacted. candidate_list holds its first candidates (100 by default; candidates_limit up to 200, or 0 to leave it out) with their candidate_id, delivery and can_resend; has_more says there are more. For all of them, with verdicts and answers, call GET /campaigns/{campaign_id}/candidates.
Scope: campaigns:write or results:read
Can also return the common errors. Full schema
List campaigns
GET /campaigns
List your organisation’s campaigns; filter by mandate_id to see one job’s.
Scope: campaigns:write or results:read
Can also return the common errors. Full schema
Start a campaign
POST /campaigns/{campaign_id}/start
Start a campaign you created with start: manual. It starts once.
Scope: campaigns:write · Idempotency-Key: optional
Can also return idempotency errors (
IDEMPOTENCY_IN_PROGRESS, IDEMPOTENCY_KEY_REUSED) and the common errors. Full schema
Add candidates
POST /campaigns/{campaign_id}/candidates
Add more people (up to 1,000 a call). A number already in the campaign is skipped, so resending is safe.
Scope: campaigns:write · Idempotency-Key: required
Can also return idempotency errors (
IDEMPOTENCY_KEY_REQUIRED, IDEMPOTENCY_IN_PROGRESS, IDEMPOTENCY_KEY_REUSED) and the common errors. Full schema
Resend a candidate link
POST /campaigns/{campaign_id}/candidates/{candidate_id}/resend
Send one candidate’s link again over WhatsApp (and SMS) if they have not received or opened it. Get the candidate_id from GET /campaigns/{campaign_id}/candidates (look for can_resend: true). Only for a started campaign you created, and not while it is paused. A candidate who has completed or declined has nothing to resend. One send per candidate per minute.
Scope: campaigns:write · Idempotency-Key: optional
Can also return idempotency errors (
IDEMPOTENCY_IN_PROGRESS, IDEMPOTENCY_KEY_REUSED) and the common errors. Full schema
Pause a campaign
POST /campaigns/{campaign_id}/pause
Emergency brake: nobody new is contacted until you resume.
Scope: campaigns:write · Idempotency-Key: optional
Can also return idempotency errors (
IDEMPOTENCY_IN_PROGRESS, IDEMPOTENCY_KEY_REUSED) and the common errors. Full schema
Resume a campaign
POST /campaigns/{campaign_id}/resume
Continue a paused campaign: held-back people are contacted now.
Scope: campaigns:write · Idempotency-Key: optional
Can also return idempotency errors (
IDEMPOTENCY_IN_PROGRESS, IDEMPOTENCY_KEY_REUSED) and the common errors. Full schema
