VOICE BROADCASTS

AI voice campaigns, controlled by API.

A broadcast dials your contact list from a Sautikit number while a published AI agent handles each two-way conversation. Set per-contact variables, calling windows, and retries in the request; retrieve reports after calls complete.

create-broadcast.js
const res = await fetch("https://api.sautikit.com/v1/broadcasts", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SAUTIKIT_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    name: "July renewal reminders",
    agent_id: "9d2b1f53-8c0e-4f1d-9a6b-5d3a8c47e9f0",
    prompt_template:
      "You are calling {{name}} about a policy renewing on " +
      "{{renewal_date}}. Confirm renewal and note any questions.",
    start_phrase: "Hi {{name}}, this is Amina from Baraka Insurance.",
    schedule_days: [1, 2, 3, 4, 5], // Mon–Fri
    daily_start_minute: 540, // 09:00
    daily_end_minute: 1020, // 17:00
    timezone: "Africa/Nairobi",
    max_attempts: 3,
    backoff_minutes: 45,
    retry_on: ["no_answer", "busy", "voicemail"],
  }),
});

const broadcast = await res.json(); // state: "draft" — nothing dials yet

How a broadcast runs.

Four calls take a campaign from draft to a downloadable report. The window, the retries, and the voicemail handling run themselves in between.

  1. POST /v1/broadcastsCreate the campaign: a published agent, a prompt template with {{variables}}, a start phrase, the calling window, and the retry policy. It's a draft — nothing dials yet.
  2. POST /v1/broadcasts/{id}/contactsAdd contacts as JSON, or upload a CSV to /contacts/bulk. Each row is a phone number plus the variable values that personalize its call — a bad row is rejected individually with the reason, never the whole batch.
  3. POST /v1/broadcasts/{id}/startStart it, then walk away. Dialing runs only inside your window, misses re-queue per your retry policy, and /pause and /resume are one call each if plans change.
  4. GET /v1/broadcasts/{id}/report.csvDownload the report: one row per call with its outcome — and every result is backed by the call's own recording and per-turn transcript.

Every broadcast endpoint — including /duplicate for re-running a campaign on a new list — is documented in the API reference.

Create and control campaigns by API

Create the campaign, add contacts, start or pause it, and download the report with documented endpoints.

Template variables

Write {{name}}, {{amount}}, {{due_date}} once. Required variables are derived from the template and every contact row carries its own values — each call opens knowing who it's talking to and why.

Start phrase

Script the exact opening line the agent speaks the moment the callee answers — personalized with the same variables, so the first second sounds like a person with a reason to call.

Calling windows

Pick the days of the week and a daily start/end in your timezone. Dialing stops at the edge of the window and picks up where it left off on the next allowed day.

Retry policy

Choose which outcomes re-queue — no_answer, busy, failed, voicemail — plus max attempts and the backoff between them. Missed contacts come back around without you touching anything.

Voicemail detection

When a machine answers, the attempt is marked voicemail and re-queued for a later retry. Your agent holds conversations with people, not mailboxes.

Barge-in support

Audio streams both ways, and the callee can talk over the agent mid-sentence. It stops, listens, and answers — the difference between a conversation and a recording.

Tools during the call

The agent calls your own HMAC-signed HTTP tools mid-conversation — confirm a payment, update the CRM, book the slot — and speaks the result back to the callee.

Recordings + transcripts

Every call is recorded and transcribed turn by turn. Pull any conversation with GET /v1/calls/{id}?transcript=1 and read exactly what was said.

Pause, resume, duplicate

Pause a live campaign and resume it without losing state. Duplicate last month's broadcast, point it at a fresh contact list, and start.

Send one test call before a campaign.

POST /v1/agents/{id}/send places a single agent call with the same prompt template and variables a broadcast uses. Hear the exact conversation your contacts will get, tweak the template, then hand it to a broadcast and a contact list.

one-test-call.js
await fetch(`https://api.sautikit.com/v1/agents/${agentId}/send`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SAUTIKIT_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    to: "+254712345678",
    prompt_template:
      "You are calling {{name}} to confirm Tuesday's appointment.",
    variables: { name: "Alice" },
  }),
});

Broadcast calls are live conversations.

A robocall plays a recording at everyone and calls that reach. A broadcast call is a live conversation that ends in a result.

A robocall blast

  • Plays one recording at every number
  • Ignores questions and talks over people
  • Wastes its one shot on voicemail
  • Reports a “delivered” count

A Sautikit broadcast

  • Holds a live two-way conversation, per person
  • Stops when interrupted, answers, and continues
  • Detects voicemail and retries the human later
  • Reports transcript-backed outcomes, call by call

Configure the agent before you launch.

Choose a published agent with the prompt, tools, and handover rules your campaign needs.

Configure an AI agent →

Campaign use cases.

If a team reads the same script down a list every month, a broadcast does it with a template and an agent — and brings back what each person actually said.

  • Payment & renewal reminders
  • Promise-to-pay follow-ups
  • Appointment reminders
  • School-fees reminders
  • Delivery & dispatch notifications
  • Seasonal greetings
  • Surveys & lead qualification

Billing and concurrency.

Per-second call billingStandard call rates metered per second — a 40-second conversation costs 40 seconds.
KES 4.00/min AI rateThe agent’s time on the call, also metered per second, on top of the call rate.
Prepaid walletTop up with M-Pesa. New calls are rejected when your wallet has insufficient credit.
KES 100/month numbersBefore VAT (KES 116 incl. VAT). Instant activation, no setup fee.

The free tier includes one unit of AI call concurrency; move to 5, 8, or 10 concurrent seats as campaigns grow. Live in Kenya, with more African markets coming. Full details on pricing.

Configure a broadcast through MCP.

Connect claude.ai, Claude Code, or Cursor to the hosted Sautikit MCP server and “Call our 200 July appointments and remind them” becomes a complete instruction — your assistant builds the agent, creates the campaign, loads the contacts, and starts dialing only after you confirm.

Explore the MCP server →

Start a broadcast.

Claim a number, publish an agent, and start your first broadcast today — from the dashboard, the API, or your AI assistant.