AI VOICE AGENTS

Hire an AI receptionist to answer calls.

Sautikit AI agent is your always-on receptionist that can handle inbound calls. It streams audio in real time, supports barge-in, and can hand a caller to your team with a briefing.

KES 4.00/min only
PUT /v1/numbers/{id}/routing
{
  "inbound_agent": {
    "enabled": true,
    "agent_id": "agt_7f3k2m",
    "mode": "after_hours",
    "schedule": {
      "timezone": "Africa/Nairobi",
      "hours": [
        { "days": [1, 2, 3, 4, 5], "start": "08:00", "end": "17:30" }
      ]
    },
    "handover_callback_url": "https://wema.example/handover"
  }
}

Create, publish, and route an agent.

An agent is a name, a base prompt, and a SautiKit model (GET /v1/models) — running on realtime voice engines, with the accent and speaking style matching your description.

  1. Create and publish the agentA POST /v1/agents. Agents are drafts until you publish — publishing freezes an immutable revision, and later edits create a new draft while the last published revision keeps answering calls. No mid-call surprises.
  2. Bind your numberA PUT /v1/numbers/{id}/routing points the number at a published agent. mode: "always" hands it every call; "after_hours" lets your team answer inside the schedule while the agent covers nights and weekends.
  3. It answers — and knows when to stopRealtime streaming audio, barge-in when callers interrupt, and tools against your own systems. When a call needs a human, the agent hands over with a briefing; if no AI seat is free, the call falls through to your normal routing.
const res = await fetch("https://api.sautikit.com/v1/agents", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.SAUTIKIT_API_KEY}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "Reception",
    base_prompt:
      "You answer for Wema Dental. Book appointments, answer " +
      "opening-hours questions, and hand over to a human for " +
      "anything medical.",
    model: "sautikit-flash",
    max_call_minutes: 10
  })
});
const agent = await res.json();

// Only published agents answer calls — freeze the draft as revision 1.
await fetch(`https://api.sautikit.com/v1/agents/${agent.id}/publish`, {
  method: "POST",
  headers: { "Authorization": `Bearer ${process.env.SAUTIKIT_API_KEY}` }
});

Prefer clicking to curling? Everything here — create, publish, bind — is also in the dashboard at app.sautikit.com. Full request and response shapes live in the API reference.

Agent call controls.

HTTP tools, transfers, recordings, transcripts, and routing fallback are configured per agent.

HTTP tools

Give the agent HTTP tools — order lookup, booking, CRM. JSON-Schema parameters, requests signed with an HMAC X-Sautikit-Signature header, a per-agent signing secret, and encrypted stored headers.

Handover to a human

The built-in handover tool sends your team a reason and a summary of the call so far — then your voice actions decide who picks up.

Specialist transfer

Link agents to specialists — sales to support — and the call moves between them in-session, no re-dial. Capped at 5 transfers per call, and specialists can hand back.

Per-turn transcripts

Every agent call is fully transcribed: roles, timestamps, interruptions, tool calls. GET /v1/calls/{id}?transcript=1.

Recorded by default

Every agent call is recorded. Pull the audio any time with GET /v1/calls/{id}/recording.

After-hours mode

Your team answers inside the schedule; the agent takes everything outside it. Timezone-aware, with per-day hours — or set mode: "always" and hand it the whole day.

Graceful fallback

No AI seat free, or the agent unpublished? The call falls through to your normal routing — voice webhook or WebRTC client. Callers never hear an error.

A hard cap on every call

max_call_minutescaps every call — 15 minutes by default. An agent can’t get stuck talking on your wallet.

A warm handover.

When the agent decides a call needs a person, it calls handover with a reason and a summary of the conversation so far. Sautikit POSTs a CallHandover webhook to your handover_callback_url — alongside the caller, your number, and the call direction:

CallHandover.json
{
  "handover": {
    "agent_id": "agt_7f3k2m",
    "agent_name": "Reception",
    "reason": "Caller wants to reschedule and has a billing question",
    "summary": "Amina, a returning patient, wants to move Thursday's 3pm crown fitting to next week and asked about her last invoice."
  }
}

You respond with ordinary Sautikit voice actions — dial your team, play a message and collect digits, enqueue. The caller stays on the line; nobody starts from “how can I help you?”

your-response.json
{
  "actions": [
    { "say": { "text": "Let me get someone from the front desk. One moment." } },
    { "dial": { "to": "+254733000111" } }
  ]
}

Works for outbound calls too.

Your agent can also place campaign calls with its prompt, tools, and handover rules intact. Explore broadcasts →

Billing and concurrency.

Our cheapest AI agent costs KES 4.00 per minute, metered per second. No subscription required to get started.

KES 4.00per AI minute
Pay for what you useNo hidden charges.
KES 100/mobefore VAT. No setup fee.

The free tier supports one concurrent AI call. Call and AI usage remain billable at the rates above; higher-concurrency tiers are available as call volume grows.

Configure an agent through MCP.

Over the hosted Sautikit MCP server, create_agent, publish_agent, and update_number_routing run straight from your AI assistant or IDE — describe the agent you want and approve the result. Connect over MCP →

Route a number to an agent.

Sign up, claim a number — it activates instantly — and connect an agent. Your next missed call doesn’t have to be one.