Download OpenAPI specification:
This API enables integration with the Payment Gateway to initiate transactions, monitor their statuses, and interact with various payment providers.
This API is part of the our ecosystem. It allows you to make payments, find out the status of transactions and much more. Here you will find the latest documentation on setting up your solution.
Important: all Mobile Money C2B/B2C payments must be processed only with verified phone numbers.
Before proceeding with the request, please confirm that the phone number:
This requirement is essential for minimizing fraud risk.
Use the test provider below during sandbox integration. Note that responses from the simulator do not include a callback — transactions remain in the "in progress" state.
| ID | Name | Country | Description |
|---|---|---|---|
| 14 | Simulator | ANY | For testing purposes |
When using the simulator provider, a successful request returns the following structure. Note that status: 1 means "in progress" — use the /status method to poll for updates.
{
"order_id": "54321",
"transaction_id": "12345",
"transaction_ref": "",
"status": 1,
"result": {
"code": 0,
"message": "OK"
},
"provider_result": {
"code": -8888,
"message": "Good"
},
"service_id": 1,
"service_version": "1.03/1.14|1.0/1.26|1.0/1.0|1.01/1.01|1.01/1.01||1.01/1.27",
"service_date_time": "2023-05-15 10:00:00.000000",
"confirm_type": 0
}
To generate a correct signature, use your secretKey and apply recursive
HMAC SHA-512 hashing on all request fields, excluding the signature field itself.
Example in PHP:
function calculateSignature(array $data, string $secretKey, string $prefix = '', int $depth = 16, int $level = 0): string {
if ($level >= $depth) {
throw new Exception('Too deep');
}
$result = '';
foreach ($data as $key => $value) {
if ($key === 'signature') continue;
$fullKey = $prefix . $key;
if (is_array($value)) {
$result .= calculateSignature($value, $secretKey, $fullKey . '.', $depth, $level + 1);
} else {
$result .= $fullKey . $value;
}
}
return $level === 0
? strtolower(hash_hmac('sha512', $result, $secretKey))
: $result;
}
$postData = [
'merchant_id' => 'fffed61b...',
'provider_id' => 10,
'client_id' => '254000000000',
'country' => 'KE',
'order_id' => 'order_3444298767545',
'amount' => 1000,
'currency' => 'KES',
'callback_url' => 'https://my.callback.url'
];
$secretKey = 'cf11635572...';
$postData['signature'] = calculateSignature($postData, $secretKey);
| Code | Name | Description |
|---|---|---|
| -1 | undefined | Unknown or error state |
| 0 | initiated | Operation is initiated |
| 1 | in progress | Operation is in progress |
| 2 | success | Operation completed successfully |
| 3 | failed | Operation failed |
| 4 | cancelled | Operation was cancelled |
Operation type codes visible in callbacks:
| Code | Type |
|---|---|
| 16 | payment_b2c |
| 17 | payment_c2b |
| 32 | paybill |
| Code | Note |
|---|---|
| KES | Example for test requests |
| MWK | Malawian kwacha |
| UGX | Ugandan shilling |
| TZS | Tanzanian shilling |
| ZMW | Zambian kwacha |
| XOF | West African CFA franc |
| XAF | CFA franc BEAC |
Transaction status is sent via callback because it requires asynchronous confirmation from the client system. Usually the callback should arrive within 2–3 minutes.
If no callback is received, use the status API method to check transaction result.
Successful callback = HTTP 200 from merchant'
| Provider ID | Provider Name | Notes |
|---|---|---|
| 9525 | MTN | Check provider id with your manager |
242000000000 - This is the format of the phone number you have to send in the payment requests.
| Provider_id | No Extra Required | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9525 | * | * |
| Provider_id | No Extra Required | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9525 | * | * |
| Provider_id | c2b minimum | b2c minimum | Maximum transaction limit |
|---|---|---|---|
| 9525 | XAF 100.00 | XAF 100.00 | XAF 2'000'000.00 |
| Provider ID | Provider Name | Notes |
|---|---|---|
| 9515, 9574 | M-Pesa Safaricom | Check provider id with your manager |
254000000000 - This is the format of the phone number you have to send in the payment requests.
| Provider_id | No Extra Required | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9515 | * | |||
| 9574 | * |
| Provider_id | No Extra Required | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9515 | * | |||
| 9574 | * |
| Provider_id | c2b minimum | b2c minimum | Maximum transaction limit |
|---|---|---|---|
| 9515 | KES 100.00 | KES 50.00 | KES 250'000.00 |
| 9574 | KES 10.00 | KES 10.00 | KES 85'000.00 |
| Provider ID | Provider Name | Notes |
|---|---|---|
| 9259 | Wave | Check with your manager |
| 9322 | Orange | Chack with your manager |
221000000000 - This is the format of the phone number you have to send in the payment requests.
| Provider_id | Empty | customer_email | customer_name | customer_ip | return_url |
|---|---|---|---|---|---|
| 9322 | * | ||||
| 9259 | * |
"extra":
{
"customer_redirect": "https://checkout.provider.com/202511131111MqKRft39377/pay"
},
| Provider_id | Empty | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9259 | * | |||
| 9322 | * |
| Provider_id | c2b minimum | b2c minimum | Maximum transaction limit |
|---|---|---|---|
| 9322, 9269 | XOF 200.00 | XOF 200.00 | XOF 2'000'000.00 |
| Provider ID | Provider Name | Notes |
|---|---|---|
| 9370 | Airtel | Check provider id with your manager |
| HaloPesa | Check provider id with your manager | |
| 9369 | Vodacom | Check provider id with your manager |
| 9376 | Tigo | Check provider id with your manager |
255000000000 - This is the format of the phone number you have to send in the payment requests.
| Provider_id | Empty | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9369, 9370, 9376 | * | * |
| Provider_id | Empty | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9369, 9370, 9376 | * | * |
| Provider_id | c2b minimum | b2c minimum | Maximum transaction limit |
|---|---|---|---|
| 9369, 9370, 9376 | TZS 1'000.00 | TZS 1'000.00 | TZS 5'000'000.00 |
| Provider ID | Provider Name | Notes |
|---|---|---|
| 9527 | TOGOCOM | Check provider id with your manager |
| 9526 | Moov | Check provider id with your manager |
The phone number must consist of exactly 8 numeric digits in the following format: 228XXXXXXXX (3-digit country code 228 + 8-digit local phone number). Example: 22890123456 No spaces, plus signs, separators, or other characters are permitted.
| Provider_id | No Extra Required | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9526, 9527 | * |
| Provider_id | No Extra Required | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9526, 9527 | * |
Note deposits and withdrawals are made in multiples of 5.
| Provider_id | c2b minimum | b2c minimum | Maximum transaction limit |
|---|---|---|---|
| 9526, 9527 | XOF 100.00 | XOF 100.00 | XOF 2'000'000.00 |
| Provider ID | Provider Name | Notes |
|---|---|---|
| 9262, 9519 | Wave | Check with your manager |
| 9260 | Moov | Check with your manager |
| 9261, 9516 | MTN | Check with your manager |
| 9324 | Orange | Check with your manager |
2250XXXXXXXXX - This is the format of the phone number you have to send in the payment requests.
| Provider_id | Empty | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9260, 9261 | * | |||
| 9516 | * |
#144*82#| Provider_id | Empty | customer_email | customer_name | return_url | otp |
|---|---|---|---|---|---|
| 9324 | * |
Example Request:
{
"merchant_id": "your merchant id",
"customer_id": "2250705145655",
"order_id": "test_161225_01_1",
"amount": "1111",
"currency": "XOF",
"country": "BF",
"callback_url": "your callback url",
"provider_id": "9324",
"signature": "1c594d338bc3f413bd61cb97d697e98ad5772071da533",
"extra": {
"otp": "7777"
},
}
| Provider_id | Empty | customer_email | customer_name | customer_ip | return_url |
|---|---|---|---|---|---|
| 9262 | * | ||||
| 9519 | * | * |
"extra":
{
"customer_redirect": "https://checkout.provider.com/202511131111MqKRft39377/pay"
},
| Provider_id | Empty | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9260, 9261, 9262, 9324, 9516 | * | |||
| 9519 | * | * |
| Provider_id | c2b minimum | b2c minimum | Maximum transaction limit |
|---|---|---|---|
| 9262, 9324, 9261, 9260 | XOF 200.00 | XOF 200.00 | XOF 2'000'000.00 |
| 9516, 9519 | XOF 100.00 | XOF 100.00 | XOF 2'000'000.00 |
| Provider ID | Provider Name | Notes |
|---|---|---|
| 9343 | MTN | Check provider id with your manager |
| 9344 | Vodafone | Check provider id with your manager |
233000000000 - This is the format of the phone number you have to send in the payment requests.
| Provider_id | Empty | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9343, 9344 | * | * |
| Provider_id | Empty | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9343, 9344 | * | * |
| Provider_id | c2b minimum | b2c minimum | Maximum transaction limit |
|---|---|---|---|
| 9343, 9344 | GHS 10.00 | GHS 10.00 | GHS no limit |
| Provider ID | Provider Name | Notes |
|---|---|---|
| 9341 | MTN | Check provider id with your manager |
| 9342 | Airtel | Check provider id with your manager |
260000000000 - This is the format of the phone number you have to send in the payment requests.
| Provider_id | Empty | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9341, 9342 | * | * |
| Provider_id | Empty | customer_email | customer_name | return_url |
|---|---|---|---|---|
| 9341, 9342 | * | * |
| Provider_id | c2b minimum | b2c minimum | Maximum transaction limit |
|---|---|---|---|
| 9341, 9342 | ZMW 1.00 | ZMW 1.00 | ZMW 20'000.00 |
| public_id required | string Example: f54ec96649be11ebb3780242ac130002 Merchant public ID |
Parameters to initiate a customer to the merchant payment
| merchant_id required | string (merchantIdDef) Unique Merchant ID received during the merchant registration |
| customer_id required | string (customerIdDef) Customer ID (usually mobile phone number of the customer) |
| customer_user_id required | string (customerUserIdDef) <= 200 characters Unique customer identifier on the merchant’s side (e.g., internal user ID, CRM ID) |
| order_id required | string (orderIdDef) The unique value is generated by the transaction initiator for each Operation. Max length is 128 symbols. Allowed symbols: [a-z], [A-Z], [0-9], “_” (underscore character), “-” (hyphen), “:” (colon), “.” (dot). For example, GUID or TIMESTAMP can be used as an order_id. This parameter provides API idempotency. It means that requests with identical nonce from the same transaction initiator will have identical responses and The corresponding operation won’t be repeated. |
| amount required | string Amount to pay, should be in format with two digits after point |
| currency required | string (currencyDef) Currency code in ISO 4217 format from the list of availabe currencies |
| country | |
| callback_url | string URL to notify the merchant via callback. Recommended |
| provider_id required | |
| signature required | string (signatureDef) Merchant’s request and callback have to be signed to verify sent data. To generate the signature all sent parameters are included in the order they were sent. The parameter signature should be excluded, of course. Example can be found here |
{- "merchant_id": "e0fecd91fcb24f348048193b3fb34875ba3722b4",
- "customer_id": 900000001,
- "customer_user_id": "user-123456",
- "order_id": "16280954971628095497",
- "amount": "100.00",
- "currency": "KES",
- "country": "KE",
- "provider_id": 14,
- "signature": "d7d6d76b0e22c6f9d369fa6c24f107053d12bfd24d3b154f2deb6676bf179c123134e1f20879c803be455d81cfe792f00cd8892c26ce7cf5a05beebb9c80843e"
}{- "order_id": "16280954971628095497",
- "transaction_id": "732007046722",
- "transaction_ref": "MP.33234.342.CP33",
- "status": 2,
- "result": {
- "code": 0,
- "message": "OK"
}, - "provider_result": {
- "code": 0,
- "message": "OK"
}, - "service_id": 1,
- "service_version": 11.1,
- "service_date_time": "2020-11-25 10:08:32.832969"
}{- "transaction_id": "1234567",
- "order_id": "16280954971628095497",
- "service_id": 12345,
- "service_version": "5.2.0",
- "service_date_time": "2020-11-25 10:08:32.832969",
- "result": {
- "code": 0,
- "message": "OK"
}, - "signature": "d7d6d76b0e22c6f9d369fa6c24f107053d12bfd24d3b154f2deb6676bf179c123134e1f20879c803be455d81cfe792f00cd8892c26ce7cf5a05beebb9c80843e"
}Cashless payment from the merchant to the customer. If the confirm_type response parameter is a non-zero merchant, send the second payment_b2c request with confirmation data according to the section Confirmation Types.
| public_id required | string Example: f54ec96649be11ebb3780242ac130002 Merchant public ID |
Parameters to initiate the merchant to the customer payment
| merchant_id required | string (merchantIdDef) Unique Merchant ID received during the merchant registration |
| customer_id required | string (customerIdDef) Customer ID (usually mobile phone number of the customer) |
| customer_user_id required | string (customerUserIdDef) <= 200 characters Unique customer identifier on the merchant’s side (e.g., internal user ID, CRM ID) |
| order_id required | string (orderIdDef) The unique value is generated by the transaction initiator for each Operation. Max length is 128 symbols. Allowed symbols: [a-z], [A-Z], [0-9], “_” (underscore character), “-” (hyphen), “:” (colon), “.” (dot). For example, GUID or TIMESTAMP can be used as an order_id. This parameter provides API idempotency. It means that requests with identical nonce from the same transaction initiator will have identical responses and The corresponding operation won’t be repeated. |
| amount required | string Amount to pay, with two digits after point |
| currency required | string (currencyDef) Currency code in ISO 4217 format from the list of availabe currencies |
| country | |
| callback_url | string URL to notify the merchant via callback |
| provider_id required | |
| signature required | string (signatureDef) Merchant’s request and callback have to be signed to verify sent data. To generate the signature all sent parameters are included in the order they were sent. The parameter signature should be excluded, of course. Example can be found here |
{- "merchant_id": "e0fecd91fcb24f348048193b3fb34875ba3722b4",
- "customer_id": 900000001,
- "customer_user_id": "user-123456",
- "order_id": "16280954971628095497",
- "amount": "100.00",
- "currency": "KES",
- "country": "KE",
- "provider_id": 14,
- "signature": "d7d6d76b0e22c6f9d369fa6c24f107053d12bfd24d3b154f2deb6676bf179c123134e1f20879c803be455d81cfe792f00cd8892c26ce7cf5a05beebb9c80843e"
}{- "order_id": "16280954971628095497",
- "transaction_id": "532007056722",
- "transaction_ref": "",
- "status": 2,
- "result": {
- "code": 0,
- "message": "OK"
}, - "provider_result": {
- "code": 0,
- "message": "OK"
}, - "service_id": 11,
- "service_version": 11.1,
- "service_date_time": "2020-11-25 10:08:32.832969",
- "confirm_type": 0
}| public_id required | string Example: f54ec96649be11ebb3780242ac130002 Merchant public ID |
Get the status of the performed transaction
| merchant_id required | string (merchantIdDef) Unique Merchant ID received during the merchant registration |
| order_id required | string (orderIdDef) The unique value is generated by the transaction initiator for each Operation. Max length is 128 symbols. Allowed symbols: [a-z], [A-Z], [0-9], “_” (underscore character), “-” (hyphen), “:” (colon), “.” (dot). For example, GUID or TIMESTAMP can be used as an order_id. This parameter provides API idempotency. It means that requests with identical nonce from the same transaction initiator will have identical responses and The corresponding operation won’t be repeated. |
| signature required | string (signatureDef) Merchant’s request and callback have to be signed to verify sent data. To generate the signature all sent parameters are included in the order they were sent. The parameter signature should be excluded, of course. Example can be found here |
{- "merchant_id": "e0fecd91fcb24f348048193b3fb34875ba3722b4",
- "order_id": "16280954971628095497",
- "signature": "d7d6d76b0e22c6f9d369fa6c24f107053d12bfd24d3b154f2deb6676bf179c123134e1f20879c803be455d81cfe792f00cd8892c26ce7cf5a05beebb9c80843e"
}{- "order_id": "16280954971628095497",
- "transaction_id": "732007046722",
- "transaction_ref": "MP.33234.342.CP33",
- "status": 2,
- "result": {
- "code": 0,
- "message": "OK"
}, - "provider_result": {
- "code": 0,
- "message": "OK"
}, - "service_id": 1,
- "service_version": 11.1,
- "service_date_time": "2020-11-25 10:08:32.832969"
}