Add contacts (JSON or CSV)
Send application/json ({"contacts": [...]}) or text/csv. A CSV needs a
header row with a phone column (phone, phone_number, msisdn or
number); external_ref, callback_url, timezone and priority are
recognised and every other column becomes a custom field passed to your
callback. At most 10,000 rows and 16 MB per request.
Every row ends up accepted, suppressed (stored, never dialed) or rejected with
a reason; one bad row never fails the request. rejected[].index is the
0-based row number in your upload (CSV: data rows, header excluded). Numbers
are normalised to E.164; duplicates inside the request or already in the
campaign are rejected as duplicate.
Supports Idempotency-Key: the same key and body replays the original result
without inserting again (X-Idempotency-Replayed: true); the same key with a
different body is 409.
Authorization
bearerAuth Long-lived ES256 JWT minted from the dashboard (https://app.sautikit.com/developers/api-keys). Signed by the
platform keyring. Carries workspace_id and scopes claims;
revoked via the platform deny-list.
In: header
Path Parameters
uuidHeader Parameters
Client-supplied key for safe retries.
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/dialer/campaigns/497f6eca-6276-4993-bfeb-53cbbbba6f08/contacts" \ -H "Content-Type: application/json" \ -d '{ "contacts": [ { "phone": "+254712345678", "external_ref": "inv-1001", "fields": { "name": "Alice", "balance": "1200" }, "timezone": "Africa/Nairobi", "priority": 5 }, { "phone": "0700000001", "callback_url": "https://example.com/dialer/vip" } ] }'{ "total": 0, "accepted": 0, "suppressed": 0, "duplicates": 0, "rejected": [ { "index": 0, "phone": "string", "code": "invalid_phone", "message": "string" } ]}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ], "resolution": "string", "reason": "invalid_characters", "suggested_e164": "+254727524723" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ], "resolution": "string", "reason": "invalid_characters", "suggested_e164": "+254727524723" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ], "resolution": "string", "reason": "invalid_characters", "suggested_e164": "+254727524723" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ], "resolution": "string", "reason": "invalid_characters", "suggested_e164": "+254727524723" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ], "resolution": "string", "reason": "invalid_characters", "suggested_e164": "+254727524723" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ], "resolution": "string", "reason": "invalid_characters", "suggested_e164": "+254727524723" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ], "resolution": "string", "reason": "invalid_characters", "suggested_e164": "+254727524723" }}