Africaβs best and cheapest payment gateway
All API requests require both your API key and API secret in headers:
x-api-key: ypk_your_api_key_here x-api-secret: yps_your_api_secret_here Idempotency-Key: unique-request-id # recommended for POST requests
POST /api/api-create-payment
Initiate a payment collection from a customer's mobile money account.
{
"amount": 5000,
"phone_number": "0712345678",
"provider": "mtn",
"wallet": "ugx",
"note": "Payment for order #123",
"webhook_url": "https://your-server.com/webhook"
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| amount | number | Yes | Amount to collect; minimum depends on wallet |
| wallet | string | No | ugx (default), kes, rwf, cdf, usd, or usdt |
| phone_number | string | Mobile money | Customer number in local or international format |
| provider | string | No | mtn, airtel, mpesa, vodacom, orange, or crypto |
| gateway | string | No | Optional configured gateway override; omit to use your account routing |
| note | string | Yes | Description, 4β255 characters |
| string | No | Customer email for a USDT collection | |
| network | string | No | Blockchain network for a USDT collection |
| webhook_url | string | No | URL to receive status callbacks |
{
"success": true,
"message": "Payment initiated successfully",
"transaction_id": "uuid",
"reference": "API_COL_...",
"amount": 5000,
"phone_number": "256712345678"
}
const response = await fetch('https://pay.yollie.live/api/api-create-payment', {
method: 'POST',
headers: {
'x-api-key': 'ypk_your_api_key_here',
'x-api-secret': 'yps_your_api_secret_here',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: 50000,
phone_number: '0712345678',
provider: 'mtn',
wallet: 'ugx',
note: 'Payment for services',
webhook_url: 'https://your-server.com/webhook'
})
});
const data = await response.json();
console.log('Transaction ID:', data.transaction_id);
| Wallet | Method | Minimum | Required destination |
|---|---|---|---|
| UGX | Uganda mobile money | 500 collection / 1,000 payout | phone_number; mtn or airtel |
| KES | Kenya M-Pesa | 10 | phone_number; mpesa |
| RWF | Rwanda mobile money | 100 | phone_number |
| CDF | DR Congo mobile money | 500 | phone_number |
| USD | DR Congo mobile money | 1.00 | phone_number |
| USDT | Crypto | 1.00 | crypto_address for payouts |
{
"wallet": "usdt",
"amount": 25,
"note": "Order 8891",
"email": "customer@example.com",
"network": "TRC20",
"webhook_url": "https://your-server.com/webhook"
}
{
"success": true,
"transaction_id": "transaction-uuid",
"reference": "your-reference",
"payment": {
"pay_amount": 25,
"pay_currency": "USDT",
"network": "TRC20",
"address": "TX...",
"memo": null,
"qr_code": "https://...",
"expired_at": 1790672400
}
}
{
"wallet": "usdt",
"amount": 25,
"crypto_address": "TX...",
"network": "TRC20",
"recipient_name": "John Doe",
"note": "Payout 8891",
"webhook_url": "https://your-server.com/webhook"
}
POST /api/api-disburse
Send money to a mobile money number. Funds are deducted from your Yolliepay wallet.
{
"amount": 10000,
"phone_number": "0712345678",
"provider": "mtn",
"wallet": "ugx",
"recipient_name": "John Doe",
"note": "Salary payment",
"webhook_url": "https://your-server.com/webhook"
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| amount | number | Yes | Payout amount; minimum depends on wallet |
| wallet | string | No | ugx (default), kes, rwf, cdf, usd, or usdt |
| phone_number | string | Mobile money | Recipient number in local or international format |
| provider | string | No | mtn, airtel, mpesa, vodacom, orange, or crypto |
| gateway | string | No | Optional configured gateway override; omit to use your account routing |
| crypto_address | string | USDT | Recipient blockchain address |
| network | string | No | USDT network; TRC20 is used by default |
| recipient_name | string | No | Recipient's name |
| note | string | Yes | Description, 4β255 characters |
| webhook_url | string | No | URL to receive status callbacks |
{
"success": true,
"message": "Payout initiated successfully",
"transaction_id": "uuid",
"reference": "...",
"amount": 10000,
"phone_number": "256712345678"
}
const response = await fetch('https://pay.yollie.live/api/api-disburse', {
method: 'POST',
headers: {
'x-api-key': 'ypk_your_api_key_here',
'x-api-secret': 'yps_your_api_secret_here',
'Content-Type': 'application/json'
},
body: JSON.stringify({
amount: 10000,
phone_number: '0712345678',
provider: 'mtn',
recipient_name: 'John Doe',
note: 'Salary payment',
webhook_url: 'https://your-server.com/webhook'
})
});
const data = await response.json();
console.log('Payout ID:', data.transaction_id);
curl -X POST "https://pay.yollie.live/api/api-disburse" \
-H "x-api-key: ypk_your_api_key_here" \
-H "x-api-secret: yps_your_api_secret_here" \
-H "Content-Type: application/json" \
-d '{
"amount": 10000,
"phone_number": "0712345678",
"provider": "mtn",
"recipient_name": "John Doe",
"note": "Payout"
}'
GET /api/api-balance
Returns the available UGX wallet balance for the authenticated API key.
curl "https://pay.yollie.live/api/api-balance" \ -H "x-api-key: ypk_your_api_key_here" \ -H "x-api-secret: yps_your_api_secret_here"
{
"success": true,
"balance": 250000,
"currency": "UGX",
"available": 250000,
"sandbox": false,
"updated_at": "2026-09-29T06:00:00Z"
}
GET /api/api-transactions
| Query | Required | Description |
|---|---|---|
| limit | No | 1β100; default 20 |
| offset | No | Pagination offset; default 0 |
| type | No | deposit, withdrawal, or transfer |
| status | No | pending, completed, or failed |
curl "https://pay.yollie.live/api/api-transactions?limit=20&offset=0&type=deposit&status=completed" \ -H "x-api-key: ypk_your_api_key_here" \ -H "x-api-secret: yps_your_api_secret_here"
{
"success": true,
"total": 1,
"limit": 20,
"offset": 0,
"transactions": [{
"id": "transaction-uuid",
"reference": "provider-reference",
"type": "deposit",
"status": "completed",
"provider_status": "successful",
"amount": 50000,
"currency": "UGX",
"recipient_phone": "+256712345678",
"recipient_name": null,
"description": "Order 8891",
"created_at": "2026-09-29T06:00:00Z"
}]
}
GET /api/api-transaction-status?reference=...
Look up one transaction using either reference or transaction_id.
curl "https://pay.yollie.live/api/api-transaction-status?reference=provider-reference" \ -H "x-api-key: ypk_your_api_key_here" \ -H "x-api-secret: yps_your_api_secret_here"
{
"success": true,
"transaction": {
"id": "transaction-uuid",
"reference": "provider-reference",
"type": "withdrawal",
"status": "completed",
"provider_status": "successful",
"amount": 10000,
"currency": "UGX",
"recipient_phone": "+256712345678",
"recipient_name": "John Doe",
"description": "Payout 8891",
"created_at": "2026-09-29T06:00:00Z"
}
}
POST /api/api-verify-phone
Confirm who a Uganda mobile money number is registered to before sending a payout, so your customers don't send money to the wrong number.
{
"phone_number": "0712345678"
}
| Parameter | Type | Required | Description |
|---|---|---|---|
| phone_number | string | Yes | Uganda number in 07XXXXXXXX or 256XXXXXXXXX format |
{
"success": true,
"message": "Phone number verified successfully",
"data": {
"phone_number": "256712345678",
"first_name": "JOHN",
"last_name": "ODO",
"full_name": "JOHN ODO",
"verification_status": "verified"
}
}
| Status | code | Meaning |
|---|---|---|
| 400 | invalid_phone_number | Missing or badly formatted number |
| 401 | - | Invalid API credentials |
| 403 | api_disabled_for_account | API access disabled on the account |
| 404 | phone_not_found | Number not registered on the network |
| 502 / 503 | verification_unavailable | Lookup service temporarily unavailable |
curl -X POST "https://pay.yollie.live/api/api-verify-phone" \
-H "x-api-key: ypk_your_api_key_here" \
-H "x-api-secret: yps_your_api_secret_here" \
-H "Content-Type: application/json" \
-d '{ "phone_number": "0712345678" }'
Pass a webhook_url in each API request to receive transaction status updates at that URL.
{
"id": "evt_abc12345",
"type": "transaction.completed",
"created": 1642000000,
"data": {
"id": "transaction-uuid",
"type": "deposit",
"amount": 50000,
"currency": "UGX",
"status": "completed",
"description": "Payment for services",
"recipient_phone": "256712345678",
"recipient_name": "John Doe",
"created_at": "2026-01-12T10:30:00Z"
},
"api_version": "2025-01"
}
User-Agent: Yolliepay-Webhooks/1.0 Content-Type: application/json X-Yolliepay-Event: transaction.completed X-Yolliepay-Timestamp: 1642000000 X-Yolliepay-Signature: sha256=<hex-digest>
Verify the signature by calculating HMAC SHA-256 over timestamp.raw_request_body using your webhook secret. Return HTTP 200 after accepting the event.
| Event | Description |
|---|---|
| transaction.completed | Payment/payout successfully processed |
| transaction.failed | Payment/payout failed or cancelled |
| transaction.pending | Payment initiated, awaiting approval |
| payout.completed | Payout successfully sent |
| payout.failed | Payout failed |
| Type | Fee |
|---|---|
| All deposits (including API) | 5% |
| Type | Fee |
|---|---|
| All withdrawals / payouts (including API) | 5% |
| Type | Fee |
|---|---|
| All transactions, including internal transfers | 5% |
| Account Type | Limit |
|---|---|
| Personal | UGX 500,000/day |
| Business | UGX 5,000,000/day |
| Sandbox (unverified) | Withdrawals disabled |
| Code | Description |
|---|---|
| 400 | Bad Request β missing or invalid parameters (validation details in response) |
| 401 | Unauthorized β invalid or missing API credentials |
| 403 | Forbidden β key deactivated, deposits/withdrawals disabled, or origin not allowed |
| 409 | Duplicate β identical request received recently. Wait before retrying. |
| 429 | Rate limit exceeded β slow down (60 transaction requests/min/key) |
| 500 | Server error β internal processing error |