AI VOICE AGENTS
Your number, answered by AI.
Create an agent, bind it to your Sautikit number, and every inbound call gets answered — around the clock, or only after hours. It speaks in real time, callers can interrupt it mid-sentence, it hands over to your team when it matters — with a briefing — and the same agent runs your outbound campaigns through broadcasts.
{
"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"
}
}Two requests. Then it answers.
An agent is a name, a base prompt, and a model from the public catalog (GET /v1/models) — running on realtime voice engines, with the accent and speaking style controlled from the prompt settings.
Create and publish the agentOne POST to/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.Bind your numberOne PUT to/v1/numbers/{id}/routingpoints 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.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.
Built for calls that matter.
Not a demo that reads a script — an agent wired into your systems, with an exit to your team and a paper trail on every call.
Tools that hit your systems
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.
The AI briefs your team before the human picks up.
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:
{
"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?”
{
"actions": [
{ "say": { "text": "Let me get someone from the front desk. One moment." } },
{ "dial": { "to": "+254733000111" } }
]
}Broadcasts for outbound. AI agents for inbound.
The same published agent that answers your number can dial out at campaign scale — appointment reminders, payment follow-ups, surveys. Load the contacts, launch the broadcast, read the funnel. Explore broadcasts →
Priced like the rest of Sautikit.
AI adds KES 4.00 per minute on top of standard call rates, metered per second, from the same prepaid wallet as everything else. No subscription required to get started.
The free tier includes 1 concurrent AI call. Higher-concurrency tiers are available as call volume grows.
Your AI assistant can configure your AI receptionist.
Over the hosted Sautikit MCP server, create_agent, publish_agent, and update_number_routing run straight from claude.ai or your editor — describe the receptionist you want and approve the result. Connect over MCP →
Put an agent on a number today.
Sign up, claim a number — it activates instantly — and point it at an agent. Your next missed call doesn’t have to be one.