List a broadcast's contacts
Cursor-paginated with filters. status accepts roster vocabulary
(scheduled | active | completed | missed | discarded) or a raw
contact status; q is a phone substring; from/to are inclusive
created_at bounds (RFC3339 or YYYY-MM-DD).
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
uuidQuery Parameters
1 <= valueResponse Body
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/broadcasts/497f6eca-6276-4993-bfeb-53cbbbba6f08/contacts"{ "data": [ { "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "phone": "string", "variables": { "property1": "string", "property2": "string" }, "status": "queued", "last_call_result": "string", "latest_call_id": "74a17bb1-799d-4447-868f-6bc4bb991ab8", "attempts": 0, "next_attempt_at": "2019-08-24T14:15:22Z", "created_at": "2019-08-24T14:15:22Z", "updated_at": "2019-08-24T14:15:22Z" } ], "next_cursor": "string", "total_count": 0}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string" }}Duplicate a broadcast (config + contacts) POST
Creates a NEW draft copying the source's configuration and contact list. The source is never mutated; the copy is not auto-started.
Append contacts (batch, row-level results) POST
Batch append with per-row results — one bad row never fails the batch. Phones must be strict E.164 (leading '+', no spaces); rows missing the template's `required_variables` are rejected with `missing_variables` + the missing names. Supports `Idempotency-Key`: replaying the same key + body returns the original result without re-inserting; same key + different body is 409.