Kenya-hosted · Africa-first · Built for developers

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"
  }'

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

Step 1 of 5

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.

Realtime

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