# API Overview Source: https://docs.niobi.co/api-reference/api-overview REST API for collecting payments, sending payouts, and managing multi-currency wallets across Africa and global corridors. Niobi's REST API gives you a single interface for collections, disbursements, and balance queries across 17+ African markets. ## Before You Begin Two requirements must be met before any API call will succeed in either environment: 1. **Whitelist your server IP.** Requests from non-whitelisted IPs are blocked before authentication is checked. See the [IP Whitelisting Guide](/ip-whitelisting). 2. **Sign every request.** Each call requires a unique HMAC signature computed from your credentials, timestamp, salt, and payload. Signatures cannot be reused. See the [Authentication Guide](/authentication/basics). ## Environments
Sandbox Development and Testing
[https://sandbox.users.niobi.co](https://sandbox.users.niobi.co)
Production Live Transactions
[https://users.niobi.co](https://users.niobi.co)
Both environments enforce IP whitelisting and signature validation independently. Credentials are not shared between environments. ## Endpoints Generate and verify the HMAC signature required on every request. Accept payments via mobile money, bank transfer, and payment links. Send payouts to mobile wallets and bank accounts across supported markets. Retrieve live wallet balances across all currencies in your account.
New to the API? Follow the Quickstart to make your first authenticated request.
Start Quickstart
# Generate Signature Source: https://docs.niobi.co/api-reference/authentication/generate-signature post /api/niobi-signature This endpoint is for integration with Niobi. It generates signature used in the requests. For the full signature generation walkthrough, including sandbox testing and backend signing, see the [Authentication Guide](/authentication/basics). # Verify Signature Source: https://docs.niobi.co/api-reference/authentication/verify-signature post /api/niobi-verify This endpoint verifies the signature of a request to ensure its integrity and authenticity. For the full signature verification walkthrough, including webhook callback validation, see the [Authentication Guide](/authentication/basics). # Unified Collections Source: https://docs.niobi.co/api-reference/collections/unified-collections post /api/v4/niobi-unified-collections One endpoint for all collection methods across all supported markets. Accepts mobile money, bank transfer, virtual accounts, and redirect-based rails through a single unified interface. Each request must carry a freshly generated signature, signatures cannot be reused across requests. Conditional `params` fields vary by payment method and country. See the [Collections Guide](/collecting-payments/basics) and [Payment Methods](/collecting-payments/methods) for the full field matrix per market. ### Integration Quick Reference | Requirement | Standard | Rule / Action | | :------------------------------------------------------------------------------------------ | :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | [**Settlement Rule**](/collecting-payments/basics#understanding-payment-steps-payment_step) | `payment_step: 2` only | Never credit goods or user accounts on `payment_step: 1` (initiation). Only credit upon receiving [payment\_step: 2](/collecting-payments/callbacks) with `status: "success"` (`statusCode: "000000"`). | | [**Signatures**](/authentication/signature-generation) | Fresh per request | Compute a fresh SHA-256 signature for every API call. Signatures cannot be reused. See [Signature Generation](/authentication/signature-generation). | | [**Amount Format**](/collecting-payments/basics#request-parameters) | Whole integers | Pass whole numbers in major currency units (for example, `1000` KES). No decimals allowed. | | [**Idempotency**](/idempotency) | Unique merchant ref | Pass a distinct `third_party_reference_1` per request to prevent duplicate charges. See the [Idempotency Guide](/idempotency). | | [**Delayed Webhook**](/transaction-status) | Query status | If a callback is delayed, query the [Get Transaction Status API](/transaction-status) before taking action. | | [**Sandbox Testing**](/testing) | Mapped test MSISDNs | Use designated [Sandbox Test Numbers](/testing) mapped to outcomes (success, timeout, failed) instead of real phone numbers. | | [**Production Prep**](/go-live-checklist) | Technical checklist | Verify public HTTPS `callback_url`, country limits, and credentials in the [Go-Live Checklist](/go-live-checklist#technical-checklist). | ## List of Supported Countries
| Country Id | Country | Code | Currency | Payment Methods | Status | | ---------- | ----------------------------------------- | ---- | -------- | ------------------------------ | ------ | | 1 | [Kenya](/countries/kenya) | 254 | KES | send money, Airtel | Active | | 2 | [Benin](/countries/benin) | 229 | XOF | Mtn, Moov | Active | | 3 | [Cote D'Ivoire](/countries/cote-d-ivoire) | 225 | XOF | Mtn,Orange, Moov, Wave | Active | | 4 | [Cameroon](/countries/cameroon) | 237 | XAF | Mtn, Orange | Active | | 5 | [DRC](/countries/drc) | 243 | CDF | Airtel, Orange, Vodacom | Active | | 8 | [Rwanda](/countries/rwanda) | 250 | RWF | Mtn, Airtel | Active | | 9 | [Senegal](/countries/senegal) | 221 | XOF | Orange, Free, Wave | Active | | 10 | [Tanzania](/countries/tanzania) | 255 | TZS | Airtel, Halotel, Tigo, Vodacom | Active | | 11 | [Uganda](/countries/uganda) | 256 | UGX | Mtn, Airtel | Active | | 12 | [Zambia](/countries/zambia) | 260 | ZMW | Mtn, Zamtel, Airtel | Active | | 13 | [Sierra Leone](/countries/sierra-leone) | 232 | SLE | Orange | Active | | 15 | [South Africa](/countries/south-africa) | 27 | ZAR | bank\_eft, capitec | Active | | 16 | [Ghana](/countries/ghana) | 233 | GHS | Mtn, At(AirtelTigo), Vodafone | Active | | 17 | [Nigeria](/countries/nigeria) | 234 | NGN | virtual\_account | Active | | 19 | [Burkina Faso](/countries/burkina-faso) | 226 | XOF | Orange, Moov | Active | | 18 | [Mali](/countries/mali) | 223 | XOF | Orange, Moov | Active | | 20 | [Togo](/countries/togo) | 228 | XOF | moov, tmoney | Active |
**Coming Soon** | Country | Code | Currency | Payment Methods | | ----------------------------------- | ---- | -------- | ----------------------- | | [Ethiopia](/countries/ethiopia) | 251 | ETB | teleBirr, mBirr | | [Malawi](/countries/malawi) | 265 | MWK | Airtel, tnm | | [Egypt](/countries/egypt) | 20 | EGP | Vodafone, Orange | | [Mozambique](/countries/mozambique) | 258 | MZN | Vodacom, Movitel, Tmcel | For NGN bank and virtual account deposits, the expected amount is processed and any overpayment is automatically reversed to the customer on successful deposit. Send exact amounts to prevent unnecessary reversals. ### NGN Virtual Account - Supported Bank Codes Pass one of the following codes as `bank_code` in your request to select the bank that will issue the virtual account. | Bank Code | Bank Name | | --------- | -------------------------- | | 17001 | 78 Finance Company Limited | | 17002 | Fidelity Bank Limited | | 17003 | Globus Bank Limited | For Senegal Orange deposits, the end user receives an SMS with a shortcode after the deposit is initiated. They dial the shortcode, triggering a USSD prompt where they input their PIN to approve the transaction. ### Special Collection Flows Some corridors don't follow the standard STK-push flow above: they require redirect URLs, customer national ID numbers, dynamic virtual bank accounts, or a secondary OTP verification step. For complete architectural walkthroughs, UX screenshots, and lifecycle diagrams, see: * [**Collection Methods Guide**](/collecting-payments/methods): Step-by-step guides for all payment collection channels. * [**Country Guides Index**](/supported-countries): Country-specific corridors, telco channel rules, and test MSISDNs. There is no `"eft"` payment method value. South African EFT collections use `payment_method_type: "bank_eft"`, shown below. `payment_method_type`: `"bank_eft"` Returns an `authorization_url` where the customer approves the payment directly with their bank (ABSA, FNB, Standard Bank, Nedbank, Investec, Bidvest, TymeBank). **Documentation & Guides:** * [Collection Methods: South Africa Bank EFT](/collecting-payments/methods#3-south-africa-bank-transfers--capitec-zar) * [South Africa Country Guide: Bank EFT Flow](/countries/south-africa#1-eft-bank-collections-payment_method_type-bank_eft) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "c6b98e1f5d6a7890bc4e123456789abcdef0123456789abcdef0123456789abc", "params": { "amount": 500, "currency": "ZAR", "country_id": 15, "mobile": "2763456789", "name": "John Doe", "bank_code": "0001", "payment_method_type": "bank_eft", "successful_url": "https://yourdomain.com/payment-success", "failure_url": "https://yourdomain.com/payment-failed", "callback_url": "https://yourdomain.com/niobi/callback", "third_party_reference_1": "ZAR-DEPOSIT-01" } } ``` **Initial Response:** Returns `"authorization_url": "https://..."` and `"payment_step": 1`. Redirect the customer to this URL. For a full walkthrough of redirect handling and bank selection, see the [South Africa Country Guide](/countries/south-africa). `payment_method_type`: `"capitec"` Capitec Bank collections authenticate directly against the payer's national identity. You must pass the customer's full 13-digit South African ID number in `params.id_number` (e.g. `"9001015800083"`) for the request to be valid. **Documentation & Guides:** * [Collection Methods: Capitec Collections](/collecting-payments/methods#3-south-africa-bank-transfers--capitec-zar) * [South Africa Country Guide: Capitec Pay](/countries/south-africa#2-capitec-collections-payment_method_type-capitec) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "c6b98e1f5d6a7890bc4e123456789abcdef0123456789abcdef0123456789abc", "params": { "amount": 500, "currency": "ZAR", "country_id": 15, "mobile": "2763456789", "name": "John Doe", "id_number": "9001015800083", "payment_method_type": "capitec", "successful_url": "https://yourdomain.com/payment-success", "failure_url": "https://yourdomain.com/payment-failed", "callback_url": "https://yourdomain.com/niobi/callback", "third_party_reference_1": "ZAR-CAPITEC-01" } } ``` `payment_method_type`: `"Wave"` Wave uses a redirect-based browser authorization flow, not a USSD push. You must include `successful_url` and `failure_url`. After initiating the collection, redirect the customer to the returned `authorization_url` to complete payment. **Documentation & Guides:** * [Collection Methods: Wave Flow & UI Walkthrough](/collecting-payments/methods#4-wave-collections-senegal--cote-divoire) * [Senegal Country Guide: Wave Checkout](/countries/senegal#2-wave-redirect-flow-payment_method_type-wave) * [Côte d'Ivoire Country Guide: Wave Collections](/countries/cote-d-ivoire#2-wave-redirect-flow-payment_method_type-wave) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "c6b98e1f5d6a7890bc4e123456789abcdef0123456789abcdef0123456789abc", "params": { "amount": 5000, "currency": "XOF", "country_id": 9, "mobile": "221763456789", "payment_method_type": "Wave", "successful_url": "https://yourdomain.com/checkout/success", "failure_url": "https://yourdomain.com/checkout/cancel", "callback_url": "https://yourdomain.com/niobi/callback", "third_party_reference_1": "WAVE-SN-001" } } ``` `payment_method_type`: `"Orange"` Orange payins in Côte d'Ivoire require a two-step OTP process instead of a single request. **Documentation & Guides:** * [Collection Methods: OTP-Verified Payins](/collecting-payments/methods#5-otp-verified-payins-cote-divoire-orange) * [Côte d'Ivoire Country Guide: Orange Money OTP](/countries/cote-d-ivoire#3-orange-money-otp-flow-payment_method_type-orange) **Step 1: Initiate.** Submit the collection request as usual. The customer receives an SMS OTP, and the response returns a `payment_token` instead of a terminal status: ```json theme={null} { "success": true, "message": "We've sent a verification prompt to your phone. Please approve it to complete your payment.", "data": { "status": "success", "amount": 2000, "currency": "XOF", "country_id": 3, "payment_token": "NIO-S0000001", "payment_step": 1 }, "status_code": "000000" } ``` **Step 2: Verify.** Collect the OTP from the customer and send a signed request to [`POST /api/v4/niobi-unified-process-transaction`](/api-reference/collections/verify-otp): ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "3a3cf7f2e3ff8d4ee991d7e1323312887dfda8536b8c2e197d0d4ef764013658", "params": { "otp": "000000", "payment_token": "NIO-S0000001" } } ``` In production, the OTP is valid for 2 minutes. In sandbox, use OTP `000000` to simulate successful verification. `payment_method_type`: `"virtual_account"` Generates a dedicated NGN virtual account for the customer to pay into. `account_name` is required. Pass a `bank_code` from the [NGN Virtual Account bank codes](#ngn-virtual-account---supported-bank-codes) above to choose the issuing bank; `first_name` and `last_name` are optional customer details. **Documentation & Guides:** * [Collection Methods: Dynamic Virtual Accounts](/collecting-payments/methods#2-dynamic-virtual-accounts-nigeria---ngn) * [Nigeria Country Guide: Dynamic Virtual Accounts](/countries/nigeria#deposits-collections-via-dynamic-virtual-accounts) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "account_name": "John Doe", "amount": 10000, "bank_code": "17001", "callback_url": "https://example.com/callback", "country_id": 17, "currency": "NGN", "first_name": "John", "last_name": "Doe", "mobile": "2349034567899", "payment_method_type": "virtual_account", "third_party_reference_1": "TX-COLL-1001", "third_party_reference_2": "CUST-501" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` **Response:** Returns `account_number` and `bank_name` for the generated virtual account, plus `"payment_step": 1`. Display these to the customer, this is the initial acknowledgement, not confirmation of payment. Await the terminal callback (`payment_step: 2`). See the full walkthrough in the [Nigeria Country Guide](/countries/nigeria). # Verify OTP Source: https://docs.niobi.co/api-reference/collections/verify-otp post /api/v4/niobi-unified-process-transaction Completes step 2 of the OTP-verified collection flow, currently required for Cote D'Ivoire Orange payins. Submit the OTP the customer received by SMS along with the `payment_token` returned from the initial [Unified Collections](/api-reference/collections/unified-collections) request. See the [OTP-Verified Payins guide](/collecting-payments/methods#5-otp-verified-payins-c%C3%B4te-divoire-orange) for the full two-step flow. This is step 2 of the OTP-verified collection flow. Step 1 is the standard [Unified Collections](/api-reference/collections/unified-collections) request, which returns a `payment_token` instead of a terminal status when OTP verification is required. See the [OTP-Verified Payins guide](/collecting-payments/methods#5-otp-verified-payins-c%C3%B4te-divoire-orange) for the full walkthrough. # Unified Disbursements Source: https://docs.niobi.co/api-reference/disbursement/unified-disbursement post /api/v4/niobi-unified-payments One endpoint for all disbursement methods across all supported markets. Sends payouts via mobile money, bank transfer, or other supported rails. Each request must carry a freshly generated signature, signatures cannot be reused across requests. See the [Making Payments Guide](/making-payments/basics) and [Payout Methods](/making-payments/methods) for the full field matrix per market. ### Integration Quick Reference | Requirement | Standard | Rule / Action | | :-------------------------------------------------------------------------------------- | :--------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [**Settlement Rule**](/making-payments/basics#understanding-payment-steps-payment_step) | `payment_step: 2` only | Funds remain in transit during `payment_step: 1`. Update your ledger and notify recipients only upon receiving [payment\_step: 2](/making-payments/callbacks) with `status: "success"` (`statusCode: "000000"`). | | [**Signatures**](/authentication/signature-generation) | Fresh per request | Compute a fresh SHA-256 signature for every API call. Signatures cannot be reused. See [Signature Generation](/authentication/signature-generation). | | [**Wallet Balance**](/api-reference/get-account-balance) | Available balance | Always check [`available_balance`](/api-reference/get-account-balance) (not total balance) before disbursing. See [Payout Best Practices](/making-payments/best-practices). | | [**Amount Format**](/making-payments/basics#request-parameters) | Whole integers | Pass whole numbers in major currency units (for example, `1000` KES). No decimals allowed. | | [**Idempotency**](/idempotency) | Unique payout ref | Pass a distinct `payment_reference` / `third_party_reference_1` per payout to prevent duplicate disbursements. See the [Idempotency Guide](/idempotency). | | [**Delayed Webhook**](/transaction-status) | Query status | If a callback is delayed, query the [Get Transaction Status API](/transaction-status) before re-attempting or failing a transfer. | | [**Sandbox Testing**](/testing) | Mapped test MSISDNs | Use designated [Sandbox Test Numbers](/testing) mapped to outcomes (success, invalid wallet, timeout) instead of real phone numbers. | | [**Production Prep**](/go-live-checklist) | Technical checklist | Fund your merchant payout wallet, verify public HTTPS callback URL, and review corridor limits in the [Go-Live Checklist](/go-live-checklist#technical-checklist). | ## List of Supported Countries
| Country Id | Country | Code | Currency | Payment Methods | Status | | ---------- | ----------------------------------------- | ---- | -------- | --------------------------------------------------- | ------ | | 1 | [Kenya](/countries/kenya) | 254 | KES | send money, pay bill, till number, pesalink, Airtel | Active | | 2 | [Benin](/countries/benin) | 229 | XOF | Mtn, Moov | Active | | 3 | [Cote D'Ivoire](/countries/cote-d-ivoire) | 225 | XOF | Mtn,Orange, Moov, Wave | Active | | 4 | [Cameroon](/countries/cameroon) | 237 | XAF | Mtn, Orange | Active | | 5 | [DRC](/countries/drc) | 243 | CDF | Airtel, Orange, Vodacom | Active | | 8 | [Rwanda](/countries/rwanda) | 250 | RWF | Mtn, Airtel | Active | | 9 | [Senegal](/countries/senegal) | 221 | XOF | Orange, Free, Wave | Active | | 10 | [Tanzania](/countries/tanzania) | 255 | TZS | Airtel, Halotel, Tigo, Vodacom | Active | | 11 | [Uganda](/countries/uganda) | 256 | UGX | Mtn, Airtel | Active | | 12 | [Zambia](/countries/zambia) | 260 | ZMW | Mtn, Zamtel, Airtel | Active | | 13 | [Sierra Leone](/countries/sierra-leone) | 232 | SLE | Orange | Active | | 15 | [South Africa](/countries/south-africa) | 27 | ZAR | bank | Active | | 16 | [Ghana](/countries/ghana) | 233 | GHS | Mtn, At(AirtelTigo), Vodafone | Active | | 17 | [Nigeria](/countries/nigeria) | 234 | NGN | bank | Active | | 19 | [Burkina Faso](/countries/burkina-faso) | 226 | XOF | Orange, Moov | Active | | 18 | [Mali](/countries/mali) | 223 | XOF | Orange, Moov | Active | | 20 | [Togo](/countries/togo) | 228 | XOF | moov, tmoney | Active |
**Coming Soon** | Country | Code | Currency | Payment Methods | | ----------------------------------- | ---- | -------- | ----------------------- | | [Ethiopia](/countries/ethiopia) | 251 | ETB | teleBirr, mBirr | | [Malawi](/countries/malawi) | 265 | MWK | Airtel, tnm | | [Egypt](/countries/egypt) | 20 | EGP | Vodafone, Orange | | [Mozambique](/countries/mozambique) | 258 | MZN | Vodacom, Movitel, Tmcel | ### List of Supported Kenyan Banks | bank\_name | niobi\_bank\_code | | --------------------------- | ----------------- | | Kenya Commercial Bank | 1 | | Standard Chartered | 2 | | Absa Bank Kenya | 3 | | Ncba Bank Kenya | 7 | | Prime Bank | 10 | | Cooperative Bank | 11 | | National Bank of Kenya | 12 | | Citibank N.A Kenya | 16 | | Middle East Bank Kenya | 18 | | Bank of Africa Kenya | 19 | | Credit Bank Limited | 25 | | CFC Stanbic Kenya | 31 | | Paramount Bank | 50 | | Jamii Bora Bank | 51 | | Guaranty Trust Bank | 53 | | Guardian Bank | 55 | | I\&M Bank | 57 | | Diamond Trust Bank | 63 | | Sidian Bank | 66 | | Equity Bank Kenya | 68 | | Family Bank Limited | 70 | | Gulf African Bank | 72 | | First Community Bank | 74 | | Kenya Women's Finance Trust | 78 | | Choice Microfinance Bank | 82 | ### List of Supported Nigerian Banks | bank\_name | bank\_code | | --------------------------------------------- | ---------- | | AL-Barakah Microfinance Bank | 090133 | | 9 Payment Service Bank | 120001 | | AB Microfinance Bank | 090270 | | Abbey Mortgage Bank | 070010 | | Above Only Microfinance Bank | 090260 | | ABU Microfinance Bank | 090197 | | Access Bank Nigeria | 044 | | Access Bank Plc (Diamond) | 063 | | ACCESS MOBILE | 323 | | Access Money | 927 | | Access Yello & Beta | 100052 | | Accion Microfinance Bank | 090134 | | Addosser Microfinance Bank | 090160 | | Adeyemi College Staff Microfinance Bank | 090268 | | AG Mortgage Bank | 100028 | | Al-Hayat Microfinance Bank | 090277 | | Alekun Microfinance Bank | 090259 | | Alert MFB | 090297 | | Allworkers Microfinance Bank | 090131 | | Alpha Kapital Microfinance Bank | 090169 | | AMJU Unique Microfinance Bank | 090180 | | AMML Micro-finance Bank | 914 | | Apeks Microfinance Bank | 090143 | | Arise MFB | 090282 | | Aso Savings and Loans | 401 | | Astrapolaris Microfinance Bank | 090172 | | Auchi Microfinance Bank | 090264 | | Baines Credit Microfinance Bank | 090188 | | Balogun Gambari MFB | 090326 | | Bayero MICROFINANCE BANK | 090316 | | BC Kash Microfinance Bank | 090127 | | BIPC MICROFINANCE BANK | 090336 | | BOCTrust Micro-finance Bank | 952 | | Bosak Microfinance Bank | 090176 | | Bowen Microfinance Bank | 090148 | | Brent Mortgage Bank | 070015 | | BRETHREN MICROFINANCE BANK | 090293 | | BRIDGEWAY MICROFINANCE BANK | 090393 | | Brightway MFB | 090308 | | Cellulant | 919 | | CEMCS Microfinance Bank | 090154 | | Chams Mobile | 929 | | Chikum Microfinance Bank | 090141 | | CIT Microfinance Bank | 090144 | | Citi Bank | 023 | | Consumer Microfinance Bank | 090130 | | Contec Global Infotech Limited (NowNow) | 100032 | | Coronation Merchant Bank | 559 | | Covenant Micro-finance Bank | 949 | | Credit Afrique Microfinance Bank | 090159 | | Daylight Microfinance Bank | 090167 | | e-Barcs Microfinance Bank | 090156 | | Eagle Flight MFB | 090294 | | Eartholeum | 935 | | Ecobank | 050 | | EcoBank Express Account | 922 | | Ecobank Mobile | 307 | | Edfin MFB | 090310 | | Ekondo MFB | 090097 | | Emeralds Microfinance Bank | 090273 | | Empire Trust Micro-finance Bank | 913 | | Enterprise Bank | 084 | | Esan Microfinance Bank | 090189 | | Eso-E Microfinance Bank | 090166 | | eTRANZACT | 920 | | Evangel MFB | 090304 | | Evergreen MICROFINANCE BANK | 090332 | | Eyowo MFB | 090328 | | FAST Microfinance Bank | 090179 | | FBN MOBILE | 309 | | FBN Mortgages Limited | 090107 | | FBNQuest Merchant Bank | 911 | | FCMB Easy Account | 100031 | | FCMB Plc | 214 | | FCT MFB | 090290 | | FEDERAL UNIVERSITY DUTSE MICROFINANCE BANK | 090318 | | FederalPoly NasarawaMFB | 090298 | | FETS | 915 | | FFS Microfinance Bank | 090153 | | Fidelity Bank | 070 | | Fidelity Mobile | 933 | | Fidfund Microfinance Bank | 090126 | | FINATRUST MICROFINANCE BANK | 090111 | | Firmus MFB | 090366 | | First Bank of Nigeria | 011 | | First Generation Mortgage Bank | 070014 | | First Multiple MFB | 090163 | | First Option MFB | 090285 | | First Royal Microfinance Bank | 090164 | | First Trust Mortgage Bank Plc | 910 | | FirstMonie Wallet | 928 | | FlutterWave Technology Solutions Limited | 110002 | | Fortis Micro-finance Bank | 948 | | Fortis Mobile | 930 | | FSDH Merchant Bank | 601 | | Fullrange Microfinance Bank | 090145 | | Futo Microfinance Bank | 090158 | | Gashua Microfinance Bank | 090168 | | Gateway Mortgage Bank | 070009 | | Globus Bank | 103 | | Glory MFB | 090278 | | GoMoney | 100022 | | GOODNEWS MICROFINANCE BANK | 090495 | | Gowans Microfinance Bank | 090122 | | GreenBank Microfinance Bank | 090178 | | Greenville Microfinance Bank | 090269 | | Greenwich Merchant Bank | 060004 | | Grooming Microfinance Bank | 090195 | | GT MOBILE | 923 | | GTBank Mobile Money | 315 | | GTBank Plc | 058 | | Hackman Microfinance Bank | 090147 | | Haggai Mortgage Bank Limited | 070017 | | Hala MFB | 090291 | | Hasal Micro-finance Bank | 958 | | Hedonmark | 931 | | Heritage Bank | 030 | | IBILE Microfinance Bank | 090118 | | IKENNE MFB | 090324 | | Ikire MFB | 090279 | | Imo State Microfinance Bank | 090258 | | Imperial Homes Mortgage Bank | 938 | | Infinity Microfinance Bank | 090157 | | Infinity Trust Mortgage Bank | 070016 | | Innovectives Kesh | 100029 | | Intellfin | 941 | | IRL Microfinance Bank | 090149 | | JAIZ Bank | 301 | | Jubliee Life | 906 | | Kadick Integration Limited | 110008 | | Kadpoly MICROFINANCE BANK | 090320 | | KCMB Microfinance Bank | 090191 | | Kegow | 100015 | | Keystone Bank | 082 | | Kontagora MFB | 090299 | | Kuda Micro-finance Bank | 50211 | | La Fayette Microfinance Bank | 090155 | | Lagos Building Investment Company | 070012 | | Lapo Microfinance Bank | 090177 | | Lavender Microfinance Bank | 090271 | | Letshego MFB | 090420 | | Lovonus Microfinance Bank | 090265 | | M36 | 100035 | | Mainland MICROFINANCE BANK | 090323 | | Mainstreet Micro-finance Bank | 014 | | Malachy Microfinance Bank | 090174 | | Manny Microfinance bank | 090383 | | MAUTECH Microfinance Bank | 090423 | | Mayfair MFB | 090321 | | MayFresh Mortgage Bank | 070019 | | Megapraise Microfinance Bank | 090280 | | Meridian MFB | 090275 | | Microcred Microfinance Bank | 090136 | | Midland Microfinance Bank | 090192 | | Mint-Finex Micro-finance Bank | 50304 | | Mkudi | 100011 | | Money Trust Micro-finance Bank | 963 | | MoneyBox | 934 | | Mutual Benefits Microfinance Bank | 090190 | | Mutual Trust Microfinance Bank | 090151 | | Nagarta Microfinance Bank | 090152 | | Navy Microfinance Bank | 090263 | | Ndiorah Microfinance Bank | 090128 | | New Dawn Microfinance Bank | 090205 | | New Prudential Bank | 090108 | | NIP Virtual Bank | 999999 | | NIRSAL Microfinance Bank | 090194 | | Nnew women MFB | 090283 | | Nova Merchant Bank | 637 | | NPF Micro-finance Bank | 947 | | Oche MFB | 090333 | | Ohafia Microfinance Bank | 090119 | | Okpoga Microfinance Bank | 090161 | | Olabisi Onabanjo University Microfinance Bank | 090272 | | Omiye MFB | 090295 | | Omoluabi Mortgage Bank Plc | 950 | | One Finance | 940 | | PAGA | 916 | | Page Micro-finance Bank | 951 | | PALMPAY | 100033 | | PARALLEX BANK | 526 | | Parkway | 311 | | ParkWay-ReadyCash | 917 | | Parralex Microfinance bank | 090004 | | PatrickGold Microfinance Bank | 090317 | | PayAttitude Online | 943 | | PAYCOM | 305 | | PecanTrust Microfinance Bank | 090137 | | Pennywise Microfinance Bank | 090196 | | Personal Trust Microfinance Bank | 090135 | | Petra Microfinance Bank | 090165 | | Pillar MFB | 090289 | | Platinum Mortgage Bank | 070013 | | Polaris Bank | 076 | | Polyuwanna MFB | 090296 | | Prestige Microfinance bank | 090274 | | Providus Bank | 101 | | Purplemoney MFB | 090303 | | Quickfund Microfinance Bank | 090261 | | Rahama MFB | 090170 | | Rand Merchant Bank | 502 | | Refuge Mortgage Bank | 070011 | | Regent Micro-finance Bank | 955 | | Reliance Microfinance Bank | 090173 | | RenMoney Microfinance Bank | 090198 | | Rephidim MICROFINANCE BANK | 090322 | | Richway Microfinance Bank | 090132 | | Royal Exchange Microfinance Bank | 090138 | | Rubies Micro-finance Bank | 125 | | Safe Haven MFB | 090286 | | SafeTrust | 909 | | Sagamu Micro-finance Bank | 966 | | Seed Capital Micro-finance Bank | 609 | | Sparkle | 090325 | | Stanbic IBTC @ease Wallet | 921 | | Stanbic IBTC Bank | 221 | | Stanbic Mobile | 304 | | Standard Chartered Bank | 068 | | Stanford Microfinance Bak | 090162 | | Stellas Microfinance Bank | 090262 | | Sterling Bank | 232 | | Sterling Mobile | 936 | | Sulsap MFB | 090305 | | Suntrust Bank Nigeria Limited | 100 | | TAGPAY | 937 | | Taj Bank | 302 | | TCF Micro-finance Bank | 567 | | Teasy MOBILE | 924 | | Titan Trust Bank | 102 | | Trident Microfinance Bank | 090146 | | Trust MFB | 090327 | | Trustbond Mortgage Bank | 090005 | | Trustfund Microfinance Bank | 090276 | | U AND C MFB | 090315 | | UNAAB MFB | 090331 | | Uniben Microfinance Bank | 090266 | | Unical Microfinance Bank | 090193 | | Union Bank | 032 | | United Bank for Africa | 033 | | Unity Bank | 215 | | UNN MFB | 090251 | | Verite Microfinance Bank | 090123 | | VFD Micro-finance Bank | 566 | | Virtue Microfinance Bank | 090150 | | Visa Microfinance Bank | 090139 | | VT Networks | 926 | | Wema Bank | 035 | | WetLand Micro-finance Bank | 954 | | Xslnce Microfinance Bank | 090124 | | Yes Microfinance Bank | 090142 | | Zenith Bank Plc | 057 | | ZENITH Mobile | 322 | | ZINTERNET - KONGAPAY | 939 | ### Special Disbursement Flows Some payout corridors require custom nested payload shapes (such as Kenya Paybill, Till Number, and PesaLink) or additional mandatory compliance details (such as Cameroon CEMAC sender identity). For complete architectural walkthroughs and country rules, see: * [**Payout Methods Guide**](/making-payments/methods): Step-by-step technical guides for all disbursement channels. * [**Country Guides Index**](/supported-countries): Country-specific payout corridors, network rules, and test numbers. `payment_method_type`: `"pay bill"` Disburse directly to an M-Pesa Paybill business number with an associated account reference. **Documentation & Guides:** * [Payout Methods: Kenya Paybill](/making-payments/methods#a-m-pesa-paybill-payouts) * [Kenya Country Guide: M-Pesa Paybill Payouts](/countries/kenya#payouts-disbursements) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 500, "currency": "KES", "country_id": 1, "first_name": "John", "last_name": "Doe", "payment_method_type": "pay bill", "payment_reference": "YOUR-PAYOUT-REF", "client_callback_url": "https://yourdomain.com/niobi/payout-callback", "third_party_reference_1": "TX-KES-PAYBILL-01", "paybill": [ { "paybill_number": "333111", "account_number": "00000000" } ] } } ``` `payment_method_type`: `"till number"` Disburse directly to an M-Pesa Buy Goods till merchant. **Documentation & Guides:** * [Payout Methods: Kenya Buy Goods Till](/making-payments/methods#b-m-pesa-till-number-buy-goods-payouts) * [Kenya Country Guide: Buy Goods Till Payouts](/countries/kenya#payouts-disbursements) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 500, "currency": "KES", "country_id": 1, "first_name": "John", "last_name": "Doe", "payment_method_type": "till number", "payment_reference": "YOUR-PAYOUT-REF", "client_callback_url": "https://yourdomain.com/niobi/payout-callback", "third_party_reference_1": "TX-KES-TILL-01", "tillnumber": [ { "till_number": "222750" } ] } } ``` `payment_method_type`: `"pesalink"` Real-time bank transfer to any commercial bank in Kenya. See [Supported Kenyan Banks](#list-of-supported-kenyan-banks) above for `bank_code` values. **Documentation & Guides:** * [Payout Methods: PesaLink Instant Bank Transfers](/making-payments/methods#c-pesalink-instant-bank-transfers) * [Kenya Country Guide: PesaLink Bank Transfers](/countries/kenya#payouts-disbursements) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "client_callback_url": "https://example.com/callback", "country_id": 1, "currency": "KES", "first_name": "John", "last_name": "Doe", "payment_method_type": "pesalink", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-KES-PESA-2002", "pesalink": [ { "bank_name": "Co-operative Bank", "bank_code": "11", "branch_name": "Nairobi", "account_name": "John Doe", "account_number": "123223837" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` `payment_method_type`: `"bank"` Direct bank disbursements to commercial and microfinance banks (e.g. Nigeria NUBAN, South Africa RTC/EFT, or International SWIFT/SEPA/Wire). **Documentation & Guides:** * [Payout Methods: Nigeria NGN Bank Payouts](/making-payments/methods#3-nigeria-ngn-bank-payouts) * [Nigeria Country Guide: Bank Payouts](/countries/nigeria#payouts-disbursements) * [South Africa Country Guide: Bank Payouts](/countries/south-africa#payouts-disbursements) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 5000, "currency": "NGN", "country_id": 17, "first_name": "John", "last_name": "Doe", "payment_method_type": "bank", "payment_reference": "YOUR-PAYOUT-REF", "client_callback_url": "https://yourdomain.com/niobi/payout-callback", "third_party_reference_1": "TX-NGN-DISB-1001", "bank": [ { "bank_name": "First Bank of Nigeria", "bank_code": "011", "branch_name": "Victoria Island", "account_name": "John Doe", "account_number": "0123456789" } ] } } ``` In accordance with CEMAC regional financial compliance regulations, all payouts in Cameroon (`country_id: 4`, currency `XAF`) require the identification details of the originating sender: `sender_firstname`, `sender_lastname`, and `sender_phone_number` (all required). **Documentation & Guides:** * [Payout Methods: Cameroon CEMAC Compliance](/making-payments/methods#4-cameroon-xaf-compliance-cemac-sender-information) * [Cameroon Country Guide: CEMAC Compliance Rules](/countries/cameroon#payouts-disbursements) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "d4e5f6a7b8c90123456789abcdef0123456789abcdef0123456789abcdef01", "params": { "amount": 10000, "currency": "XAF", "country_id": 4, "first_name": "Jean", "last_name": "Dupont", "mobile": "237791189789", "email": "jean.dupont@example.com", "city": "Yaounde", "sender_firstname": "John", "sender_lastname": "Doe", "sender_phone_number": "237690000000", "payment_method_type": "Orange", "Orange": [ { "phone_number": "237791189789" } ], "client_callback_url": "https://yourdomain.com/niobi/payout-callback", "payment_reference": "CAM-DISB-3001" } } ``` # Account Balance Source: https://docs.niobi.co/api-reference/get-account-balance post /api/v3/get-unified-balance Retrieve the live balance for a specific wallet and currency in your Niobi account. Returns total, available, on-hold, and unsettled balances. Each request must carry a freshly generated signature. See [Payout Best Practices](/making-payments/best-practices#1-merchant-wallet-balance-management-&-pre-check) for balance monitoring guidance. Generate a fresh `signature` for every request — signatures cannot be reused. # Get Transaction Status Source: https://docs.niobi.co/api-reference/get-transaction-status post /api/v3/get-unified-transaction-status Query the current status of a collection (payin) or disbursement (payout) using your own reference or Niobi's transaction reference. Use this to poll for a terminal status when a callback hasn't arrived yet, or to reconcile a transaction after the fact. See [Payout Best Practices](/making-payments/best-practices#2-the-double-verification-reconciliation-recipe-for-payouts) for the recommended reconciliation flow. Please ensure that a new `signature` is generated each time you create a transaction status request `id` accepts your own `third_party_reference_1`/`third_party_reference_2` supplied when you created the transaction, or the Niobi-generated `ref` returned in the original response, so you can query by whichever identifier you already have on hand. See [Payout Best Practices](/making-payments/best-practices#2-the-double-verification-reconciliation-recipe-for-payouts) for the recommended reconciliation flow when a callback hasn't arrived yet. # Create Payment Link Source: https://docs.niobi.co/api-reference/payment-links/create post /api/v3/payment-link-api/create Creates a payment link, and allows you to pass customer details, such as name, email, or phone number, so that the generated payment link is prefilled with this information. When shared with a customer, the link opens Niobi's [hosted checkout](/collecting-payments/methods#hosted-checkout) page, where they confirm their details and complete payment without you building any UI. Please make sure to generate a new `signature` whenever you are creating a new payment link request. You can pre-fill the payer's details on the link by passing `first_name`, `last_name`, `email`, and `phone` at creation time. When these are included, the customer's [hosted checkout](/collecting-payments/payment-links) page loads with their details already filled in, so they only need to pick a payment method and confirm. `currency_country_id` identifies the country of the payer (customer), based on the selected currency. It is used to support multi-country currency scenarios and ensures payments are routed correctly depending on the payer’s location. For backward compatibility, this field is optional; if omitted the system will infer the country from `currency` and `country_id` where possible. ## List of Supported Countries This endpoint covers every corridor available through the payment link API.
| ID | Country | Code | Currency | Payment Method type | Status | | -- | -------------- | ------ | --------- | ------------------------------------------- | ------------------------------- | | 1 | Kenya | 254 | KES | till number, pay bill, pesalink, send money | Active | | 2 | Benin | 229 | XOF | mtn | Active | | 3 | Cote D'Ivoire | 225 | XOF | mtn, Orange | Active | | 4 | Cameroon | 237 | XAF | mtn, Orange | Active | | 5 | DRC | 243 | CDF | Airtel, Orange, Vodacom | Active | | 7 | Malawi | 265 | MWK | Airtel, TNM | Coming Soon (Q3 2026) | | 8 | Rwanda | 250 | RWF | MTN MOMO, Airtel, eKash | Active | | 9 | Senegal | 221 | XOF | Orange, Free | Active | | 10 | Tanzania | 255 | TZS | Airtel, Halotel, Tigo | Active | | 11 | Uganda | 256 | UGX | mtn, Airtel | Active | | 12 | Zambia | 260 | ZMW | Zamtel, mtn | Active | | 13 | Sierra Leone | 232 | SLE | Orange | Active | | 15 | South Africa | 27 | ZAR | bank\_eft, capitec | Active | | 16 | Ghana | 233 | GHS | mtn, At(AirtelTigo), Vodafone | Active | | 17 | Nigeria | 234 | NGN | bank | Active | | 18 | Burkina Faso | 226 | XOF | Orange, Moov | Active | | 19 | Canada | 1 | CAD | SWIFT | Not Supported via Payment Links | | 20 | China | 86 | CNY | CNAP Payout, CNAP Payin, AliPay, WeChat Pay | Coming Soon (Q4 2026) | | 21 | Egypt | 20 | EGP | Vodafone Cash, Orange Cash, Etisalat Cash | Coming Soon (Q1 2027) | | 22 | Ethiopia | 251 | ETB | Tele-Birr, M-Birr | Coming Soon (Q1 2027) | | 23 | Europe | EU | EUR | SEPA | Not Supported via Payment Links | | 24 | Mali | 223 | XOF | Orange, Moov | Active | | 25 | Mozambique | 258 | MZN | Vodacom MPESA, Movitel, Tmcel, SIMO | Coming Soon (Q1 2027) | | 26 | Pakistan | 92 | PKR | SWIFT, Raast, JazzCash, Easypaisa | Coming Soon (Q4 2026) | | 27 | Stablecoins | CRYPTO | USDT/USDC | ERC20, TRC20, Polygon, Solana | Active | | 28 | Togo | 228 | XOF | Moov, T Money | Active | | 29 | UAE | 971 | AED | SWIFT | Not Supported via Payment Links | | 30 | United Kingdom | 44 | GBP | SWIFT, FPS | Coming Soon (Q4 2026) | | 31 | United States | 1 | USD | SWIFT, ACH, Fedwire | Coming Soon (Q4 2026) |
For Senegal Orange deposits, the end user receives an SMS with a shortcode after the deposit is initiated. They dial the shortcode, triggering a USSD prompt where they input their PIN to approve the transaction. # Get Payment Links Source: https://docs.niobi.co/api-reference/payment-links/list get /api/payment-link-api/list This endpoint allows you to access a list of all the payment links created under your Niobi account. # Authentication Basics Source: https://docs.niobi.co/authentication/basics Overview of Niobi's cryptographic request signing model, required credentials, signature generation options, and dynamic endpoint parameters. ## Overview To maintain the highest level of security and data integrity across all transactions, Niobi requires **cryptographic request signing** for all API communication. Unlike APIs that use static API tokens or reusable session headers, **every individual request sent to any Niobi endpoint must be signed uniquely**. Because each signature is cryptographically computed from the request's exact timestamp, a random salt, and the specific payload parameters (`params`), **signatures cannot be reused across multiple requests**. If any parameter changes, or when initiating a new transaction, a fresh signature must be generated. ```mermaid theme={null} %%{init: {'themeVariables': {'fontSize': '23px', 'actorBorder': '#0D9373', 'actorLineColor': '#0D9373', 'signalColor': '#0D9373', 'noteBorderColor': '#0D9373'}, 'sequence': {'width': 220, 'height': 95, 'actorMargin': 80, 'messageMargin': 60, 'boxMargin': 18, 'noteMargin': 18}}}%% sequenceDiagram autonumber participant Merchant as Your Server participant Niobi as Niobi API Note over Merchant: 1. Assemble endpoint params, timestamp, and salt
2. Compute unique signature with Secret Key
3. Ensure Secret Key is not in final request Merchant->>Niobi: Send signed request envelope (client_id, sender, signature, params) Note over Niobi: Look up Secret Key for client_id
Recalculate signature for this specific payload alt Signature matches Niobi-->>Merchant: 200 OK (payment initiated / processed) else Signature mismatch Niobi-->>Merchant: 403 Forbidden (request not verified) end ``` **Pre-requisite: IP Whitelisting**\ Before sending any API requests to Niobi servers or endpoints (in Sandbox or Production), your server's outgoing public IP address must be whitelisted in the Niobi Dashboard under **Workspace -> IP Whitelisting**. Requests sent from non-whitelisted IPs will be blocked. See our [IP Whitelisting Guide](/ip-whitelisting) for setup steps. *** ## API Environments & Base URLs Niobi provides dedicated Sandbox and Production environments. Configure your API client with the appropriate base URL: | Environment | Base URL | Purpose | | :------------- | :------------------------------- | :----------------------------------------------------- | | **Sandbox** | `https://sandbox.users.niobi.co` | Development, testing, and simulator verification. | | **Production** | `https://users.niobi.co` | Live transaction processing and real money settlement. | Prepend the appropriate base URL to all endpoint paths described in the documentation (e.g. `https://sandbox.users.niobi.co/api/v4/niobi-unified-collections` for sandbox testing). *** ## Core Credentials When you create an API integration in your Niobi Dashboard (under [**Workspace -> Integrations**](/getting-credentials)), you will receive three credentials: | Credential | Field in Payload | Requirement | Description | | :-------------------- | :------------------------------- | :---------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------- | | **Client ID** | `client_id` | **Required** in every API request | The unique identifier assigned to your integration in the Niobi Dashboard. Identifies your merchant account. | | **Integration Title** | `sender` | **Required** in every API request | The exact name you gave to your integration when setting it up in the dashboard. Identifies the integration entity. | | **Secret Key** | `senderKey` *(used for signing)* | **Required for signing only** (Do not transmit) | Your private cryptographic key used on your backend server to compute the SHA-256 signature. **Never include this key in your final API request.** | **Need to generate your API credentials first?**\ If you have not created an integration in your dashboard yet, follow our step-by-step walkthrough in [Getting Your API Credentials](/getting-credentials) (includes UI video guide and key security practices) before proceeding with signature generation. **Never expose your Secret Key in client-side code** (such as React, Vue, iOS, or Android apps) or send it in raw HTTP requests. Request signing must always occur on your secure backend server. *** ## How Credentials and Request Parameters (`params`) Connect Whenever your system interacts with a Niobi endpoint (for example, collecting a payment or initiating a payout): 1. **Package Target Parameters**: Place all the specific fields required by that destination endpoint inside a nested `"params": { ... }` object (such as `amount`, `currency`, `mobile`, `payment_method_type`, etc.). 2. **Attach Authentication Metadata**: Bundle `params` with your integration credentials (`client_id`, `sender`), the UNIX `timestamp` (in seconds) at the time of signing, and a random `salt` (a unique string generated on your server as an additional layer of security and entropy). 3. **Generate the Signature**: Sign that specific combination using your private Secret Key (either [in your code](/authentication/signature-generation#method-1-in-code) or via the [Niobi Signature Generation API](/authentication/signature-generation#method-2-signature-api)). 4. **Dispatch the Request**: Send the signed envelope to the destination endpoint. Niobi recalculates the hash and confirms that the payload was created by you and has not been altered in transit. *** ## Two Ways to Generate Signatures Niobi gives you two flexible ways to generate request signatures: Implement our deterministic SHA-256 signing algorithm in your backend (Node.js, Python, PHP, Java, Go, etc.). Zero extra network latency. Call Niobi's dedicated `POST /api/niobi-signature` endpoint to automatically generate and return a signed payload. Ideal for rapid prototyping and Postman testing. *** ## Response & Callback Verification Security is bidirectional. When Niobi sends a synchronous response or an asynchronous webhook callback to your server, the payload includes a `signature` computed by Niobi. You can verify this signature on your server to guarantee that the incoming callback genuinely originated from Niobi and was not intercepted or altered in transit. Detailed steps are covered in [Response Signature Verification](/authentication/signature-generation#verifying-response-signatures). *** ## Next Steps Follow these two guides in order to complete your integration:
Step 1

How to Create the Signature

Implement the SHA-256 algorithm in code or use the Niobi Signature Generation API to compute your hash.

Step 2

How to Pass Signature in Requests

Bundle your signature with endpoint parameters into the signed request envelope.

# How to Pass the Signature in Requests Source: https://docs.niobi.co/authentication/passing-signature How to structure signed JSON request envelopes, configure HTTP headers, pass dynamic endpoint parameters, and avoid 403 verification errors. ## Overview Once you have generated your signature, either locally via [the SHA-256 algorithm](/authentication/signature-generation#method-1-in-code) or using the [Niobi Signature Generation API](/authentication/signature-generation#method-2-signature-api), the final step is formatting and dispatching the HTTP request. Every Niobi API request follows a standardized **envelope structure** that bundles your authentication metadata with your specific payment parameters. **Pre-requisite: IP Whitelisting**\ Before sending any API requests to Niobi servers or endpoints (in Sandbox or Production), your server's outgoing public IP address must be whitelisted in the Niobi Dashboard under **Workspace -> IP Whitelisting**. Requests sent from non-whitelisted IPs will be blocked. See our [IP Whitelisting Guide](/ip-whitelisting) for setup steps. *** ## Request Envelope Structure Every signed request to Niobi contains two tiers: 1. **Root-Level Authentication Metadata**: Identifies your integration, timestamp, salt, and cryptographic signature. 2. **Nested `params` Object**: Contains **whatever specific parameters are required by the destination endpoint** you are invoking. ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_string", "signature": "c6b98e1f5d6a7890bc4e123456789abcdef0123456789abcdef0123456789abc", "params": { /* Destination endpoint-specific parameters go here */ } } ``` ### Root Fields Specification | Field | Type | Required | Description | | :---------- | :------------------- | :------- | :------------------------------------------------------------------------------------------------------------------------ | | `client_id` | `string` | **Yes** | The unique identifier assigned to your integration in the Niobi Dashboard. | | `sender` | `string` | **Yes** | The exact name of your integration entity as created in the dashboard. | | `timestamp` | `integer` / `string` | **Yes** | The exact UNIX timestamp (in seconds) used when the request was signed. | | `salt` | `string` | **Yes** | A unique random string generated on your server providing an additional layer of security and entropy. | | `signature` | `string` | **Yes** | 64-character hexadecimal SHA-256 hash computed using your Secret Key (or returned by the Niobi Signature Generation API). | | `params` | `object` | **Yes** | The nested parameters required by the specific target endpoint. | **The `params` Object is Dynamic:**\ The outer fields (`client_id`, `sender`, `timestamp`, `salt`, `signature`) never change between endpoints. But the contents of `"params": { ... }` change to match the schema of the endpoint you are calling. *** ## Complete Request Examples Across Endpoints **Endpoint:** `POST /api/v4/niobi-unified-collections` ```json theme={null} { "client_id": "client_id", "sender": "Integration_name", "timestamp": 1724835600, "salt": "salt_value", "signature": "c6b98e1f5d6a7890bc4e123456789abcdef0123456789abcdef0123456789abc", "params": { "amount": 10000, "currency": "KES", "country_id": 1, "mobile": "254161166649", "payment_method_type": "send money", "callback_url": "https://yourdomain.com/callbacks", "third_party_reference_1": "TX-COLL-001", "third_party_reference_2": "CUST-450" } } ``` [View Unified Collections API Reference ->](/api-reference/collections/unified-collections) **Endpoint:** `POST /api/v4/niobi-unified-payments` ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_67890", "signature": "e5f6a7b8c90123456789abcdef0123456789abcdef0123456789abcdef012345", "params": { "amount": 5000, "currency": "KES", "country_id": 1, "payment_method_type": "send money", "payment_reference": "PAYOUT-REF-1001", "first_name": "Jane", "last_name": "Doe", "mobile": "254647647649", "email": "jane.doe@example.com", "city": "Nairobi", "postal_code": "00100", "address": "Kilimani, Nairobi", "client_callback_url": "https://yourdomain.com/payout-callbacks", "third_party_reference_1": "PAYOUT-REF-1001", "third_party_reference_2": "BATCH-AUG", "sendmoney": [ { "phone_number": "254647647649" } ], "sub_merchant_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6" } } ``` [View Unified Payments API Reference ->](/api-reference/disbursement/unified-disbursement) *** ## Sub-Merchant Parameter Placement If you are operating multiple distinct brands or merchants under one master account: * Pass the approved sub-merchant UUID in `params.sub_merchant_id`. * The `sub_merchant_id` field **must be included in the pre-signature object** when generating the signature (either in code or via the Niobi Signature Generation API) so that the hash remains valid. * For more information on creating and managing sub-merchants, see [Sub-Merchant Management](/submerchant/sub-merchant-management). *** ## Common Pitfalls & How to Avoid Them **Error:** Security hazard and potential rejection.\ **Fix:** The `senderKey` is strictly used on your server to compute the SHA-256 hash. Always delete `senderKey` before sending the payload over the wire. **Error:** `403 - Request was not verified`.\ **Fix:** If any field in `params` or the root envelope changes (e.g. updating an amount or reference), the signature must be recomputed. **Error:** Signature mismatch on the server.\ **Fix:** When stringifying the pre-signature object, ensure `callback_url` remains unencoded (e.g. `https://yourdomain.com/callback` rather than `https%3A%2F%2F...`). **Error:** Signature mismatch.\ **Fix:** Ensure parameter types remain consistent (e.g. if `amount` is a number `10000`, do not send `"10000"` as a string). **Error:** Request blocked or connection refused.\ **Fix:** Ensure your server's outgoing public IP address is whitelisted in your Niobi Dashboard under **Workspace -> IP Whitelisting**. See our [IP Whitelisting Guide](/ip-whitelisting). **Error:** `403 - Request was not verified`.\ **Fix:** Trailing or leading whitespace can occur on your credentials (`client_id`, `sender`, `senderKey`) when copied from the dashboard, as well as on string parameter values inside `params` (e.g. `callback_url`, `mobile`, `email`, `payment_reference`). Always trim string values across all fields before computing the hash to prevent signature mismatches. *** ## Next Steps You are now ready to make authenticated API requests:
Payin

Collecting Payments

Learn how to initiate collections across mobile money, cards, and bank transfers.

Payout

Making Payments

Learn how to initiate disbursements and payouts across 17+ African markets.

# How to Create the Signature Source: https://docs.niobi.co/authentication/signature-generation Step-by-step guide to generating signatures by implementing the SHA-256 algorithm in code (Node.js, Python, PHP) or using Niobi's Signature Generation API. ## Overview Niobi supports two methods for generating request signatures: 1. **In Code (Custom Implementation)**: Run our deterministic SHA-256 signing algorithm directly on your backend server. Recommended for production. 2. **Via the Niobi Signature Generation API (`POST /api/niobi-signature`)**: Call Niobi's helper endpoint to automatically compute and return the signed payload. **Important: `params` contains whatever the destination endpoint requires**\ In both methods, the inner `"params": { ... }` object is dynamic. It is not limited to a fixed set of fields; it must contain **whatever specific parameters are required by the target API endpoint** you are invoking (e.g., Collections parameters for collections or Payout parameters for disbursements). *** ## Method 1: The Request Signing Algorithm (In Code) For production environments where you want to minimize network latency and generate signatures entirely within your backend infrastructure, implement the following 10-step algorithm: 1. **Obtain Credentials**: Log into your Niobi Dashboard, navigate to [**Workspace -> Integrations**](/getting-credentials), and create an integration entity. Note your `client_id`, `sender` (integration title), and `senderKey` (Secret Key). 2. **Assemble the Pre-Signing Object**: Create a JSON object containing your target endpoint parameters inside a nested `params` object, along with your metadata fields: | Field | Requirement | Description | | :---------- | :---------------------------- | :------------------------------------------------------------------ | | `client_id` | **Required** | Your integration Client ID from the dashboard. | | `sender` | **Required** | Your exact integration title from the dashboard. | | `senderKey` | **Required for signing only** | Your private Secret Key (must be deleted before HTTP transmission). | | `timestamp` | **Required** | The UNIX timestamp (in seconds) at the time the request is signed. | | `salt` | **Required** | Random entropy string generated on your server. | | `params` | **Required** | Object holding the target endpoint's parameter payload. | ```json theme={null} { "sender": "Integration_title", "timestamp": 1724835600, "salt": "random_salt_value", "client_id": "your_client_key_here", "senderKey": "your_secret_key_here", "params": { "amount": 10000, "currency": "KES", "country_id": 1, "mobile": "254161166649", "payment_method_type": "send money", "callback_url": "https://yourdomain.com/niobi/callback", "third_party_reference_1": "REF-001", "third_party_reference_2": "REF-002" } } ``` 3. **Add a Salt (`salt`)**: Provide your own random string (for example, 16 to 32 alphanumeric characters). This is not provided by Niobi; it is an additional security and entropy layer you control on your server to guarantee that every payment request produces a unique signature. 4. **Include Client ID & Secret Key**: Set `"client_id"` with your integration's Client ID. **Temporarily** add your private Secret Key as `"senderKey"`. 5. **Add Integration Title (`sender`)**: Pass the exact integration name registered in your dashboard as `"sender"`. 6. **Sort Alphabetically (Recursive K-Sort)**: Sort all keys alphabetically in ascending order, applying the sort recursively for nested objects (such as `params`). 7. **Stringify Key-Value Pairs**: Convert the sorted structure into a single string formatted as `key=value`, concatenated with `&`. Nested properties are represented using dot notation (e.g. `params.amount=10000`). **Important URL Formatting**: The `callback_url` (or `client_callback_url`) must **not** be URL-encoded in the stringified hash representation. For example: `...¶ms.callback_url=https://yourdomain.com/niobi/callback&...` 8. **Hash the String with SHA-256**: Apply the SHA-256 hashing algorithm to the concatenated string. This produces a 64-character hexadecimal hash string. 9. **Attach the Signature**: Insert the resulting hash into the root JSON object as the `"signature"` field. 10. **Remove the Secret Key (`senderKey`)**: Delete the `"senderKey"` field from the payload completely before dispatching the request over the network. **Watch Out for Whitespace & Trailing Spaces:**\ Ensure that your credentials (`client_id`, `senderKey`, `sender`) and string parameter values do not contain inadvertent leading or trailing whitespace, newlines, or extra spaces. A single accidental trailing space when copying a key will alter the computed hash and cause your request to fail with a `403 Request was not verified` error. We recommend trimming all string values before hashing. *** ## Detailed Payload Walkthrough ### 1. Before Signing (Pre-Signature Payload) ```json theme={null} { "sender": "Integration_title", "timestamp": 1724835600, "salt": "random_salt_value", "client_id": "your_client_key_here", "senderKey": "your_secret_key_here", "params": { "amount": 10, "city": "Nairobi", "client_callback_url": "https://your-domain.com/niobi/result", "country": "KEN", "currency": "KES" } } ``` ### 2. Flattened, Sorted and Stringified Format ``` client_id=your_client_key_here¶ms.amount=10¶ms.city=Nairobi¶ms.client_callback_url=https://your-domain.com/niobi/result¶ms.country=KEN¶ms.currency=KES&salt=random_salt_value&sender=Integration_title&senderKey=your_secret_key_here×tamp=1724835600 ``` ### 3. Final Signed Request Payload (Ready to Send to the Matching API Endpoint) ```json theme={null} { "sender": "Integration_title", "timestamp": 1724835600, "salt": "random_salt_value", "client_id": "your_client_key_here", "params": { "amount": 10, "city": "Nairobi", "client_callback_url": "https://your-domain.com/niobi/result", "country": "KEN", "currency": "KES" }, "signature": "219d12d1b0b9c8e66e84ee08cefafe05eaad68745a9e82cbcbc153131333c640" } ``` *** ## Implementation Code Examples ```javascript theme={null} const crypto = require('crypto'); function recursiveSort(value) { if (Array.isArray(value)) { return value.map(recursiveSort); } if (value !== null && typeof value === 'object') { const sorted = {}; for (const key of Object.keys(value).sort()) { sorted[key] = recursiveSort(value[key]); } return sorted; } return value; } function stringifyValue(value) { if (typeof value === 'boolean') return value ? '1' : ''; if (value === null || value === undefined) return ''; if (typeof value === 'string') return value.trim(); return String(value); } function convertToQueryString(value, parentKey = null) { let entries; if (Array.isArray(value)) { entries = value.map((v, i) => [i, v]); } else if (value !== null && typeof value === 'object') { entries = Object.entries(value); } else { return stringifyValue(value); } const parts = entries.map(([key, subValue]) => { const currentKey = parentKey !== null ? `${parentKey}.${key}` : String(key); if (subValue !== null && typeof subValue === 'object') { return convertToQueryString(subValue, currentKey); } return `${currentKey}=${stringifyValue(subValue)}`; }); return parts.join('&'); } function signRequest(payload, secretKey) { // 1. Create a clone and inject senderKey temporarily const prePayload = { ...payload, senderKey: secretKey.trim() }; // 2. Sort keys recursively, then flatten into the key=value string const sortedPayload = recursiveSort(prePayload); const queryString = convertToQueryString(sortedPayload); // 3. Compute SHA-256 hash const signature = crypto .createHash('sha256') .update(queryString) .digest('hex'); // 4. Return final payload without senderKey const finalPayload = { ...payload, signature }; return finalPayload; } // Example Usage: params contains whatever is needed for your target endpoint. // Method arrays (e.g. sendmoney) are flattened by index, not JSON-stringified: // this becomes params.sendmoney.0.phone_number=254647647649. const requestPayload = { client_id: "YOUR_CLIENT_ID", sender: "MyIntegration", salt: "random_salt_12345", timestamp: Math.floor(Date.now() / 1000), params: { amount: 10000, currency: "KES", country_id: 1, payment_method_type: "send money", callback_url: "https://example.com/callback", third_party_reference_1: "REF-001", third_party_reference_2: "REF-002", sendmoney: [ { phone_number: "254647647649" } ] } }; const signedPayload = signRequest(requestPayload, "YOUR_SECRET_KEY"); console.log(JSON.stringify(signedPayload, null, 2)); ``` ```python theme={null} import hashlib import json import time def recursive_ksort(value): if isinstance(value, dict): return {k: recursive_ksort(value[k]) for k in sorted(value.keys())} if isinstance(value, list): return [recursive_ksort(v) for v in value] return value def stringify_value(value) -> str: if isinstance(value, bool): return '1' if value else '' if value is None: return '' if isinstance(value, str): return value.strip() return str(value) def convert_to_query_string(value, parent_key=None) -> str: if isinstance(value, dict): items = list(value.items()) elif isinstance(value, list): items = list(enumerate(value)) else: return stringify_value(value) parts = [] for key, sub_value in items: current_key = f"{parent_key}.{key}" if parent_key is not None else str(key) if isinstance(sub_value, (dict, list)): parts.append(convert_to_query_string(sub_value, current_key)) else: parts.append(f"{current_key}={stringify_value(sub_value)}") return "&".join(parts) def sign_request(payload: dict, secret_key: str) -> dict: pre_payload = dict(payload) pre_payload["senderKey"] = secret_key.strip() # Sort keys recursively, then flatten into the key=value string sorted_payload = recursive_ksort(pre_payload) query_string = convert_to_query_string(sorted_payload) # Compute SHA-256 hash signature = hashlib.sha256(query_string.encode('utf-8')).hexdigest() # Build final payload without senderKey final_payload = dict(payload) final_payload["signature"] = signature return final_payload # Example Usage: params contains whatever is needed for your target endpoint. # Method arrays (e.g. sendmoney) are flattened by index, not JSON-encoded: # this becomes params.sendmoney.0.phone_number=254647647649. payload = { "client_id": "YOUR_CLIENT_ID", "sender": "MyIntegration", "salt": "random_salt_12345", "timestamp": int(time.time()), "params": { "amount": 10000, "currency": "KES", "country_id": 1, "payment_method_type": "send money", "callback_url": "https://example.com/callback", "third_party_reference_1": "REF-001", "third_party_reference_2": "REF-002", "sendmoney": [ {"phone_number": "254647647649"} ] } } signed_request = sign_request(payload, "YOUR_SECRET_KEY") print(json.dumps(signed_request, indent=2)) ``` ```php theme={null} $value) { $currentKey = $parentKey !== null ? $parentKey . '.' . $key : (string) $key; if (is_array($value)) { $parts[] = convertToQueryString($value, $currentKey); } else { $parts[] = $currentKey . '=' . stringifyValue($value); } } return implode('&', $parts); } function signRequest(array $payload, string $secretKey): array { $prePayload = $payload; $prePayload['senderKey'] = trim($secretKey); recursiveKsort($prePayload); $queryString = convertToQueryString($prePayload); $signature = hash('sha256', $queryString); $finalPayload = $payload; $finalPayload['signature'] = $signature; return $finalPayload; } // Example Usage: params contains whatever is needed for your target endpoint. // Method arrays (e.g. sendmoney) are flattened by index, not JSON-encoded: // this becomes params.sendmoney.0.phone_number=254647647649. $requestPayload = [ 'client_id' => 'YOUR_CLIENT_ID', 'sender' => 'MyIntegration', 'salt' => 'random_salt_12345', 'timestamp' => time(), 'params' => [ 'amount' => 10000, 'currency' => 'KES', 'country_id' => 1, 'payment_method_type' => 'send money', 'callback_url' => 'https://example.com/callback', 'third_party_reference_1' => 'REF-001', 'third_party_reference_2' => 'REF-002', 'sendmoney' => [ ['phone_number' => '254647647649'] ] ] ]; $signed = signRequest($requestPayload, 'YOUR_SECRET_KEY'); echo json_encode($signed, JSON_PRETTY_PRINT); ``` ```java theme={null} import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; public class NiobiSignature { private static String stringifyValue(Object value) { if (value == null) return ""; if (value instanceof Boolean) return ((Boolean) value) ? "1" : ""; if (value instanceof String) return ((String) value).trim(); return String.valueOf(value); } @SuppressWarnings("unchecked") private static String convertToQueryString(Object value, String parentKey) { List> entries = new ArrayList<>(); if (value instanceof Map) { List keys = new ArrayList<>(((Map) value).keySet()); Collections.sort(keys); for (String key : keys) { entries.add(new AbstractMap.SimpleEntry<>(key, ((Map) value).get(key))); } } else if (value instanceof List) { List list = (List) value; for (int i = 0; i < list.size(); i++) { entries.add(new AbstractMap.SimpleEntry<>(String.valueOf(i), list.get(i))); } } else { return stringifyValue(value); } List parts = new ArrayList<>(); for (Map.Entry entry : entries) { String currentKey = (parentKey == null || parentKey.isEmpty()) ? entry.getKey() : parentKey + "." + entry.getKey(); Object subValue = entry.getValue(); if (subValue instanceof Map || subValue instanceof List) { // Recurse into BOTH maps and lists the same way. An empty // map/list contributes an empty string here, not "[]" or "key=". parts.add(convertToQueryString(subValue, currentKey)); } else { parts.add(currentKey + "=" + stringifyValue(subValue)); } } return String.join("&", parts); } public static String generateSignature(Map payload, String secretKey) throws NoSuchAlgorithmException { // 1. Clone payload and temporarily attach secret key Map prePayload = new LinkedHashMap<>(payload); prePayload.put("senderKey", secretKey.trim()); // 2. Sort keys recursively, then flatten into the key=value string String queryString = convertToQueryString(prePayload, null); // 3. Compute SHA-256 hash MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest(queryString.getBytes(StandardCharsets.UTF_8)); StringBuilder hexString = new StringBuilder(); for (byte b : hash) { String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) hexString.append('0'); hexString.append(hex); } return hexString.toString(); } public static void main(String[] args) throws Exception { // Method arrays (e.g. sendmoney) are flattened by index, not // stringified: this becomes params.sendmoney.0.phone_number=254647647649. Map sendMoneyEntry = new LinkedHashMap<>(); sendMoneyEntry.put("phone_number", "254647647649"); Map params = new LinkedHashMap<>(); params.put("amount", 10000); params.put("currency", "KES"); params.put("country_id", 1); params.put("payment_method_type", "send money"); params.put("callback_url", "https://example.com/callback"); params.put("third_party_reference_1", "REF-001"); params.put("third_party_reference_2", "REF-002"); params.put("sendmoney", Collections.singletonList(sendMoneyEntry)); Map payload = new LinkedHashMap<>(); payload.put("client_id", "YOUR_CLIENT_ID"); payload.put("sender", "MyIntegration"); payload.put("salt", "random_salt_12345"); payload.put("timestamp", System.currentTimeMillis() / 1000L); payload.put("params", params); String signature = generateSignature(payload, "YOUR_SECRET_KEY"); payload.put("signature", signature); System.out.println("Generated Signature: " + signature); } } ``` ```go theme={null} package main import ( "crypto/sha256" "encoding/hex" "encoding/json" "fmt" "sort" "strconv" "strings" "time" ) func stringifyValue(value interface{}) string { if value == nil { return "" } switch v := value.(type) { case bool: if v { return "1" } return "" case string: return strings.TrimSpace(v) default: return fmt.Sprintf("%v", v) } } func isContainer(value interface{}) bool { switch value.(type) { case map[string]interface{}, []interface{}: return true default: return false } } func convertToQueryString(value interface{}, parentKey string) string { switch v := value.(type) { case map[string]interface{}: keys := make([]string, 0, len(v)) for k := range v { keys = append(keys, k) } sort.Strings(keys) parts := make([]string, 0, len(keys)) for _, k := range keys { currentKey := k if parentKey != "" { currentKey = parentKey + "." + k } subValue := v[k] if isContainer(subValue) { // Recurse into BOTH maps and slices the same way. An empty // map/slice contributes an empty string here, not "[]" or "key=". parts = append(parts, convertToQueryString(subValue, currentKey)) } else { parts = append(parts, currentKey+"="+stringifyValue(subValue)) } } return strings.Join(parts, "&") case []interface{}: parts := make([]string, 0, len(v)) for i, item := range v { currentKey := strconv.Itoa(i) if parentKey != "" { currentKey = parentKey + "." + currentKey } if isContainer(item) { parts = append(parts, convertToQueryString(item, currentKey)) } else { parts = append(parts, currentKey+"="+stringifyValue(item)) } } return strings.Join(parts, "&") default: return stringifyValue(value) } } func SignRequest(payload map[string]interface{}, secretKey string) string { prePayload := make(map[string]interface{}, len(payload)+1) for k, v := range payload { prePayload[k] = v } prePayload["senderKey"] = strings.TrimSpace(secretKey) // Sort keys recursively (inline, at each level) and flatten into the // key=value string in the same pass. queryString := convertToQueryString(prePayload, "") hash := sha256.Sum256([]byte(queryString)) return hex.EncodeToString(hash[:]) } func main() { // Method arrays (e.g. sendmoney) are flattened by index, not // JSON-marshaled: this becomes params.sendmoney.0.phone_number=254647647649. params := map[string]interface{}{ "amount": 10000, "currency": "KES", "country_id": 1, "payment_method_type": "send money", "callback_url": "https://example.com/callback", "third_party_reference_1": "REF-001", "third_party_reference_2": "REF-002", "sendmoney": []interface{}{ map[string]interface{}{"phone_number": "254647647649"}, }, } payload := map[string]interface{}{ "client_id": "YOUR_CLIENT_ID", "sender": "MyIntegration", "salt": "random_salt_12345", "timestamp": time.Now().Unix(), "params": params, } signature := SignRequest(payload, "YOUR_SECRET_KEY") payload["signature"] = signature out, _ := json.MarshalIndent(payload, "", " ") fmt.Println(string(out)) } ``` ```csharp theme={null} using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Text.Json; public class NiobiSignature { private static string StringifyValue(object value) { if (value == null) return ""; if (value is bool b) return b ? "1" : ""; if (value is string s) return s.Trim(); return Convert.ToString(value, System.Globalization.CultureInfo.InvariantCulture); } private static bool IsContainer(object value) => value is IDictionary || value is IEnumerable; private static string ConvertToQueryString(object value, string parentKey) { if (value is IDictionary dict) { var sortedKeys = dict.Keys.OrderBy(k => k, StringComparer.Ordinal).ToList(); var parts = new List(); foreach (var key in sortedKeys) { string currentKey = string.IsNullOrEmpty(parentKey) ? key : $"{parentKey}.{key}"; var subValue = dict[key]; // Recurse into BOTH dictionaries and lists the same way. An empty // dictionary/list contributes an empty string, not "[]" or "key=". parts.Add(IsContainer(subValue) ? ConvertToQueryString(subValue, currentKey) : $"{currentKey}={StringifyValue(subValue)}"); } return string.Join("&", parts); } if (value is IEnumerable list) { var parts = new List(); int i = 0; foreach (var item in list) { string currentKey = string.IsNullOrEmpty(parentKey) ? i.ToString() : $"{parentKey}.{i}"; parts.Add(IsContainer(item) ? ConvertToQueryString(item, currentKey) : $"{currentKey}={StringifyValue(item)}"); i++; } return string.Join("&", parts); } return StringifyValue(value); } public static string GenerateSignature(Dictionary payload, string secretKey) { var prePayload = new Dictionary(payload) { ["senderKey"] = secretKey.Trim() }; // Sort keys recursively (inline, at each level) and flatten into the // key=value string in the same pass. string queryString = ConvertToQueryString(prePayload, null); using var sha256 = SHA256.Create(); byte[] bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(queryString)); return BitConverter.ToString(bytes).Replace("-", "").ToLowerInvariant(); } public static void Main() { // Method arrays (e.g. sendmoney) are flattened by index, not // serialized: this becomes params.sendmoney.0.phone_number=254647647649. var paramsDict = new Dictionary { { "amount", 10000 }, { "currency", "KES" }, { "country_id", 1 }, { "payment_method_type", "send money" }, { "callback_url", "https://example.com/callback" }, { "third_party_reference_1", "REF-001" }, { "third_party_reference_2", "REF-002" }, { "sendmoney", new List { new Dictionary { { "phone_number", "254647647649" } } } } }; var payload = new Dictionary { { "client_id", "YOUR_CLIENT_ID" }, { "sender", "MyIntegration" }, { "salt", "random_salt_12345" }, { "timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds() }, { "params", paramsDict } }; string signature = GenerateSignature(payload, "YOUR_SECRET_KEY"); payload["signature"] = signature; Console.WriteLine(JsonSerializer.Serialize(payload, new JsonSerializerOptions { WriteIndented = true })); } } ``` *** ## Method 2: Generating Signatures via the Niobi Signature Generation API If you prefer not to write custom cryptographic sorting and hashing functions, or if you want to quickly test requests in Postman or Sandbox, Niobi provides a dedicated Signature Generation endpoint: **Endpoint:** [`POST /api/niobi-signature`](/api-reference/authentication/generate-signature) ### Step 1: Send Your Request Parameters to the Signature Endpoint Construct a request containing the following fields: | Field | Requirement | Description | | :---------- | :----------- | :----------------------------------------------------------------------------------------- | | `client_id` | **Required** | Your integration Client ID from the Niobi Dashboard. | | `sender` | **Required** | Your exact integration title from the dashboard. | | `salt` | **Required** | A unique random string generated on your server for entropy. | | `params` | **Required** | Object containing the specific parameters for the destination endpoint you intend to call. | ```json theme={null} { "sender": "Integration_title", "salt": "random_salt_value", "client_id": "your_client_key_here", "params": { "amount": 10000, "mobile": "254161166649", "country_id": 1, "currency": "KES", "payment_method_type": "send money", "callback_url": "https://yourdomain.com/callback", "third_party_reference_1": "REF-001", "third_party_reference_2": "REF-002" } } ``` ### Step 2: Receive the Complete Signed Payload Niobi validates your `client_id`, calculates the SHA-256 signature using your account's registered Secret Key, and returns the full signed envelope inside the `data` object: ```json theme={null} { "success": true, "message": "Signature was generated successfully.", "data": { "client_id": "your_client_key_here", "params": { "amount": 10000, "mobile": "254161166649", "country_id": 1, "currency": "KES", "payment_method_type": "send money", "callback_url": "https://yourdomain.com/callback", "third_party_reference_1": "REF-001", "third_party_reference_2": "REF-002" }, "salt": "random_salt_value", "sender": "Integration_title", "timestamp": 1724835600, "signature": "c6b98e1f5d6a7890bc4e123456789abcdef0123456789abcdef0123456789abc" } } ``` ### Step 3: Pass the Signed Payload to the Target API You can now take the exact JSON object inside `data` and send it directly to your target endpoint (e.g. `POST /api/v4/niobi-unified-collections` or `POST /api/v4/niobi-unified-payments`) **without changing or modifying anything as it is**. **Do Not Modify the Returned Payload:**\ You must transmit the JSON object inside `data` exactly as returned, without adding, altering, or removing any fields. Any modification to parameters or values after generation will invalidate the signature and cause the target endpoint to reject your request with a `403 Request was not verified` error. *** ## Verifying Response & Webhook Signatures When receiving a synchronous response or asynchronous webhook callback from Niobi, you can verify its authenticity using either code or the Verification API: ### 1. In Code (5 Steps): 1. **Extract Signature**: Store the `"signature"` field from the incoming JSON and remove it from the object. 2. **Add Secret Key**: Add `"senderKey": "your_secret_key_here"` into the object. 3. **Sort and Stringify**: Alphabetically sort keys recursively (K-sort) and format into `key=value` concatenated with `&`. 4. **Compute SHA-256 Hash**: Hash the string with SHA-256. 5. **Compare Signatures**: Compare your computed hash with the signature received in Step 1. ### 2. Via the Verification Helper API: Send the payload to [`POST /api/niobi-verify`](/api-reference/authentication/verify-signature): ```json theme={null} { "success": true, "message": "Request verified successfully." } ``` *** ## Next Steps Now that you can generate valid signatures, proceed to construct the signed request envelope: # Collection Basics Source: https://docs.niobi.co/collecting-payments/basics Core fundamentals of collecting payments across Africa: payment steps, request parameters, synchronous dispatch responses, and asynchronous terminal callbacks. ## Overview Niobi's **Unified Collections API** allows your application to collect payments from customers across Africa through a single standardized integration. Whether your customer pays via Mobile Money (STK Push, OTP, or USSD), Bank Transfer, Dynamic Virtual Account, or Browser Redirect, you send a signed request to the unified collections endpoint: **Endpoint:** [`POST /api/v4/niobi-unified-collections`](/api-reference/collections/unified-collections) ```mermaid theme={null} %%{init: {'themeVariables': {'fontSize': '23px', 'actorBorder': '#0D9373', 'actorLineColor': '#0D9373', 'signalColor': '#0D9373', 'noteBorderColor': '#0D9373'}, 'sequence': {'width': 220, 'height': 95, 'actorMargin': 80, 'messageMargin': 60, 'boxMargin': 18, 'noteMargin': 18}}}%% sequenceDiagram autonumber participant Customer as Customer (Payer) participant Merchant as Your Backend participant Niobi as Niobi API participant TelcoBank as Telco / Bank Switch Merchant->>Niobi: POST /api/v4/niobi-unified-collections (Signed Payload) Niobi->>TelcoBank: Dispatch collection request Niobi-->>Merchant: Initial HTTP Response (On success: payment_step: 1, status_code: 000000) Note over Merchant: Transaction initiated (Pending customer authorization) TelcoBank->>Customer: Trigger STK push / Prompt / Issue Virtual Account Customer->>TelcoBank: Authorize payment (Enter PIN / Complete Transfer) TelcoBank->>Niobi: Confirm payment outcome alt Payment Succeeded Niobi->>Merchant: Webhook (payment_step: 2, status: "success", statusCode: "000000") Note over Merchant: Only now: Credit user balance & fulfill order else Payment Failed / Canceled Niobi->>Merchant: Webhook (payment_step: 2, status: "failed", statusCode: "000005") Note over Merchant: Mark order failed, do not credit user end ```
Step 1 Request Initiation
payment\_step: 1
  1. Your backend sends a signed POST /api/v4/niobi-unified-collections request, which Niobi dispatches to the telco or bank switch.
  2. Niobi returns an initial HTTP response confirming the transaction was initiated and is pending customer authorization.
  3. The switch triggers an STK push, prompt, or issues a virtual account, and the customer authorizes payment (PIN entry or transfer).
→
Step 2 Terminal Outcome
payment\_step: 2
  1. The switch confirms the payment outcome back to Niobi.
  2. Niobi sends a webhook callback to your callback\_url with the final status.
  3. Reconcile the transaction and credit the user based on the final terminal state.
*** ## API Environments & Base URLs Niobi provides separate environments for integration testing and live transaction processing: | Environment | Base URL | Purpose | | :------------- | :------------------------------- | :------------------------------------------------------------ | | **Sandbox** | `https://sandbox.users.niobi.co` | Integration testing, mock transactions, and sandbox accounts. | | **Production** | `https://users.niobi.co` | Live payment collections and real customer funds. | All collection endpoints referenced throughout this guide are relative to your target environment's base URL. *** ## Understanding Payment Steps (`payment_step`) A critical concept in Niobi's collection architecture is the two-step payment lifecycle:
Step 1 Request Initiation
payment\_step: 1

Initial HTTP response to the request when it's successful, telling you the transaction was accepted by the telco/bank switch.

→
Step 2 Terminal Outcome
payment\_step: 2

Asynchronous webhook callback delivering the final result (success or failed).

### 1. `payment_step: 1` (Initial API Response) * **Delivery:** Synchronous HTTP response returned immediately when calling `POST /api/v4/niobi-unified-collections`. * **Meaning:** The request passed validation, authentication was verified, and the transaction was accepted and dispatched to the upstream payment processor or telco switch. * **Important:** This is an acknowledgement that the process has begun, **not the final payment outcome**. The customer has not yet entered their PIN or completed the transfer. **Absence of `payment_step` on Initiation Failures:**\ If a collection request fails during initial submission (for example, due to an invalid phone number format, unsupported method, or immediate upstream processor rejection returning `status_code: "000005"`), the `"payment_step"` field is **not present** in the response. Your backend must inspect `status_code` (`"000000"` vs `"000005"`) rather than assuming `payment_step` is always returned. ### 2. `payment_step: 2` (Terminal Callback) * **Delivery:** Asynchronous callback POST request sent to the `callback_url` passed in your request. * **Meaning:** The transaction has reached its **final terminal state**. * **Action:** When `"payment_step": 2` is present in the `params` object of the callback, treat this as the final outcome. Reconcile your records based on `status: "success"` (`status_code: "000000"`) or `status: "failed"` (`status_code: "000005"`). Full details are covered in [Collection Callbacks](/collecting-payments/callbacks). **Rules of Transaction Settlement (Never Credit on `payment_step: 1`):**\ Niobi's collection flows follow a strict two-step lifecycle. An initial synchronous API response with `"payment_step": 1` is an acknowledgement that the payment request has been delivered to the telecom provider or banking switch; **it is NOT a confirmation of payment**. * **Never credit customer balances or release goods on `payment_step: 1`**:\ Wait for the asynchronous terminal webhook callback (`payment_step: 2`) containing `"status": "success"` (`status_code: "000000"`). * **Handle Failure States (`payment_step: 2` with `"status": "failed"` / `"000005"`):**\ If the callback returns `status: "failed"`, the customer canceled the prompt, entered an incorrect PIN, or lacked funds. Mark the invoice as unpaid. * **Missing or Delayed Webhook?**\ If a callback hasn't arrived after a reasonable wait, query the [Get Transaction Status API](/transaction-status) (`POST /api/v3/get-unified-transaction-status`) to verify the state before taking any action. *** ## Request Parameters The unified collections endpoint accepts standard parameters wrapped in the signed envelope: | Parameter | Type | Required | Description | | :---------------------------- | :------------------- | :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------- | | **`amount`** | `integer` | **Yes** | The amount to collect in standard major currency units (e.g. `1000` = 1,000 KES). **Must be a whole integer with no decimal points.** | | **`mobile`** | `string` | **Yes** | The customer's mobile phone number in international format without `+` (e.g. `254700000000`, `234xxxxxxxxx`). | | **`country_id`** | `integer` / `string` | **Yes** | The country ID where the deposit originates (e.g. `1` for Kenya, `17` for Nigeria, `15` for South Africa). See [Country Coverage](/supported-countries). | | **`currency`** | `string` | **Yes** | The 3-letter ISO currency code (e.g. `KES`, `NGN`, `ZAR`, `GHS`, `UGX`, `TZS`, `XOF`, `XAF`). | | **`payment_method_type`** | `string` | **Yes** | The collection channel (e.g. `send money`, `virtual_account`, `bank_eft`, `Wave`, `capitec`). See [Collection Methods](/collecting-payments/methods). | | **`callback_url`** | `string` | **Required (for callbacks)** | The endpoint URL on your server where real-time terminal callbacks (`payment_step: 2`) are delivered. Essential for automated transaction settlement. | | **`third_party_reference_1`** | `string` | **Recommended** | Your unique merchant transaction reference. Strongly recommended for automated reconciliation and idempotency defense. | | **`third_party_reference_2`** | `string` | Optional | Additional secondary reference or custom customer identifier. | | **`id_number`** | `string` | **ZAR Capitec only** | Customer's full 13-digit South African ID number (required for Capitec payments to be valid). | | **`successful_url`** | `string` | **Redirects only** | URL to redirect customer upon payment approval (required for Wave Senegal/Ivory Coast and South Africa Bank EFT/Capitec). | | **`failure_url`** | `string` | **Redirects only** | URL to redirect customer upon payment cancellation or failure (required for Wave and South Africa Bank EFT/Capitec). | | **`name`** | `string` | **ZAR only** | Customer's full name (required for South Africa Bank EFT and Capitec collections). | | **`first_name`** | `string` | **NGN only** | Customer's first name (required for Nigerian dynamic virtual accounts). | | **`last_name`** | `string` | **NGN only** | Customer's last name (required for Nigerian dynamic virtual accounts). | | **`account_name`** | `string` | **NGN only** | Account holder name to appear when funds are reconciled (Nigerian virtual accounts). | | **`bank_code`** | `string` | **NGN / ZAR** | Code of the bank issuing the account (Nigeria: `17001`, `17002`, `17003`) or handling transfer (South Africa: `0001`, etc.). | | **`sub_merchant_id`** | `string` (UUID) | Optional | Sub-merchant identifier if collecting on behalf of a managed sub-merchant. | *** ## Front-End Integration Pathways Niobi gives you **2** ways to deliver payment collections to your customers: ### Option 1: Niobi Hosted Checkout (Fastest & Zero UI Code) If you want to start accepting payments immediately without building and maintaining custom checkout forms, input validation, or tokenization UI, use **Niobi Hosted Checkout** powered by Payment Links. Niobi Hosted Checkout Interface #### How It Works: 1. **Create via Dashboard (No-Code) or API:** * **Dashboard (No-Code):** Log into your Niobi Dashboard, navigate to **Payments -> Payment Links**, click **Create Payment Link**, configure your business details and amount (fixed or customer-entered), and copy your generated checkout URL immediately. * **API (Programmatic):** Call the [Create Payment Link API](/api-reference/payment-links/create) (`POST /api/v3/payment-link-api/create`) to dynamically generate customized payment links on demand from your backend. 2. **Manage & Retrieve:** View, edit, filter, or retrieve active links in the dashboard or via the [Payment Link List API](/api-reference/payment-links/list) (`GET /api/payment-link-api/list`). 3. **Share or Redirect:** Share the link via WhatsApp, SMS, invoices, emails, or redirect customers directly from your web or mobile checkout button. 4. **Automated Settlement & Callback:** The customer completes payment on the secure hosted checkout page. Niobi confirms the transaction, credits your merchant wallet, and dispatches an asynchronous webhook callback (`payment_step: 2`) to your server. For full implementation details, see [Payment Links Guide](/collecting-payments/payment-links) and [Hosted Checkout & Payment Links](/collecting-payments/methods#hosted-checkout). *** ### Option 2: Direct API Integration (Custom UI / White-Label) If you require 100% white-labeled control over every UI element and payment form, integrate directly with our collections endpoint: Send a signed `POST` request to `/api/v4/niobi-unified-collections`: #### Sample Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "c6b98e1f5d6a7890bc4e123456789abcdef0123456789abcdef0123456789abc", "params": { "amount": 10000, "currency": "KES", "country_id": 1, "mobile": "254161166649", "payment_method_type": "send money", "callback_url": "https://yourdomain.com/niobi/callback", "third_party_reference_1": "TX-COLL-1001", "third_party_reference_2": "CUST-450" } } ``` #### Sample Initial API Responses ```json theme={null} { "success": true, "message": "We've sent a verification prompt to your phone. Please approve it to complete your payment.", "data": { "amount": 10000, "callback_url": "https://yourdomain.com/niobi/callback", "country_id": 1, "currency": "KES", "mobile": "254161166649", "payment_method_type": "send money", "third_party_reference_1": "TX-COLL-1001", "third_party_reference_2": "CUST-450", "status": "success", "payment_step": 1, "payment_token": null }, "status_code": "000000" } ``` ```json theme={null} { "success": false, "message": "Payment process initiation failed. Kindly check the details and try again.", "status_code": "000005" } ``` If an initiation request is rejected outright (e.g. missing fields, invalid phone number, unsupported currency), refer to the [400 Client Errors Guide](/errors/client-errors). **Understanding the Two "Success" Indicators:**\ You will notice two different success indicators in the initial response: * **Outer `"success": true` (Root Level):** Indicates the **HTTP API Request Status** ([Request Successfully Initiated](/errors/200-success)). It confirms that your API call was authenticated, structurally valid, and successfully received by Niobi servers. * **Inner `"status": "success"` (Inside `data`):** Indicates the **Transaction Initiation State**. Used together with `"status_code": "000000"` and `"payment_step": 1`, it confirms that the upstream provider or telco switch accepted the collection request and triggered the authorization prompt on the payer's device. It signifies successful initiation, not final fund settlement. **The `message` Field:**\ The `message` string returned in the initial response describes the action the payer must take to complete the transaction. Its wording varies depending on the upstream payment processor or telco switch. Common examples include: * `"Verification token was sent to your mobile number. Kindly verify to proceed payment."` * `"We've sent a verification prompt to your phone. Please approve it to complete your payment."` We recommend displaying this returned message directly in your application UI so payers know to check their device for the authorization prompt. Depending on the selected payment method: * **Mobile Money (STK Push):** The customer receives an on-screen prompt on their mobile phone and enters their PIN. * **OTP Payins (e.g. Ivory Coast Orange):** The customer receives an SMS OTP, which your UI collects and submits to `/api/v4/niobi-unified-process-transaction`. * **Virtual Account (e.g. Nigeria):** The initial response returns an `account_number` and `bank_name`. Display these details to the customer to complete a standard bank transfer within 30 minutes. * **Browser Redirect (e.g. Wave, South Africa Bank EFT):** The response includes an `authorization_url`. Redirect the customer to open the URL in their browser to complete payment. When the transaction concludes, Niobi sends an asynchronous callback containing `"payment_step": 2` to the `callback_url` passed under `params.callback_url` in your collection request. #### Sample Terminal Callbacks (payment\_step: 2) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "salt": "random_salt_12345", "timestamp": 1724835620, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 10000, "depositId": "NIO-D123456789", "mobile": "254161166649", "name": "Jane Doe", "payment_step": 2, "reference": "TX-COLL-1001", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-COLL-1001", "third_party_reference_2": "CUST-450" } } ``` ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "salt": "random_salt_12345", "timestamp": 1724835625, "signature": "e5f6a7b8c90123456789abcdef0123456789abcdef0123456789abcdef012345", "params": { "amount": 10000, "depositId": "NIO-D123456789", "mobile": "254161166649", "name": "Customer Name", "payment_step": 2, "reference": "TX-COLL-1001", "status": "failed", "statusCode": "000005", "failureReason": { "failureCode": "DS-004", "failureMessage": "User cancelled transaction / Request timed out" }, "third_party_reference_1": "TX-COLL-1001", "third_party_reference_2": "CUST-450" } } ``` **Determine Outcome Using `status` and `statusCode`:**\ When `"payment_step": 2` arrives, inspect both `params.status` and `params.statusCode` inside the payload: * [`status: "success"` with `statusCode: "000000"`](/errors/000000-success): The payment was successfully authorized and credited. Fulfill the order or credit the user account. * [`status: "failed"` with `statusCode: "000005"`](/errors/000005-failed): The payment failed or was declined. Inspect `params.failureReason` for specific provider diagnostics. `payment_step: 2` always carries one of these two outcomes, there is no separate timeout callback shape. See our [Transaction Status Codes Guide](/errors/transaction-status-codes) for the complete list of system status codes. **Handling Collection Timeouts (`000006`):**\ `000006` is not a callback outcome, it only appears when you query the [Transaction Status API](/api-reference/get-transaction-status) while a collection is still awaiting customer authorization past the standard 2-minute window. Timeouts can be triggered by several factors: * **Customer Inaction:** The payer did not enter their PIN or respond to the prompt before the session expired. * **Mobile Operator / SMS Latency:** Delays across the telco network in delivering the STK or USSD push to the user's handset. * **Upstream Processor Congestion:** Temporary clearing latency with partner banking switches or mobile money providers. If a status query returns `000006`, do not immediately prompt the customer to pay again. Wait 2 to 3 minutes and query again, the transaction will eventually resolve to `success` (`000000`) or `failed` (`000005`), and that final outcome is what arrives in the `payment_step: 2` callback. **On-Demand Status Verification:**\ If you ever need to confirm or query the current status of a collection on demand (for example, if a network disruption delayed your webhook callback), call our [Get Transaction Status API](/api-reference/get-transaction-status) (`POST /api/v3/get-unified-transaction-status`) by passing `"type": "payin"` and your transaction reference in `"id"`. *** ## Next Steps Follow these guides in order to complete your collection integration: # Collection Best Practices Source: https://docs.niobi.co/collecting-payments/best-practices Operational guidance, phone number validation rules, reconciliation recipes, and status polling best practices for payment collections. ## Overview Building a resilient, production-ready payment collection flow requires proper error handling, disciplined polling behavior, strict input validation, and reliable transaction reconciliation. Follow these best practices to ensure seamless transaction processing and avoid common production pitfalls. *** ## 1. When to Query Status vs. Waiting for Callbacks Niobi processes transactions asynchronously with regional payment switches and mobile network operators.
Primary Flow Collection Callback

Rely on the incoming payment\_step: 2 payload.

→
Fallback Flow Transaction Status Query API

Query with spaced intervals if the callback isn't received.

### Best Practices for Status Handling: * **Rely on Callbacks as the Primary Source:**\ The callback delivered to your `callback_url` is the primary and most efficient notification mechanism. * **Avoid Aggressive Polling Loops:**\ Do not poll the status API immediately in a tight loop after initiating a collection. Aggressive polling consumes unnecessary bandwidth and may trigger rate limits. * **Query Status Using Spaced Intervals:**\ If your server has not received a callback after a while, you can query the [Get Transaction Status API](/api-reference/get-transaction-status) (`POST /api/v3/get-unified-transaction-status`) using spaced intervals (e.g. progressive backoff) to reconcile pending collection transactions. *** ## 2. The Double-Verification Reconciliation Recipe For mission-critical workflows where releasing value prematurely or acting on an unverified signal creates financial risk, Niobi recommends implementing a **double-verification reconciliation recipe**: rely on the `payment_step: 2` callback as your primary signal, fall back to a status query if it hasn't arrived, and only close out the order once that confirmed status is reconciled against your own internal order records. ### When to Implement Double-Verification: * **Instant Digital Value & Wallet Credits:** Crypto on-ramps, forex trading platforms, and digital wallet top-ups where credited funds can be immediately withdrawn. * **Automated Chain Reactions (Collection to Payout):** Systems where collection completion automatically triggers a downstream disbursement (e.g. cross-border remittances or escrow releases). * **High-Value B2B Invoicing & Automated Dispatch:** Wholesalers or e-commerce platforms triggering automated warehouse dispatch upon payment confirmation. ### The 4-Step Technical Reconciliation Flow: ```mermaid theme={null} %%{init: {'themeVariables': {'fontSize': '17px'}}}%% flowchart TD A["Initiate Collection (POST /api/v4/niobi-unified-collections)"] --> B["Receive payment_step: 1 (Initiated)"] B --> C["Wait for Incoming Callback"] C --> D{"payment_step: 2 Callback Received?"} D -- Yes --> E["Reconciliation Step 1: Verify Inbound Signature"] D -- "No (after a while)" --> F["Call Status API (POST /api/v3/get-unified-transaction-status)"] E --> G["Reconciliation Step 2: Acquire DB Lock on Reference"] F --> G G --> H{"Reconciliation Step 3: Triple-Point Match?
1. status == 'success' & statusCode == '000000'
2. amount & currency match order
3. third_party_reference_1 matches"} H -- "Match Confirmed" --> I["
Reconciliation Step 4: Atomic DB Update (Set status = 'SETTLED') & Credit Balance
"] H -- "Mismatch / Failed" --> J["
Mark Transaction Failed / Flag for Review
"] style I fill:#0D9373,stroke:#0D9373,color:#ffffff style J fill:#b91c1c,stroke:#b91c1c,color:#ffffff ``` ### Reconciliation Checklist: 1. **Inbound Signature Verification:** Always verify the incoming SHA-256 callback signature using your integration Secret Key (`senderKey`) before parsing the payload. 2. **Concurrency Lock & Idempotency Check:** Acquire a row-level database lock on `third_party_reference_1` before processing balance updates. If both a callback and a status query arrive concurrently, only the first thread processes the credit while the second safely exits. 3. **Triple-Point Data Match:** Confirm that all three attributes match your internal order record: * **Status & Code:** Both `status: "success"` and `statusCode: "000000"` ([Success Code 000000](/errors/000000-success)). * **Amount & Currency:** The received `amount` matches the exact order total (prevents underpayment fulfillment). * **Reference:** The `third_party_reference_1` matches the specific customer order ID. 4. **Atomic Ledger Settlement:** Execute the balance credit and update the local order status to `SETTLED` inside a single atomic database transaction. *** ## 3. Phone Number & Amount Formatting Rules ### Strict Integer Rule for `amount` (No Decimal Points) All collection amounts submitted in API requests **MUST be whole integers** (e.g. `1000` for 1,000 KES/NGN/ZAR). Do not send decimal points (such as `1000.50` or `1000.00`). Submitting decimal amounts will cause the request to fail validation. ### Phone Number Formatting Rules: * **Digits Only:** Strip all spaces, plus signs (`+`), hyphens, parentheses, or symbols. * **Length:** Between 8 and 15 digits (including country code). * **International Prefix without Plus:** Always include the country code, but omit the leading `+` or local trunk `0`. | Country | Correct Format | Incorrect Format | | :---------------- | :-------------- | :----------------------------------- | | **Kenya** | `254712345678` | `+254 712 345 678` or `0712345678` | | **Nigeria** | `2348012345678` | `+234 801 234 5678` or `08012345678` | | **Ghana** | `233501234567` | `+233 50 123 4567` or `0501234567` | | **South Africa** | `27600000008` | `+27 60 000 0008` or `0600000008` | | **Senegal** | `221770000000` | `+221 77 000 0000` | | **Côte d'Ivoire** | `225070000000` | `+225 07 00 00 00` | *** ## 4. Error Handling & Retry Policies Design your integration to distinguish between permanent client errors and temporary upstream issues: **Examples:** [`400 Bad Request`](/errors/client-errors), [`403 Request not verified`](/errors/authentication-errors), `404 Not Found`.\ **Action:** Do not retry these requests automatically with the same payload. Log the error message, inspect your parameter validation, verify your signature generation algorithm, and correct the payload before resending. See [400 Client Errors](/errors/client-errors) for code breakdowns. **Examples:** `500 Internal Server Error`, `502 Bad Gateway`, `504 Gateway Timeout`.\ **Action:** Implement exponential backoff (e.g. retry after 2s, 4s, 8s, 16s) up to a maximum of 3 to 5 attempts. If timeouts persist, check transaction status before re-initiating. For Nigerian NGN virtual account collections, always collect the exact amount. Any excess payment is automatically reversed by the banking system, which may cause customer confusion if not handled cleanly. *** ## Next Steps Complete your integration and explore developer references: # Collection Callbacks Source: https://docs.niobi.co/collecting-payments/callbacks Handling asynchronous collection callbacks, understanding terminal payment_step 2 notifications, verifying callback signatures, and querying transaction status. ## Overview Because payment processing across African mobile networks and banking systems is asynchronous, Niobi notifies your server of the final transaction outcome by sending an HTTP POST callback request to the `callback_url` specified in your collection request. ```mermaid theme={null} %%{init: {'themeVariables': {'fontSize': '23px', 'actorBorder': '#0D9373', 'actorLineColor': '#0D9373', 'signalColor': '#0D9373', 'noteBorderColor': '#0D9373'}, 'sequence': {'width': 220, 'height': 95, 'actorMargin': 80, 'messageMargin': 60, 'boxMargin': 18, 'noteMargin': 18}}}%% sequenceDiagram autonumber participant Customer as Customer (Payer) participant TelcoBank as Telco / Bank Switch participant Niobi as Niobi API participant Merchant as Your Callback Server Customer->>TelcoBank: Authorize or Reject payment TelcoBank->>Niobi: Report settlement outcome Note over Niobi: Compute SHA-256 callback signature
Assemble payload (payment_step: 2) alt Payment Succeeded Niobi->>Merchant: POST to callback_url (payment_step: 2, status: "success", statusCode: "000000") Note over Merchant: 1. Verify signature
2. Credit user & fulfill order
3. Reconcile idempotently else Payment Failed / Canceled Niobi->>Merchant: POST to callback_url (payment_step: 2, status: "failed", statusCode: "000005") Note over Merchant: 1. Verify signature
2. Mark failed (Do NOT credit)
3. Reconcile idempotently end Merchant-->>Niobi: HTTP 200 OK ``` *** ## Terminal Callback Guarantee (`payment_step: 2`) **Terminal Settlement Rule:**\ Only credit user balances or fulfill orders when the callback delivers `payment_step: 2` with `status: "success"` and `statusCode: "000000"`. Never credit on `status: "failed"` (`statusCode: "000005"`) or on initial dispatch responses (`payment_step: 1`). * The callback is delivered for both **successful** ([`status: "success"`, `statusCode: "000000"`](/errors/000000-success)) and **failed** ([`status: "failed"`, `statusCode: "000005"`](/errors/000005-failed)) payments. * Update your application's order state based on both the `status` and `statusCode` fields delivered inside `params`. See our [Transaction Status Codes Reference](/errors/transaction-status-codes) for details. *** ## Callback Payload Structure Incoming callbacks from Niobi follow the standard signed envelope structure: ### 1. Successful Collection Callback (`payment_step: 2`) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "salt": "random_salt_value", "timestamp": 1724835620, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 10000, "depositId": "NIO-D123456789", "mobile": "254161166649", "name": "Jane Doe", "payment_step": 2, "reference": "TX-COLL-1001", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-COLL-1001", "third_party_reference_2": "CUST-450" } } ``` ### 2. Failed Collection Callback (`payment_step: 2`) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "salt": "random_salt_value", "timestamp": 1724835625, "signature": "e5f6a7b8c90123456789abcdef0123456789abcdef0123456789abcdef012345", "params": { "amount": 10000, "depositId": "NIO-D123456789", "mobile": "254161166649", "name": "Customer Name", "payment_step": 2, "reference": "TX-COLL-1001", "status": "failed", "statusCode": "000005", "failureReason": { "failureCode": "DS-004", "failureMessage": "User cancelled transaction / Request timed out" }, "third_party_reference_1": "TX-COLL-1001", "third_party_reference_2": "CUST-450" } } ``` ### Callback Parameter Specification | Parameter | Type | Description | | :------------------------------- | :------------------- | :------------------------------------------------------------------------------------------- | | `params.amount` | `integer` / `number` | The final deposited amount. | | `params.depositId` | `string` | Unique deposit reference returned in collection callbacks. | | `params.mobile` | `string` | Payer mobile phone number. | | `params.name` | `string` | Registered name of the account holder / payer. | | `params.payment_step` | `integer` | Set to `2` for terminal collection callbacks. | | `params.reference` | `string` | Unique transaction reference. | | `params.status` | `string` | Terminal transaction status: `"success"` or `"failed"`. | | `params.statusCode` | `string` | `"000000"` for success, `"000005"` for failure. | | `params.failureReason` | `object` | Detailed failure diagnostics (`failureCode` and `failureMessage`) if `status` is `"failed"`. | | `params.third_party_reference_1` | `string` | Your original merchant reference passed during initiation. | | `params.third_party_reference_2` | `string` | Your second optional reference passed during initiation. | *** ## Verifying Inbound Callback Signatures To ensure that an incoming callback genuinely originated from Niobi and has not been forged or tampered with: 1. **Extract Signature**: Extract `signature` from the incoming root JSON object and remove it. 2. **Inject Secret Key**: Add `"senderKey": "YOUR_SECRET_KEY"` into the payload object. 3. **Sort Keys (Recursive K-Sort)**: Alphabetically sort all keys recursively. 4. **Flatten & Hash**: Convert to key-value query string format concatenated with `&`, and hash with SHA-256. 5. **Compare**: Compare your computed hash with the `signature` from Step 1. If they match, the callback is authentic. *** ## Dual-Layer Confirmation: Querying Transaction Status As an additional layer of confirmation, Niobi encourages querying the transaction status alongside listening for callbacks. Combining the incoming asynchronous callback with an on-demand status query gives your system independent, double-verified confirmation before updating customer balances or fulfilling high-value orders. ### Endpoint [`POST /api/v3/get-unified-transaction-status`](/api-reference/get-transaction-status) ### Request Parameters (`params` Object) | Field | Requirement | Type | Description | | :--------- | :----------- | :------- | :----------------------------------------------------------------------------------------------------------------------------- | | **`id`** | **Required** | `string` | The transaction reference to query. Pass your original `third_party_reference_1`, `payment_reference`, or Niobi's `reference`. | | **`type`** | **Required** | `string` | Must be set to `"payin"` for collection and deposit transactions. | ### Sample Signed Status Query Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "b1c2d3e4f5a60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "id": "TX-COLL-1001", "type": "payin" } } ``` ### Sample Status Query Response ```json theme={null} { "success": true, "message": "Transaction data fetched successfully.", "data": { "amount": 10000, "fee": 100, "currency": "KES", "status": "success", "mobile": "254161166649", "transaction_id": "CR-NIO-S12345678", "ref": "TX-COLL-1001", "payment_method_type": "send money", "third_party_reference_1": "TX-COLL-1001", "third_party_reference_2": "CUST-450", "created_at": "2026-08-28 12:30:00" }, "status_code": "000000" } ``` ### Reconciling Query Results: * **`status: "success"` (`status_code: "000000"`):** The collection was successfully authorized and credited to your merchant wallet. You can safely fulfill the order or credit the user's account. * **`status: "failed"` (`status_code: "000005"`):** The collection failed or was declined by the payer. Mark the payment as failed. * **`status: "pending"` (`status_code: "000001"`):** Authorization is still in progress with the upstream provider. **Do not take action on this state** (do not fulfill orders or mark as failed). Keep the transaction in a pending state and await the asynchronous callback (`payment_step: 2`) or re-query after a brief delay. The status query response above returns `status_code` (snake\_case) at its top level. The terminal callback's `params.statusCode` field, along with `params.failureReason` (`failureCode`/`failureMessage`) on failed collections, shown earlier on this page, are camelCase. *** ## Callback Receiver Implementation Guidelines Your callback listener should respond with an HTTP `200 OK` status as quickly as possible (ideally within 3 to 5 seconds). Perform long-running background tasks (e.g. sending customer confirmation emails or generating PDFs) asynchronously in a background job queue after returning 200 OK. In rare cases of network timeouts between Niobi and your server, callback notifications may be retried. Ensure your callback handler uses `params.reference` or `params.third_party_reference_1` to verify whether a transaction has already been processed and credited before applying balance updates. Rely on the `payment_step: 2` callback as the primary notification mechanism. Do not continuously poll the status API in a tight loop while waiting for a callback; if a callback has not been received after a while, you can query the [Get Transaction Status API](/api-reference/get-transaction-status) (`POST /api/v3/get-unified-transaction-status`) using spaced intervals. *** ## Resending Callbacks via the Payment Portal You can resend callbacks in case of a delivery failure through the payment portal. To do this, access the specific transaction and click on **Resend Callback**. Resend Callback from Niobi Payment Portal **When can a callback be resent?**\ The **Resend Callback** option can only be triggered via the payment portal for a deposit or payout request in cases where the callback was not delivered correctly to your server (for example, if your listener experienced downtime, timed out, or returned an HTTP error). It is not displayed for callbacks that were already acknowledged with HTTP 200. *** ## Next Steps Follow these guides to complete and secure your collection flow: # Collection Methods Source: https://docs.niobi.co/collecting-payments/methods Comprehensive guide to supported collection methods across Africa: Mobile Money USSD push, OTP verification, Bank Transfers, Virtual Accounts, and Redirect flows. ## Overview Niobi supports diverse payment collection channels across Africa. Depending on the destination country, your application can collect funds via Mobile Money, Dynamic Virtual Accounts, Bank Transfers, or Browser Redirects. ### Master Country Collection Matrix | ID | Country | Currency | Supported Methods (`payment_method_type`) | | :----: | :------------------------------------------------------------------------------------------------------ | :------: | :----------------------------------------------------- | | **1** | [Kenya](/countries/kenya) | `KES` | `send money` (M-Pesa), `airtel` | | **2** | [Benin](/countries/benin) | `XOF` | `mtn`, `moov` | | **3** | [Côte d'Ivoire](/countries/cote-d-ivoire) | `XOF` | `Orange` (OTP), `mtn`, `moov`, `Wave` | | **4** | [Cameroon](/countries/cameroon) | `XAF` | `mtn`, `Orange` | | **5** | [DRC](/countries/drc) | `CDF` | `airtel`, `Orange`, `vodacom` | | **8** | [Rwanda](/countries/rwanda) | `RWF` | `mtn`, `airtel` | | **9** | [Senegal](/countries/senegal) | `XOF` | `Orange` (USSD PIN), `free`, `Wave` | | **10** | [Tanzania](/countries/tanzania) | `TZS` | `airtel`, `halotel`, `tigo`, `vodacom` | | **11** | [Uganda](/countries/uganda) | `UGX` | `mtn`, `airtel` | | **12** | [Zambia](/countries/zambia) | `ZMW` | `mtn`, `zamtel`, `airtel` | | **13** | [Sierra Leone](/countries/sierra-leone) | `SLE` | `Orange` | | **15** | [South Africa](/countries/south-africa) | `ZAR` | `bank_eft` (EFT), `capitec` (Capitec Pay) | | **16** | [Ghana](/countries/ghana) | `GHS` | `mtn`, `At` (AirtelTigo), `vodafone` | | **17** | [Nigeria](/countries/nigeria) | `NGN` | `virtual_account` (Bank Transfer) | | **18** | [Mali](/countries/mali) | `XOF` | `Orange`, `moov` | | **19** | [Burkina Faso](/countries/burkina-faso) | `XOF` | `Orange`, `moov` | | **20** | [Togo](/countries/togo) | `XOF` | `moov`, `tmoney` | | N/A | **[Hosted Checkout](/collecting-payments/basics#option-1-niobi-hosted-checkout-fastest--zero-ui-code)** | *All* | Pre-built payment links across all supported countries | ### Upcoming Collection Corridors | Country | Code | Currency | Planned Payment Methods | | :---------------------------------- | :--: | :------: | :----------------------------- | | [Ethiopia](/countries/ethiopia) | 251 | `ETB` | teleBirr, mBirr | | [Malawi](/countries/malawi) | 265 | `MWK` | Airtel Money, TNM Mpamba | | [Egypt](/countries/egypt) | 20 | `EGP` | Vodafone Cash, Orange Money | | [Mozambique](/countries/mozambique) | 258 | `MZN` | Vodacom M-Pesa, Movitel, Tmcel | *** ## 1. Mobile Money (USSD STK Push) USSD Push (STK Push) is the standard mobile money collection flow across East and West Africa. ### How It Works: 1. Your backend dispatches `POST /api/v4/niobi-unified-collections` with the corridor-specific `payment_method_type` for that mobile money network. 2. The telco switch sends an instant SIM toolkit prompt to the customer's mobile phone. 3. The customer enters their PIN to authorize the payment. 4. Niobi dispatches a terminal callback (`payment_step: 2`) to the `callback_url` passed under `params.callback_url` in your request. **`payment_method_type` Matches the Channel and Country:**\ The value passed in `payment_method_type` is specific to the local payment provider and country: * **Kenya (Country ID: 1):** `payment_method_type` = `"send money"` (M-Pesa STK Push) or `"airtel"` (Airtel Money) * **Ghana (Country ID: 16):** `payment_method_type` = `"mtn"`, `"At"`, or `"vodafone"` * **Côte d'Ivoire (Country ID: 3):** `payment_method_type` = `"Orange"`, `"mtn"`, `"moov"`, or `"Wave"` * **Senegal (Country ID: 9):** `payment_method_type` = `"Orange"`, `"free"`, or `"Wave"` * **Nigeria (Country ID: 17):** `payment_method_type` = `"virtual_account"` (Dynamic Virtual Account) * **South Africa (Country ID: 15):** `payment_method_type` = `"bank_eft"` (Bank EFT) or `"capitec"` (Capitec Pay) Always check the individual [Country Guides](/supported-countries) for the exact method strings accepted in each market. ### Sample Request: Kenya M-Pesa STK Push (Country ID: 1) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "c6b98e1f5d6a7890bc4e123456789abcdef0123456789abcdef0123456789abc", "params": { "amount": 1000, "currency": "KES", "country_id": 1, "mobile": "254700000000", "payment_method_type": "send money", "callback_url": "https://yourdomain.com/niobi/callback", "third_party_reference_1": "ORDER-991" } } ``` *** ## 2. Dynamic Virtual Accounts (Nigeria - NGN) For Nigerian collections, Niobi provides **dynamic virtual bank accounts** that expire within 30 minutes. **Send Exact Amounts:**\ For NGN virtual account deposits, the expected amount is processed and any overpayment is automatically reversed to the customer upon successful deposit. Always instruct customers to transfer the exact amount. ### Required Parameters for Nigerian Virtual Accounts: * `payment_method_type`: `"virtual_account"` or `"bank"` * `first_name`: Customer's first name * `last_name`: Customer's last name * `account_name`: Customer's full bank account name * `bank_code`: Code of the issuing bank: * `17001`: 78 Finance Company Limited * `17002`: Fidelity Bank Limited * `17003`: Globus Bank ### Sample Request: ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "c6b98e1f5d6a7890bc4e123456789abcdef0123456789abcdef0123456789abc", "params": { "amount": 10000, "currency": "NGN", "country_id": 17, "mobile": "2348012345678", "first_name": "Joseph", "last_name": "Mike", "account_name": "Joseph Mike", "bank_code": "17001", "payment_method_type": "virtual_account", "callback_url": "https://yourdomain.com/niobi/callback", "third_party_reference_1": "NGN-COLL-001" } } ``` ### Initial API Response (Returns Virtual Account Details): ```json theme={null} { "success": true, "message": "Please use the following bank details for making a deposit via your preferred banking application", "data": { "account_name": "Joseph Mike", "account_number": "7500123497", "bank_name": "78 FINANCE COMPANY LIMITED", "amount": 10000, "currency": "NGN", "country_id": 17, "mobile": "2348012345678", "depositId": "NIO-S12345678", "status": "success", "payment_step": 1, "callback_url": "https://yourdomain.com/niobi/callback" }, "status_code": "000000" } ``` Display the returned `account_number` and `bank_name` to your customer to complete their transfer. See the [Nigeria Country Guide](/countries/nigeria) for full details. *** ## 3. South Africa Bank Transfers & Capitec (ZAR) South African collections support both generic bank transfers (EFT) and direct Capitec authorization. There is no `"eft"` value, EFT collections use `payment_method_type: "bank_eft"`, shown below. **`payment_method_type`**: `"bank_eft"`\ Returns an `authorization_url` where the customer approves the payment directly with their bank (ABSA, FNB, Standard Bank, Nedbank, Investec, Bidvest, TymeBank). ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "c6b98e1f5d6a7890bc4e123456789abcdef0123456789abcdef0123456789abc", "params": { "amount": 500, "currency": "ZAR", "country_id": 15, "mobile": "27600000008", "name": "John Doe", "bank_code": "0001", "payment_method_type": "bank_eft", "successful_url": "https://yourdomain.com/payment-success", "failure_url": "https://yourdomain.com/payment-failed", "callback_url": "https://yourdomain.com/niobi/callback", "third_party_reference_1": "ZAR-DEPOSIT-01" } } ``` **Initial Response:** Returns `"authorization_url": "https://..."` and `"payment_step": 1`. Redirect the customer to this URL. **`payment_method_type`**: `"capitec"`\ Capitec Bank collections authenticate directly against the payer's national identity. You must pass the customer's full **13-digit South African ID number** in `params.id_number` (e.g. `"9001015800083"`) for the request to be valid. ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "c6b98e1f5d6a7890bc4e123456789abcdef0123456789abcdef0123456789abc", "params": { "amount": 500, "currency": "ZAR", "country_id": 15, "mobile": "27600000008", "name": "John Doe", "id_number": "9001015800083", "payment_method_type": "capitec", "successful_url": "https://yourdomain.com/payment-success", "failure_url": "https://yourdomain.com/payment-failed", "callback_url": "https://yourdomain.com/niobi/callback", "third_party_reference_1": "ZAR-CAPITEC-01" } } ``` *** ## 4. Wave Collections (Senegal & Côte d'Ivoire) Wave uses a redirect-based authorization flow, not a USSD push: Submit the request with `successful_url` and `failure_url` included in the parameters. Niobi returns an `authorization_url` (`payment_step: 1`). Redirect the customer to this URL. If they open it on their phone, it launches the Wave app directly to approve payment; if they open it on a desktop browser, the page displays a QR code they can scan with the Wave app on their phone to authorize instead. Wave hosted checkout page with QR code Wave app payment confirmation screen Once the customer approves or cancels the payment in Wave, they're redirected to your `successful_url` or `failure_url` accordingly, and Niobi delivers the terminal webhook callback (`payment_step: 2`) to your `callback_url`. ### Sample Request (Senegal - XOF): ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "c6b98e1f5d6a7890bc4e123456789abcdef0123456789abcdef0123456789abc", "params": { "amount": 5000, "currency": "XOF", "country_id": 9, "mobile": "221763456789", "payment_method_type": "Wave", "successful_url": "https://yourdomain.com/checkout/success", "failure_url": "https://yourdomain.com/checkout/cancel", "callback_url": "https://yourdomain.com/niobi/callback", "third_party_reference_1": "WAVE-SN-001" } } ``` *** ## 5. OTP-Verified Payins (Côte d'Ivoire Orange) For Orange payins in Côte d’Ivoire, payment authorization requires a two-step OTP process: ### Step 1: Initiate Deposit Submit the collection request to `POST /api/v4/niobi-unified-collections`. The customer receives an SMS OTP, and the response returns a `payment_token`: ```json theme={null} { "success": true, "message": "We've sent a verification prompt to your phone. Please approve it to complete your payment.", "data": { "status": "success", "amount": 2000, "currency": "XOF", "country_id": 3, "payment_token": "NIO-S0000001", "payment_step": 1 }, "status_code": "000000" } ``` ### Step 2: Verify the Transaction with OTP Collect the OTP from the customer and send a signed request to `POST /api/v4/niobi-unified-process-transaction`: ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "salt": "random_salt_12345", "signature": "3a3cf7f2e3ff8d4ee991d7e1323312887dfda8536b8c2e197d0d4ef764013658", "params": { "otp": "000000", "payment_token": "NIO-S0000001" } } ``` * **OTP Validity:** In production, the authorization OTP is valid for **2 minutes**. * **Sandbox Testing:** Use OTP `000000` to simulate successful verification when testing in the sandbox environment. *** ## Hosted Checkout & Payment Links If you want to accept payments without building and maintaining a custom front-end payment interface, Niobi provides **Payment Links** (Hosted Checkout). This is the fastest and easiest way to start collecting payments across Africa with zero UI code required on your part. For full architectural walkthroughs, dashboard setup, and API parameters, see the [Payment Links Guide](/collecting-payments/payment-links). Niobi Hosted Checkout Interface ### Why Use Hosted Checkout? * **Zero Front-End Engineering:** You do not need to build complex payment forms, input masks, or error-handling UI. Niobi hosts the entire checkout experience for you. * **Multi-Currency & Country Support:** Payer details, country selection, and currency conversions are handled automatically on the page. * **Flexible Distribution:** Share links over WhatsApp, SMS, invoices, emails, or redirect customers directly from your website or mobile app checkout button. * **Instant Reconciliation:** When a payment is completed on the hosted checkout page, Niobi dispatches an asynchronous webhook callback to your server and credits your merchant wallet in real time. ### How Hosted Checkout Works: * **Dashboard (No-Code):** Log into your Niobi Dashboard, navigate to **Payments -> Payment Links**, click **Create Payment Link**, enter your item name, currency, and amount (fixed or customer-entered), and copy your generated checkout URL immediately. * **API (Programmatic):** Dynamically generate payment links on demand from your backend server using the [Create Payment Link API](/api-reference/payment-links/create) (`POST /api/v3/payment-link-api/create`). You can retrieve, search, and manage active links via the [Payment Link List API](/api-reference/payment-links/list) (`GET /api/payment-link-api/list`). Pass `first_name`, `last_name`, `email`, and `phone` in the request to pre-fill the payer's details on the checkout page, see [Create Payment Link](/api-reference/payment-links/create) for details. Provide the generated checkout URL to your customer. When clicked, the customer is presented with the clean, branded Niobi checkout interface shown above. The customer confirms their name, email, country, and currency (pre-filled automatically if you supplied them at creation), then chooses their preferred local payment channel (Mobile Money, Bank Transfer, or Card) to complete authorization. Once the transaction settles, Niobi sends a terminal callback (`payment_step: 2`) to your configured webhook URL and automatically updates your transaction records. *** ## Next Steps Follow these guides in order to complete your collection integration: *** ## Country-Specific Guides For deep dives into local provider configurations, test phone numbers, and country limits, explore our country guides: Virtual accounts (78 Finance, Fidelity, Globus), NGN limits, and sample callbacks. Bank EFT, Capitec Pay, ZAR settlement, and redirect handling. M-Pesa STK Push, Airtel Money, KES channels, and callbacks. Wave browser redirect and Orange SMS shortcode authorization. Wave redirect and Orange two-step OTP authorization. Complete coverage matrix across all 29 supported African markets. # Payment Links Source: https://docs.niobi.co/collecting-payments/payment-links Collect payments with zero front-end code using Niobi's hosted checkout. Learn the two ways to create a payment link, when to use each, and how the customer experience works end to end. ## Overview Niobi gives you two ways to collect payments: integrate directly with the [Unified Collections API](/collecting-payments/basics) for full control over your own checkout UI, or generate a **Payment Link**, a Niobi-hosted checkout page you can share with a customer without writing any front-end code. This page covers Payment Links, how to create one, and how the customer completes payment on it. Niobi Hosted Checkout Interface ### Why Payment Links? * **Zero front-end engineering:** Niobi hosts the entire checkout page, so you don't need to build payment forms, input masks, or error-handling UI. * **Multi-currency & country support:** Payer details, country selection, and currency are handled on the page itself. * **Flexible distribution:** Share the link over WhatsApp, SMS, invoices, email, or a website or app checkout button, or embed it as a QR code for a customer to scan in person. * **Instant reconciliation:** When the customer completes payment, Niobi credits your merchant wallet and dispatches the same webhook callback (`payment_step: 2`) used across every other collection method. *** ## Two Ways to Create a Payment Link A payment link can be created in one of two ways, depending on who is creating it and why: ```mermaid theme={null} %%{init: {'themeVariables': {'fontSize': '23px', 'actorBorder': '#0D9373', 'actorLineColor': '#0D9373', 'signalColor': '#0D9373', 'noteBorderColor': '#0D9373'}, 'sequence': {'width': 220, 'height': 95, 'actorMargin': 80, 'messageMargin': 60, 'boxMargin': 18, 'noteMargin': 18}}}%% sequenceDiagram autonumber participant You as You (Dashboard or API) participant Niobi as Niobi participant Customer as Customer alt Via Dashboard (no-code) You->>Niobi: Payments -> Payment Links -> Create else Via API (programmatic) You->>Niobi: POST /api/v3/payment-link-api/create end Niobi-->>You: Checkout URL generated You->>Customer: Share the link (WhatsApp, SMS, email, invoice, website, or QR code) Customer->>Niobi: Opens the hosted checkout page Customer->>Niobi: Selects payment method and completes payment Niobi->>You: Webhook callback (payment_step: 2) Note over You: Reconcile and credit the merchant wallet ``` Built for a person creating a link by hand: sales, support, or finance staff sending a one-off link to a specific customer, invoice, or order, with no engineering work involved. Built for your own systems creating links automatically: for example, generating a unique link every time an order is placed on your platform, tied to your own order reference, with no manual step in between. Neither method replaces the other. Which one you use depends on whether a **person** is triggering link creation, or a **system event** in your own backend is. ### Method 1: Via the Dashboard Navigate to **Payments → Payment Links**. Enter the item name, currency, and amount. The amount can be fixed, or left for the customer to enter themselves. The link is ready to share immediately, no further setup required. ### Method 2: Via the API Send a signed request to the [Create Payment Link API](/api-reference/payment-link/create-a-payment-link) (`POST /api/v3/payment-link-api/create`) from your backend. Pass `first_name`, `last_name`, `email`, and `phone` at creation time so the checkout page loads with the customer's details already filled in, they only need to pick a payment method and confirm. Use the [Payment Link List API](/api-reference/payment-link/payment-link-list) (`GET /api/payment-link-api/list`) to view, filter, or retrieve links you've created. *** ## How the Customer Completes Payment Regardless of how the link was created, the customer experience and the settlement flow are identical: Whether the customer clicked the link directly or scanned it as a QR code, they land on the same clean, branded Niobi checkout page shown above. Their name, email, country, and currency are pre-filled automatically if you supplied them at creation. The customer then picks their preferred local payment channel (Mobile Money, Bank Transfer, or Card) and completes authorization. Once the transaction settles, Niobi sends a terminal callback (`payment_step: 2`) to your configured webhook URL, the same shape you'd receive for a direct API collection. See [Collection Callbacks](/collecting-payments/callbacks) for the full payload and how to reconcile it. *** ## Next Steps # Benin | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/benin Supported collection and payout methods, request formats, and sample payloads for Benin on the Niobi API.

Benin

Supported payment methods and integration details for Benin

Benin flag

Country Details

Country ID: 2  •   Country Code: 229  •   Currency: XOF (West African CFA Franc)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :------------- | :------ | :----------------------------------------------- | :--------------------------------------- | :------------------------------------ | :---------------------------------------------------------------- | | **MTN MoMo** | Deposit | `"mtn"` | `mobile` (format: `"229XXXXXXXX"`) | MTN Benin (STK PIN prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Moov Money** | Deposit | `"moov"` | `mobile` (format: `"229XXXXXXXX"`) | Moov Africa Benin (Prompt on handset) | [Collections API](/api-reference/collections/unified-collections) | | **MTN MoMo** | Payout | `"mtn"` | `mtn: [{"phone_number": "229XXXXXXXX"}]` | MTN Benin Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Moov Money** | Payout | `"moov"` | `mobile` (format: `"229XXXXXXXX"`) | Moov Africa Benin Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) 1. **Initiation:** Submit a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `country_id: 2`, `currency: "XOF"`, `amount`, `payment_method_type` (`"mtn"` or `"moov"`), and the customer's phone number in `mobile` (format: `229XXXXXXXX`). 2. **Handset Authorization:** The customer receives an instant on-screen prompt on their mobile phone to enter their PIN and authorize the debit. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once authorized, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When initiating a payout to Benin via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and its corresponding parameters: * **MTN MoMo:** Pass `payment_method_type: "mtn"` with an `mtn` array containing `phone_number`. * **Moov Money:** Pass `payment_method_type: "moov"` with the recipient's phone number in `mobile`. *** ## Sample Requests & Responses ### MTN MoMo Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 2, "currency": "XOF", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "22918580649", "payment_method_type": "mtn", "third_party_reference_1": "TX-BEN-DEP-1001", "third_party_reference_2": "CUST-1301" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 2, "currency": "XOF", "depositId": "dep_12345678", "mobile": "22918580649", "payment_method_type": "mtn", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-BEN-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (MTN MoMo) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 2000, "client_callback_url": "https://example.com/callback", "country_id": 2, "currency": "XOF", "first_name": "John", "last_name": "Doe", "mobile": "22991600649", "payment_method_type": "mtn", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-BEN-DISB-2001", "mtn": [ { "phone_number": "22991600649" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "22991600649", "total": 2000, "type": "MTN MoMo" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 5000, "currency": "XOF", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "22918580649", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-BEN-DEP-1001", "third_party_reference_2": "CUST-1301" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "22991600649", "amount": 2000, "currency": "XOF", "fee": 20, "message": "Payment was transferred successfully.", "mobile": "22991600649", "payee": "John Doe", "payment_channel": "MTN MoMo", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-BEN-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through MTN MoMo", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Benin deposits. Payments API reference for Benin payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Benin (XOF) collections and payouts, please see the [Transaction Limits for Benin](/transaction-limits#benin) section on the Transaction Limits page. # Burkina Faso | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/burkina-faso Supported collection and payout methods, request formats, and sample payloads for Burkina Faso on the Niobi API.

Burkina Faso

Supported payment methods and integration details for Burkina Faso

Burkina Faso flag

Country Details

Country ID: 19  •   Country Code: 226  •   Currency: XOF (West African CFA Franc)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :--------------- | :------ | :----------------------------------------------- | :------------------------------------------ | :------------------------------------------- | :---------------------------------------------------------------- | | **Orange Money** | Deposit | `"orange"` | `mobile` (format: `"226XXXXXXXX"`) | Orange Burkina Faso (STK prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Moov Money** | Deposit | `"moov"` | `mobile` (format: `"226XXXXXXXX"`) | Moov Africa Burkina Faso (Prompt on handset) | [Collections API](/api-reference/collections/unified-collections) | | **Orange Money** | Payout | `"Orange"` | `Orange: [{"phone_number": "226XXXXXXXX"}]` | Orange Burkina Faso Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Moov Money** | Payout | `"moov"` | `mobile` (format: `"226XXXXXXXX"`) | Moov Africa Burkina Faso Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) 1. **Initiation:** Submit a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `country_id: 19`, `currency: "XOF"`, `amount`, `payment_method_type` (`"orange"` or `"moov"`), and the customer's phone number in `mobile` (format: `226XXXXXXXX`). 2. **Handset Authorization:** The customer receives a prompt on their handset to enter their PIN and authorize the debit. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once authorized, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When initiating a payout to Burkina Faso via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and its corresponding parameters: * **Orange Money:** Pass `payment_method_type: "Orange"` with an `Orange` array containing `phone_number`. * **Moov Money:** Pass `payment_method_type: "moov"` with the recipient's phone number in `mobile`. *** ## Sample Requests & Responses ### Orange Money Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 19, "currency": "XOF", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "22618580649", "payment_method_type": "orange", "third_party_reference_1": "TX-BFA-DEP-1001", "third_party_reference_2": "CUST-1401" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 19, "currency": "XOF", "depositId": "dep_12345678", "mobile": "22618580649", "payment_method_type": "orange", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-BFA-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (Orange Money) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 2000, "client_callback_url": "https://example.com/callback", "country_id": 19, "currency": "XOF", "first_name": "John", "last_name": "Doe", "mobile": "22691600649", "payment_method_type": "Orange", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-BFA-DISB-2001", "Orange": [ { "phone_number": "22691600649" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "22691600649", "total": 2000, "type": "Orange Money" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 5000, "currency": "XOF", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "22618580649", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-BFA-DEP-1001", "third_party_reference_2": "CUST-1401" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "22691600649", "amount": 2000, "currency": "XOF", "fee": 20, "message": "Payment was transferred successfully.", "mobile": "22691600649", "payee": "John Doe", "payment_channel": "Orange Money", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-BFA-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through Orange Money", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Burkina Faso deposits. Payments API reference for Burkina Faso payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Burkina Faso (XOF) collections and payouts, please see the [Transaction Limits for Burkina Faso](/transaction-limits#burkina-faso) section on the Transaction Limits page. # Cameroon | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/cameroon Supported collection and payout methods, request formats, and sample payloads for Cameroon on the Niobi API.

Cameroon

Supported payment methods and integration details for Cameroon

Cameroon flag

Country Details

Country ID: 4  •   Country Code: 237  •   Currency: XAF (Central African CFA Franc)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :--------------- | :------ | :----------------------------------------------- | :-------------------------------------------------------------------------------------------------------- | :---------------------------- | :---------------------------------------------------------------- | | **MTN MoMo** | Deposit | `"mtn"` | `mobile` (format: `"237XXXXXXXX"`) | MTN Cameroon (STK PIN prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Orange Money** | Deposit | `"orange"` | `mobile` (format: `"237XXXXXXXX"`) | Orange Cameroon (USSD prompt) | [Collections API](/api-reference/collections/unified-collections) | | **MTN MoMo** | Payout | `"mtn"` | `mtn: [{"phone_number": "237XXXXXXXX"}]`, `sender_firstname`, `sender_lastname`, `sender_phone_number` | MTN Cameroon Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Orange Money** | Payout | `"Orange"` | `Orange: [{"phone_number": "237XXXXXXXX"}]`, `sender_firstname`, `sender_lastname`, `sender_phone_number` | Orange Cameroon Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) 1. **Initiation:** Submit a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `payment_method_type` set to `"mtn"` or `"orange"`, along with `country_id: 4`, `currency: "XAF"`, `amount`, and the customer's phone number in `mobile` (format: `237XXXXXXXX`). 2. **Handset Prompt:** The customer receives an on-screen prompt on their mobile phone to enter their PIN and authorize the transaction. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once the customer authorizes the transaction, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When initiating a payout to Cameroon via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type`, its nested array, and the required regulatory sender identity fields: * **MTN MoMo:** Pass `payment_method_type: "mtn"` with an `mtn` array containing `phone_number`. * **Orange Money:** Pass `payment_method_type: "Orange"` with an `Orange` array containing `phone_number`. **Sender Identity Requirement for Cameroon:**\ Due to regional compliance regulations in Cameroon (`country_id: 4`), all payout requests require the sender's identity fields: `sender_firstname`, `sender_lastname`, and `sender_phone_number` inside `params`. *** ## Sample Requests & Responses ### MTN MoMo Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 4, "currency": "XAF", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "237653456789", "payment_method_type": "mtn", "third_party_reference_1": "TX-CMR-DEP-1001", "third_party_reference_2": "CUST-801" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 4, "currency": "XAF", "depositId": "dep_12345678", "mobile": "237653456789", "payment_method_type": "mtn", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-CMR-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (MTN MoMo with Sender Details) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 2500, "client_callback_url": "https://example.com/callback", "country_id": 4, "currency": "XAF", "first_name": "John", "last_name": "Doe", "mobile": "237387597649", "payment_method_type": "mtn", "payment_reference": "YOUR-PAYOUT-REF", "sender_firstname": "Alice", "sender_lastname": "Smith", "sender_phone_number": "237690000000", "third_party_reference_1": "TX-CMR-DISB-2001", "mtn": [ { "phone_number": "237387597649" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "237387597649", "total": 2500, "type": "MTN MoMo" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 5000, "currency": "XAF", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "237653456789", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-CMR-DEP-1001", "third_party_reference_2": "CUST-801" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "237387597649", "amount": 2500, "currency": "XAF", "fee": 25, "message": "Payment was transferred successfully.", "mobile": "237387597649", "payee": "John Doe", "payment_channel": "MTN MoMo", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-CMR-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through MTN MoMo", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Cameroon deposits. Payments API reference for Cameroon payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Cameroon (XAF) collections and payouts, please see the [Transaction Limits for Cameroon](/transaction-limits#cameroon) section on the Transaction Limits page. # Canada | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/canada Supported collection and payout methods, request formats, and sample payloads for Canada on the Niobi API.

Canada

Supported payment methods and integration details for Canada

Canada flag

Country Details

Country Code: 1  •   Currency: CAD (Canadian Dollar)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :---------------------- | :------ | :----------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :------------------------ | :---------------------------------------------------------------- | | **SWIFT Wire Transfer** | Payout | `"bank"` | `bank: [{"bank_name": "...", "bank_code": "...", "branch_name": "...", "account_name": "...", "account_number": "..."}]` | Canadian Commercial Banks | [Payments API](/api-reference/disbursement/unified-disbursement) | | **SWIFT Wire Transfer** | Deposit | `"bank"` | Contact Support for CAD Wire Details | Canadian Commercial Banks | [Collections API](/api-reference/collections/unified-collections) |
*** ## Payment Flow: How It Works ### Payouts (Disbursements) 1. **Initiation:** Send a POST request to the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement) with `currency: "CAD"` and `payment_method_type: "bank"`. 2. **Recipient Bank Details:** Provide the recipient's bank account information, SWIFT/BIC code, and account name. 3. **Settlement & Callback:** Funds are routed via international wire transfer, and Niobi sends an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `client_callback_url` upon clearance. *** ## Sample Requests & Responses ### CAD Bank Payout Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 1000, "client_callback_url": "https://example.com/callback", "currency": "CAD", "first_name": "John", "last_name": "Doe", "payment_method_type": "bank", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-CAD-DISB-1001", "bank": [ { "bank_name": "Royal Bank of Canada", "bank_code": "ROYCCAT2", "branch_name": "Toronto", "account_name": "John Doe", "account_number": "123456789" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` *** ## Try it Collections API reference for CAD deposits. Payments API reference for CAD payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Canada (CAD) collections and payouts, please see the [Transaction Limits for Canada](/transaction-limits#canada) section on the Transaction Limits page. # China | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/china Supported collection and payout methods, request formats, and sample payloads for China on the Niobi API.

China

Supported payment methods and integration details for China

China flag

Country Details

Country Code: 86  •   Currency: CNY (Chinese Yuan)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :------------------------ | :--------------- | :----------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------------------- | :--------------------------------------------------------------- | | **CNAP / Express Payout** | Payout | `"cny_express"` | `bank: [{"bank_name": "...", "bank_code": "...", "branch_name": "...", "account_name": "...", "account_number": "..."}]` | China National Automatic Payment System | [Payments API](/api-reference/disbursement/unified-disbursement) | | **AliPay & WeChat Pay** | Payout / Deposit | Contact Support | Digital Wallet Integration Details | AliPay / WeChat Pay | [Contact Support](mailto:support@niobi.co) |
*** ## Payment Flow: How It Works ### Payouts (Disbursements) 1. **Initiation:** Send a POST request to the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement) with `currency: "CNY"` and `payment_method_type: "cny_express"`. 2. **Recipient Bank Details:** Include the recipient's bank account information, CNAPS code, and account name. 3. **Settlement & Callback:** Funds are routed via CNAPS, and Niobi sends an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) upon clearance. *** ## Sample Requests & Responses ### CNY Bank Payout Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "client_callback_url": "https://example.com/callback", "currency": "CNY", "first_name": "John", "last_name": "Doe", "payment_method_type": "cny_express", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-CNY-DISB-1001", "bank": [ { "bank_name": "Industrial and Commercial Bank of China", "bank_code": "ICBKCNBJ", "branch_name": "Beijing", "account_name": "John Doe", "account_number": "6222021234567890" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` *** ## Try it Collections API reference for CNY deposits. Payments API reference for CNY payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for China (CNY) collections and payouts, please see the [Transaction Limits for China](/transaction-limits#china) section on the Transaction Limits page. # Cote D'Ivoire | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/cote-d-ivoire Supported collection and payout methods, request formats, and sample payloads for Cote D'Ivoire on the Niobi API.

Cote D'Ivoire

Supported payment methods and integration details for Cote D'Ivoire

Cote D'Ivoire flag

Country Details

Country ID: 3  •   Country Code: 225  •   Currency: XOF (West African CFA Franc)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :--------------- | :------ | :----------------------------------------------- | :----------------------------------------------------------- | :----------------------------------- | :---------------------------------------------------------------- | | **MTN MoMo** | Deposit | `"mtn"` | `mobile` (format: `"225XXXXXXXXXX"`) | MTN Cote d'Ivoire (STK prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Moov Money** | Deposit | `"moov"` | `mobile` (format: `"225XXXXXXXXXX"`) | Moov Africa CI (Prompt on handset) | [Collections API](/api-reference/collections/unified-collections) | | **Orange Money** | Deposit | `"orange"` | `mobile` (format: `"225XXXXXXXXXX"`), `otp` (via `#144*82#`) | Orange CI (USSD authorization / OTP) | [Collections API](/api-reference/collections/unified-collections) | | **Wave** | Deposit | `"wave"` | `mobile`, `successful_url`, `failure_url` | Wave CI (Redirect URL) | [Collections API](/api-reference/collections/unified-collections) | | **MTN MoMo** | Payout | `"mtn"` | `mtn: [{"phone_number": "225XXXXXXXXXX"}]` | MTN Cote d'Ivoire Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Orange Money** | Payout | `"Orange"` | `Orange: [{"phone_number": "225XXXXXXXXXX"}]` | Orange CI Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Moov Money** | Payout | `"moov"` | `mobile` (format: `"225XXXXXXXXXX"`) | Moov Africa CI Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Wave** | Payout | `"wave"` | `mobile` (format: `"225XXXXXXXXXX"`) | Wave CI Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works Cote d'Ivoire features three distinct deposit collection flows depending on the operator: ### Deposits (Collections) #### 1. Instant Push Prompt Flow (MTN & Moov) * **Initiation:** Submit a POST request to [Unified Collections](/api-reference/collections/unified-collections) with `payment_method_type: "mtn"` or `"moov"`, `country_id: 3`, `currency: "XOF"`, `amount`, and `mobile` (format: `225XXXXXXXXXX`). * **Handset Prompt:** The customer immediately receives an on-screen prompt on their phone to enter their PIN and approve the debit. * **Response & Callback:** Niobi returns an initial response (`payment_step: 1`). Upon user approval, Niobi sends an asynchronous webhook callback (`payment_step: 2`, `status: "success"`). #### 2. Wave Redirect Flow (`payment_method_type: "wave"`) * **Initiation:** Send a POST request to [Unified Collections](/api-reference/collections/unified-collections) with `payment_method_type: "wave"`, `country_id: 3`, `currency: "XOF"`, `amount`, `successful_url`, and `failure_url`. * **Redirection URL:** Niobi generates and returns an `authorization_url` (`payment_step: 1`). Redirect the customer to this URL. On mobile, it opens directly in the Wave app; on desktop, the page shows a QR code the customer can scan with the Wave app on their phone to authorize instead. * **Completion:** Once the customer approves or cancels the payment in Wave, they're redirected to your `successful_url` or `failure_url` accordingly, and Niobi delivers the terminal webhook callback (`payment_step: 2`). #### 3. Orange Money OTP Flow (`payment_method_type: "orange"`) This is a two-step flow, the OTP is generated by the customer after you've already initiated the request, not before: * **Step 1, Initiate:** Submit a collection request with `payment_method_type: "orange"` and the customer's phone number in `mobile`. Niobi returns a `payment_token` (`payment_step: 1`). * **Generate the OTP:** Ask the customer to generate their OTP. They dial a USSD code on their Orange Cote d'Ivoire mobile handset to receive it via a USSD prompt on their phone (generating it through the Orange app is also possible but being phased out). The OTP is valid for **2 minutes**. * **Step 2, Verify:** Once you have the OTP from the customer, submit it together with the `payment_token` from Step 1 to [`POST /api/v4/niobi-unified-process-transaction`](/api-reference/collections/verify-otp). * **Completion:** The customer is debited and Niobi delivers the terminal webhook callback (`payment_step: 2`). No `successful_url` or `failure_url` is needed for this flow. Orange CI USSD OTP prompt *** ### Payouts (Disbursements) When initiating a payout to Cote d'Ivoire via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and its corresponding parameters: * **MTN MoMo:** Pass `payment_method_type: "mtn"` with an `mtn` array containing `phone_number`. * **Orange Money:** Pass `payment_method_type: "Orange"` with an `Orange` array containing `phone_number`. * **Moov Money:** Pass `payment_method_type: "moov"` with a `Moov` array containing `phone_number`. * **Wave:** Pass `payment_method_type: "wave"` with a `Wave` array containing `phone_number`. *** ## Sample Requests & Responses ### 1. MTN MoMo Deposit Request (STK Prompt) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 3, "currency": "XOF", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "2254805147649", "payment_method_type": "mtn", "third_party_reference_1": "TX-CIV-DEP-1001", "third_party_reference_2": "CUST-701" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### 2. Wave Deposit Request (Redirect Flow) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 3, "currency": "XOF", "email": "customer@example.com", "failure_url": "https://example.com/payment-failed", "first_name": "John", "last_name": "Doe", "mobile": "2254905147649", "payment_method_type": "wave", "successful_url": "https://example.com/payment-success", "third_party_reference_1": "TX-CIV-WAVE-1002" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Wave Deposit Response (with Authorization URL) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 5000, "authorization_url": "https://pay.wave.com/c/co_12345678abcdef", "callback_url": "https://example.com/callback", "country_id": 3, "currency": "XOF", "depositId": "dep_12345678", "failure_url": "https://example.com/payment-failed", "mobile": "2254905147649", "payment_method_type": "wave", "payment_step": 1, "status": "success", "successful_url": "https://example.com/payment-success", "third_party_reference_1": "TX-CIV-WAVE-1002" }, "status_code": "000000" } ``` *** ### 3. Orange Money Deposit Request (OTP Flow, Step 1: Initiate) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 3, "currency": "XOF", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "2259445131649", "payment_method_type": "orange", "third_party_reference_1": "TX-CIV-ORA-1003" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` #### Initial Response (Returns `payment_token`) ```json theme={null} { "success": true, "message": "Verification token was sent to your mobile number. Kindly verify to proceed payment.", "data": { "amount": 5000, "country_id": 3, "currency": "XOF", "payment_token": "NIO-S0000001", "payment_step": 1 }, "status_code": "000000" } ``` ### Orange Money Deposit Request (OTP Flow, Step 2: Verify) Once the customer has generated their OTP, submit it with the `payment_token` from the initial response to [`POST /api/v4/niobi-unified-process-transaction`](/api-reference/collections/verify-otp): ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "otp": "000000", "payment_token": "NIO-S0000001" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` *** ### Payout Request (MTN MoMo) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 2000, "client_callback_url": "https://example.com/callback", "country_id": 3, "currency": "XOF", "first_name": "John", "last_name": "Doe", "mobile": "2259421131649", "payment_method_type": "mtn", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-CIV-DISB-2001", "mtn": [ { "phone_number": "2259421131649" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "2259421131649", "total": 2000, "type": "MTN MoMo" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 5000, "currency": "XOF", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "2254805147649", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-CIV-DEP-1001", "third_party_reference_2": "CUST-701" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "2259421131649", "amount": 2000, "currency": "XOF", "fee": 50, "message": "Payment was transferred successfully.", "mobile": "2259421131649", "payee": "John Doe", "payment_channel": "MTN MoMo", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-CIV-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through MTN MoMo", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Cote D'Ivoire deposits. Payments API reference for Cote D'Ivoire payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Cote D'Ivoire (XOF) collections and payouts, please see the [Transaction Limits for Cote D'Ivoire](/transaction-limits#cote-d-ivoire) section on the Transaction Limits page. # DRC | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/drc Supported collection and payout methods, request formats, and sample payloads for DRC on the Niobi API.

DRC

Supported payment methods and integration details for Democratic Republic of Congo

DRC flag

Country Details

Country ID: 5  •   Country Code: 243  •   Currency: CDF (Congolese Franc)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :----------------- | :------ | :----------------------------------------------- | :-------------------------------------------- | :------------------------ | :---------------------------------------------------------------- | | **Airtel Money** | Deposit | `"airtel"` | `mobile` (format: `"243XXXXXXXXX"`) | Airtel DRC (USSD prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Orange Money** | Deposit | `"orange"` | `mobile` (format: `"243XXXXXXXXX"`) | Orange DRC (STK prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Vodacom M-Pesa** | Deposit | `"vodacom"` | `mobile` (format: `"243XXXXXXXXX"`) | Vodacom DRC (STK prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Airtel Money** | Payout | `"Airtel"` | `Airtel: [{"phone_number": "243XXXXXXXXX"}]` | Airtel DRC Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Orange Money** | Payout | `"Orange"` | `Orange: [{"phone_number": "243XXXXXXXXX"}]` | Orange DRC Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Vodacom M-Pesa** | Payout | `"Vodacom"` | `Vodacom: [{"phone_number": "243XXXXXXXXX"}]` | Vodacom DRC Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) 1. **Initiation:** Submit a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `country_id: 5`, `currency: "CDF"`, `amount`, `payment_method_type` (`"airtel"`, `"orange"`, or `"vodacom"`), and the customer's phone number in `mobile` (format: `243XXXXXXXXX`). 2. **Handset Authorization:** The customer receives a prompt on their handset to enter their PIN and authorize the debit. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once authorized, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When initiating a payout to DRC via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and its corresponding parameters: * **Airtel Money:** Pass `payment_method_type: "Airtel"` with an `Airtel` array containing `phone_number`. * **Orange Money:** Pass `payment_method_type: "Orange"` with an `Orange` array containing `phone_number`. * **Vodacom M-Pesa:** Pass `payment_method_type: "Vodacom"` with a `Vodacom` array containing `phone_number`. *** ## Sample Requests & Responses ### Vodacom M-Pesa Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 25000, "callback_url": "https://example.com/callback", "country_id": 5, "currency": "CDF", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "243957311649", "payment_method_type": "vodacom", "third_party_reference_1": "TX-COD-DEP-1001", "third_party_reference_2": "CUST-1501" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 25000, "callback_url": "https://example.com/callback", "country_id": 5, "currency": "CDF", "depositId": "dep_12345678", "mobile": "243957311649", "payment_method_type": "vodacom", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-COD-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (Vodacom M-Pesa) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 10000, "client_callback_url": "https://example.com/callback", "country_id": 5, "currency": "CDF", "first_name": "John", "last_name": "Doe", "mobile": "243589638649", "payment_method_type": "Vodacom", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-COD-DISB-2001", "Vodacom": [ { "phone_number": "243589638649" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "243589638649", "total": 10000, "type": "Vodacom M-Pesa" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 25000, "currency": "CDF", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "243957311649", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-COD-DEP-1001", "third_party_reference_2": "CUST-1501" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "243589638649", "amount": 10000, "currency": "CDF", "fee": 100, "message": "Payment was transferred successfully.", "mobile": "243589638649", "payee": "John Doe", "payment_channel": "Vodacom M-Pesa", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-COD-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through Vodacom M-Pesa", "type": "Pay out" } } ``` *** ## Try it Collections API reference for DRC deposits. Payments API reference for DRC payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for DRC (CDF) collections and payouts, please see the [Transaction Limits for DRC](/transaction-limits#drc) section on the Transaction Limits page. # Egypt | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/egypt Supported collection and payout methods, request formats, and sample payloads for Egypt on the Niobi API.

Egypt

Coming Soon

Supported payment methods and integration details for Egypt

Egypt flag

Country Details

Country Code: 20  •   Currency: EGP (Egyptian Pound)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | Status | | :---------------- | :--------------- | :----------------------------------------------- | :---------------------------------- | :--------------------- | :---------- | | **Vodafone Cash** | Payout / Deposit | `"vodafone"` | `mobile` (format: `"20XXXXXXXXXX"`) | Vodafone Egypt | Coming Soon | | **Orange Cash** | Payout / Deposit | `"orange"` | `mobile` (format: `"20XXXXXXXXXX"`) | Orange Egypt | Coming Soon | | **Etisalat Cash** | Payout / Deposit | `"etisalat"` | `mobile` (format: `"20XXXXXXXXXX"`) | Etisalat Egypt | Coming Soon |
*** ## Overview & Availability Egypt payment rails are currently in development. To join the beta program or request early access for EGP collections and disbursements, please contact our team at [support@niobi.co](mailto:support@niobi.co). *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Egypt (EGP) collections and payouts, please see the [Transaction Limits for Egypt](/transaction-limits#egypt-coming-soon) section on the Transaction Limits page. # Ethiopia | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/ethiopia Supported collection and payout methods, request formats, and sample payloads for Ethiopia on the Niobi API.

Ethiopia

Coming Soon

Supported payment methods and integration details for Ethiopia

Ethiopia flag

Country Details

Country Code: 251  •   Currency: ETB (Ethiopian Birr)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | Status | | :----------- | :--------------- | :----------------------------------------------- | :---------------------------------- | :--------------------- | :---------- | | **Telebirr** | Payout / Deposit | `"telebirr"` | `mobile` (format: `"251XXXXXXXXX"`) | Ethio Telecom Telebirr | Coming Soon | | **M-Birr** | Payout / Deposit | `"mbirr"` | `mobile` (format: `"251XXXXXXXXX"`) | M-Birr Services | Coming Soon |
*** ## Overview & Availability Ethiopia payment integrations are currently in active development. If your business requires early access or custom routing for Ethiopian Birr (ETB), contact us at [support@niobi.co](mailto:support@niobi.co). *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Ethiopia (ETB) collections and payouts, please see the [Transaction Limits for Ethiopia](/transaction-limits#ethiopia-coming-soon) section on the Transaction Limits page. # Europe | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/europe Supported collection and payout methods, request formats, and sample payloads for Europe on the Niobi API.

Europe

Supported payment methods and integration details for Single Euro Payments Area (SEPA)

Europe flag

Region Details

Currency: EUR (Euro)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :----------------------- | :------ | :----------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :------------------------------------ | :---------------------------------------------------------------- | | **SEPA Credit Transfer** | Payout | `"bank"` | `bank: [{"bank_name": "...", "bank_code": "...", "branch_name": "...", "account_name": "...", "account_number": "..."}]` | European Banking Network (IBAN / BIC) | [Payments API](/api-reference/disbursement/unified-disbursement) | | **SEPA Instant / Wire** | Deposit | `"bank"` | Contact Support for EUR Inward Wire Details | European Commercial Banks | [Collections API](/api-reference/collections/unified-collections) |
*** ## Payment Flow: How It Works ### Payouts (Disbursements) 1. **Initiation:** Send a POST request to the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement) with `currency: "EUR"` and `payment_method_type: "bank"`. 2. **IBAN & BIC Details:** Provide the recipient's IBAN in `account_number` and BIC/SWIFT code in `bank_code`. 3. **Settlement & Callback:** Funds are routed via SEPA Credit Transfer, and Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) upon execution. *** ## Sample Requests & Responses ### EUR SEPA Payout Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 1000, "client_callback_url": "https://example.com/callback", "currency": "EUR", "first_name": "John", "last_name": "Doe", "payment_method_type": "bank", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-EUR-DISB-1001", "bank": [ { "bank_name": "BNP Paribas", "bank_code": "BNPAFRPP", "branch_name": "Paris", "account_name": "John Doe", "account_number": "FR7630006000011234567890189" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` *** ## Try it Collections API reference for EUR deposits. Payments API reference for EUR payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Europe (EUR) collections and payouts, please see the [Transaction Limits for Europe](/transaction-limits#europe) section on the Transaction Limits page. # Ghana | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/ghana Supported collection and payout methods, request formats, and sample payloads for Ghana on the Niobi API.

Ghana

Supported payment methods and integration details for Ghana

Ghana flag

Country Details

Country ID: 16  •   Country Code: 233  •   Currency: GHS (Ghanaian Cedi)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :-------------------------- | :------ | :----------------------------------------------- | :--------------------------------------------- | :-------------------------------- | :---------------------------------------------------------------- | | **MTN MoMo** | Deposit | `"mtn"` | `mobile` (format: `"233XXXXXXXXX"`) | MTN Ghana (Prompt on handset) | [Collections API](/api-reference/collections/unified-collections) | | **Telecel (Vodafone Cash)** | Deposit | `"vodafone"` | `mobile` (format: `"233XXXXXXXXX"`) | Telecel Ghana (Prompt on handset) | [Collections API](/api-reference/collections/unified-collections) | | **AT (AirtelTigo)** | Deposit | `"at"` | `mobile` (format: `"233XXXXXXXXX"`) | AT Ghana (Prompt on handset) | [Collections API](/api-reference/collections/unified-collections) | | **MTN MoMo** | Payout | `"mtn"` | `mtn: [{"phone_number": "233XXXXXXXXX"}]` | MTN Ghana Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Telecel (Vodafone Cash)** | Payout | `"Vodafone"` | `Vodafone: [{"phone_number": "233XXXXXXXXX"}]` | Telecel Ghana Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **AT (AirtelTigo)** | Payout | `"at"` | `at: [{"phone_number": "233XXXXXXXXX"}]` | AT Ghana Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) 1. **Initiation:** Send a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `payment_method_type` set to `"mtn"`, `"vodafone"`, or `"at"`, along with `country_id: 16`, `currency: "GHS"`, `amount`, and the customer's phone number in `mobile` (format: `233XXXXXXXXX`). 2. **Handset Prompt:** The customer receives a prompt on their handset to enter their PIN and authorize the transfer. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once the customer confirms the payment on their phone, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When submitting a payout to Ghana via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and its corresponding nested array: * **MTN MoMo:** Pass `payment_method_type: "mtn"` with an `mtn` array containing `phone_number`. * **Telecel (Vodafone Cash):** Pass `payment_method_type: "Vodafone"` with a `Vodafone` array containing `phone_number`. * **AT (AirtelTigo):** Pass `payment_method_type: "at"` with an `at` array containing `phone_number`. *** ## Sample Requests & Responses ### MTN MoMo Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 100, "callback_url": "https://example.com/callback", "country_id": 16, "currency": "GHS", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "233593456789", "payment_method_type": "mtn", "third_party_reference_1": "TX-GHS-DEP-1001", "third_party_reference_2": "CUST-601" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 100, "callback_url": "https://example.com/callback", "country_id": 16, "currency": "GHS", "depositId": "dep_12345678", "mobile": "233593456789", "payment_method_type": "mtn", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-GHS-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (MTN MoMo) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 50, "client_callback_url": "https://example.com/callback", "country_id": 16, "currency": "GHS", "first_name": "John", "last_name": "Doe", "mobile": "233593456789", "payment_method_type": "mtn", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-GHS-DISB-2001", "mtn": [ { "phone_number": "233593456789" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "233593456789", "total": 50, "type": "MTN MoMo" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 100, "currency": "GHS", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "233593456789", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-GHS-DEP-1001", "third_party_reference_2": "CUST-601" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "233593456789", "amount": 50, "currency": "GHS", "fee": 1, "message": "Payment was transferred successfully.", "mobile": "233593456789", "payee": "John Doe", "payment_channel": "MTN MoMo", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-GHS-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through MTN MoMo", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Ghana deposits. Payments API reference for Ghana payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Ghana (GHS) collections and payouts, please see the [Transaction Limits for Ghana](/transaction-limits#ghana) section on the Transaction Limits page. # Kenya | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/kenya Supported collection and payout methods, request formats, and sample payloads for Kenya on the Niobi API.

Kenya

Supported payment methods and integration details for Kenya

Kenya flag

Country Details

Country ID: 1  •   Country Code: 254  •   Currency: KES (Kenyan Shilling)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :-------------------- | :------ | :----------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------- | :---------------------------------------------------------------- | | **M-Pesa STK Push** | Deposit | `"send money"` | `mobile` (format: `"2547XXXXXXXX"`) | Safaricom (STK PIN prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Airtel Money** | Deposit | `"airtel"` | `mobile` (format: `"2547XXXXXXXX"`) | Airtel Kenya (USSD PIN prompt) | [Collections API](/api-reference/collections/unified-collections) | | **M-Pesa Send Money** | Payout | `"send money"` | `sendmoney: [{"phone_number": "2547XXXXXXXX"}]` | Safaricom (B2C Mobile Wallet) | [Payments API](/api-reference/disbursement/unified-disbursement) | | **PayBill** | Payout | `"pay bill"` | `paybill: [{"paybill_number": "...", "account_number": "..."}]` | Safaricom (B2B Business PayBill) | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Till Number** | Payout | `"till number"` | `tillnumber: [{"till_number": "..."}]` | Safaricom (Buy Goods Till) | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Pesalink** | Payout | `"pesalink"` | `pesalink: [{"bank_name": "...", "bank_code": "...", "branch_name": "...", "account_name": "...", "account_number": "..."}]` | [Kenyan Commercial Banks](#list-of-supported-kenyan-banks-for-pesalink) | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Airtel Money** | Payout | `"Airtel"` | `Airtel: [{"phone_number": "2547XXXXXXXX"}]` | Airtel Kenya Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections via STK Push) 1. **Initiation:** Send a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `payment_method_type: "send money"`, `country_id: 1`, `currency: "KES"`, and the customer's phone number in `mobile` (format: `2547XXXXXXXX`). 2. **Handset Prompt:** The customer receives an on-screen prompt on their phone to enter their PIN and authorize the transfer. 3. **Initial Acknowledgement:** Niobi returns an immediate response (`payment_step: 1`) containing the assigned `depositId`. 4. **Webhook Delivery:** Once the payment completes, Niobi sends an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When making a payout via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` along with its required nested method array: * **Send Money (B2C):** Pass `payment_method_type: "send money"` with a `sendmoney` array carrying `phone_number`. * **PayBill (B2B):** Pass `payment_method_type: "pay bill"` with a `paybill` array containing `paybill_number` and `account_number`. * **Till Number (Buy Goods):** Pass `payment_method_type: "till number"` with a `tillnumber` array containing `till_number`. * **Pesalink (Bank Transfer):** Pass `payment_method_type: "pesalink"` with a `pesalink` array carrying `bank_name`, `bank_code`, `branch_name`, `account_name`, and `account_number`. * **Airtel Money:** Pass `payment_method_type: "Airtel"` with an `Airtel` array containing `phone_number`. #### List of Supported Kenyan Banks for Pesalink Pass one of the following codes as `bank_code` in the `pesalink` array when initiating a bank payout: | Bank Name | `bank_code` | | :----------------------------------- | :---------- | | Kenya Commercial Bank (KCB) | `1` | | Standard Chartered Bank | `2` | | Absa Bank Kenya | `3` | | NCBA Bank Kenya | `7` | | Prime Bank | `10` | | Cooperative Bank of Kenya | `11` | | National Bank of Kenya | `12` | | Citibank N.A Kenya | `16` | | Middle East Bank Kenya | `18` | | Bank of Africa Kenya | `19` | | Credit Bank Limited | `25` | | Stanbic Bank Kenya | `31` | | Paramount Bank | `50` | | Kingdom Bank (Jamii Bora) | `51` | | Guaranty Trust Bank | `53` | | Guardian Bank | `55` | | I\&M Bank | `57` | | Diamond Trust Bank (DTB) | `63` | | Sidian Bank | `66` | | Equity Bank Kenya | `68` | | Family Bank Limited | `70` | | Gulf African Bank | `72` | | Premier Bank (First Community Bank) | `74` | | Kenya Women Microfinance Bank (KWFT) | `78` | | Choice Microfinance Bank | `82` | *** ## Sample Requests & Responses ### M-Pesa STK Push Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 1000, "callback_url": "https://example.com/callback", "country_id": 1, "currency": "KES", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "254161166649", "payment_method_type": "send money", "third_party_reference_1": "TX-KES-DEP-1001", "third_party_reference_2": "CUST-401" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 1000, "callback_url": "https://example.com/callback", "country_id": 1, "currency": "KES", "depositId": "dep_12345678", "mobile": "254161166649", "payment_method_type": "send money", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-KES-DEP-1001" }, "status_code": "000000" } ``` This is the initial acknowledgement. `payment_step: 1` means the request was accepted and the STK prompt was pushed to the user's handset. Await the terminal callback (`payment_step: 2`). *** ### Payout Request (M-Pesa Send Money) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 500, "client_callback_url": "https://example.com/callback", "country_id": 1, "currency": "KES", "first_name": "John", "last_name": "Doe", "mobile": "254647647649", "payment_method_type": "send money", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-KES-DISB-2001", "sendmoney": [ { "phone_number": "254647647649" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Request (Pesalink Bank Transfer) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "client_callback_url": "https://example.com/callback", "country_id": 1, "currency": "KES", "first_name": "John", "last_name": "Doe", "payment_method_type": "pesalink", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-KES-PESA-2002", "pesalink": [ { "bank_name": "Co-operative Bank", "bank_code": "11", "branch_name": "Nairobi", "account_name": "John Doe", "account_number": "01129123456700" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "254647647649", "total": 500, "type": "Send Money" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 1000, "currency": "KES", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "254161166649", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-KES-DEP-1001", "third_party_reference_2": "CUST-401" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "254647647649", "amount": 500, "currency": "KES", "fee": 5, "message": "Payment was transferred successfully.", "mobile": "254647647649", "payee": "John Doe", "payment_channel": "Send Money", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-KES-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through M-Pesa Send Money", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Kenya deposits. Payments API reference for Kenya payouts. *** ## Conditional SMS Notifications for External Beneficiaries (KES Payouts) For payout transactions in Kenyan Shillings (KES), you can request conditional SMS notifications to be sent to external beneficiaries. This feature allows you to opt-in for SMS alerts to recipients outside your organization. To enable this feature, contact our support team at [support@niobi.co](mailto:support@niobi.co) to request activation. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Kenya (KES) collections and payouts, please see the [Transaction Limits for Kenya](/transaction-limits#kenya) section on the Transaction Limits page. # Malawi | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/malawi Supported collection and payout methods, request formats, and sample payloads for Malawi on the Niobi API.

Malawi

Coming Soon

Supported payment methods and integration details for Malawi

Malawi flag

Country Details

Country Code: 265  •   Currency: MWK (Malawian Kwacha)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | Status | | :--------------- | :--------------- | :----------------------------------------------- | :---------------------------------- | :---------------------- | :---------- | | **Airtel Money** | Payout / Deposit | `"airtel"` | `mobile` (format: `"265XXXXXXXXX"`) | Airtel Malawi | Coming Soon | | **TNM Mpamba** | Payout / Deposit | `"tnm"` | `mobile` (format: `"265XXXXXXXXX"`) | Telekom Networks Malawi | Coming Soon |
*** ## Overview & Availability Malawi mobile money integrations are currently in development. If your business requires early access or pilot testing for Malawian Kwacha (MWK), reach out to us at [support@niobi.co](mailto:support@niobi.co). *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Malawi (MWK) collections and payouts, please see the [Transaction Limits for Malawi](/transaction-limits#malawi-coming-soon) section on the Transaction Limits page. # Mali | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/mali Supported collection and payout methods, request formats, and sample payloads for Mali on the Niobi API.

Mali

Supported payment methods and integration details for Mali

Mali flag

Country Details

Country ID: 18  •   Country Code: 223  •   Currency: XOF (West African CFA Franc)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :--------------- | :------ | :----------------------------------------------- | :------------------------------------------ | :----------------------------------- | :---------------------------------------------------------------- | | **Orange Money** | Deposit | `"orange"` | `mobile` (format: `"223XXXXXXXX"`) | Orange Mali (STK prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Moov Money** | Deposit | `"moov"` | `mobile` (format: `"223XXXXXXXX"`) | Moov Africa Mali (Prompt on handset) | [Collections API](/api-reference/collections/unified-collections) | | **Orange Money** | Payout | `"Orange"` | `Orange: [{"phone_number": "223XXXXXXXX"}]` | Orange Mali Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Moov Money** | Payout | `"moov"` | `mobile` (format: `"223XXXXXXXX"`) | Moov Africa Mali Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) 1. **Initiation:** Submit a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `country_id: 18`, `currency: "XOF"`, `amount`, `payment_method_type` (`"orange"` or `"moov"`), and the customer's phone number in `mobile` (format: `223XXXXXXXX`). 2. **Handset Authorization:** The customer receives a prompt on their handset to enter their PIN and authorize the debit. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once authorized, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When initiating a payout to Mali via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and its corresponding parameters: * **Orange Money:** Pass `payment_method_type: "Orange"` with an `Orange` array containing `phone_number`. * **Moov Money:** Pass `payment_method_type: "moov"` with the recipient's phone number in `mobile`. *** ## Sample Requests & Responses ### Orange Money Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 18, "currency": "XOF", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "22318580649", "payment_method_type": "orange", "third_party_reference_1": "TX-MLI-DEP-1001", "third_party_reference_2": "CUST-1601" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 18, "currency": "XOF", "depositId": "dep_12345678", "mobile": "22318580649", "payment_method_type": "orange", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-MLI-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (Orange Money) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 2000, "client_callback_url": "https://example.com/callback", "country_id": 18, "currency": "XOF", "first_name": "John", "last_name": "Doe", "mobile": "22391600649", "payment_method_type": "Orange", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-MLI-DISB-2001", "Orange": [ { "phone_number": "22391600649" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "22391600649", "total": 2000, "type": "Orange Money" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 5000, "currency": "XOF", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "22318580649", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-MLI-DEP-1001", "third_party_reference_2": "CUST-1601" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "22391600649", "amount": 2000, "currency": "XOF", "fee": 20, "message": "Payment was transferred successfully.", "mobile": "22391600649", "payee": "John Doe", "payment_channel": "Orange Money", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-MLI-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through Orange Money", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Mali deposits. Payments API reference for Mali payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Mali (XOF) collections and payouts, please see the [Transaction Limits for Mali](/transaction-limits#mali) section on the Transaction Limits page. # Mozambique | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/mozambique Supported collection and payout methods, request formats, and sample payloads for Mozambique on the Niobi API.

Mozambique

Coming Soon

Supported payment methods and integration details for Mozambique

Mozambique flag

Country Details

Country Code: 258  •   Currency: MZN (Mozambican Metical)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | Status | | :------------------- | :--------------- | :----------------------------------------------- | :---------------------------------- | :--------------------- | :---------- | | **Vodacom M-Pesa** | Payout / Deposit | `"vodacom"` | `mobile` (format: `"258XXXXXXXXX"`) | Vodacom Mozambique | Coming Soon | | **Movitel (e-Mola)** | Payout / Deposit | `"movitel"` | `mobile` (format: `"258XXXXXXXXX"`) | Movitel Mozambique | Coming Soon | | **Tmcel (mKesh)** | Payout / Deposit | `"tmcel"` | `mobile` (format: `"258XXXXXXXXX"`) | Tmcel Mozambique | Coming Soon |
*** ## Overview & Availability Mozambique payment channels are currently under integration. For updates or early enterprise boarding for Mozambican Metical (MZN), contact [support@niobi.co](mailto:support@niobi.co). *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Mozambique (MZN) collections and payouts, please see the [Transaction Limits for Mozambique](/transaction-limits#mozambique-coming-soon) section on the Transaction Limits page. # Nigeria | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/nigeria Supported collection and payout methods, request formats, and sample payloads for Nigeria on the Niobi API.

Nigeria

Supported payment methods and integration details for Nigeria

Nigeria flag

Country Details

Country ID: 17  •   Country Code: 234  •   Currency: NGN (Nigerian Naira)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :---------------------------------- | :------ | :----------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------- | :---------------------------------------------------------------- | | **Virtual Account (Bank Transfer)** | Deposit | "virtual\_account" | `first_name`, `last_name`, `account_name`, `bank_code` (`17001`, `17002`, `17003`) | Dynamic Virtual Account (78 Finance, Fidelity, Globus) | [Collections API](/api-reference/collections/unified-collections) | | **Bank Transfer** | Payout | `"bank"` | `bank: [{"bank_name": "...", "bank_code": "...", "branch_name": "...", "account_name": "...", "account_number": "..."}]` | [Nigerian Commercial & Microfinance Banks](#list-of-supported-nigerian-banks-for-payouts) | [Payments API](/api-reference/disbursement/unified-disbursement) |
**Opay and PalmPay Collections:**\ Opay and PalmPay are not separate Niobi payment methods. Customers can fund the dynamic virtual account by transferring from their Opay or PalmPay wallet, or from any Nigerian banking app. The API call on your end is the same virtual account deposit request. *** ## Payment Flow: How It Works ### Deposits (Collections via Dynamic Virtual Accounts) 1. **Initiation:** Send a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `payment_method_type: "virtual_account"` along with `first_name`, `last_name`, `account_name`, and `bank_code`. 2. **Virtual Account Generation:** Niobi returns an initial response (`payment_step: 1`) containing the generated `account_number` and `bank_name`. 3. **Customer Transfer:** Display the account details to the customer. The customer transfers the exact amount via their bank app, Opay, or PalmPay within 30 minutes. 4. **Callback Confirmation:** Once the funds land, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. #### Supported Virtual Account Issuing Banks (Collections) Pass one of the following codes as `bank_code` in your collection request: | Issuing Bank | `bank_code` | Notes | | :----------------------------- | :---------- | :---------------------------------------------------- | | **78 Finance Company Limited** | `17001` | Dynamic virtual bank account issued via 78 Finance | | **Fidelity Bank** | `17002` | Dynamic virtual bank account issued via Fidelity Bank | | **Globus Bank** | `17003` | Dynamic virtual bank account issued via Globus Bank | **Exact Amount Required:**\ Ensure customers transfer the exact requested amount. Any overpayment is automatically reversed to the payer upon successful settlement. *** ### Payouts (Bank Transfers) 1. **Initiation:** Send a signed POST request to the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement) with `payment_method_type: "bank"`. 2. **Bank Parameters:** Include a `bank` array containing the recipient's `bank_name`, `bank_code`, `branch_name`, `account_name`, and `account_number`. 3. **Processing:** Niobi returns an initial acknowledgement (`payment_step: 1`). 4. **Callback Delivery:** Niobi delivers a terminal callback (`payment_step: 2`) to your `client_callback_url` once the funds have cleared the recipient's bank. #### List of Supported Nigerian Banks for Payouts Pass one of the following codes as `bank_code` in the `bank` array when initiating a payout: | bank\_name | bank\_code | | --------------------------------------------- | ---------- | | AL-Barakah Microfinance Bank | 090133 | | 9 Payment Service Bank | 120001 | | AB Microfinance Bank | 090270 | | Abbey Mortgage Bank | 070010 | | Above Only Microfinance Bank | 090260 | | ABU Microfinance Bank | 090197 | | Access Bank Nigeria | 044 | | Access Bank Plc (Diamond) | 063 | | ACCESS MOBILE | 323 | | Access Money | 927 | | Access Yello & Beta | 100052 | | Accion Microfinance Bank | 090134 | | Addosser Microfinance Bank | 090160 | | Adeyemi College Staff Microfinance Bank | 090268 | | AG Mortgage Bank | 100028 | | Al-Hayat Microfinance Bank | 090277 | | Alekun Microfinance Bank | 090259 | | Alert MFB | 090297 | | Allworkers Microfinance Bank | 090131 | | Alpha Kapital Microfinance Bank | 090169 | | AMJU Unique Microfinance Bank | 090180 | | AMML Micro-finance Bank | 914 | | Apeks Microfinance Bank | 090143 | | Arise MFB | 090282 | | Aso Savings and Loans | 401 | | Astrapolaris Microfinance Bank | 090172 | | Auchi Microfinance Bank | 090264 | | Baines Credit Microfinance Bank | 090188 | | Balogun Gambari MFB | 090326 | | Bayero MICROFINANCE BANK | 090316 | | BC Kash Microfinance Bank | 090127 | | BIPC MICROFINANCE BANK | 090336 | | BOCTrust Micro-finance Bank | 952 | | Bosak Microfinance Bank | 090176 | | Bowen Microfinance Bank | 090148 | | Brent Mortgage Bank | 070015 | | BRETHREN MICROFINANCE BANK | 090293 | | BRIDGEWAY MICROFINANCE BANK | 090393 | | Brightway MFB | 090308 | | Cellulant | 919 | | CEMCS Microfinance Bank | 090154 | | Chams Mobile | 929 | | Chikum Microfinance Bank | 090141 | | CIT Microfinance Bank | 090144 | | Citi Bank | 023 | | Consumer Microfinance Bank | 090130 | | Contec Global Infotech Limited (NowNow) | 100032 | | Coronation Merchant Bank | 559 | | Covenant Micro-finance Bank | 949 | | Credit Afrique Microfinance Bank | 090159 | | Daylight Microfinance Bank | 090167 | | e-Barcs Microfinance Bank | 090156 | | Eagle Flight MFB | 090294 | | Eartholeum | 935 | | Ecobank | 050 | | EcoBank Express Account | 922 | | Ecobank Mobile | 307 | | Edfin MFB | 090310 | | Ekondo MFB | 090097 | | Emeralds Microfinance Bank | 090273 | | Empire Trust Micro-finance Bank | 913 | | Enterprise Bank | 084 | | Esan Microfinance Bank | 090189 | | Eso-E Microfinance Bank | 090166 | | eTRANZACT | 920 | | Evangel MFB | 090304 | | Evergreen MICROFINANCE BANK | 090332 | | Eyowo MFB | 090328 | | FAST Microfinance Bank | 090179 | | FBN MOBILE | 309 | | FBN Mortgages Limited | 090107 | | FBNQuest Merchant Bank | 911 | | FCMB Easy Account | 100031 | | FCMB Plc | 214 | | FCT MFB | 090290 | | FEDERAL UNIVERSITY DUTSE MICROFINANCE BANK | 090318 | | FederalPoly NasarawaMFB | 090298 | | FETS | 915 | | FFS Microfinance Bank | 090153 | | Fidelity Bank | 070 | | Fidelity Mobile | 933 | | Fidfund Microfinance Bank | 090126 | | FINATRUST MICROFINANCE BANK | 090111 | | Firmus MFB | 090366 | | First Bank of Nigeria | 011 | | First Generation Mortgage Bank | 070014 | | First Multiple MFB | 090163 | | First Option MFB | 090285 | | First Royal Microfinance Bank | 090164 | | First Trust Mortgage Bank Plc | 910 | | FirstMonie Wallet | 928 | | FlutterWave Technology Solutions Limited | 110002 | | Fortis Micro-finance Bank | 948 | | Fortis Mobile | 930 | | FSDH Merchant Bank | 601 | | Fullrange Microfinance Bank | 090145 | | Futo Microfinance Bank | 090158 | | Gashua Microfinance Bank | 090168 | | Gateway Mortgage Bank | 070009 | | Globus Bank | 103 | | Glory MFB | 090278 | | GoMoney | 100022 | | GOODNEWS MICROFINANCE BANK | 090495 | | Gowans Microfinance Bank | 090122 | | GreenBank Microfinance Bank | 090178 | | Greenville Microfinance Bank | 090269 | | Greenwich Merchant Bank | 060004 | | Grooming Microfinance Bank | 090195 | | GT MOBILE | 923 | | GTBank Mobile Money | 315 | | GTBank Plc | 058 | | Hackman Microfinance Bank | 090147 | | Haggai Mortgage Bank Limited | 070017 | | Hala MFB | 090291 | | Hasal Micro-finance Bank | 958 | | Hedonmark | 931 | | Heritage Bank | 030 | | IBILE Microfinance Bank | 090118 | | IKENNE MFB | 090324 | | Ikire MFB | 090279 | | Imo State Microfinance Bank | 090258 | | Imperial Homes Mortgage Bank | 938 | | Infinity Microfinance Bank | 090157 | | Infinity Trust Mortgage Bank | 070016 | | Innovectives Kesh | 100029 | | Intellfin | 941 | | IRL Microfinance Bank | 090149 | | JAIZ Bank | 301 | | Jubliee Life | 906 | | Kadick Integration Limited | 110008 | | Kadpoly MICROFINANCE BANK | 090320 | | KCMB Microfinance Bank | 090191 | | Kegow | 100015 | | Keystone Bank | 082 | | Kontagora MFB | 090299 | | Kuda Micro-finance Bank | 50211 | | La Fayette Microfinance Bank | 090155 | | Lagos Building Investment Company | 070012 | | Lapo Microfinance Bank | 090177 | | Lavender Microfinance Bank | 090271 | | Letshego MFB | 090420 | | Lovonus Microfinance Bank | 090265 | | M36 | 100035 | | Mainland MICROFINANCE BANK | 090323 | | Mainstreet Micro-finance Bank | 014 | | Malachy Microfinance Bank | 090174 | | Manny Microfinance bank | 090383 | | MAUTECH Microfinance Bank | 090423 | | Mayfair MFB | 090321 | | MayFresh Mortgage Bank | 070019 | | Megapraise Microfinance Bank | 090280 | | Meridian MFB | 090275 | | Microcred Microfinance Bank | 090136 | | Midland Microfinance Bank | 090192 | | Mint-Finex Micro-finance Bank | 50304 | | Mkudi | 100011 | | Money Trust Micro-finance Bank | 963 | | MoneyBox | 934 | | Mutual Benefits Microfinance Bank | 090190 | | Mutual Trust Microfinance Bank | 090151 | | Nagarta Microfinance Bank | 090152 | | Navy Microfinance Bank | 090263 | | Ndiorah Microfinance Bank | 090128 | | New Dawn Microfinance Bank | 090205 | | New Prudential Bank | 090108 | | NIP Virtual Bank | 999999 | | NIRSAL Microfinance Bank | 090194 | | Nnew women MFB | 090283 | | Nova Merchant Bank | 637 | | NPF Micro-finance Bank | 947 | | Oche MFB | 090333 | | Ohafia Microfinance Bank | 090119 | | Okpoga Microfinance Bank | 090161 | | Olabisi Onabanjo University Microfinance Bank | 090272 | | Omiye MFB | 090295 | | Omoluabi Mortgage Bank Plc | 950 | | One Finance | 940 | | PAGA | 916 | | Page Micro-finance Bank | 951 | | PALMPAY | 100033 | | PARALLEX BANK | 526 | | Parkway | 311 | | ParkWay-ReadyCash | 917 | | Parralex Microfinance bank | 090004 | | PatrickGold Microfinance Bank | 090317 | | PayAttitude Online | 943 | | PAYCOM | 305 | | PecanTrust Microfinance Bank | 090137 | | Pennywise Microfinance Bank | 090196 | | Personal Trust Microfinance Bank | 090135 | | Petra Microfinance Bank | 090165 | | Pillar MFB | 090289 | | Platinum Mortgage Bank | 070013 | | Polaris Bank | 076 | | Polyuwanna MFB | 090296 | | Prestige Microfinance bank | 090274 | | Providus Bank | 101 | | Purplemoney MFB | 090303 | | Quickfund Microfinance Bank | 090261 | | Rahama MFB | 090170 | | Rand Merchant Bank | 502 | | Refuge Mortgage Bank | 070011 | | Regent Micro-finance Bank | 955 | | Reliance Microfinance Bank | 090173 | | RenMoney Microfinance Bank | 090198 | | Rephidim MICROFINANCE BANK | 090322 | | Richway Microfinance Bank | 090132 | | Royal Exchange Microfinance Bank | 090138 | | Rubies Micro-finance Bank | 125 | | Safe Haven MFB | 090286 | | SafeTrust | 909 | | Sagamu Micro-finance Bank | 966 | | Seed Capital Micro-finance Bank | 609 | | Sparkle | 090325 | | Stanbic IBTC @ease Wallet | 921 | | Stanbic IBTC Bank | 221 | | Stanbic Mobile | 304 | | Standard Chartered Bank | 068 | | Stanford Microfinance Bak | 090162 | | Stellas Microfinance Bank | 090262 | | Sterling Bank | 232 | | Sterling Mobile | 936 | | Sulsap MFB | 090305 | | Suntrust Bank Nigeria Limited | 100 | | TAGPAY | 937 | | Taj Bank | 302 | | TCF Micro-finance Bank | 567 | | Teasy MOBILE | 924 | | Titan Trust Bank | 102 | | Trident Microfinance Bank | 090146 | | Trust MFB | 090327 | | Trustbond Mortgage Bank | 090005 | | Trustfund Microfinance Bank | 090276 | | U AND C MFB | 090315 | | UNAAB MFB | 090331 | | Uniben Microfinance Bank | 090266 | | Unical Microfinance Bank | 090193 | | Union Bank | 032 | | United Bank for Africa | 033 | | Unity Bank | 215 | | UNN MFB | 090251 | | Verite Microfinance Bank | 090123 | | VFD Micro-finance Bank | 566 | | Virtue Microfinance Bank | 090150 | | Visa Microfinance Bank | 090139 | | VT Networks | 926 | | Wema Bank | 035 | | WetLand Micro-finance Bank | 954 | | Xslnce Microfinance Bank | 090124 | | Yes Microfinance Bank | 090142 | | Zenith Bank Plc | 057 | | ZENITH Mobile | 322 | | ZINTERNET - KONGAPAY | 939 | ## Sample Requests & Responses ### Deposit request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "account_name": "John Doe", "amount": 10000, "bank_code": "17001", "callback_url": "https://example.com/callback", "country_id": 17, "currency": "NGN", "first_name": "John", "last_name": "Doe", "mobile": "2349034567899", "payment_method_type": "virtual_account", "third_party_reference_1": "TX-COLL-1001", "third_party_reference_2": "CUST-501", "sub_merchant_id": "{optional-sub-merchant-uuid}" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` `account_name` is the name of the account holder for the bank selected via `bank_code`. `bank_code` determines which bank issues the virtual account. `sub_merchant_id` is optional and only needed if you're onboarding multiple brands under one account; see [Sub-Merchant Management](/submerchant/sub-merchant-management). ### Deposit response (successfully initiated) ```json theme={null} { "success": true, "message": "Please use the following bank details for making a deposit via your preferred banking application", "data": { "account_name": "John Doe", "amount": 10000, "callback_url": "https://example.com/callback", "country_id": 17, "currency": "NGN", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "2349034567899", "payment_method_type": "virtual_account", "third_party_reference_1": "TX-COLL-1001", "third_party_reference_2": "CUST-501", "depositId": "dep_12345678", "account_number": "75xxxxxx97", "bank_name": "78 FINANCE COMPANY LIMITED", "bank_code": null, "status": "success", "payment_token": null, "payment_step": 1 }, "status_code": "000000" } ``` This is the initial acknowledgement, not the final result. `payment_step: 1` means the request was accepted and a dynamic virtual account was generated; it does not mean the customer has paid yet. Await the terminal callback (`payment_step: 2`). ### Payout request ```json theme={null} { "client_id": "client_id", "params": { "amount": 10000, "currency": "NGN", "payment_reference": "YOUR-REFERENCE", "first_name": "John", "last_name": "Doe", "mobile": "2349034567899", "email": "john.doe@example.com", "country_id": 17, "city": "Lagos", "postal_code": "100001", "line1": "CustomerStreet", "client_callback_url": "https://example.com", "payment_method_type": "bank", "third_party_reference_1": "", "bank": [ { "bank_name": "First Bank of Nigeria", "bank_code": "011", "branch_name": "Victoria Island", "account_name": "John Doe", "account_number": "0123456789" } ], "sub_merchant_id": "{approved-submerchant-uuid, optional}" }, "salt": "salt_value", "sender": "Integration_name", "timestamp": "", "signature": "0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5" } ``` `bank_code` here is First Bank of Nigeria, from the list above; swap in whichever bank the recipient account is held at. ### Payout response (successfully initiated) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "reference": "S000001234", "type": "Bank Transfer", "total": 10000, "creation_date": "2026-08-22T09:53:40.000000Z", "execution_date": "2026-08-22T09:53:44.000000Z", "from": "John Doe", "to": "0123456789", "invoice_date": "2026-08-22", "invoice_amount": 10000, "payment_step": 1 }, "status_code": "000000" } ``` ### Payout response (failed to initiate) ```json theme={null} { "success": false, "message": "Payment process initiation failed. Please check the details and try again.", "status_code": "000005" } ``` ## Webhook/Callback Examples ### Successful deposit ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 10000, "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "2349034567899", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-COLL-1001", "third_party_reference_2": "CUST-501" } } ``` ### Failed deposit ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 10000, "depositId": "dep_12345678", "email": "customer@example.com", "failureReason": { "failureCode": "DS-004", "failureMessage": "Virtual account expired or session timed out" }, "mobile": "2349034567899", "name": "John Doe", "payment_step": 2, "reference": "ref_98765432", "status": "failed", "statusCode": "000005", "third_party_reference_1": "TX-COLL-1001", "third_party_reference_2": "CUST-501" } } ``` `payment_step: 2` is the terminal status on the transaction, sent for both success and failure. Ensure your callback listener acknowledges with HTTP `200 OK` and reconciles your database. ### Successful payout ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "0123456789", "amount": 10000, "currency": "NGN", "fee": 50, "message": "Payment was transferred successfully.", "mobile": "2349034567899", "payee": "John Doe", "payment_channel": "Bank Transfer", "payment_reference": "YOUR-REFERENCE", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-DISB-9901", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through Bank Transfer", "type": "Pay out" } } ``` ### Failed payout ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "0123456789", "amount": 10000, "currency": "NGN", "fee": 50, "message": "Payment was not transferred.", "mobile": "2349034567899", "payee": "John Doe", "payment_channel": "Bank Transfer", "payment_reference": "YOUR-REFERENCE", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "failed", "statusCode": "000005", "third_party_reference_1": "TX-DISB-9901", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through Bank Transfer", "type": "Pay out" } } ``` ## Try it Collections API reference for Nigeria deposits. Payments API reference for Nigeria payouts. ## Transaction Limits For the full list of minimum and maximum transaction limits for Nigeria (NGN) collections and payouts, please see the [Transaction Limits for Nigeria](/transaction-limits#nigeria) section on the Transaction Limits page. **Deposit Settlement & Overpayment Protection:**\ For NGN virtual account deposits, customers must transfer the exact requested amount. If an overpayment occurs, the expected amount is processed and the excess is automatically reversed to the customer upon successful settlement. # Pakistan | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/pakistan Supported collection and payout methods, request formats, and sample payloads for Pakistan on the Niobi API.

Pakistan

Supported payment methods and integration details for Pakistan

Pakistan flag

Country Details

Country Code: 92  •   Currency: PKR (Pakistani Rupee)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :-------------------------------- | :--------------- | :----------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------------- | :--------------------------------------------------------------- | | **Bank Transfer (1LINK / Raast)** | Payout | `"bank"` | `bank: [{"bank_name": "...", "bank_code": "...", "branch_name": "...", "account_name": "...", "account_number": "..."}]` | Pakistani Commercial Banks (IBAN) | [Payments API](/api-reference/disbursement/unified-disbursement) | | **JazzCash & Easypaisa** | Payout / Deposit | Contact Support | Mobile Wallet Integration Details | JazzCash / Easypaisa | [Contact Support](mailto:support@niobi.co) |
*** ## Payment Flow: How It Works ### Payouts (Disbursements) 1. **Initiation:** Submit a POST request to the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement) with `currency: "PKR"` and `payment_method_type: "bank"`. 2. **Recipient Bank Details:** Provide the recipient's bank account or IBAN in `account_number`, bank code in `bank_code`, and account name in `account_name`. 3. **Settlement & Callback:** Funds are processed via 1LINK/Raast network, and Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) upon settlement. *** ## Sample Requests & Responses ### PKR Bank Payout Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 15000, "client_callback_url": "https://example.com/callback", "currency": "PKR", "first_name": "John", "last_name": "Doe", "payment_method_type": "bank", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-PKR-DISB-1001", "bank": [ { "bank_name": "Standard Chartered Bank Pakistan", "bank_code": "SCBLPKKA", "branch_name": "Karachi", "account_name": "John Doe", "account_number": "PK36SCBL0000001123456701" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` *** ## Try it Collections API reference for PKR deposits. Payments API reference for PKR payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Pakistan (PKR) collections and payouts, please see the [Transaction Limits for Pakistan](/transaction-limits#pakistan) section on the Transaction Limits page. # Rwanda | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/rwanda Supported collection and payout methods, request formats, and sample payloads for Rwanda on the Niobi API.

Rwanda

Supported payment methods and integration details for Rwanda

Rwanda flag

Country Details

Country ID: 8  •   Country Code: 250  •   Currency: RWF (Rwandan Franc)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :--------------- | :------ | :----------------------------------------------- | :------------------------------------------- | :-------------------------- | :---------------------------------------------------------------- | | **MTN MoMo** | Deposit | `"mtn"` | `mobile` (format: `"250XXXXXXXXX"`) | MTN Rwanda (STK PIN prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Airtel Money** | Deposit | `"airtel"` | `mobile` (format: `"250XXXXXXXXX"`) | Airtel Rwanda (USSD prompt) | [Collections API](/api-reference/collections/unified-collections) | | **MTN MoMo** | Payout | `"mtn"` | `mtn: [{"phone_number": "250XXXXXXXXX"}]` | MTN Rwanda Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Airtel Money** | Payout | `"Airtel"` | `Airtel: [{"phone_number": "250XXXXXXXXX"}]` | Airtel Rwanda Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) 1. **Initiation:** Submit a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `country_id: 8`, `currency: "RWF"`, `amount`, `payment_method_type` (`"mtn"` or `"airtel"`), and the customer's phone number in `mobile` (format: `250XXXXXXXXX`). 2. **Handset Authorization:** The customer receives a prompt on their handset to enter their PIN and authorize the debit. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once authorized, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When initiating a payout to Rwanda via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and its corresponding parameters: * **MTN MoMo:** Pass `payment_method_type: "mtn"` with an `mtn` array containing `phone_number`. * **Airtel Money:** Pass `payment_method_type: "Airtel"` with an `Airtel` array containing `phone_number`. *** ## Sample Requests & Responses ### MTN MoMo Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 8, "currency": "RWF", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "250783456789", "payment_method_type": "mtn", "third_party_reference_1": "TX-RWA-DEP-1001", "third_party_reference_2": "CUST-1101" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 8, "currency": "RWF", "depositId": "dep_12345678", "mobile": "250783456789", "payment_method_type": "mtn", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-RWA-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (MTN MoMo) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 2500, "client_callback_url": "https://example.com/callback", "country_id": 8, "currency": "RWF", "first_name": "John", "last_name": "Doe", "mobile": "250783456789", "payment_method_type": "mtn", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-RWA-DISB-2001", "mtn": [ { "phone_number": "250783456789" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "250783456789", "total": 2500, "type": "MTN MoMo" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 5000, "currency": "RWF", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "250783456789", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-RWA-DEP-1001", "third_party_reference_2": "CUST-1101" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "250783456789", "amount": 2500, "currency": "RWF", "fee": 25, "message": "Payment was transferred successfully.", "mobile": "250783456789", "payee": "John Doe", "payment_channel": "MTN MoMo", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-RWA-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through MTN MoMo", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Rwanda deposits. Payments API reference for Rwanda payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Rwanda (RWF) collections and payouts, please see the [Transaction Limits for Rwanda](/transaction-limits#rwanda) section on the Transaction Limits page. # Senegal | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/senegal Supported collection and payout methods, request formats, and sample payloads for Senegal on the Niobi API.

Senegal

Supported payment methods and integration details for Senegal

Senegal flag

Country Details

Country ID: 9  •   Country Code: 221  •   Currency: XOF (West African CFA Franc)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :--------------- | :------ | :----------------------------------------------- | :------------------------------------------- | :--------------------------------- | :---------------------------------------------------------------- | | **Orange Money** | Deposit | `"orange"` | `mobile` (format: `"221XXXXXXXXX"`) | Orange Senegal (STK / USSD prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Free Money** | Deposit | `"free"` | `mobile` (format: `"221XXXXXXXXX"`) | Free Senegal (STK prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Wave** | Deposit | `"wave"` | `mobile` (format: `"221XXXXXXXXX"`) | Wave Senegal | [Collections API](/api-reference/collections/unified-collections) | | **Orange Money** | Payout | `"Orange"` | `Orange: [{"phone_number": "221XXXXXXXXX"}]` | Orange Senegal Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Free Money** | Payout | `"Free"` | `Free: [{"phone_number": "221XXXXXXXXX"}]` | Free Senegal Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Wave** | Payout | `"wave"` | `mobile` (format: `"221XXXXXXXXX"`) | Wave Senegal Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) #### 1. Orange Money & Free Money (USSD/STK Push) 1. **Initiation:** Submit a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `country_id: 9`, `currency: "XOF"`, `amount`, `payment_method_type` (`"orange"` or `"free"`), and the customer's phone number in `mobile` (format: `221XXXXXXXXX`). 2. **Handset Authorization:** The customer receives a prompt on their handset to enter their PIN and authorize the debit. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once authorized by the customer, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. #### 2. Wave (Redirect Flow, `payment_method_type: "wave"`) Wave does not use a USSD push, it's a redirect-based authorization flow: 1. **Initiation:** Submit the request with `country_id: 9`, `currency: "XOF"`, `amount`, `payment_method_type: "wave"`, `successful_url`, and `failure_url`. 2. **Customer Redirection:** Niobi returns an `authorization_url` (`payment_step: 1`). Redirect the customer to this URL. On mobile, it opens directly in the Wave app; on desktop, the page shows a QR code the customer can scan with the Wave app on their phone to authorize instead. 3. **Completion & Callback:** Once the customer approves or cancels the payment in Wave, they're redirected to your `successful_url` or `failure_url` accordingly, and Niobi delivers the terminal webhook callback (`payment_step: 2`) to your `callback_url`. *** ### Payouts (Disbursements) When initiating a payout to Senegal via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and its corresponding parameters: * **Orange Money:** Pass `payment_method_type: "Orange"` with an `Orange` array containing `phone_number`. * **Free Money:** Pass `payment_method_type: "Free"` with a `Free` array containing `phone_number`. * **Wave:** Pass `payment_method_type: "wave"` with the recipient's phone number in `mobile`. *** ## Sample Requests & Responses ### Orange Money Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 3000, "callback_url": "https://example.com/callback", "country_id": 9, "currency": "XOF", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "221994013649", "payment_method_type": "orange", "third_party_reference_1": "TX-SEN-DEP-1001", "third_party_reference_2": "CUST-901" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 3000, "callback_url": "https://example.com/callback", "country_id": 9, "currency": "XOF", "depositId": "dep_12345678", "mobile": "221994013649", "payment_method_type": "orange", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-SEN-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (Orange Money) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 1500, "client_callback_url": "https://example.com/callback", "country_id": 9, "currency": "XOF", "first_name": "John", "last_name": "Doe", "mobile": "221885338649", "payment_method_type": "Orange", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-SEN-DISB-2001", "Orange": [ { "phone_number": "221885338649" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "221885338649", "total": 1500, "type": "Orange Money" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 3000, "currency": "XOF", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "221994013649", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-SEN-DEP-1001", "third_party_reference_2": "CUST-901" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "221885338649", "amount": 1500, "currency": "XOF", "fee": 15, "message": "Payment was transferred successfully.", "mobile": "221885338649", "payee": "John Doe", "payment_channel": "Orange Money", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-SEN-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through Orange Money", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Senegal deposits. Payments API reference for Senegal payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Senegal (XOF) collections and payouts, please see the [Transaction Limits for Senegal](/transaction-limits#senegal) section on the Transaction Limits page. # Sierra Leone | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/sierra-leone Supported collection and payout methods, request formats, and sample payloads for Sierra Leone on the Niobi API.

Sierra Leone

Supported payment methods and integration details for Sierra Leone

Sierra Leone flag

Country Details

Country ID: 13  •   Country Code: 232  •   Currency: SLE (Sierra Leonean Leone)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :--------------- | :------ | :----------------------------------------------- | :------------------------------------------ | :-------------------------------- | :---------------------------------------------------------------- | | **Orange Money** | Deposit | `"orange"` | `mobile` (format: `"232XXXXXXXX"`) | Orange Sierra Leone (STK prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Orange Money** | Payout | `"Orange"` | `Orange: [{"phone_number": "232XXXXXXXX"}]` | Orange Sierra Leone Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) 1. **Initiation:** Submit a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `country_id: 13`, `currency: "SLE"`, `amount`, `payment_method_type: "orange"`, and the customer's phone number in `mobile` (format: `232XXXXXXXX`). 2. **Handset Authorization:** The customer receives a prompt on their handset to enter their PIN and authorize the debit. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once authorized, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When initiating a payout to Sierra Leone via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and its corresponding nested array: * **Orange Money:** Pass `payment_method_type: "Orange"` with an `Orange` array containing `phone_number`. *** ## Sample Requests & Responses ### Orange Money Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 100, "callback_url": "https://example.com/callback", "country_id": 13, "currency": "SLE", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "23217231649", "payment_method_type": "orange", "third_party_reference_1": "TX-SLE-DEP-1001", "third_party_reference_2": "CUST-1801" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 100, "callback_url": "https://example.com/callback", "country_id": 13, "currency": "SLE", "depositId": "dep_12345678", "mobile": "23217231649", "payment_method_type": "orange", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-SLE-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (Orange Money) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 50, "client_callback_url": "https://example.com/callback", "country_id": 13, "currency": "SLE", "first_name": "John", "last_name": "Doe", "mobile": "23289137649", "payment_method_type": "Orange", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-SLE-DISB-2001", "Orange": [ { "phone_number": "23289137649" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "23289137649", "total": 50, "type": "Orange Money" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 100, "currency": "SLE", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "23217231649", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-SLE-DEP-1001", "third_party_reference_2": "CUST-1801" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "23289137649", "amount": 50, "currency": "SLE", "fee": 1, "message": "Payment was transferred successfully.", "mobile": "23289137649", "payee": "John Doe", "payment_channel": "Orange Money", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-SLE-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through Orange Money", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Sierra Leone deposits. Payments API reference for Sierra Leone payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Sierra Leone (SLE) collections and payouts, please see the [Transaction Limits for Sierra Leone](/transaction-limits#sierra-leone) section on the Transaction Limits page. # South Africa | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/south-africa Supported collection and payout methods, request formats, and sample payloads for South Africa on the Niobi API.

South Africa

Supported payment methods and integration details for South Africa

South Africa flag

Country Details

Country ID: 15  •   Country Code: 27  •   Currency: ZAR (South African Rand)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :-------------------- | :------ | :----------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------- | :---------------------------------------------------------------- | | **EFT Bank Transfer** | Deposit | `"bank_eft"` | `bank_code`, `successful_url`, `failure_url` | [South African Banks](#supported-south-african-banks-for-eft-collections) (Redirect URL) | [Collections API](/api-reference/collections/unified-collections) | | **Capitec Pay** | Deposit | `"capitec"` | `id_number` (13 digits), `successful_url`, `failure_url` | Capitec Bank (App Prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Bank Transfer** | Payout | `"bank"` | `bank: [{"bank_name": "...", "bank_code": "...", "branch_name": "...", "account_name": "...", "account_number": "..."}]` | South African Commercial Banks (RTC / EFT) | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) #### 1. EFT Bank Collections (`payment_method_type: "bank_eft"`) 1. **Initiation:** Send a POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `payment_method_type: "bank_eft"`, `country_id: 15`, `currency: "ZAR"`, `bank_code`, `successful_url`, and `failure_url`. 2. **Customer Redirection:** Niobi returns an `authorization_url` in the initial response (`payment_step: 1`). Redirect the customer to this URL to log into their bank portal and approve the transfer. This URL is single-use and expires once opened, do not open it yourself to preview or test it, only the customer should open it, and only once they're ready to pay. If it expires unused, you'll need to initiate a new request to get a fresh one. 3. **Completion & Callback:** Once the customer approves or cancels the transfer on their bank's portal, they're redirected to your `successful_url` or `failure_url` accordingly, and Niobi delivers an asynchronous webhook callback (`payment_step: 2`) to your `callback_url`. South Africa EFT bank selection page #### Supported South African Banks for EFT Collections: * ABSA (`0001`) * First National Bank (FNB) (`0002`) * Investec (`0003`) * Nedbank (`0004`) * Standard Bank (`0005`) * Bidvest Bank (`0006`) * TymeBank (`0007`) *** #### 2. Capitec Collections (`payment_method_type: "capitec"`) 1. **Initiation:** Send a POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `payment_method_type: "capitec"` and the customer's 13-digit South African ID number in `id_number`. 2. **In-App Approval:** The customer receives a prompt on their Capitec banking app to approve the debit. 3. **Callback Delivery:** Niobi delivers an asynchronous webhook callback (`payment_step: 2`) to your `callback_url`. *** ### Payouts (Disbursements) 1. **Initiation:** Send a POST request to the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement) with `payment_method_type: "bank"`. 2. **Recipient Details:** Include the recipient's bank name, bank code, branch name, account name, and account number. 3. **Settlement:** Funds are routed via Real Time Clearing (RTC) or Electronic Funds Transfer (EFT). 4. **Callback Delivery:** Niobi delivers a terminal webhook callback (`payment_step: 2`) once funds clear. *** ## Sample Requests & Responses ### EFT Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 500, "bank_code": "0001", "callback_url": "https://example.com/callback", "country_id": 15, "currency": "ZAR", "failure_url": "https://example.com/payment-failed", "mobile": "2763456789", "name": "John Doe", "payment_method_type": "bank_eft", "successful_url": "https://example.com/payment-success", "third_party_reference_1": "TX-ZAR-DEP-1001", "third_party_reference_2": "CUST-301" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### EFT Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "amount": 500, "authorization_url": "https://auth.bank-gateway.example.com/session/12345", "currency": "ZAR", "depositId": "dep_12345678", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-ZAR-DEP-1001" }, "status_code": "000000" } ``` Redirect the user to `authorization_url` to complete authentication with their bank. *** ### Capitec Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 500, "callback_url": "https://example.com/callback", "country_id": 15, "currency": "ZAR", "failure_url": "https://example.com/payment-failed", "id_number": "9001015800083", "mobile": "27600000000", "name": "John Doe", "payment_method_type": "capitec", "successful_url": "https://example.com/payment-success", "third_party_reference_1": "TX-CAP-DEP-1002", "third_party_reference_2": "CUST-302" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` *** ### Payout Request (Bank Transfer) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 1000, "client_callback_url": "https://example.com/callback", "country_id": 15, "currency": "ZAR", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "2768856789", "payment_method_type": "bank", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-ZAR-DISB-2001", "bank": [ { "bank_name": "ABSA", "bank_code": "0001", "branch_name": "Sandton", "account_name": "John Doe", "account_number": "4081234567" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 500, "currency": "ZAR", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "2763456789", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-ZAR-DEP-1001", "third_party_reference_2": "CUST-301" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "4081234567", "amount": 1000, "currency": "ZAR", "fee": 10, "message": "Payment was transferred successfully.", "mobile": "2768856789", "payee": "John Doe", "payment_channel": "EFT", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-ZAR-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through EFT", "type": "Pay out" } } ``` *** ## Try it Collections API reference for South Africa deposits. Payments API reference for South Africa payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for South Africa (ZAR) collections and payouts, please see the [Transaction Limits for South Africa](/transaction-limits#south-africa) section on the Transaction Limits page. # Stablecoins | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/stablecoins Supported stablecoin payment methods, request formats, and sample payloads for Stablecoins on the Niobi API.

Stablecoins

Supported blockchain networks and settlement details for USDT and USDC

Details

Assets: USDT / USDC  •   Networks: TRC20, ERC20, Polygon, Solana

## Supported Payment Methods & Payload Requirements
| Network / Asset | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :------------------------ | :--------------- | :----------------------------------------------- | :------------------------------------------ | :--------------------- | :--------------------------------------------------------------- | | **TRC-20 (USDT)** | Payout / Deposit | `"digital"` | Contact Support for On-Chain Wallet Routing | TRON Network | [Payments API](/api-reference/disbursement/unified-disbursement) | | **ERC-20 (USDT / USDC)** | Payout / Deposit | `"digital"` | Contact Support for On-Chain Wallet Routing | Ethereum Network | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Polygon (USDT / USDC)** | Payout / Deposit | `"digital"` | Contact Support for On-Chain Wallet Routing | Polygon Network | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Solana (USDT / USDC)** | Payout / Deposit | `"digital"` | Contact Support for On-Chain Wallet Routing | Solana Network | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Payouts & Collections 1. **Activation:** Contact [support@niobi.co](mailto:support@niobi.co) to enable stablecoin settlement and configure your designated deposit and payout blockchain addresses. 2. **Execution:** Initiate requests specifying the on-chain destination wallet address and chosen network. 3. **Confirmation:** Once required network confirmations are reached on-chain, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`). *** ## Try it Collections API reference for digital currency. Payments API reference for digital currency payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Stablecoins (USDT/USDC) collections and payouts, please see the [Transaction Limits for Stablecoins](/transaction-limits#stablecoins) section on the Transaction Limits page. # Tanzania | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/tanzania Supported collection and payout methods, request formats, and sample payloads for Tanzania on the Niobi API.

Tanzania

Supported payment methods and integration details for Tanzania

Tanzania flag

Country Details

Country ID: 10  •   Country Code: 255  •   Currency: TZS (Tanzanian Shilling)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :--------------------- | :------ | :----------------------------------------------- | :-------------------------------------------- | :-------------------------------- | :---------------------------------------------------------------- | | **Airtel Money** | Deposit | `"airtel"` | `mobile` (format: `"255XXXXXXXXX"`) | Airtel Tanzania (USSD prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Halotel** | Deposit | `"halotel"` | `mobile` (format: `"255XXXXXXXXX"`) | Halotel HaloPesa (STK prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Tigo (Mixx by YAS)** | Deposit | `"tigo"` | `mobile` (format: `"255XXXXXXXXX"`) | Tigo Tanzania (STK prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Vodacom M-Pesa** | Deposit | `"vodacom"` | `mobile` (format: `"255XXXXXXXXX"`) | Vodacom Tanzania (STK PIN prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Airtel Money** | Payout | `"Airtel"` | `Airtel: [{"phone_number": "255XXXXXXXXX"}]` | Airtel Tanzania Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Halotel** | Payout | `"Halotel"` | `Halotel: [{"phone_number": "255XXXXXXXXX"}]` | Halotel HaloPesa Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Tigo (Mixx by YAS)** | Payout | `"Tigo"` | `Tigo: [{"phone_number": "255XXXXXXXXX"}]` | Tigo Tanzania Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Vodacom M-Pesa** | Payout | `"Vodacom"` | `Vodacom: [{"phone_number": "255XXXXXXXXX"}]` | Vodacom Tanzania Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) 1. **Initiation:** Submit a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `country_id: 10`, `currency: "TZS"`, `amount`, `payment_method_type` (`"airtel"`, `"halotel"`, `"tigo"`, or `"vodacom"`), and the customer's phone number in `mobile` (format: `255XXXXXXXXX`). 2. **Handset Authorization:** The customer receives a prompt on their handset to enter their PIN and authorize the debit. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once authorized, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When initiating a payout to Tanzania via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and its corresponding nested array: * **Airtel Money:** Pass `payment_method_type: "Airtel"` with an `Airtel` array containing `phone_number`. * **Halotel:** Pass `payment_method_type: "Halotel"` with a `Halotel` array containing `phone_number`. * **Tigo (Mixx by YAS):** Pass `payment_method_type: "Tigo"` with a `Tigo` array containing `phone_number`. * **Vodacom M-Pesa:** Pass `payment_method_type: "Vodacom"` with a `Vodacom` array containing `phone_number`. *** ## Sample Requests & Responses ### Vodacom M-Pesa Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 10000, "callback_url": "https://example.com/callback", "country_id": 10, "currency": "TZS", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "255750000000", "payment_method_type": "vodacom", "third_party_reference_1": "TX-TZA-DEP-1001", "third_party_reference_2": "CUST-1001" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 10000, "callback_url": "https://example.com/callback", "country_id": 10, "currency": "TZS", "depositId": "dep_12345678", "mobile": "255750000000", "payment_method_type": "vodacom", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-TZA-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (Vodacom M-Pesa) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "client_callback_url": "https://example.com/callback", "country_id": 10, "currency": "TZS", "first_name": "John", "last_name": "Doe", "mobile": "255720993649", "payment_method_type": "Vodacom", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-TZA-DISB-2001", "Vodacom": [ { "phone_number": "255720993649" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "255720993649", "total": 5000, "type": "Vodacom M-Pesa" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 10000, "currency": "TZS", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "255750000000", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-TZA-DEP-1001", "third_party_reference_2": "CUST-1001" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "255720993649", "amount": 5000, "currency": "TZS", "fee": 50, "message": "Payment was transferred successfully.", "mobile": "255720993649", "payee": "John Doe", "payment_channel": "Vodacom M-Pesa", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-TZA-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through Vodacom M-Pesa", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Tanzania deposits. Payments API reference for Tanzania payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Tanzania (TZS) collections and payouts, please see the [Transaction Limits for Tanzania](/transaction-limits#tanzania) section on the Transaction Limits page. # Togo | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/togo Supported collection and payout methods, request formats, and sample payloads for Togo on the Niobi API.

Togo

Supported payment methods and integration details for Togo

Togo flag

Country Details

Country ID: 20  •   Country Code: 228  •   Currency: XOF (West African CFA Franc)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :------------- | :------ | :----------------------------------------------- | :--------------------------------- | :----------------------------------- | :---------------------------------------------------------------- | | **Moov Money** | Deposit | `"moov"` | `mobile` (format: `"228XXXXXXXX"`) | Moov Africa Togo (Prompt on handset) | [Collections API](/api-reference/collections/unified-collections) | | **T-Money** | Deposit | `"tmoney"` | `mobile` (format: `"228XXXXXXXX"`) | Togocom T-Money (STK prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Moov Money** | Payout | `"moov"` | `mobile` (format: `"228XXXXXXXX"`) | Moov Africa Togo Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **T-Money** | Payout | `"tmoney"` | `mobile` (format: `"228XXXXXXXX"`) | Togocom T-Money Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) 1. **Initiation:** Submit a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `country_id: 20`, `currency: "XOF"`, `amount`, `payment_method_type` (`"moov"` or `"tmoney"`), and the customer's phone number in `mobile` (format: `228XXXXXXXX`). 2. **Handset Authorization:** The customer receives a prompt on their handset to enter their PIN and authorize the debit. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once authorized, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When initiating a payout to Togo via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and recipient phone number in `mobile`: * **Moov Money:** Pass `payment_method_type: "moov"` with the recipient's phone number in `mobile`. * **T-Money:** Pass `payment_method_type: "tmoney"` with the recipient's phone number in `mobile`. *** ## Sample Requests & Responses ### Moov Money Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 20, "currency": "XOF", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "22818580649", "payment_method_type": "moov", "third_party_reference_1": "TX-TGO-DEP-1001", "third_party_reference_2": "CUST-1701" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 5000, "callback_url": "https://example.com/callback", "country_id": 20, "currency": "XOF", "depositId": "dep_12345678", "mobile": "22818580649", "payment_method_type": "moov", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-TGO-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (Moov Money) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 2000, "client_callback_url": "https://example.com/callback", "country_id": 20, "currency": "XOF", "first_name": "John", "last_name": "Doe", "mobile": "22891600649", "payment_method_type": "moov", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-TGO-DISB-2001" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "22891600649", "total": 2000, "type": "Moov Money" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 5000, "currency": "XOF", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "22818580649", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-TGO-DEP-1001", "third_party_reference_2": "CUST-1701" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "22891600649", "amount": 2000, "currency": "XOF", "fee": 20, "message": "Payment was transferred successfully.", "mobile": "22891600649", "payee": "John Doe", "payment_channel": "Moov Money", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-TGO-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through Moov Money", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Togo deposits. Payments API reference for Togo payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Togo (XOF) collections and payouts, please see the [Transaction Limits for Togo](/transaction-limits#togo) section on the Transaction Limits page. # UAE | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/uae Supported collection and payout methods, request formats, and sample payloads for UAE on the Niobi API.

United Arab Emirates (UAE)

Supported payment methods and integration details for UAE

UAE flag

Country Details

Country Code: 971  •   Currency: AED (UAE Dirham)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :------------------------- | :------ | :----------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :-------------------------- | :---------------------------------------------------------------- | | **UAE Local / SWIFT Wire** | Payout | `"bank"` | `bank: [{"bank_name": "...", "bank_code": "...", "branch_name": "...", "account_name": "...", "account_number": "..."}]` | UAE Commercial Banks (IBAN) | [Payments API](/api-reference/disbursement/unified-disbursement) | | **UAE Inward Wire** | Deposit | `"bank"` | Contact Support for AED Wire Details | UAE Commercial Banks | [Collections API](/api-reference/collections/unified-collections) |
*** ## Payment Flow: How It Works ### Payouts (Disbursements) 1. **Initiation:** Submit a POST request to the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement) with `currency: "AED"` and `payment_method_type: "bank"`. 2. **Recipient Details:** Include the recipient's UAE IBAN in `account_number`, bank SWIFT code in `bank_code`, and account name in `account_name`. 3. **Settlement & Callback:** Funds are routed via the UAE Funds Transfer System (UAEFTS) or SWIFT wire, and Niobi sends an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) upon settlement. *** ## Sample Requests & Responses ### AED Bank Payout Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 2500, "client_callback_url": "https://example.com/callback", "currency": "AED", "first_name": "John", "last_name": "Doe", "payment_method_type": "bank", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-AED-DISB-1001", "bank": [ { "bank_name": "Emirates NBD", "bank_code": "EBILAEAD", "branch_name": "Dubai", "account_name": "John Doe", "account_number": "AE070331234567890123456" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` *** ## Try it Collections API reference for AED deposits. Payments API reference for AED payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for UAE (AED) collections and payouts, please see the [Transaction Limits for UAE](/transaction-limits#uae) section on the Transaction Limits page. # Uganda | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/uganda Supported collection and payout methods, request formats, and sample payloads for Uganda on the Niobi API.

Uganda

Supported payment methods and integration details for Uganda

Uganda flag

Country Details

Country ID: 11  •   Country Code: 256  •   Currency: UGX (Ugandan Shilling)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :--------------- | :------ | :----------------------------------------------- | :------------------------------------------- | :-------------------------- | :---------------------------------------------------------------- | | **MTN MoMo** | Deposit | `"mtn"` | `mobile` (format: `"256XXXXXXXXX"`) | MTN Uganda (STK PIN prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Airtel Money** | Deposit | `"airtel"` | `mobile` (format: `"256XXXXXXXXX"`) | Airtel Uganda (USSD prompt) | [Collections API](/api-reference/collections/unified-collections) | | **MTN MoMo** | Payout | `"mtn"` | `mtn: [{"phone_number": "256XXXXXXXXX"}]` | MTN Uganda Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Airtel Money** | Payout | `"Airtel"` | `Airtel: [{"phone_number": "256XXXXXXXXX"}]` | Airtel Uganda Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) 1. **Initiation:** Submit a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `country_id: 11`, `currency: "UGX"`, `amount`, `payment_method_type` (`"mtn"` or `"airtel"`), and the customer's phone number in `mobile` (format: `256XXXXXXXXX`). 2. **Handset Authorization:** The customer receives a prompt on their handset to enter their PIN and authorize the debit. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once authorized, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When initiating a payout to Uganda via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and its corresponding parameters: * **MTN MoMo:** Pass `payment_method_type: "mtn"` with an `mtn` array containing `phone_number`. * **Airtel Money:** Pass `payment_method_type: "Airtel"` with an `Airtel` array containing `phone_number`. *** ## Sample Requests & Responses ### MTN MoMo Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 10000, "callback_url": "https://example.com/callback", "country_id": 11, "currency": "UGX", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "256673005649", "payment_method_type": "mtn", "third_party_reference_1": "TX-UGA-DEP-1001", "third_party_reference_2": "CUST-101" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 10000, "callback_url": "https://example.com/callback", "country_id": 11, "currency": "UGX", "depositId": "dep_12345678", "mobile": "256673005649", "payment_method_type": "mtn", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-UGA-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (MTN MoMo) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 5000, "client_callback_url": "https://example.com/callback", "country_id": 11, "currency": "UGX", "first_name": "John", "last_name": "Doe", "mobile": "256753855649", "payment_method_type": "mtn", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-UGA-DISB-2001", "mtn": [ { "phone_number": "256753855649" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "256753855649", "total": 5000, "type": "MTN MoMo" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 10000, "currency": "UGX", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "256673005649", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-UGA-DEP-1001", "third_party_reference_2": "CUST-101" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "256753855649", "amount": 5000, "currency": "UGX", "fee": 50, "message": "Payment was transferred successfully.", "mobile": "256753855649", "payee": "John Doe", "payment_channel": "MTN MoMo", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-UGA-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through MTN MoMo", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Uganda deposits. Payments API reference for Uganda payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Uganda (UGX) collections and payouts, please see the [Transaction Limits for Uganda](/transaction-limits#uganda) section on the Transaction Limits page. # United Kingdom | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/united-kingdom Supported collection and payout methods, request formats, and sample payloads for United Kingdom on the Niobi API.

United Kingdom

Supported payment methods and integration details for United Kingdom

United Kingdom flag

Country Details

Country Code: 44  •   Currency: GBP (British Pound)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :---------------------- | :------ | :----------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------- | :---------------------------------------------------------------- | | **FPS / Bank Transfer** | Payout | `"bank"` | `bank: [{"bank_name": "...", "bank_code": "...", "branch_name": "...", "account_name": "...", "account_number": "..."}]` | UK Commercial Banks (Sort Code & Account / IBAN) | [Payments API](/api-reference/disbursement/unified-disbursement) | | **GBP Inward Wire** | Deposit | `"bank"` | Contact Support for GBP Inward Wire Details | UK Commercial Banks | [Collections API](/api-reference/collections/unified-collections) |
*** ## Payment Flow: How It Works ### Payouts (Disbursements) 1. **Initiation:** Send a POST request to the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement) with `currency: "GBP"` and `payment_method_type: "bank"`. 2. **Recipient Bank Details:** Include the UK Sort Code (in `bank_code`), 8-digit Account Number (in `account_number`), and account name. Alternatively, provide the full UK IBAN. 3. **Settlement & Callback:** Funds are routed via Faster Payments System (FPS) or CHAPS, and Niobi sends an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) upon settlement. *** ## Sample Requests & Responses ### GBP Bank Payout Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 500, "client_callback_url": "https://example.com/callback", "currency": "GBP", "first_name": "John", "last_name": "Doe", "payment_method_type": "bank", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-GBP-DISB-1001", "bank": [ { "bank_name": "Barclays Bank", "bank_code": "200000", "branch_name": "London", "account_name": "John Doe", "account_number": "12345678" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` *** ## Try it Collections API reference for GBP deposits. Payments API reference for GBP payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for United Kingdom (GBP) collections and payouts, please see the [Transaction Limits for United Kingdom](/transaction-limits#united-kingdom) section on the Transaction Limits page. # United States | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/united-states Supported collection and payout methods, request formats, and sample payloads for United States on the Niobi API.

United States

Supported payment methods and integration details for United States

United States flag

Country Details

Country Code: 1  •   Currency: USD (United States Dollar)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :------------------------ | :------ | :----------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------- | :---------------------------------------------------------------- | | **Fedwire / ACH / SWIFT** | Payout | `"bank"` | `bank: [{"bank_name": "...", "bank_code": "...", "branch_name": "...", "account_name": "...", "account_number": "..."}]` | US Commercial Banks (ABA Routing Number & Account) | [Payments API](/api-reference/disbursement/unified-disbursement) | | **USD Inward Wire** | Deposit | `"bank"` | Contact Support for USD Inward Wire Details | US Commercial Banks | [Collections API](/api-reference/collections/unified-collections) |
*** ## Payment Flow: How It Works ### Payouts (Disbursements) 1. **Initiation:** Send a POST request to the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement) with `currency: "USD"` and `payment_method_type: "bank"`. 2. **Recipient Bank Details:** Provide the recipient's 9-digit ABA Routing Number in `bank_code`, Account Number in `account_number`, and full account name in `account_name`. 3. **Settlement & Callback:** Funds are routed via Fedwire, ACH, or SWIFT, and Niobi sends an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) upon execution. *** ## Sample Requests & Responses ### USD Bank Payout Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 1000, "client_callback_url": "https://example.com/callback", "currency": "USD", "first_name": "John", "last_name": "Doe", "payment_method_type": "bank", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-USD-DISB-1001", "bank": [ { "bank_name": "JPMorgan Chase", "bank_code": "021000021", "branch_name": "New York", "account_name": "John Doe", "account_number": "1234567890" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` *** ## Try it Collections API reference for USD deposits. Payments API reference for USD payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for United States (USD) collections and payouts, please see the [Transaction Limits for United States](/transaction-limits#united-states) section on the Transaction Limits page. # Zambia | Supported Payment Methods & Corridors Source: https://docs.niobi.co/countries/zambia Supported collection and payout methods, request formats, and sample payloads for Zambia on the Niobi API.

Zambia

Supported payment methods and integration details for Zambia

Zambia flag

Country Details

Country ID: 12  •   Country Code: 260  •   Currency: ZMW (Zambian Kwacha)

## Supported Payment Methods & Payload Requirements
| Channel | Flow | payment\_method\_type | Required Payload Array / Fields | Destination / Operator | API Reference | | :---------------- | :------ | :----------------------------------------------- | :------------------------------------------- | :-------------------------- | :---------------------------------------------------------------- | | **MTN MoMo** | Deposit | `"mtn"` | `mobile` (format: `"260XXXXXXXXX"`) | MTN Zambia (STK PIN prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Zamtel Kwacha** | Deposit | `"zamtel"` | `mobile` (format: `"260XXXXXXXXX"`) | Zamtel Zambia (STK prompt) | [Collections API](/api-reference/collections/unified-collections) | | **Airtel Money** | Deposit | `"airtel"` | `mobile` (format: `"260XXXXXXXXX"`) | Airtel Zambia (USSD prompt) | [Collections API](/api-reference/collections/unified-collections) | | **MTN MoMo** | Payout | `"mtn"` | `mtn: [{"phone_number": "260XXXXXXXXX"}]` | MTN Zambia Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Zamtel Kwacha** | Payout | `"Zamtel"` | `Zamtel: [{"phone_number": "260XXXXXXXXX"}]` | Zamtel Zambia Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) | | **Airtel Money** | Payout | `"Airtel"` | `Airtel: [{"phone_number": "260XXXXXXXXX"}]` | Airtel Zambia Mobile Wallet | [Payments API](/api-reference/disbursement/unified-disbursement) |
*** ## Payment Flow: How It Works ### Deposits (Collections) 1. **Initiation:** Submit a signed POST request to the [Unified Collections endpoint](/api-reference/collections/unified-collections) with `country_id: 12`, `currency: "ZMW"`, `amount`, `payment_method_type` (`"mtn"`, `"zamtel"`, or `"airtel"`), and the customer's phone number in `mobile` (format: `260XXXXXXXXX`). 2. **Handset Authorization:** The customer receives a prompt on their handset to enter their PIN and authorize the debit. 3. **Initial Response:** Niobi returns an acknowledgement (`payment_step: 1`) containing the assigned `depositId`. 4. **Callback Confirmation:** Once authorized, Niobi delivers an asynchronous webhook callback (`payment_step: 2`, `status: "success"`) to your `callback_url`. *** ### Payouts (Disbursements) When initiating a payout to Zambia via the [Unified Payments endpoint](/api-reference/disbursement/unified-disbursement), pass the appropriate `payment_method_type` and its corresponding parameters: * **MTN MoMo:** Pass `payment_method_type: "mtn"` with an `mtn` array containing `phone_number`. * **Zamtel Kwacha:** Pass `payment_method_type: "Zamtel"` with a `Zamtel` array containing `phone_number`. * **Airtel Money:** Pass `payment_method_type: "Airtel"` with an `Airtel` array containing `phone_number`. *** ## Sample Requests & Responses ### MTN MoMo Deposit Request ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 250, "callback_url": "https://example.com/callback", "country_id": 12, "currency": "ZMW", "email": "customer@example.com", "first_name": "John", "last_name": "Doe", "mobile": "260873039649", "payment_method_type": "mtn", "third_party_reference_1": "TX-ZMB-DEP-1001", "third_party_reference_2": "CUST-1201" }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Deposit Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "account_name": "John Doe", "amount": 250, "callback_url": "https://example.com/callback", "country_id": 12, "currency": "ZMW", "depositId": "dep_12345678", "mobile": "260873039649", "payment_method_type": "mtn", "payment_step": 1, "status": "success", "third_party_reference_1": "TX-ZMB-DEP-1001" }, "status_code": "000000" } ``` *** ### Payout Request (MTN MoMo) ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "params": { "amount": 100, "client_callback_url": "https://example.com/callback", "country_id": 12, "currency": "ZMW", "first_name": "John", "last_name": "Doe", "mobile": "260771312649", "payment_method_type": "mtn", "payment_reference": "YOUR-PAYOUT-REF", "third_party_reference_1": "TX-ZMB-DISB-2001", "mtn": [ { "phone_number": "260771312649" } ] }, "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0" } ``` ### Payout Response (Initiation) ```json theme={null} { "success": true, "message": "Payment process initiated successfully.", "data": { "creation_date": "2026-08-28T12:30:00.000000Z", "from": "YOUR_INTEGRATION_NAME", "payment_step": 1, "reference": "ref_98765432", "to": "260771312649", "total": 100, "type": "MTN MoMo" }, "status_code": "000000" } ``` *** ## Webhook/Callback Examples ### Successful Deposit Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "amount": 250, "currency": "ZMW", "depositId": "dep_12345678", "email": "customer@example.com", "mobile": "260873039649", "name": "John Doe", "payment_step": 2, "status": "success", "status_code": "000000", "third_party_reference_1": "TX-ZMB-DEP-1001", "third_party_reference_2": "CUST-1201" } } ``` ### Successful Payout Callback ```json theme={null} { "client_id": "YOUR_CLIENT_ID", "salt": "random_salt_12345", "sender": "YOUR_INTEGRATION_NAME", "timestamp": 1724835600, "signature": "a1b2c3d4e5f60718293a4b5c6d7e8f90123456789abcdef0123456789abcdef0", "params": { "account": "260771312649", "amount": 100, "currency": "ZMW", "fee": 2, "message": "Payment was transferred successfully.", "mobile": "260771312649", "payee": "John Doe", "payment_channel": "MTN MoMo", "payment_reference": "YOUR-PAYOUT-REF", "payment_step": 2, "payoutId": "bd8f51a2-xxxx-xxxx-xxxx-xxxxx9a", "ref": "ref_98765432", "status": "success", "statusCode": "000000", "third_party_reference_1": "TX-ZMB-DISB-2001", "third_party_reference_2": null, "transaction_date": "2026-08-28 12:30:00", "transaction_detail": "Disbursement made through MTN MoMo", "type": "Pay out" } } ``` *** ## Try it Collections API reference for Zambia deposits. Payments API reference for Zambia payouts. *** ## Transaction Limits For the full list of minimum and maximum transaction limits for Zambia (ZMW) collections and payouts, please see the [Transaction Limits for Zambia](/transaction-limits#zambia) section on the Transaction Limits page. # Authentication Errors Source: https://docs.niobi.co/errors/authentication-errors This section describes a list of errors related to security credentials while accessing the api endpoints. | Error Code | Error Message | Action Required | | ---------- | ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | 403 | [You are restricted to access the site. Contact to Niobi support for further information.](/errors/403/restricted-access) | Your ip address is not yet whitelisted with us. Contact us with a list of your ips for whitelisting at [support@niobi.co](mailto:support@niobi.co) | | 403 | [Request was not verified](/errors/403/request-not-verified) | Make sure you are using the correct payload and signature which were previously signed | # Client Errors Source: https://docs.niobi.co/errors/client-errors This section describes a list of errors caused by issues in the client's request, such as invalid data, missing fields, or insufficient permissions. | Error Code | Error Message | Action Required | | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 400 | [Account details are missing.](/errors/400/account-details-missing) | Account details for the payment method are missing. Ensure that you have provided the necessary account details for the specified payment method. | | 400 | [Country was not found](/errors/400/country-not-found) | The country id used is incorrect or missing. Make sure you are using the correct country id as listed in the [supported countries section](/supported-countries) | | 400 | [Niobi user not found.](/errors/400/niobi-user-not-found) | User or api credentials do not exist. Ensure the integration being used is active and that a valid user is linked to it. | | 400 | [Payment method type is wrong or missing](/errors/400/payment-method-type-missing) | The payment method in the API request is invalid or missing. Make sure you are using one of the supported payment methods found in the [collections](/api-reference/collections/unified-collections) or [disbursements](/api-reference/disbursement/unified-disbursement) page | | 400 | [Your account has insufficient balance to complete this transaction. Please top up the account and try again.](/errors/400/insufficient-balance) | There are insufficient funds in your currency wallet. Top up your account to complete the transaction. | | 400 | [Your transaction amount exceeded the limit. Please input an amount below \{amount}.](/errors/400/transaction-amount-exceeded-limit) | The transaction limit has been exceeded. Reduce the transaction amount to a value below the maximum limit as listed [here](/transaction-limits) | | 400 | [Your transaction amount is not sufficient.](/errors/400/insufficient-transaction-amount) | The transaction amount is lower than the minimum transaction limit. Ensure the amount is above the minimum limit supported by a specific country or payment method as listed [here](/transaction-limits) | | 403 | [Client id not matched](/errors/403/client-id-not-matched) | The client ID is incorrect. Ensure you are using the correct client key for the integration, which is generated when creating API credentials. Please refer to [API Credentials Section](/getting-credentials) for more information on generating credentials. | | 403 | [Entity integration record not found](/errors/403/entity-record-not-found) | The integration name is invalid. Verify that the sender value used in signing the request matches the API integration title created. Please refer to [API Credentials Section](/getting-credentials) for more information on generating credentials. | # HTTP Status Codes Overview Source: https://docs.niobi.co/errors/overview This page provides an overview of all HTTP status codes supported by our API, categorized by their general meanings. Each status code includes a brief description and a link to a detailed page for more information. ## Success Status Codes This indicates that the request was successfully received, understood, and processed by the server. * **200 OK**\ The request was successful, and the server returned the requested data.\ [View Details](/errors/200-success) ## Client Errors Status Codes These codes indicate that there was an issue with the request, such as incorrect parameters or missing information. ### 400 Bad Request The request could not be understood due to malformed syntax. * [400 - Account details are missing.](/errors/400/account-details-missing) * [400 - Country was not found](/errors/400/country-not-found) * [400 - Niobi user not found.](/errors/400/niobi-user-not-found) * [400 - Payment method type is wrong or missing](/errors/400/payment-method-type-missing) * [400 - Your account has insufficient balance to complete this transaction. Please top up the account and try again.](/errors/400/insufficient-balance) * [400 - Your transaction amount exceeded the limit. Please input an amount below \{amount}.](/errors/400/transaction-amount-exceeded-limit) * [400 - Your transaction amount is not sufficient.](/errors/400/insufficient-transaction-amount) ### 403 Forbidden The server understood the request but refuses to authorize it. * [403 - Client id not matched](/errors/403/client-id-not-matched) * [403 - Entity integration record not found](/errors/403/entity-record-not-found) ## Authentication Errors Status Codes These status codes are for errors related to security credentials while accessing the api endpoints. * [403 - Restricted access.](/errors/403/restricted-access) * [403 - Request was not verified](/errors/403/request-not-verified) ## Transaction Status Codes These codes indicate the transaction statuses returned after a transaction has been initiated. * [000000 - Success](/errors/000000-success) * [000001 - Pending](/errors/000001-pending) * [000005 - Failed](/errors/000005-failed) * [000006 - Timeout](/errors/000006-timeout) ## Transaction Errors Transaction failure codes are errors that are returned by the provider when a transaction fails. * [400 - Amount Exceeds Maximum Limit](/errors/400/amount-exceeds-maximum-limit) * [400 - Top Up Funds](/errors/400/top-up-funds) * [400 - Invalid Payment Details](/errors/400/invalid-payment-details) * [400 - The payment is still being processed.](/errors/400/payment-still-processing) * [400 - A similar payment is still being processed](/errors/400/similar-payment-being-processed) * [400 - Insufficient Access Rights](/errors/400/no-access-rights) * [400 - Wait for some time and try again later](/errors/400/wait-for-some-time) * [400 - We apologise as we were not able to process your payment request.](/errors/400/error-processing-payment) ## Server Errors These codes indicate that the server failed to process a valid request due to internal issues. ### 429 Too Many Requests The client has sent too many requests in a given time period and has exceeded the API rate limit. * [429 - Too Many Requests](/errors/429/too-many-requests) ### 500 Internal Server Error The server encountered an unexpected condition that prevented it from fulfilling the request. * [500 - Server Error](/errors/500/server-error) ## Next Steps Click on any of the status codes above to view detailed information about the code, its causes, and troubleshooting steps. # Server Errors Source: https://docs.niobi.co/errors/server-errors This section describes a list of errors caused by issues on the server-side. | Error Code | Error Message | Action Required | | ---------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 429 | [Too Many Requests](/errors/429/too-many-requests) | The client has sent too many requests in a given time exceeding the given api rate limit. Reduce the number of requests or consult with our support team for further assistance at [support@niobi.co](mailto:support@niobi.co) | # Transaction-Related Errors Source: https://docs.niobi.co/errors/transaction-errors This section describes a list of errors that are returned by the provider when a transaction fails. | ERROR Code | Error Message | Action Required | | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 400 | [This is more than maximum transaction value we allow in one transaction](/errors/400/amount-exceeds-maximum-limit) | The transaction amount exceeds the maximum allowable value. Adjust the amount and retry. | | 400 | [Please add funds to your account to cover this payment.](/errors/400/top-up-funds) | Top-up your wallet to be able to process the transaction. | | 400 | [One of the payment details entered is invalid. Please confirm again.](/errors/400/invalid-payment-details) | Check if you have added all the valid payment information. | | 400 | [The payment is still being processed. We request for your patience as we work to complete the process. Once completed, we will send an email notification.](/errors/400/payment-still-processing) | Please wait patiently or contact us in case it is taking too long. | | 400 | [A similar payment is still being processed. Please confirm to avoid duplicating the payment.](/errors/400/similar-payment-being-processed) | A similar transaction is still being processed. If it was not intentional, you can just ignore this. However, if you want to perform the same transaction you can make the request again. | | 400 | [Your account does not have the rights to complete this payment. Please contact us for assistance.](/errors/400/no-access-rights) | This occurs when you have not fully submitted all the required KYC or the account is not verified. Please contact us for assistance. | | 400 | [Wait for some time and try again later](/errors/400/wait-for-some-time) | This might happen because of our providers downtimes. Please contact us for further support | | 400 | [We apologise as we were not able to process your payment request. Please try again later.](/errors/400/error-processing-payment) | Please contact us. | # Transaction Status Codes Source: https://docs.niobi.co/errors/transaction-status-codes This section describes the transaction status codes you will expect once a transaction has been processed. | Status Code | Description | Action Required | | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | [000000](/errors/000000-success) | The transaction was successfully completed. | No action required | | [000001](/errors/000001-pending) | The transaction is pending and is still being processed. We request your patience as we work to complete the process. Once completed, we will send an email notification. | Please wait patiently or contact us in case it is taking too long. | | [000005](/errors/000005-failed) | The transaction failed. This could be due to the errors described above. | Check if you have added all the valid payment information and contact us if it persists | | [000006](/errors/000006-timeout) | The transaction timed out. The transaction time was more than the 2-minute timeout set on our end. Once completed outside the 2-minute window, it will be changed to success or failed. | Query transaction status after a few minutes to check if the status changed to success or failed. If not, please contact support for further assistance. | # FAQs Source: https://docs.niobi.co/faqs ## Getting Started **1. How do I set up my API credentials?** Log in to the payment portal and navigate to **Workspace -> API Keys**. Select **Create New Integration** and proceed to generate the credentials. Full guide: [Getting Your API Credentials](/getting-credentials). **2. What countries are available to me?** All countries listed in [Supported Countries](/supported-countries) are available in the sandbox environment with the supported methods. Only the countries you select during onboarding are enabled in production. **3. How do I access test funds in the sandbox environment?** Request a top-up of the specific currencies you want to test by emailing [support@niobi.co](mailto:support@niobi.co). **4. Can I reuse the same signature across multiple requests?** No. Every request must carry its own uniquely generated signature, computed from that request's exact timestamp, salt, and parameters. Signatures cannot be reused, even for retries of the same logical action. See [Authentication Basics](/authentication/basics). ## Errors & Status Codes **5. What does status code "000005" mean, and what should I check first?** `000005` means the request was rejected or the transaction failed. In sandbox, first confirm you're using a valid test phone number for that country ([Testing Guide](/testing)), and that your `country_id`, `currency`, and `payment_method_type` are all correct for that channel. **6. Does a validation error mean my transaction actually failed?** No, these are two different things. A validation error (for example, a missing required field) means Niobi rejected the request before any transaction was created, so there's nothing to reconcile. A real transaction failure is a terminal callback with `payment_step: 2`, `status: "failed"`, and `status_code: "000005"`. See [Understanding Payment Steps](/collecting-payments/basics#understanding-payment-steps-payment_step). Treat these as categorically different: one means "fix your request," the other means "the transaction ran and didn't succeed." **7. What do the transaction status codes 000000 / 000001 / 000005 / 000006 mean, and which ones are final?** `000000` (success) and `000005` (failed) are terminal, treat them as the final word. `000001` (pending) and `000006` (timeout) are not terminal, so don't act on them, just wait or re-query. Full breakdown: [Status Codes & Action Matrix](/transaction-status#status-codes--action-matrix). **8. Why do some responses use `status_code` and others `statusCode`?** It depends on where you're reading the response from, not random inconsistency. `status_code` (snake\_case) appears at the root of direct, synchronous API responses: the initial response you get back right after submitting a collection or payout, and the response from querying [transaction status](/transaction-status). `statusCode` (camelCase) appears only inside `params` in asynchronous webhook callbacks (`payment_step: 2` notifications). If you're parsing a webhook payload, check `params.statusCode`. If you're parsing a direct API response, check `status_code`. **9. What do I do when I encounter "You are restricted to access the site. Contact Niobi support for further information."?** Your IP address hasn't been whitelisted yet. If your account is already approved, you can whitelist your own IPs directly in the portal under **Workspace -> IP Whitelisting -> Add New**, no need to contact support. If your account hasn't been verified/approved yet, email your sandbox and production IPs to [support@niobi.co](mailto:support@niobi.co) instead. Full guide: [IP Whitelisting](/ip-whitelisting). ## Confirming a Transaction Really Completed **10. How do I know a transaction is really done, not just acknowledged?** `payment_step: 1` on the initial response only means "accepted for processing," don't act on it yet. Wait for the terminal `payment_step: 2` callback, then independently verify with [`POST /api/v3/get-unified-transaction-status`](/transaction-status), and only mark the transaction complete once both agree. Full recipe: [Collections Best Practices](/collecting-payments/best-practices#2-the-double-verification-reconciliation-recipe) and [Payouts Best Practices](/making-payments/best-practices#2-the-double-verification-reconciliation-recipe-for-payouts). **11. Is `/api/v3/get-unified-transaction-status` deprecated in favor of a v4 endpoint?** No. Unlike collections and payouts, transaction status intentionally stays on v3, there's no v4 version and none is planned. It's a synchronous, direct status check outside the async payment flow, which is also why `payment_step` doesn't appear in its response. See [Transaction Status](/transaction-status). **12. Is the API ever going to become synchronous?** No, this is intentional, not a current limitation. The underlying settlement process with mobile network operators and banks is inherently asynchronous, so callbacks and status polling are how you get the final result, not a workaround pending a future synchronous option. ## Payouts **13. Do I need to approve payouts with OTP when using the API?** No. OTP approval only applies to payments initiated manually through the payment portal. It never applies to payments sent via the API. **14. What's the difference between M-Pesa PayBill and Till Number payouts?** `"pay bill"` sends to a business PayBill account (requires a `paybill` array with `paybill_number` and `account_number`). `"till number"` sends to a Buy Goods till (requires a `tillnumber` array with just `till_number`). See the full method table on [Kenya's country page](/countries/kenya#supported-payment-methods--payload-requirements). **15. Is there an API to retrieve my `sub_merchant_id`?** No, there's currently no endpoint to list or fetch sub-merchant IDs programmatically. Look them up in the Dashboard's Sub-Merchant list after onboarding. See [Sub-Merchant Management](/submerchant/sub-merchant-management). ## Refunds **16. Will I get a webhook callback when a refund is processed?** No. Refunds are handled through the payment portal and confirmed by email notification, not a webhook callback, unlike collections and payouts. See [Refund Requests](/refund-requests). # Getting Credentials Source: https://docs.niobi.co/getting-credentials ## Types of Credentials There are two types of credentials: **Sandbox** and **Production** credentials. The sandbox credentials are for use in the sandbox environment during testing, while the production credentials are set up when going live. ## Structure of Credentials The API credentials include: * **Client ID (`client_id`)**: Public identifier for your integration. * **Integration Title (`sender`)**: The name assigned to your integration. * **Secret Key (`senderKey`)**: The private key used strictly on your backend server to generate the cryptographic signature for each API request. ## Getting Credentials Please follow these steps to set up your API credentials:
  1. In the developer portal, on the sidebar menu under "Workspace", select the option "Integrations" where you will manage integrations and API keys.
  2. Begin by creating your first integration by clicking the "Create Integration" button. We recommend creating one integration for each of the projects or brands you are connecting.
  3. You need to create separate integrations for both sandbox and live accounts in their respective environments.
  1. Within the Integration settings, generate the required credentials for the integration.
  2. These credentials consist of a Client ID, Integration Name, and Secret Key. Make sure to save these credentials securely. Treat your Secret Key like a password. Never expose it in frontend code, client apps, or public logs.
  3. This key serves as your authentication mechanism when signing API requests.