National payments switch · Burundi
Burundi Pay
Stripe-like APIs for shops. USSD checkout is a live demonstration on the Mojaloop hub. The native Hyperswitch connector comes later.
Démonstration (maintenant)
Two customer shapes on the same shop: Mobile (phone + push prompt) and Code marchand (till / MoMoPay-style). Tick Livraison to hold funds until the customer’s 6-digit code is submitted.
Open hs-lab-demo.jengacore.com/checkout. Demo number 25779000000, merchant code 220001. Courier page: /checkout/release.
Checkout on your website
Same pattern as Stripe Elements: secret key on the server, publishable key in the browser, Unified Checkout iframe on the page.
POST /v1/checkout/session → client_secret
<script src="https://hs-lab-checkout.jengacore.com/HyperLoader.js"></script>
Hyper(publishable_key).widgets({ clientSecret }).create("payment").mount("#pay")
Try it as a shop: open the demo checkout.
Ecommerce / marketplace API
curl -X POST $API/payments \
-H "api-key: $SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"amount":5000,"currency":"BIF","confirm":true}'
Adapter: POST /v1/ecommerce/payments. Marketplaces may send X-Merchant-Api-Key.
Food delivery and taxis
You run the app (orders, GPS, drivers). We only move money: escrow, splits, OTP, disputes. Same payment_id as a café — no vertical SDK. Full how-to: repo hyperswitch/INTEGRATION.md.
Food — pay with release_on: delivery. Courier at the door submits the customer’s code. Cancel before kitchen = refund from escrow.
POST /v1/ussd/collect
{"msisdn":"25779000000","amount":15000,"currency":"BIF","release_on":"delivery","merchant_reference":"ORD-4412"}
POST /v1/checkout/release
{"payment_id":"…","code":"735904"}
Taxi — hold an estimate with release_on: trip_complete, assign the driver later, capture meter + tip, refund unused. Driver is the merchant split; you are platform_fee.
POST /v1/ussd/collect
{"msisdn":"25779000000","amount":8000,"currency":"BIF","release_on":"trip_complete","merchant_reference":"TRIP-88"}
Do not pay restaurants or drivers from your own wallet. Do not mark delivered without our release. Disputes: one inbox per payment, even with splits.
USSD checkout (scheme PSP)
Web collects an MSISDN (push). The till uses a merchant code we issued (pull). The customer pays Burundi Pay in BIF, not the shop. PIN is never in the USSD string. Delivery release is a second step we mint and verify.
POST /v1/ussd/collect
{"msisdn":"25779000000","amount":15000,"currency":"BIF","merchant_code":"220001","release_on":"delivery"}
POST /v1/checkout/release
{"payment_id":"…","code":"482193"}
GET /v1/merchant?code=220001
Shortcode callback (Africa's Talking): POST /ussd. Scheme health: GET /v1/scheme/health.