Integrate with the Korapay pan-African payment infrastructure API for payment processing, disbursements, mobile money transfers, card issuing, and KYC verification. Use this skill whenever the user wants to initialize charges, process payments, handle disbursements, verify transaction status, manage payment flows, work with mobile money, process remittance payouts, issue virtual cards, or perform identity verification. Also trigger when the user mentions 'Korapay', 'pan-African payments', 'charge initialization', 'Korapay disbursement', 'mobile money transfer', 'remittance', 'card issuing', 'KYC verification', or needs payment processing with multi-currency and fast disbursement capabilities.
Korapay is a comprehensive pan-African payment infrastructure platform providing APIs for charge initialization, transaction processing, mobile money transfers, payouts, remittance services, virtual card issuing, and identity verification across Nigeria, Ghana, Kenya, and other African markets. It enables developers to accept payments and send money with minimal friction, high reliability, and support for multiple African currencies.
You're building a payment solution that needs to accept charges, process disbursements, send remittances, issue cards, or verify identities — an e-commerce platform, marketplace, B2B payment tool, fintech app, or cross-border money transfer service. Korapay handles payment collection, fund transfers, mobile money payments, and identity verification across Africa with a modern REST API.
All Korapay API requests require a Bearer token in the Authorization header:
Authorization: Bearer your_secret_key
Keys are generated in your Korapay merchant dashboard. Store in an environment variable like . Never hardcode tokens.
KORAPAY_SECRET_KEYBase URL: https://api.korapay.com/merchant
Official Documentation:
Start a payment transaction and receive a checkout link to share with customers. Korapay handles card, mobile money, bank transfer, and other payment methods.
POST /api/v1/charges/initialize
Body:
{
"amount": 50000,
"currency": "NGN",
"reference": "CHG-2025-001",
"email": "[email protected]",
"description": "Payment for digital services",
"checkout": {
"text": "Complete your purchase",
"logo": "https://yoursite.com/logo.png"
},
"metadata": {
"order_id": "ORD-12345",
"customer_name": "Amina Okafor"
}
}
Important: Amount is in the base unit of the currency (NGN, GHS, KES, etc.). Reference must be unique and is used for idempotency — sending the same reference twice returns the original charge.
Response:
{
"status": true,
"message": "Charge created successfully",
"data": {
"reference": "CHG-2025-001",
"charge_id": "CRG_xxxxx",
"checkout_url": "https://checkout.korapay.com/xxxxx",
"amount": 50000,
"currency": "NGN",
"status": "pending"
}
}
Share checkout_url with the customer. After payment, they're redirected to your callback or you listen for webhooks.
Retrieve the status and details of a charge.
GET /api/v1/charges/{reference}
Path Parameters:
reference: The charge reference ID you providedResponse:
{
"status": true,
"message": "Charge retrieved",
"data": {
"reference": "CHG-2025-001",
"charge_id": "CRG_xxxxx",
"amount": 50000,
"currency": "NGN",
"status": "successful",
"paid_at": "2025-02-15T14:30:00Z",
"customer_email": "[email protected]",
"payment_method": "card",
"metadata": {
"order_id": "ORD-12345"
}
}
}
Check status field: pending, successful, or failed. Always verify server-side — never trust client-side callbacks alone.
Process payments via mobile money (MTN, Airtel, Vodafone, Safaricom, etc.).
POST /api/v1/charges/mobile-money
Body:
{
"amount": 50000,
"currency": "NGN",
"reference": "MM-2025-001",
"phone_number": "2348012345678",
"email": "[email protected]",
"description": "Mobile money payment"
}
Response: Returns charge reference and payment initiation status. Customer confirms on their mobile device.
Send money to a bank account (fast transfer). Requires positive account balance.
POST /api/v1/transactions/disburse
Body:
{
"reference": "DIS-2025-001",
"amount": 100000,
"currency": "NGN",
"recipient": {
"bank_account": "0123456789",
"bank_code": "058",
"account_name": "Chinedu Adeyemi"
},
"narration": "Payout for contract work",
"metadata": {
"worker_id": "WRK-001"
}
}
Important: Amount is in the base currency unit. Bank code is the 3-digit code (058 = GTB). Reference must be unique — duplicates are rejected or return cached result.
Response:
{
"status": true,
"message": "Disbursement initiated",
"data": {
"reference": "DIS-2025-001",
"transaction_id": "TXN_xxxxx",
"amount": 100000,
"currency": "NGN",
"recipient_bank_code": "058",
"recipient_account": "0123456789",
"status": "processing"
}
}
Send international remittances and cross-border payouts using the dedicated remittance API.
POST /api/v1/transactions/disburse/remittance
Body:
{
"reference": "REM-2025-001",
"amount": 100000,
"currency": "NGN",
"recipient": {
"bank_account": "0123456789",
"bank_code": "058",
"country_code": "NG"
},
"narration": "Family remittance"
}
Remittance payouts support cross-border transfers with optimized processing.
Check the status of a disbursement or remittance transaction.
GET /api/v1/transactions/{reference}
Response:
{
"status": true,
"message": "Transaction retrieved",
"data": {
"reference": "DIS-2025-001",
"transaction_id": "TXN_xxxxx",
"type": "disbursement",
"amount": 100000,
"currency": "NGN",
"status": "successful",
"completed_at": "2025-02-15T14:35:00Z",
"recipient_account": "0123456789"
}
}
Possible statuses: processing, successful, failed. Most disbursements complete within 1-5 minutes.
Retrieve payout transaction history and reconciliation data.
GET /api/v1/transactions?limit=50&offset=0&status=successful&from=2025-01-01&to=2025-02-28
Query Parameters:
limit: Max results (default 50, max 100)offset: Pagination offsetstatus: Filter by successful, failed, or processingfrom: Start date (ISO format)to: End date (ISO format)Retrieve valid bank codes for disbursements.
GET /api/v1/banks
Returns a list of all banks with their codes and names for the specified country.
Retrieve valid mobile money operator codes.
GET /api/v1/mobile-money-operators
Returns a list of all MMO providers (MTN, Airtel, Vodafone, Safaricom, etc.) with their codes.
Validate a bank account before disbursing to confirm the account name.
POST /api/v1/misc/banks/resolve
Authorization: Bearer {secret_key}
Content-Type: application/json
{
"bank": "058",
"account_number": "0123456789"
}
Note: The correct path is
POST /api/v1/misc/banks/resolve(not GET, not/transactions/verify-account). Korapay uses a POST body rather than query params for this endpoint.
Query Parameters:
bank_code: 3-digit bank codeaccount_number: 10-digit NUBAN account numberResponse:
{
"status": true,
"message": "Account verified",
"data": {
"bank_code": "058",
"account_number": "0123456789",
"account_name": "Chinedu Adeyemi",
"valid": true
}
}
Always verify before disbursing to prevent sending money to wrong accounts.
Issue virtual payment cards for customers (requires Card Issuing integration).
POST /api/v1/cards/issue
Enables virtual card creation for payouts, subscriptions, and marketplace payments.
Perform KYC/KYB verification and identity checks.
POST /api/v1/identity/verify
Supports identity verification, liveness checks, and business verification across African markets.
Korapay supports multiple African currencies:
Korapay sends webhooks for charge and disbursement events. Verify and listen:
const crypto = require('crypto');
const hash = crypto
.createHmac('sha256', webhook_secret)
.update(JSON.stringify(req.body))
.digest('hex');
if (hash === req.headers['x-korapay-signature']) {
// Valid webhook
}
Key events: charge.success, charge.failed, disbursement.success, disbursement.failed, transaction.completed.
POST /api/v1/charges/initialize when customer is ready to paycheckout_url with customercharge.success webhook or GET /charges/{reference} to verifycharge.success webhookGET /api/v1/transactions/verify-account to validate seller bank accountPOST /api/v1/transactions/disburse to send seller's cutGET /api/v1/transactions/{reference}GET /api/v1/transactions with date filtersPOST /api/v1/charges/mobile-money to initiate transferGET /api/v1/charges/{reference}GET /api/v1/transactions/verify-account (cache results)POST /api/v1/transactions/disburse for each approved recipientGET /api/v1/transactions with status filtersuccessfulKorapay returns structured error responses:
{
"status": false,
"message": "Description of error",
"code": "ERROR_CODE"
}
Common errors:
For disbursements, failed status might indicate invalid account, insufficient balance, or network issues.
For web applications, the Korapay Checkout SDK is the most common integration path — it opens a hosted payment modal directly on your page without redirecting the customer away.
<script src="https://korabay.s3.amazonaws.com/checkout.min.js"></script>
<script>
function pay() {
const checkout = new KorapayCheckout({
key: "pk_live_your_public_key", // use public key, not secret key
reference: "unique_ref_" + Date.now(),
amount: 50000, // in kobo for NGN
currency: "NGN",
customer: {
email: "[email protected]",
name: "Adeola Okonkwo"
},
onClose: function() {
console.log("Payment modal closed");
},
onSuccess: function(data) {
// data.reference — use this to verify on your backend
console.log("Payment success:", data);
verifyPayment(data.reference);
},
onFailed: function(data) {
console.error("Payment failed:", data);
}
});
checkout.show();
}
</script>
<button onclick="pay()">Pay Now</button>
After onSuccess, always verify the payment server-side:
GET /api/v1/charges/{reference}
Authorization: Bearer {secret_key}
The checkout URL returned from the Checkout API (data.checkout_url) redirects to the same hosted interface. The SDK is preferred over a direct redirect because it keeps the customer on your page.