Wallet and Billing
How the Sautikit prepaid KES wallet works: top up by M-Pesa or card, read ledger entries and set low-balance alerts. Outbound calls cost KES 3.00 a minute.
How the Sautikit prepaid KES wallet works: top up by M-Pesa or card, read ledger entries and set low-balance alerts. Outbound calls cost KES 3.00 a minute.
Sautikit bills from a prepaid wallet in Kenyan shillings (KES). Every charge (calls, streaming, number rental, storage, a carrier trunk) is a ledger entry you can list. When the balance reaches zero, new outbound calls are refused and number rentals do not renew until you top up. Outbound calls cost KES 3.00 a minute and incoming calls are free.
Each workspace has one wallet in one currency, set when the workspace is created. For workspaces registered in Kenya the currency is KES. It cannot be changed later.
All amounts in the API are in minor units: KES 1 is 100, so 50000 is KES 500.00.
Top up by M-Pesa or card in the console, under Wallet. The balance updates as soon as the payment is confirmed, and a wallet.top_up webhook is sent if you subscribe to it. You can also save a card and have the wallet top itself up automatically.
Every change to the balance adds one ledger entry. Entries are never edited or removed.
| Field | Description |
|---|---|
kind | The type of transaction (see the table below) |
amount_minor | Signed amount (positive is a credit, negative is a debit) |
currency | The wallet currency |
balance_after_minor | Wallet balance immediately after this entry |
Ledger entry kinds:
| Kind | Direction | Charged for |
|---|---|---|
call_debit | Debit | An answered call, when it ends |
ai_debit | Debit | AI agent minutes on a call, after it ends |
stream_debit | Debit | Audio streaming on a call (KES 0.50 a minute), after it ends |
supervision_debit | Debit | A supervisor leg on a call, after the supervisor leaves |
amd_debit | Debit | Answering machine detection on a dialer call, one flat charge per check |
number_rental | Debit | Monthly number rental |
storage_debit | Debit | A storage upgrade, charged for the rest of the month |
storage_renewal | Debit | Monthly storage renewal on the 1st |
sip_trunk_fee | Debit | A carrier trunk, KES 2,000 a month |
agent_seat | Debit | AI concurrency seats, on purchase and monthly |
desk_seat | Debit | One SautiDesk person for one month |
compliance_recording | Debit | Compliance recording, KES 0.50 per minute of audio |
topup | Credit | A confirmed top-up |
trial_credit | Credit | Trial credit from Sautikit support (once per workspace) |
manual_credit, manual_debit, refund, reversal | Either | Corrections made by Sautikit support |
List the ledger with GET /v1/wallet/statements. Pass kind to filter, for example ?kind=call_debit.
const res = await fetch("https://api.sautikit.com/v1/wallet/balance", {
headers: { Authorization: `Bearer ${process.env.SAUTIKIT_API_KEY}` },
});
const wallet = await res.json();
console.log(wallet.balance_minor / 100, wallet.currency);curl "https://api.sautikit.com/v1/wallet/balance" \
-H "Authorization: Bearer $SAUTIKIT_API_KEY"{
"balance_minor": 250000,
"currency": "KES",
"low_balance_threshold_minor": 100000,
"status": "healthy",
"server_time": "2026-09-01T08:00:00Z"
}status is healthy, approaching or below, measured against your low-balance threshold.
Set a low-balance threshold in the console under Wallet → Alerts. When the balance is at or below the threshold, Sautikit sends:
wallet.low_balance webhook, if you subscribe to it, andBoth are sent at most once every 24 hours.
A threshold of KES 500 (50000 minor units) is about 166 minutes of outbound calls at KES 3.00 a minute. Incoming calls are free and do not use the balance.
| Balance | Behaviour |
|---|---|
| Above zero | Calls connect and numbers renew |
| Zero or below | POST /v1/calls returns 402 wallet.insufficient_funds. A call already in progress is ended when the balance runs out |
| Not enough for a number's monthly rental | A number.rental_past_due webhook and an email are sent and the charge is retried every 6 hours. The number is released if the rental is still unpaid after 3 days |
Calls are charged when they end, so the balance can dip slightly below zero after the last call. Top up to start calling again.
Sautikit support may give a new workspace a one-time trial credit. It appears as a trial_credit ledger entry. Trial numbers issued with the credit are released when the trial ends, and unused credit is not refunded.
const res = await fetch(
"https://api.sautikit.com/v1/wallet/statements?kind=trial_credit",
{ headers: { Authorization: `Bearer ${process.env.SAUTIKIT_API_KEY}` } }
);