VOICE BROADCASTS

A thousand calls. Zero robocalls.

Broadcasts for outbound. AI agents for inbound. A broadcast dials your contact list from your Sautikit number, and your AI agent holds a real two-way conversation with each person — personalized per contact, dialed inside your calling window, retried on no-answer, and reported call by call.

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.

Everything a campaign needs, in one create call.

No workflow builder, no CSV gymnastics in a UI — the whole campaign is a JSON body you can code-review, and the dashboard shows the same thing.

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.

Interruptible by design

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.

Test with one call. Then scale to the list.

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" },
  }),
});

This is not a robocall.

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

The same agents answer your inbound calls.

An agent isn’t a campaign asset — it’s your workspace’s voice. Point a broadcast at it for outbound and your Sautikit number at it for inbound, and the same prompt, tools, and guardrails handle both directions.

Meet the AI agents →

Built for the calls you already make.

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

Metered by the second, prepaid by you.

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 and spend only what you load — no invoices, no surprises.
KES 116/month numbersInstant activation, no setup fee. Claim a caller-ID and dial the same day.

One concurrent AI call is included free; move to 5, 8, or 10 concurrent seats as campaigns grow. Live in Kenya, with more African markets coming. Full details on pricing.

Or brief your AI assistant in one line.

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 →

Put your contact list on the phone.

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