You need an API key and a reachable
callbackUrl — see the Quickstart if you haven’t set those up. For this flow you also need a fiat wallet in the currency you’re collecting, and a customer record for the person paying.Mobile Money Deposit
The most common collection method across Kenya, Uganda, Tanzania, Ghana, and other markets. 1. Create the customer if you haven’t already. The customer record holds the phone number and network details needed to trigger the collection. 2. Initiate the deposit — call Deposit via Mobile Money with yourcallbackUrl. The API responds immediately with a PENDING transaction. The customer has not paid yet.
3. The customer confirms. Depending on the network:
- M-PESA / Airtel — STK push, customer enters PIN to approve
- MTN / others — USSD prompt or SMS confirmation
callbackUrl when the transaction settles:
SUCCESSFUL— funds collected, your deposit balance will be creditedFAILED— collection failed (declined, insufficient funds, timeout)
If you have a webhook secret configured, the callback arrives in a signed envelope with
X-Kotani-Signature, X-Kotani-Event, and X-Kotani-Integrator headers. Without a secret, the transaction fields are posted directly to your callbackUrl. See Webhooks for both modes, and the deposit payload for every field you receive with a worked example.Bank Checkout Deposit
Call Bank Checkout Deposit with yourcallbackUrl, a customerRedirectUrl (where to send the customer after they finish paying), currency, amount, and a paymentMethod. What happens next depends on the currency and payment method — bank checkout is not one flow, it’s three:
ZAR — CAPITECPAY or CARD. Kotani Pay returns a hosted checkout page. Redirect the customer to redirectUrl in the response; they complete payment there (Capitec Pay app or card entry) and are sent back to your customerRedirectUrl afterward. No manual reference entry — the hosted page handles matching the payment.
KES — PAYBYBANK (PesaLink). There is no hosted page. The response includes a bankPaymentDetails object with bankName, accountName, accountNumber, amount, and reference. Show these to the customer so they can make a manual PesaLink transfer from their own banking app.
NGN — Virtual account. The response’s bankPaymentDetails contains a one-time dedicated accountNumber (plus bankName, accountName, amount, expiresInMinutes). The customer pays the exact amount to that account from their own banking app before it expires. No narrative/reference is needed here — the account itself is unique to this transaction.
Then, for all three: Kotani Pay notifies you via your callbackUrl when the bank confirms — same event structure as mobile money. Poll for status if needed — Bank Checkout Deposit Status.
Card Deposit
1. Initiate the charge — call Card Deposit with yourcallbackUrl.
2. Handle 3DS if required. If the response includes a redirect URL, send the customer there to complete 3D Secure authentication before the charge can settle.
3. Kotani Pay notifies you via your callbackUrl when the charge settles.
4. Poll for status if needed — Card Deposit Status.
Monitoring from the Dashboard
- Log in to backoffice.kotanipay.com
- Use the country and currency selector to filter by market
- Navigate to Collections in the left sidebar
Successful deposits land in your deposit balance, not your payout balance. To use collected funds for withdrawals, transfer them to your payout balance first — see Balances & Settlement.