Getting Started with Payouts
The CrissCross Payouts API enables you to send local payouts to banks or wallets in 20+ African markets through one API. Get the most competitive FX rates, transparent pricing, and reconciliation. Whether handling individual transactions or large-volume disbursements, the Payouts API provides the flexibility to manage payouts reliably and efficiently.
API Base URL
All payout endpoints are available at:
For example:
- Single payout:
POST https://api.crisscross.money/v1/payouts - Bulk payouts:
POST https://api.crisscross.money/v1/payouts/bulk - Payout history:
GET https://api.crisscross.money/v1/payouts/history
Authentication
All payout API requests require OAuth 2.0 authentication using Bearer tokens. You obtain an access token by calling the Authentication endpoint with your merchantId and clientSecret, then include the token in the Authorization header on subsequent requests.
Quick Start:
-
Get an access token:
-
Use the token in payout requests:
For detailed authentication instructions, including token expiration and best practices, see the Authentication guide.
Key Features
- Single Payouts: Send a one-time payout to a recipient’s bank account, mobile wallet, or crypto wallet.
- Bulk Payouts: Schedule multiple payouts in a single request, ideal for handling larger batches of disbursements.
- Competitive FX Rates: Access the most competitive FX rates on every payout transaction.
- 20+ Market Coverage: Send payouts across 20+ African markets through a single API.
- Transparent Pricing: Clear, upfront pricing with no hidden fees.
Workflow
- Check Balance: Use the Balances Endpoint to confirm sufficient funds in the payout currency.
- Top-up Account (if needed): Convert between supported fiat currencies using the Trading endpoint.
- Initiate Payout: Send funds using either the single or bulk payout endpoints, depending on your needs.
- Track Payout History: Use the Payout History Endpoint to monitor and review payout transactions, with options to filter by date range or specific payout ID.
The Payouts API is built for businesses that need to move money across regions reliably, whether for operational payments, customer disbursements, or payroll.
Funding Your Payout Balance
Payouts draw from your Exchange account balances. Before sending payouts, make sure you have sufficient funds in the payout currency (fiat or stablecoin).
- Fund your account: Use the Exchange Deposits endpoints to add funds in supported fiat or crypto currencies.
- Check balances: Use the Exchange Balances endpoint to confirm available funds.
- Convert if needed: Use the Exchange Trading endpoints to convert into the payout currency (e.g., NGN, KES, USDT, USDC).
- Payout: Create single or bulk payouts once the target balance is available.
For endpoint details, see Exchange Accounts and Exchange Trading.
Use Cases
- Operational Payments: Pay suppliers, vendors, or service providers
- Customer Disbursements: Send refunds, rewards, or payouts to customers
- Payroll: Distribute salaries or wages to employees
- Marketplace Payouts: Pay out earnings to sellers or service providers
Supported Currencies
Payouts are supported in Fiat Currencies and Stablecoins:
- NGN - Nigerian Naira
- XOF - West African CFA Franc
- XAF - Central African CFA Franc
- GHS - Ghanaian Cedi
- KES - Kenyan Shilling
- ZAR - South African Rand
- AED - UAE Dirham
- EGP - Egyptian Pound
- SAR - Saudi Riyal
Stablecoins
- USDT - Tether (ERC20, TRC20)
- USDC - USD Coin (ERC20, TRC20)
Note: If you need to convert between fiat currencies or into stablecoins before paying out, use the Trading API first.
Recipient Types
The Payouts API supports three recipient types:
- Bank Account (
bank_account): Send funds directly to bank accounts - Mobile Wallet (
mobile_money): Send funds to mobile money wallets (MoMo) - Crypto Wallet (
crypto_wallet): Send funds to stablecoin wallets (USDT/USDC)
Bank Account Recipients
For bank account payouts, you’ll need:
type: Set to"bank_account"accountNumber: The recipient’s bank account numberbankCode: Bank identifier code (e.g., sort code, routing number)accountHolderName: Name on the bank accountcountry: 3-letter ISO country code (e.g., NGA, EGY)phoneNumber: Optional phone number in international format
Mobile Wallet Recipients
For mobile wallet payouts, you’ll need:
type: Set to"mobile_money"phoneNumber: Mobile money MSISDN in international formatcountry: 3-letter ISO country code (e.g., KEN, CIV, SEN)operator: Mobile money operator (e.g., mpesa, mtn, orange, airtel, moov, wave)name: Optional full name of the recipient
Crypto Wallet Recipients
For stablecoin payouts, you’ll need:
type: Set to"crypto_wallet"address: Destination wallet addressnetwork: Transfer network (ERC20orTRC20)memo: Optional memo or tag (required by some wallets)
For full destination details and required vs optional fields by recipient type, see Bank Transfers, Mobile Wallet, and Stablecoin Payouts. Which destinations and rails are supported is listed in Supported Destinations.
Request Structure
All payout requests require:
merchantId: Your merchant identifiermerchantReference: Your internal reference for tracking (used for idempotency - see Idempotency below)destinationValue: Object containing:minorAmount: Amount in minor units (integer, e.g.,10000= 100.00 NGN)currency: Currency code (NGN, XOF, XAF, GHS, KES, ZAR, AED, EGP, SAR, USDT, USDC)
paymentMethodId:"banktransfer","mobilemoney", or"crypto"paymentLocation: 3-letter ISO country code (e.g., NGA, KEN, EGY)recipient: Object containing recipient details (structure depends onpaymentMethodId)
Optional fields:
attributes: Additional payout attributes as key-value pairssender: Sender details (required for some destinations, includes KYC fields)
Amount Format
Amounts are specified in minor units (the smallest currency unit, like cents). For example:
10000minorAmount = 100.00 NGN (Nigerian Naira)5000minorAmount = 50.00 KES (Kenyan Shillings)10000minorAmount = 100.00 EGP (Egyptian Pounds)1000000minorAmount = 1.000000 USDT
Important: The minorAmount field is an integer, not a float. Fiat currencies use 2 decimal places (multiply by 100). USDT/USDC use 6 decimal places (multiply by 1,000,000).
Idempotency
The merchantReference field enables idempotency for payout requests. If you send a payout request with a merchantReference that was used in a previous successful request, the API will return the original payout instead of creating a duplicate. This helps prevent accidental duplicate payouts if a request is retried due to network issues or timeouts.
Best practice: Use unique, meaningful references for each payout (e.g., PAYOUT-2024-001, REFUND-ORDER-12345). Store the reference along with the transaction ID for reconciliation.
Getting Started
-
Authenticate: Obtain an OAuth 2.0 access token using your
merchantIdandclientSecret(see Authentication above). -
Check Your Balance: Ensure you have sufficient funds in the payout currency using the Accounts API.
-
Convert Currency (if needed): If you need to convert from a major currency to a minor currency or stablecoin, use the Trading API first.
-
Create a Payout:
- For single payouts:
POST https://api.crisscross.money/v1/payouts- See Single Payouts - For bulk payouts:
POST https://api.crisscross.money/v1/payouts/bulk- See Bulk Payouts
- For single payouts:
-
Track Payouts: Use the Payout History endpoints to monitor payout status, or set up webhooks for real-time status updates.
Additional Resources
- Rate Limiting: The API enforces rate limits to ensure system stability. See Rate Limiting for details and best practices.
- Webhooks: Receive real-time notifications about payout status changes. See Webhooks for setup and event types.
- Error Handling: See Error Handling for best practices on handling API errors and retries.