Skip to content

Features

The whole voice stack, as an API

Everything you need to put phone calls inside your product — numbers, call control, softphones, recordings and live events — without running a telephony platform yourself.

Feature overview

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 reference

Simple call-control verbs

Drive calls with plain XML — Say, Play, Dial, Record, Pause, Redirect. No SDK to learn, no call state to manage yourself.

Verb reference

Browser & mobile softphones

Give end-users a real phone inside your app. Mint short-lived phone tokens on your server — no secret key in the browser.

Browser SDK

Real-time event stream

Watch calls live over a WebSocket. Namespaced event codes and stable schemas make integrations predictable, not guesswork.

Event codes

Text-to-speech & recording

Speak dynamic text on a call with a single verb, and record calls to storage with signed, expiring download URLs.

Recordings API

Pay-as-you-go in KES

A KES wallet and no monthly fees. Calls billed per second, numbers per month. Live balance monitoring stops runaway spend.

Talk to us about rates

Calls

Place and receive calls over HTTP

Start an outbound call with a single POST. Inbound calls to your numbers arrive as a webhook to your server. Both directions are the same mental model: an HTTP request in, a call-control document back.

  • Outbound origination with your own caller ID
  • Inbound routing straight to your webhook URL
  • Per-second billing from the moment the call is answered
Calls API reference
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" }'

Call control

Say, Play, Dial, Record — as plain XML

Your webhook returns a short XML document and the platform executes the verbs in order. There is no call state to track on your side and no SIP stack to operate: every decision is just an HTTP response.

  • Say for text-to-speech, Play for audio files
  • Dial to bridge to another number or an in-app phone
  • Record with signed, expiring download URLs
  • Redirect and Pause for multi-step flows
Verb reference
<!-- 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>

Real time

Live events and browser phones

Stream every call transition over a WebSocket, and put a real softphone inside your own web app with the browser SDK. Tokens are minted server-side and short-lived, so your secret key never touches the browser.

  • Namespaced event codes that stay stable across releases
  • A distinct reason code per cause — never a generic failure
  • WebRTC softphone via @sautipbx/voice-sdk
  • Signed webhooks if you would rather we push to you
Browser SDK guide
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);
});

See it working in minutes

The quickstart takes you from an empty account to a real answered call.