Create a checkout session
Start hosted checkout. Pass escrowId XOR customerId. EscrowId funds an awaiting_funding hold (amount and currency must match). A second POST for that same unfunded hold returns the existing pending session. It does not start another charge. Same Idempotency-Key + same body replays the first response. Different key + same escrowId still returns that pending session. CustomerId credits that customer’s available and does not lock a hold; wallet top-ups may have more than one open session. PaymentMethods, if omitted, uses the channels enabled on your Demat dashboard (card only until you turn others on). See Callback URL. Webhook: payment.pending.
Authorizations
Secret API key. Use sk_test_... for sandbox data or sk_live_... for live data (after verification and live mode). Do not use pk_ keys.
Headers
Body
escrowId or customerId (not both), amount in naira, currency, optional paymentMethods, and optional callbackUrl.
Charge amount in naira. Must match the escrow when funding one.
400
ISO currency code. Must match the escrow or wallet.
"NGN"
Escrow to fund. Provide this or customerId, not both.
"esc_01hxyz"
Customer whose wallet to credit. Provide this or escrowId, not both.
"cus_01hxyz"
Checkout channels for this session. Allowed: card, bank, bank_transfer, ussd. If omitted, the channels enabled on your Demat dashboard are used (card only until you turn others on).
card, bank, bank_transfer, ussd Browser return URL after checkout. Must be https with a public domain. If omitted, the merchant account callbackUrl is used. If that is also empty, we send no default so the payer is not sent to a Demat page.
"https://yourapp.com/payments/callback"