Bulk contact action (cancel | reschedule | dial_now)
Applies one action to a set of contact ids. next_attempt_at
(RFC3339) is honoured only by reschedule. dial_now is seat-gated:
ids that could not be queued for lack of a free seat come back in
no_seat.
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
uuidRequest Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/broadcasts/497f6eca-6276-4993-bfeb-53cbbbba6f08/contacts/bulk" \ -H "Content-Type: application/json" \ -d '{ "action": "cancel", "contact_ids": [ "f4ae0292-6c1e-4caf-903f-b55ea2c1670a" ] }'{ "updated": 0, "no_seat": [ "145dfa53-fae7-4981-8a90-b62c89bced92" ]}{ "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" }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string" }}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.
Dry-run the composed prompt (zero cost) POST
Returns the FULL composed prompt (agent `base_prompt` + rendered template with the supplied variables) using the exact composer the dialer uses. No contact/call rows touched, no dial, no billing.