Developers

Integrate in an afternoon.

A REST API with JSON, clear errors and signed webhooks for every change. Build against the sandbox, then switch one key to go live.

# Request a mobile money payment in Ethiopia
curl https://api.zafivo.com/v1/payments \
-H "Authorization: Bearer sk_test_…" \
-H "Idempotency-Key: 7f3c9a" \
-d amount=150000 -d currency=ETB \
-d method=mobile_money -d phone=+2519XXXXXXXX

201 Created

{
"id": "pay_8Hq2Lx",
"status": "pending",
"provider": "telebirr",
"amount": 150000, "currency": "ETB"
}

How a payment flows

Five stops, one request.

  1. Customer

    Pays by phone or card

  2. Your app

    One API call

  3. Zafivo

    Routes and confirms

  4. Operator or bank

    M-Pesa, telebirr, Visa…

  5. Your account

    Settled on schedule

Built for production

The details that keep payments correct.

  • 01

    One format

    The same request for every country and method. Change the currency and the phone number, nothing else.

  • 02

    Signed webhooks

    An event for every status change, signed so you can verify it came from Zafivo, and retried until you confirm.

  • 03

    Idempotency keys

    Send the same key twice and get the same result: no double charges on slow or broken networks.

  • 04

    Sandbox

    Test keys, test phone numbers and test cards for every country, with the responses each operator really sends.

  • 05

    Client libraries

    Node.js, PHP, Python and Java, plus a Postman collection.

  • 06

    Status page

    Live health of every operator, bank and network Zafivo connects to.

Webhooks

Know the moment money moves.

Subscribe once and receive every event for every country in the same format.

payment.pendingPOST · signed
payment.succeededPOST · signed
payment.failedPOST · signed
refund.succeededPOST · signed
payout.paidPOST · signed
settlement.createdPOST · signed

Get your sandbox keys today.

Tell us what you are building and we will send test keys and a walkthrough of the API.