Inbound & outbound calls
Place and receive calls over the REST API. Webhook-driven: your server tells us how to handle each call, as it happens.
API referenceTurn phone calls into something you control with code. Acquire numbers, place calls, and build browser phones over one clean REST API — billed per second in KES.
Self-serve signup · Pay as you go · No monthly platform fee
curl https://api.sautipbx.com/api/calls/originate \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{ "to": "+254711111111",
"from": "+254709080010",
"url": "https://yourapp.com/voice" }'import requests
res = requests.post(
"https://api.sautipbx.com/api/calls/originate",
headers={"Authorization": "Bearer sk_live_..."},
json={
"to": "+254711111111",
"from": "+254709080010",
"url": "https://yourapp.com/voice",
},
)
print(res.json()["call_id"])const res = await fetch(
"https://api.sautipbx.com/api/calls/originate",
{
method: "POST",
headers: {
Authorization: "Bearer sk_live_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
to: "+254711111111",
from: "+254709080010",
url: "https://yourapp.com/voice",
}),
},
);
const { call_id } = await res.json();One POST places a real phone call. Your webhook decides what happens next.
No sales call and no onboarding meeting. Everything below is self-serve, from the dashboard and the API.
Create an account and generate a secret key from the dashboard. Top up your KES wallet when you are ready to go live.
AuthenticationSearch available Kenyan numbers and acquire one over the API. It is billed monthly and routes straight to your webhook.
Numbers APIWhen a call arrives we POST to your URL. Reply with call-control XML and the call does exactly what you told it to.
Webhooks guideProduction-grade telephony as a clean API. Designed for the African market, built on proven infrastructure.
Place and receive calls over the REST API. Webhook-driven: your server tells us how to handle each call, as it happens.
API referenceDrive calls with plain XML — Say, Play, Dial, Record, Pause, Redirect. No SDK to learn, no call state to manage yourself.
Verb referenceGive end-users a real phone inside your app. Mint short-lived phone tokens on your server — no secret key in the browser.
Browser SDKWatch calls live over a WebSocket. Namespaced event codes and stable schemas make integrations predictable, not guesswork.
Event codesSpeak dynamic text on a call with a single verb, and record calls to storage with signed, expiring download URLs.
Recordings APIA KES wallet and no monthly fees. Calls billed per second, numbers per month. Live balance monitoring stops runaway spend.
Talk to us about ratesWhen a call reaches your number we POST to your webhook. You reply with call-control verbs and the platform executes them in order — speak text, play audio, gather digits, record, or bridge to another leg.
<!-- Your server's reply to our webhook -->
<Response>
<Say voice="female">Welcome to Acme.</Say>
<Play>https://cdn.acme.com/menu.mp3</Play>
<Record maxLength="30" />
</Response><Response>
<Say>Connecting you now.</Say>
<Dial timeout="25">+254722000000</Dial>
</Response>Subscribe to a WebSocket and watch every call transition live — ringing, answered, completed — each carrying a namespaced reason code that stays stable across releases. The same events power the dashboard you see.
const ws = new WebSocket(
"wss://api.sautipbx.com/api/stream?token=..."
);
ws.addEventListener("message", (e) => {
const ev = JSON.parse(e.data);
// call.ringing, call.answered, call.completed …
console.log(ev.type, ev.call_id, ev.reason_code);
});import { Phone } from "@sautipbx/voice-sdk";
// Your server mints a short-lived token, so the
// secret key never reaches the browser.
const phone = new Phone({ token });
await phone.register();
await phone.call("+254711111111");Global voice APIs treat Kenya as an edge case. We start here.
SautiPBX is a programmable voice platform for Africa. It gives developers a REST API to acquire phone numbers, place and receive calls, control call flow with simple XML verbs, add browser-based softphones, and stream live call events — hosted in Kenya and billed per second in Kenyan shillings.
SautiPBX is built specifically for the Kenyan market: infrastructure hosted in Kenya for lower latency on local calls, a direct carrier interconnect, wallet billing in Kenyan shillings with no monthly platform fee, and per-second call billing rather than per-minute rounding.
Calls are billed per second against a prepaid KES wallet, and phone numbers are billed monthly. There is no monthly platform fee and no minimum commitment. Live balance monitoring ends calls before your wallet can go negative, so spend cannot run away.
No. You call a REST endpoint to start a call, and your server replies to our webhook with a short XML document using verbs like Say, Play, Dial and Record. SIP, media handling and carrier interconnects are handled by the platform.
Yes. The @sautipbx/voice-sdk browser SDK turns a web page into a working softphone over WebRTC. Your server mints a short-lived phone token, so your secret API key never reaches the browser.
SautiPBX currently serves Kenya with local Kenyan numbers and a direct carrier interconnect, and can place outbound calls internationally. Contact us about coverage for a specific market.
Create an account, top up your KES wallet, and place your first call in minutes.