TeronaPay
Product

One API. Every East African network.

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.

Channels

Every network, one consistent shape.

The same POST /v1/payments endpoint works for every channel. Pass channel and we route + validate accordingly.

ChannelHow it worksFees
M-Pesa STK PushCustomer-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 MoneyMTN 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 transferDirect deposit channel for higher-value transfers. Async confirmation via our bank-partner webhook.0.6% per successful payment
Integration

Live in 60 lines of code.

A single POST creates the payment. We send a signed webhook to your endpoint when it resolves — succeeded, failed, or canceled by the customer.

  • Idempotency-Key header dedupes retries
  • channel selects M-Pesa, MoMo, Airtel, Tigo Pesa, or card
  • Webhook signature: HMAC-SHA256 in X-Nowpesa-Signature
  • Refunds via POST /v1/payments/{id}/refunds — full or partial
// 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.

Ready to take payments?

Sign up, paste your test API key, and run your first STK Push in a few minutes.

Payments — one API, every East African network · TeronaPay