For developers
A clean API for collections and payouts.
OAuth2 keys, a sandbox, a Daraja-style prompt-to-pay, and signed webhooks — integrate in an afternoon.
For developers
Collect & disburse with a few calls.
Self-serve keys, a sandbox, and a Daraja-style flow: push a charge, the customer confirms in their wallet, you get a signed webhook.
- OAuth2 client-credentials, sandbox + production keys
- Prompt-to-pay (STK push) + status polling
- Signed, retried webhooks (HMAC-SHA256)
- Balance & transaction queries
# 1. Get a token
curl -s $API/oauth/token \
-d '{"client_id":"pk_live_…","client_secret":"sk_live_…"}'
# 2. Push a charge to a customer
curl -s $API/partner/stk \
-H "Authorization: Bearer $TOKEN" \
-d '{"payer_msisdn":"…","amount":250,
"reference":"INV-900",
"callback_url":"https://you.example/webhook"}'
# 3. Customer confirms in their wallet → signed webhook:
# { "event":"charge.completed", "charge_ref":"STK…",
# "amount":250, "state":"completed" }Designed for money
An API that behaves like a payments system.
Most APIs move data. This one moves money — so it's idempotent, signed, and built around a charge lifecycle you can trust.
Authentication is OAuth2 client-credentials: you exchange a key and secret for a short-lived bearer token. Every state-changing call carries an idempotency key, so a network retry settles exactly once — the single most important property when real money is involved.
A collection is a charge. You push it to a customer's number; a prompt-to-pay lands on their phone; they confirm with a PIN. The charge moves through pending → authorised → completed (or declined / expired / failed), and you learn the outcome two ways: poll the status endpoint, or — better — receive a webhook the moment it changes.
Webhooks are signed with HMAC-SHA256 against a secret only you and PesaBridge share, and retried with backoff until your endpoint acknowledges — so you can build on them without fear of a missed or forged event. Balance and transaction endpoints close the loop for reconciliation, and a sandbox runs the identical contract, so you ship with confidence.
Charge lifecycle
{
"event": "charge.completed",
"charge_ref": "STK9F2A",
"amount": 250.00,
"currency": "KES",
"state": "completed",
"signature": "hmac-sha256…"
}API reference
A small, predictable surface.
/oauth/tokenExchange client credentials for a bearer token./partner/stkPush a charge (prompt-to-pay) to a customer./partner/statusPoll the state of a charge./partner/balanceQuery a collection account balance./biz/requestMerchant request-to-pay./ussdUSSD menu gateway callback.Security & compliance
Trust is the product.
Financial services live or die on correctness and control. PesaBridge bakes both into the core.
Double-entry by construction
Every movement posts balanced debits and credits — the books reconcile to zero, always.
PIN, KYC & limits
Configurable KYC tiers, per-transaction and daily limits, PIN attempts and wallet locking.
Idempotent & reversible
Idempotency keys stop double charges; a unified reversal engine unwinds any department.
Signed webhooks
HMAC-SHA256 signatures and retries so partner systems can trust every callback.
Full audit trail
Immutable ledger entries and transaction history for regulators and disputes.
Per-country compliance
ID types, KYC rules and tariffs switch with the market, from configuration.
Countries you can launch in
Native apps, one platform
Channels — App · USSD · Web · API
Double-entry, always balanced
FAQ
Questions, answered.
Is PesaBridge a platform I share, or my own?
Your own. PesaBridge is a product BridgeERP resells — every operator gets their own deployment, branded and configured for them. No shared database, no shared super-admin.
Which countries and currencies are supported?
Any. Country, currency, language and KYC rules are configuration drawn from the full ISO set — not hardcoded. We have live markets today and stand up new ones without a rewrite.
Does it work on feature phones?
Yes. The full wallet runs over USSD — send, withdraw, pay bill, buy goods, airtime, balance and statements — settling on the same ledger as the apps.
Can I connect my own banks and payment rails?
Yes. Rails are pluggable adapters — banks, mobile money, cards and PSPs — so you connect only what your market needs.
How fast can we go live?
Weeks, not years. Configure your brand and country, wire your rails, then ship your apps, USSD code and web portals from one platform.
Is it secure and auditable?
Every movement is double-entry and balanced to zero, PIN- and KYC-gated, with signed webhooks and a full audit trail for regulators.
Which apps do operators and their customers get?
Four native apps (Android + iOS): a User app for customers, an Agent / Super-agent app for cash-in/out and float, a Merchant app to accept and settle, and a Corporate app for bulk disbursement with maker/checker approvals.
How does settlement and reconciliation work?
Funds settle to the relevant wallet in real time. Every transaction produces balanced ledger entries you can reconcile, with statements and exports, and a GL bridge for your accounting system.
Can it handle loans, savings and group finance?
Yes — overdraft credit, MFI loans with schedules and portfolio-at-risk, goal savings, and savings groups (chama / merry-go-round) are part of the platform and switch on per market.
Do you support bulk disbursement for payroll, aid or subsidies?
Yes. The Corporate app and API run bulk disbursement to thousands of wallets with maker/checker approvals, payee books, scheduling and full reconciliation.
What does it take to run it day-to-day?
A single operator admin console runs brand, tariffs, KYC, the agent and merchant network, the ledger, reversals, support and KPIs — no code required for everyday operations.
Who owns the deployment and the data?
You do. Each operator runs their own deployment with their own database — branded and configured for them. It's a product you resell as your own, not a shared SaaS tenant.
Ready to launch your wallet?
Book a demo and we'll stand up your brand, country and rails — and walk you through the apps, admin and API.
