Call Center Systems — Africa
How to Build an IVR System With a Voice API in Kenya (2026)
A developer guide to building an IVR in Kenya with a programmable voice API - menus, DTMF routing, code samples and per-second KES pricing.
An IVR (interactive voice response) is the automated menu a caller hears when they dial your business: press 1 for sales, 2 for support. To build one with a voice API, you provision a phone number, point it at a webhook, and return a small JSON voice-actions document that tells the carrier what to say and which keypress routes where. No PBX, no SIM cards, no on-site hardware. A working single-level menu is roughly 40 lines of code and can go live in an afternoon.
Most how-to-build-an-IVR guides that rank in Kenya are written by global vendors (Twilio, Infobip, SignalWire, Aircall) and priced in dollars. This guide is Kenya-first: local numbers, per-second KES rates, and the exact request bodies. If you would rather not write code, skip to the managed option at the end.
An IVR sits between the public phone network and your application. Its structure is a tree: a greeting (text-to-speech or recorded audio), one or more menus that gather a keypress (DTMF) or spoken input, routing rules that map each input to an action (play audio, forward to an agent, drop into a queue, record, or jump to a submenu), and a fallback for no input or a timeout. With a programmable voice API you never touch telecom hardware. See our programmable voice explainer.
You do not need a softphone, a PBX, or an office. A laptop and a cloud function are enough to test.
The examples use SautiKit, a Kenya-first programmable voice API (local numbers via API, per-second billing in KES). The same webhook-and-instructions pattern works on any provider; only the field names change. Verify every endpoint against the provider's live docs before shipping.
Buy a local voice number and set its callback URL to your server. When someone calls, the provider POSTs a call event to that URL.
SautiKit exposes calls at POST /v1/calls on base URL https://api.sautikit.com (bearer auth). A minimal outbound call:
curl -X POST https://api.sautikit.com/v1/calls \
-H 'Authorization: Bearer $SAUTIKIT_API_KEY' \
-H 'Content-Type: application/json' \
-d '{ "from": "+254200000001", "to": ["+254712345678"], "webhook_url": "https://your-app.example.com/webhook" }'For inbound IVR you do not place a call: the caller dials your number and the provider hits your webhook_url.
Your webhook replies with a voice-actions document. SautiKit supports nine verbs: say, play, getDigits, dial, conference, record, redirect, reject and hangup. A single-level member-services menu (schema-validated before publishing):
{ "actions": [
{ "say": { "text": "Welcome to Umoja SACCO. For account balance, press 1. To repay a loan, press 2. To speak to an agent, press 0.", "voice": "alice" } },
{ "getDigits": { "numDigits": 1, "timeout": 7, "finishOnKey": "#" } },
{ "redirect": { "url": "https://your-app.example.com/voice/menu", "method": "POST" } }
] }A detail that trips up beginners: the collected digits are dispatched to your number's callback, not to a field inside getDigits. So after getDigits you redirect to a menu handler, read the digit, and return the next actions:
app.post('/voice/menu', (req, res) => {
const digit = req.body.digits;
if (digit === '1') return res.json({ actions: [{ say: { text: 'Your balance is 12,400 shillings.' } }, { hangup: {} }] });
if (digit === '2') return res.json({ actions: [{ say: { text: 'Connecting you to loans.' } }, { dial: { to: ['+254711000111'] } }] });
if (digit === '0') return res.json({ actions: [{ dial: { to: ['+254711000222'] } }] });
return res.json({ actions: [{ redirect: { url: 'https://your-app.example.com/voice/incoming', method: 'POST' } }] });
});Subscribe to webhooks for call.started, call.answered, call.completed, call.failed and recording.ready to log outcomes and cost per call. SautiKit signs each delivery with an X-Sautikit-Signature HMAC-SHA256 header - verify it before trusting the payload. A Node SDK is available (npm i @sautikit/node).
Two questions: build cost is your engineering time (a single-level menu is an afternoon; a multi-level tree with a database lookup is a few days). Run cost is per-second airtime plus number rental. On SautiKit the published rates are a local number at KES 100/month, outbound at KES 0.05/second billed per second, inbound free, and recording at KES 0.50/minute with 1 GB storage free per workspace (rates exclude VAT; re-verify before quoting a client).
Per-second billing matters for IVR because menu interactions are short. A 40-second self-service balance check that deflects a call from a human agent costs about KES 2 in airtime. Per-minute providers round that same call up to a full minute.
Build your own when you have engineers, want deep control, or are embedding voice inside an existing product. Buy when you need agents, live dashboards, recording review, CRM screen-pops and QA scoring next week and do not want to maintain any of it. That managed layer is HelloDuty: a cloud contact centre with IVR, routing, recording and CRM CTI in the browser, around KES 3,500 to KES 7,500 per agent per month. The rule of thumb: SautiKit if you are a developer who wants the raw voice API; HelloDuty if you are a business that wants the finished call centre.
How do I make my own IVR without coding? Use a visual call-flow builder inside a managed contact-centre platform, or a no-code IVR menu in a business phone system. You trade some flexibility for speed.
How long does it take to set up an IVR system? A single-level menu can be live in an afternoon once your number and webhook are ready. Multi-level trees with database lookups take a few days.
What is the difference between IVR and a voice API? A voice API is the toolkit (numbers, calls, audio, DTMF). An IVR is one thing you build with it. The same API also powers auto-dialers, voice OTP and AI voice agents.
Can an IVR speak Swahili? Yes. Play pre-recorded Swahili or Sheng audio with the play action, or use text-to-speech where the voice supports it.
Do I need a licence to run an IVR in Kenya? You need a number from a licensed provider, and outbound calling must respect the Data Protection Act, 2019 and consent rules. The IVR itself is not separately licensed.
Is a voice-API IVR cheaper than a PBX? For most SMEs, yes. A PBX has hardware and maintenance costs; a voice-API IVR bills per second of usage, so you pay only for calls you handle.
Can I connect the IVR to my CRM? Yes, in your webhook handler: look the caller up by phone number, pull their record, and branch the menu on it.
Want the raw voice API to build your own IVR, auto-dialer or voice agent? Start with SautiKit. Want the finished call centre with agents, routing, recording and CRM without maintaining infrastructure? That is HelloDuty. Both are built for African networks and priced in shillings.

Are you ready to get started? Sign up here for a demo of the HelloDuty CRM and customer engagement automation software now.

Plan, engage, and analyse with ease. Transform your customer relationship with an all-in-one platform.
