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.