Sautikit in Kenya
Local Nairobi DIDs, KES wallet, M-Pesa top-up. Programmable voice live for Kenyan teams.
Local Nairobi DIDs, KES wallet, M-Pesa top-up. Programmable voice live for Kenyan teams.
Sautikit is live in Kenya. You can provision local Nairobi DIDs, place and receive calls programmatically via the REST API, record calls with 5 GB of free storage per workspace, and top up your KES wallet via M-Pesa. Billing is in Kenyan Shillings. No foreign exchange required.
The following capabilities are available to Kenyan workspaces today:
Numbers
Calls
call.started, call.answered, call.completed)Recording
Wallet and billing
All rates are in Kenyan Shillings (KES) and are billed per second, not per minute. The per-minute figures below are for reference.
| Item | Rate |
|---|---|
| Number rental | KES 100 / month per number (ex. VAT; KES 116 incl. VAT) |
| Outbound call | KES 3.00 / minute (KES 0.0500 / second) |
| Inbound call | Free (KES 0 / minute) |
| Recording storage | 5 GB free; KES 2.00 / GB / month above threshold |
| Wallet top-up (M-Pesa) | No fee |
Rates are retrieved from the public pricing endpoint. You can verify current rates at any time:
curl https://api.sautikit.com/v1/public/pricingResponse shape:
{
"currency": "KES",
"number_monthly_kes": 100,
"outbound_per_min_kes": 3.00,
"inbound_per_min_kes": 0.00,
"recording_free_gb": 5,
"updated_at": "2026-06-27T00:00:00Z"
}Pricing changes are announced at least 30 days in advance via the changelog and email notification to account holders.
Kenya's telecommunications sector is governed by the Communications Authority of Kenya (CA). Sautikit operates on the Kenyan network under arrangements with a licensed carrier. Here is what that means for you as a customer:
Type approval All network-connected equipment and software used to deliver calls on Sautikit's platform meets CA type-approval requirements. As a customer using the API, you do not need your own type-approval to place or receive calls.
Number portability Porting your existing Kenyan DID to Sautikit is supported. The porting process is coordinated through the CA's number portability system and takes 2–5 business days. Contact support to initiate a port-in request.
CLI (Caller Line Identity) presentation Outbound calls display the caller ID of the provisioned DID the call is placed from. CLI spoofing (presenting a number you do not own) is not permitted under CA rules and is not supported by the API.
Lawful intercept Sautikit's carrier partner holds the lawful intercept obligations required by Kenyan law. As a business customer, you are responsible for complying with any obligations that apply to your own communications records.
Recording consent Kenya does not have a single-party vs. all-party consent rule codified in telecoms law as of 2026; however, the Data Protection Act 2019 requires lawful basis for processing personal data, which includes voice recordings. Notify callers that calls may be recorded. The platform does not automatically play a beep or disclosure tone; that is your application's responsibility.
Initiate a top-up via the API, and an STK push prompt arrives on the specified phone within seconds:
curl -X POST https://api.sautikit.com/v1/topups \
-H "Authorization: Bearer $SAUTIKIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"provider": "mpesa",
"amount_minor": 500000,
"currency": "KES",
"phone_e164": "+254722000001"
}'The phone_e164 does not have to belong to a Sautikit user; one finance person can fund many workspaces from their own M-Pesa number.
Your workspace has a dedicated M-Pesa paybill reference for manual payments:
Credit appears in your wallet within 60 seconds in normal conditions. If credit does not appear within 5 minutes, check the transaction ID from your M-Pesa confirmation SMS and contact support with that ID.
Minimum top-up via M-Pesa: KES 100
Maximum single top-up via M-Pesa: KES 150,000 (subject to your M-Pesa transaction limits)
Set a low-balance threshold in the dashboard (Billing → Alerts). When your wallet balance falls below the threshold, you receive an email. Calls will be suspended if the balance reaches zero; they will not overdraw.
Kenyan DIDs provisioned by Sautikit are geographic Nairobi numbers in E.164 format:
+254 20 XXX XXXX
The +254 is the Kenya country code. 20 is the Nairobi area code. The remaining seven digits are allocated from the block assigned to Sautikit's carrier partner.
# List available numbers
curl -X GET "https://api.sautikit.com/v1/numbers/available?country=ke&limit=5" \
-H "Authorization: Bearer $SAUTIKIT_API_KEY"
# Purchase a number
curl -X POST "https://api.sautikit.com/v1/numbers" \
-H "Authorization: Bearer $SAUTIKIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"number": "+254200000001", "voice_callback_url": "https://yourapp.example.com/voice"}'Response:
{
"id": "num_01j00000000000000000000001",
"number": "+254200000001",
"country": "ke",
"status": "active",
"voice_callback_url": "https://yourapp.example.com/voice",
"monthly_rate_kes": 100,
"provisioned_at": "2026-06-27T10:00:00Z"
}To port a Kenyan DID you already own into Sautikit:
You cannot port a number out until it has been active on Sautikit for at least 30 days.
The examples below use a Nairobi DID as the caller ID and call a Kenyan mobile number. Replace $SAUTIKIT_API_KEY, +254200000001 (your DID), and +254712345678 (the destination) with real values.
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",
"voice_callback_url": "https://yourapp.example.com/call-events"
}'Response:
{
"id": "call_01j00000000000000000000001",
"status": "initiated",
"from": "+254200000001",
"to": "+254712345678",
"direction": "outbound",
"created_at": "2026-06-27T10:00:00Z"
}// Requires: npm install node-fetch (or use native fetch in Node 18+)
const response = await fetch("https://api.sautikit.com/v1/calls", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SAUTIKIT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
from: "+254200000001", // your Nairobi DID
to: "+254712345678", // destination (Safaricom mobile)
voice_callback_url: "https://yourapp.example.com/call-events",
}),
});
if (!response.ok) {
const err = await response.json();
throw new Error(`Call initiation failed: ${err.message}`);
}
const call = await response.json();
console.log(`Call ${call.id} initiated, status: ${call.status}`);import os
import httpx # pip install httpx
api_key = os.environ["SAUTIKIT_API_KEY"]
with httpx.Client(base_url="https://api.sautikit.com") as client:
response = client.post(
"/v1/calls",
headers={"Authorization": f"Bearer {api_key}"},
json={
"from": "+254200000001", # your Nairobi DID
"to": "+254712345678", # destination
"voice_callback_url": "https://yourapp.example.com/call-events",
},
)
response.raise_for_status()
call = response.json()
print(f"Call {call['id']} initiated, status: {call['status']}")When the call state changes, Sautikit POSTs a JSON payload to voice_callback_url. A minimal handler:
// Next.js route handler: app/api/call-events/route.js
export async function POST(request) {
const event = await request.json();
switch (event.kind) {
case "call.started":
console.log(`Call ${event.data.call_id} started`);
break;
case "call.answered":
console.log(`Call ${event.data.call_id} answered`);
break;
case "call.completed":
console.log(`Call ended. Duration: ${event.data.duration_seconds}s`);
break;
}
return new Response("OK", { status: 200 });
}Do I need a Kenyan business registration to provision numbers? No registration is required to sign up and provision numbers. However, if your use case involves outbound call campaigns, you may be subject to your own regulatory obligations under the CA's consumer protection framework. Sautikit does not enforce business registration at the account level.
Can I call international destinations from a Kenyan DID? Yes. International outbound calls are supported. Rates for international termination vary by destination and are listed in the dashboard under Billing → Rate lookup. They are billed in KES from the same wallet.
Will calls to Kenyan numbers work if I am physically outside Kenya? Yes. The API and your DIDs work from anywhere. Call termination to Kenyan numbers (Safaricom, Airtel, Telkom) is on-net from Sautikit's carrier arrangement regardless of where the API request originates.
What is the audio quality on Kenyan calls? Calls are delivered at narrowband (G.711) by default, which is the standard on Kenyan PSTN. Wideband (HD voice) availability depends on the terminating carrier and handset; it is not guaranteed.
How does per-second billing work in practice? If an outbound call lasts 47 seconds, you are billed for 47 seconds. At KES 3.00/minute that is KES 3.00 × (47/60) = KES 2.35. There is no rounding up to the next minute. Inbound calls are free (KES 0/min), so an inbound call of any length costs nothing.
Is there a minimum balance required to place calls? Calls will attempt to initiate as long as your balance is above zero. If your balance drops to zero mid-call, the call continues until it ends and the final charge may take the balance slightly negative; the next top-up covers the deficit. Calls will not initiate if balance is zero or negative.
Can I receive SMS on my Kenyan DID? Not yet. Sautikit is a voice platform. SMS on Kenyan DIDs is on the roadmap but not live.
How long does number provisioning take? Provisioning is instant via the API and dashboard. Numbers are active for inbound and outbound immediately after the purchase response returns.
What happens if I do not renew a number? Numbers are billed monthly at KES 100 (ex. VAT; KES 116 incl. VAT). If your wallet does not have sufficient balance on the renewal date, the number is suspended. After a 7-day grace period the number is released back to the pool and cannot be recovered.
Can I provision multiple numbers in one API call? Not currently. Each number requires a separate POST /v1/numbers request. Bulk provisioning is on the roadmap.
Is there a rate limit on the API? Standard rate limits apply: 300 requests per minute per API key for most endpoints; 60 requests per minute per IP on the public pricing endpoint. If you need higher limits for high-volume provisioning or call initiation, contact support.
Where is call recording data stored? Recordings are stored in Sautikit's infrastructure within the Nairobi region. Presigned download URLs are available via GET /v1/calls/{id}/recording. URLs expire after 1 hour and can be regenerated.