sautikit
PricingDevelopersBlogAbout
Sign inStart building
Live

Sautikit in Kenya

Local Nairobi DIDs, KES wallet, M-Pesa top-up. Programmable voice live for Kenyan teams.

Next Steps

  • Quickstart: Place a CallFive steps from zero to a live outbound call on Sautikit. Sign up, add KES credit, claim a Kenyan DID, POST to /v1/calls/originate, and verify the signed webhook payload.
  • Phone NumbersA phone number in Sautikit moves through a defined lifecycle from available inventory to an active workspace assignment. Each number gets its own SIP credentials and routing config.
sautikit

Programmable voice infrastructure for Africa. Buy numbers, place calls, and bill per second, all in KES, via API.

Product

NumbersCalls & routingRecordingsWallet & billingPricing

Developers

DocumentationAPI referenceQuickstartAI promptChangelog

Company

AboutBlogCareersConsole

© 2026 Sautikit. All rights reserved.

Sautikit provides voice API services for application developers. Numbers provisioned on this platform are not configured for emergency calling (e.g. 999 / 112). Do not use Sautikit numbers as a replacement for a primary phone line.

Summary

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.

What's live

The following capabilities are available to Kenyan workspaces today:

Numbers

  • Local Nairobi geographic DIDs (area code 020)
  • Instant provisioning via API or dashboard
  • Inbound and outbound calling on each number
  • Configurable voice callback URL per number for routing and event delivery

Calls

  • Outbound calls to Kenyan mobile (Safaricom, Airtel, Telkom) and landline numbers
  • Inbound calls received on your provisioned DIDs
  • Call legs bridged in the Sautikit platform; no SIP configuration required unless you opt in
  • Real-time call status via webhooks (call.started, call.answered, call.completed)

Recording

  • Per-leg call recording, toggleable via the API at call initiation or mid-call
  • 5 GB of recording storage per workspace at no additional cost
  • Recordings accessible via authenticated GET request with presigned URL
  • Retention configurable up to 90 days (default 30 days)

Wallet and billing

  • KES-denominated workspace wallet
  • Top up via M-Pesa STK push (API-initiated) or M-Pesa Paybill (manual)
  • Per-second billing on all call legs (no per-minute rounding)
  • Usage visible in real time via dashboard and GET /v1/wallet

Pricing

All rates are in Kenyan Shillings (KES) and are billed per second, not per minute. The per-minute figures below are for reference.

ItemRate
Number rentalKES 100 / month per number (ex. VAT; KES 116 incl. VAT)
Outbound callKES 3.00 / minute (KES 0.0500 / second)
Inbound callFree (KES 0 / minute)
Recording storage5 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/pricing

Response 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.

Regulation

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.

Wallet top-up

M-Pesa STK push (API-initiated)

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.

M-Pesa Paybill (manual)

Your workspace has a dedicated M-Pesa paybill reference for manual payments:

  1. Open M-Pesa on your phone.
  2. Select Lipa na M-Pesa → Pay Bill.
  3. Enter the Sautikit Paybill number (displayed in your dashboard under Billing → Top Up).
  4. Enter your workspace account number as the Account Number field.
  5. Enter the amount in KES.
  6. Confirm with your M-Pesa PIN.

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)

Low-balance alerts

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.

Number inventory

Format

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.

Provisioning via API

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

Porting existing numbers

To port a Kenyan DID you already own into Sautikit:

  1. Confirm the number is active and not subject to a contract lock with your current carrier.
  2. Submit a port-in request via the dashboard (Numbers → Port a number) or by emailing support with the number and a copy of your current carrier's account confirmation.
  3. Sautikit coordinates with the CA number portability system. The process takes 2–5 business days.
  4. During porting, inbound calls to the number will briefly be unavailable (typically under 30 minutes during the cutover window).

You cannot port a number out until it has been active on Sautikit for at least 30 days.

Code: place a call from Kenya

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

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

Node.js

// 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}`);

Python

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

Handling the voice callback

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 });
}

FAQ

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.

Next steps

  • Coverage: other African markets and waitlists
  • Pricing
  • Quickstart: place a call
  • Numbers concepts