API Reference
Dialer

Add contacts (JSON or CSV)

POST
/v1/dialer/campaigns/{id}/contacts

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
AuthorizationBearer <token>

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

id*string
Formatuuid

Header Parameters

Idempotency-Key?string

Client-supplied key for safe retries.

Request Body

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"  }}