Programmable voice
for Africa
Turn 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.
curl https://sauti-pbx.services.co.ke/api/calls/originate \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"to": "+254711111111",
"from": "+254709080010",
"url": "https://yourapp.com/handle-call"
}'import requests
r = requests.post(
"https://sauti-pbx.services.co.ke/api/calls/originate",
headers={"Authorization": "Bearer sk_live_..."},
json={
"to": "+254711111111",
"from": "+254709080010",
"url": "https://yourapp.com/handle-call",
},
)
print(r.json()) # {"sid": "call_...", "status": "initiated"}const res = await fetch(
"https://sauti-pbx.services.co.ke/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/handle-call",
}),
});
console.log(await res.json());See how a call works
New to telephony? No problem. Watch a call move between the caller, SautiPBX, and your app — one step at a time. Press play, or click through at your own pace.
Caller
Any phone
SautiPBX
The platform
Your app
Server & REST API
—
—
Everything you need to build on voice
Production-grade telephony as a clean API. Designed for the African market, built on proven infrastructure.
Inbound & outbound calls
Place and receive calls over the REST API. Webhook-driven: your server tells us how to handle each call.
Simple call-control verbs
Drive calls with plain XML — Say, Play, Dial, Record, Pause, Redirect. No SDK to learn, no state to manage.
Browser & mobile softphones
Give end-users a real phone in your app. Mint short-lived phone tokens on your server — no secret key in the browser.
Real-time event stream
Watch calls live over a WebSocket. Namespaced codes and stable schemas make integrations predictable.
Text-to-speech & recording
Speak text on a call with a single verb, and record calls to storage with signed download URLs.
Pay-as-you-go in KES
A KES wallet, no monthly fees. Calls billed per second, numbers per month. Live monitoring stops runaway spend.
Know what your calls are doing
Subscribe to the event stream and watch calls ring, answer, and complete in real time. Every event carries a stable code — the same code you see on the call record and in webhooks.
Explore events & codes// live frames on the /api/stream socket
{ "code": "CALL.0180", "event": "call.ringing", "sid": "call_..." }
{ "code": "CALL.0200", "event": "call.answered", "sid": "call_..." }
{ "code": "CALL.0300", "event": "call.completed",
"data": { "reasonCode": "END.0200" } }
Ready to build?
Create an account, top up your KES wallet, and place your first call in minutes.
Get started for free