Developers
The rails we use, as an API.
REST endpoints, JSON in and out, one API key. Sell bills, run crypto swaps, issue cards and pay suppliers abroad from your own product.
curl https://api.z9pay.com/v1/swaps/quote \
-H "Authorization: Bearer sk_test_••••••••" \
-d from=USDT \
-d to=NGN \
-d amount=2500Products
Pick the piece you need.
- REST APIBill Payment APIAirtime, data, cable TV, electricity and exam PINs. Plans for individuals, communities and influencers.
- TieredCrypto APIWallets, USDT to NGN swaps, virtual cards and international payouts. Switch modules on as you grow.
- White-labelTubali Crypto WalletA complete wallet app under your own brand. No front-end to build.
- EnterpriseInfrastructure Partner ProgramWe scope, build and operate a payments product for you. One build fee, then quarterly maintenance.
How it behaves
Boring in the right places.
- Idempotent by default
- Send an Idempotency-Key and retry safely. We never move money twice for the same key.
- Signed webhooks
- Every status change is pushed to you, signed with your secret, retried for 72 hours.
- One balance
- Fund once in naira. Bills, swaps, cards and payouts all draw from the same ledger.
- Sandbox that behaves
- Simulated billers, chains and banks, including failures, so you can test the unhappy paths.
curl https://api.z9pay.com/v1/payouts \
-H "Authorization: Bearer sk_test_••••••••" \
-H "Idempotency-Key: inv-2026-0412" \
-d currency=CNY \
-d amount=148500.00 \
-d beneficiary=ben_8Hq2Lw \
-d reference="INV-0412 Shenzhen Lighting Co."curl https://api.z9pay.com/v1/bills \
-H "Authorization: Bearer sk_test_••••••••" \
-d biller=ikeja-electric-prepaid \
-d customer=45031288761 \
-d amount=10000Is there a sandbox?
Yes. Sandbox keys work against simulated billers, chains and payouts, with the same API shape as production.
How do I go live?
Complete business verification, sign the API agreement, and our compliance team reviews your use case. Most reviews finish within five business days.
Do you send webhooks?
Yes. Every object change triggers a signed webhook. We retry with backoff for 72 hours until your endpoint returns a 2xx.