Download the aggregate campaign report (CSV)
One-row CSV snapshot of the broadcast at request time. Columns:
broadcast_id, broadcast_name, state, queued, attempted, reached, completed, no_answer, busy, voicemail, failed, exhausted, canceled, total_duration_seconds, total_turns, ai_cost_minor, telco_cost_minor, total_cost_minor, voicemail_spend_minor, currency. Per-contact and
per-call exports live on the Calls API
(GET /v1/calls?broadcast_id=…).
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
uuidResponse Body
text/csv
application/json
application/json
curl -X GET "https://example.com/v1/broadcasts/497f6eca-6276-4993-bfeb-53cbbbba6f08/report.csv""string"{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ] }}{ "error": { "code": "validation.bad_request", "message": "string", "request_id": "string", "details": [ "string" ] }}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.
Get a number's WhatsApp calling trunk GET
Returns the WhatsApp Business Calling trunk for this number, including provisioning progress. Read-only — any workspace member can poll it without a writer role. Poll this after `POST` until `status` leaves `pending`.