Dry-run the composed prompt (zero cost)
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.
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
curl -X POST "https://example.com/v1/broadcasts/497f6eca-6276-4993-bfeb-53cbbbba6f08/render" \ -H "Content-Type: application/json" \ -d '{ "variables": { "name": "Alice", "date": "Tuesday 10am" } }'{ "rendered_prompt": "string", "warnings": [ "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" }}Bulk contact action (cancel | reschedule | dial_now) POST
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`.
Download the aggregate campaign report (CSV) GET
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=…`).