Skip to main content
A campaign sends your candidates (name + mobile number) to a mandate. Record contacts them on WhatsApp, follows up by call and SMS, and verifies them.
This contacts real people and spends credits (1 per candidate when skill verification is on). The phone numbers in the samples are placeholders, so replace them with your own test numbers. A TEST key may only reach numbers Record listed for it (otherwise 403 FORBIDDEN). If the mandate is still preparing, the campaign waits and goes out by itself when it is ready.

Candidates

  • phone is a mobile number with 10 digits (98765 43210) or with a country code (+91 98765 43210). It is never returned by the API.
  • external_id is your id for the candidate. It comes back on every result.
  • metadata holds up to 10 fields of your own, such as an application id. It needs external_id and comes back unchanged on every result and event.
  • A number that cannot be used does not fail the batch. It comes back in rejected with a reason: invalid_phone, duplicate_in_request or already_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
This contacts real people.
Save 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
This contacts real people.
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
This contacts real people.
Can also return idempotency errors (IDEMPOTENCY_KEY_REQUIRED, IDEMPOTENCY_IN_PROGRESS, IDEMPOTENCY_KEY_REUSED) and the common errors. Full schema
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
This contacts real people.
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
This contacts real people.
Can also return idempotency errors (IDEMPOTENCY_IN_PROGRESS, IDEMPOTENCY_KEY_REUSED) and the common errors. Full schema