Accept M-Pesa, MTN MoMo, Airtel Money, Tigo Pesa, card, and bank transfer across Kenya, Uganda, and Tanzania through one integration. Switch channels per payment without rewriting your code.
The same POST /v1/payments endpoint works for every channel. Pass channel and we route + validate accordingly.
| Channel | How it works | Fees |
|---|---|---|
| M-Pesa STK Push | Customer-initiated payments triggered by a phone prompt — Safaricom M-Pesa (Kenya) and Vodacom M-Pesa (Tanzania). Async callback resolves within seconds. | 1.5% per successful payment |
| M-Pesa Paybill (C2B) | Customer enters your merchant-owned account number on their phone. Daraja confirmations auto-create the payment. | 1.0% per successful payment |
| MTN MoMo & Airtel Money | MTN Mobile Money in Uganda and Airtel Money across Kenya, Uganda, and Tanzania — same request shape as M-Pesa, callbacks normalized. | 1.5% per successful payment |
| Tigo Pesa (Mixx by Yas) | Tanzania mobile money via USSD/STK prompt. One channel field switches routing — no separate integration. | 1.5% per successful payment |
| Card (Visa, Mastercard) | Synchronous charges via our Stripe-style adapter. Accepts KES, UGX, TZS, USD, and EUR. Approve or decline returns inline; no callback wait. | 2.9% + local fee per successful payment |
| Bank transfer | Direct deposit channel for higher-value transfers. Async confirmation via our bank-partner webhook. | 0.6% per successful payment |
A single POST creates the payment. We send a signed webhook to your endpoint when it resolves — succeeded, failed, or canceled by the customer.
// Create a payment via STK Push
const res = await fetch("https://api.teronapay.com/v1/payments", {
method: "POST",
headers: {
"Authorization": "Basic " + btoa(`${KEY_ID}:${KEY_SECRET}`),
"Content-Type": "application/json",
"Idempotency-Key": "order-1234",
},
body: JSON.stringify({
reference: "order-1234",
amount: 12500, // KES 125.00
currency: "KES",
channel: "mpesa_stk_push",
payer_phone: "+254712345678",
}),
});
const payment = await res.json();
// payment.status === "processing" until the STK Push completes.
// Listen for the "payment.succeeded" webhook event for the final outcome.Sign up, paste your test API key, and run your first STK Push in a few minutes.