Nkapsmart is warming up...
Nkapsmart is warming up...
Nkapsmart provides a unified interface to accept local and international payments in a single integration.
Base Endpoint
https://api.nkapsmart.cmTo interact with the Nkapsmart infrastructure, you handle three types of identifiers. It is crucial to understand their role to secure your integration.
This is your application's unique identifier. It can be exposed in your requests without risk.
This is your HMAC signing key. It must NEVER travel across the network.
This is the dynamic token obtained after a successful authentication.
The Application Key is always visible in your dashboard. However, the Secret Key is only displayed once (at creation). If you lose it, you will need to generate a new key pair.
Secure your API calls using an HMAC-SHA256 signature generated from your application keys.
Besoin d'aide sur les clés ?
Avant de commencer, familiarisez-vous avec la différence entre Application Key, Secret Key et AccessToken dans notre guide de Gestion des clés.
stringToSign = METHOD + "\n" + PATH + "\n" + TIMESTAMP + "\n" + Base64(SHA256(body)) signature = Base64( HMAC-SHA256(secret, stringToSign) )
The timestamp must be within a ±5 minute window of the server's UTC time.
| Field | Type | Required |
|---|---|---|
| apiKey | string (Your API Key) | YES |
| signature | string (HMAC-SHA256) | YES |
| timestamp | number (Unix UTC) | YES |
Returns the JWT access token and user details.
{
"accessToken": "eyJh... (JWT Token)",
"tokenType": "Bearer",
"expiresAt": 1745058600,
"userId": "3fa85f64..."
}The accessToken is critical for security. Once obtained, it must be included in the Header of ALL subsequent requests (payments, withdrawals, etc.).
This allows you to securely prove your identity without re-signing or re-transmitting your secret keys for every action.
/api/auth/authenticateconst crypto = require('crypto');
const secret = 'your_plain_text_secret';
const method = 'POST';
const path = '/api/auth/authenticate';
const body = '';
const timestamp = Math.floor(Date.now() / 1000).toString();
const bodyHash = crypto.createHash('sha256').update(body).digest('base64');
const stringToSign = `${method}\n${path}\n${timestamp}\n${bodyHash}`;
const signature = crypto.createHmac('sha256', secret).update(stringToSign).digest('base64');
// Send { apiKey, signature, timestamp: parseInt(timestamp) }Never share your Secret Key. If your keys are compromised, revoke them immediately from the KeysPage.
Initialize a mobile payment transaction.
When a customer chooses Mobile Money as payment method, a push notification is sent to their registered mobile device. To complete the transaction, the customer must:
Once authorized, the payment is processed, and both the customer and merchant receive a confirmation. The customer's Mobile Money wallet is debited and a successful webhook notification is sent to your server.
Customer
Enters the number and amount.
System
Verifies the recipient's identity (user_name).
Backend
Validates the business balance and initiates the request.
Operator
Sends the USSD push to the customer's mobile.
Customer
Confirms with their PIN code.
System
Receives the Webhook and confirms the transaction.
| Field | Type | Required |
|---|---|---|
| phoneNumber | string | YES |
| amount | double | YES |
| string | YES | |
| applicationKey | string | YES |
| description | string | NO |
| productName | string | NO |
/api/v2/TransactionSecond/mobile{
"phoneNumber": "6XXXXXXXX",
"amount": 0,
"email": "user@mail.com",
"applicationKey": "YOUR_KEY",
"description": "...",
"productName": "..."
}Note: Ensure your server is listening for the charge.completed webhook to deliver value.
Authorization: Bearer [token]). It is essential for security.Initiate payments via bank transfer. This endpoint generates a secure payment session allowing the customer to finalize the transaction through their banking interface.
The bank flow relies on a redirect or transfer instruction. Once the request is sent, the system processes the authorization with the partner bank.
Customer
Enters their information and transfer amount.
System
Validates the application key and registers the payment intent.
Backend
Generates redirect links (Success/Cancel).
Bank
Checks fund availability and authorizes the transfer.
Customer
Is redirected to the success URL after confirmation.
System
Notifies your server via Webhook (charge.completed).
| Field | Type | Required |
|---|---|---|
| phoneNumber | string | NO |
| amount | double | YES |
| string | YES | |
| applicationKey | string | YES |
| productName | string | NO |
| Description | string | NO |
| SuccessUrl | string | NO |
| CancelUrl | string | NO |
/api/Transaction/bank{
"phoneNumber": "6XXXXXXXX",
"amount": 0,
"email": "user@mail.com",
"applicationKey": "YOUR_KEY",
"productName": "....",
"Description": "....",
"SuccessUrl": "....",
"CancelUrl": "...."
}Note de sécurité : Make sure the redirect URLs are publicly accessible to allow customer return.
Authorization: Bearer [token]). It is essential for security.Accept USDT payments networks. This flow requires a valid payment address for receiving funds.
Crypto payment relies on verifying the transaction on the blockchain.
Customer
Selects the currency.
System
Validates the receiving address and amount.
Backend
Locks the exchange rate and waits for the deposit.
Blockchain
Verifies the transaction on the selected network.
System
Detects the incoming transfer via the payment address.
Merchant
Receives the success notification after confirmation.
| Field | Type | Required |
|---|---|---|
| phoneNumber | string | NO |
| amount | double | YES |
| string | YES | |
| applicationKey | string | YES |
| description | string | NO |
| payCurrency | string | YES |
| productName | string | NO |
| paymentAddress | string | YES |
/api/v2/TransactionSecond/crypto{
"phoneNumber": "6XXXXXXXX",
"amount": 0,
"email": "user@example.com",
"applicationKey": "YOUR_KEY",
"description": "....",
"payCurrency": "...",
"productName": "....",
"paymentAddress": "...."
}Blockchain Security : Warning: Any error in the payment address (paymentAddress) or network (payCurrency) may result in permanent loss of funds.
Authorization: Bearer [token]). It is essential for security.Use this endpoint to send funds from your business account to a recipient's Mobile Money wallet in Cameroon.
Unlike payment, Withdraw is an outgoing operation. Money is debited from your balance to credit a third party.
System
Receives the withdrawal request with recipient information.
Backend
Checks account eligibility and available balance.
Operator
Executes the transfer to the provided phone number.
System
Updates the transaction status and your balance.
| Field | Type | Required |
|---|---|---|
| phoneNumber | string | YES |
| amount | double | YES |
| string | YES | |
| applicationKey | string | YES |
| description | string | NO |
| recieverName | string | NO |
| operator | int | YES |
/api/v2/TransactionSecond/mobile/widraw{
"phoneNumber": "6XXXXXXXX",
"amount": 0,
"email": "user@example.com",
"applicationKey": "YOUR_KEY",
"description": "....",
"recieverName": "....",
"operator": 0
}Important : Note: The withdrawal is processed immediately by the provider. Make sure you have sufficient balance to avoid 403/400 errors.
Authorization: Bearer [token]). It is essential for security.Transfer tokens to an external wallet. This network offers near-instant transactions with minimal fees.
The withdrawal is made directly on the Mainnet. Make sure the destination address is compatible.
| Field | Type | Required |
|---|---|---|
| phoneNumber | string | YES |
| amount | double | YES |
| string | YES | |
| applicationKey | string | YES |
| description | string | YES |
| payCurrency | string | YES |
| payeeAddress | string | YES |
/api/v2/TransactionSecond/crypto/widraw{
"phoneNumber": "6XXXXXXXX",
"amount": 0,
"email": "user@mail.com",
"applicationKey": "YOUR_KEY",
"description": "....",
"payCurrency": "....",
"payeeAddress": "...."
}Authorization: Bearer [token]). It is essential for security.Send money to multiple recipients simultaneously. Ideal for automating payroll or reward campaigns.
Instead of calling the API for each person, you send a transactions.
| Field | Structure | Required |
|---|---|---|
| applicationKey | string | YES |
| transactions | Array<Object> | YES |
Transaction Object Fields
| Field | Type | Required | Description |
|---|---|---|---|
| phoneNumber | string | YES | Recipient's phone number |
| amount | double | YES | Amount to transfer |
| string | NO | Recipient's email | |
| description | string | NO | Transaction description |
| recieverName | string | NO | Recipient's full name |
/api/v2/TransactionSecond/mobile/withdraw/bulk{
"applicationKey": "YOUR_KEY",
"transactions": [
{
"phoneNumber": "6XXXXXXXX",
"amount": 0,
"email": "user1@example.com",
"description": "...",
"recieverName": "...."
}
]
}Limitation : Pour des raisons de performance, nous recommandons de ne pas dépasser 100 transactions par lot (Bulk).
Authorization: Bearer [token]). It is essential for security.Use this endpoint to track the progress of a bulk operation. You will get a global summary as well as the individual status of each transaction.
URL Parameters
| URL Parameter | Type | Required | Description |
|---|---|---|---|
| bulkOperationId | string | YES | The ID returned when the bulk operation was created |
Response Fields
| Field | Type | Required | Description |
|---|---|---|---|
| bulkOperationId | string | Yes | Unique batch identifier |
| totalCount | int | Yes | Total transactions in batch |
| successCount | int | Yes | Number of successful transactions |
| failedCount | int | Yes | Number of failed transactions |
| pendingCount | int | Yes | Number of transactions still processing |
| status | string | Yes | Overall batch status (Pending, Completed, Partial) |
| createdAt | datetime | Yes | Creation date |
| updatedAt | datetime | Yes | Last update date |
Transaction Object Fields
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Unique transaction ID |
| phoneNumber | string | Yes | Recipient phone number |
| amount | double | Yes | Transaction amount |
| string | Yes | Recipient email | |
| description | string | Yes | Internal description |
| status | string | Yes | Individual transaction status |
| transactionKey | string | Yes | External bank/operator reference key |
| errorMessage | string | Yes | Error details if failed |
| createdAt | datetime | Yes | Timestamp |
/api/v2/TransactionSecond/mobile/widraw/bulk/{bulkOperationId}JSON Response Example
{
"bulkOperationId": "BK-2026-X99",
"totalCount": 2,
"successCount": 1,
"failedCount": 1,
"pendingCount": 0,
"status": "Completed",
"createdAt": "2026-06-05T09:59:22.660Z",
"updatedAt": "2026-06-05T09:59:22.660Z",
"transactions": [
{
"id": "uuid-123",
"phoneNumber": "6XXXXXXXX",
"amount": 5000,
"email": "user@example.com",
"description": "Payment",
"status": "Success",
"transactionKey": "KEY123",
"errorMessage": "",
"createdAt": "2026-06-05T09:59:22.660Z"
}
]
}Pro Tip: Don't poll this endpoint too quickly. We recommend an interval of 5 to 10 seconds between each status check to optimize your performance.
Authorization: Bearer [token]). It is essential for security.Check the status of a Mobile Money or Bank payment. This endpoint queries the final status directly from the concerned operator.
| URL Parameter | Type | Required |
|---|---|---|
| transactionkey | string | YES |
Response Fields
| Field | Type | Required | Description |
|---|---|---|---|
| transactionReference | string | Yes | Unique reference for the transaction |
| transactionAmount | double | Yes | Amount to be paid |
| transactionDescription | string | Yes | Short summary of the purchase |
| walletToken | string | Yes | Internal token for wallet referencing |
| transactionType | string | Yes | Type of transaction (Payment, etc.) |
| transactionCategory | string | Yes | Category of the transaction |
| successUrl | string | Yes | URL to redirect on success |
| cancelUrl | string | Yes | URL to redirect on cancellation |
| transactionKey | string | Yes | Unique technical identifier |
| productName | string | No | Name of the product purchased |
| transactionStatus | string | Yes | Current status (SUCCESS, FAILED, PENDING) |
| paymentUrl | string | Yes | Link to the payment gateway |
| raison | string | No | Detailed reason in case of failure |
| cryptoPayAmount | double | No | Amount in cryptocurrency (if applicable) |
| paymentAddress | string | No | Sender crypto address |
| payeeAddress | string | No | Recipient crypto address |
| ash | string | No | Transaction hash on the blockchain |
| createdAt | datetime | Yes | Transaction creation date |
Customer Details (Contact)
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Contact unique identifier |
| phoneNumber | string | Yes | Customer's mobile number |
| string | Yes | Customer's email address | |
| address | string | No | Physical address |
| city | string | No | Customer's city |
| state | string | No | State or region |
| country | string | No | Customer's country |
| zipCode | string | No | Postal code |
History (Inner Transactions)
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Transaction unique identifier |
| transactionType | string | Yes | Type of transaction |
| transactionStatus | string | Yes | Status of the individual transaction |
| operator | string | Yes | Operator used (MTN, Orange, etc.) |
| transactionAmount | double | Yes | Total amount |
| transactionWithOutFees | double | Yes | Net amount without fees |
| transactionReference | string | Yes | Merchant reference |
| transactionKey | string | Yes | Technical key |
| transactionDescription | string | Yes | Description |
| paymentUrl | string | No | Payment link |
| faildRaison | string | No | Failure details |
| ash | string | No | Blockchain hash |
| createdAt | datetime | Yes | Timestamp |
/api/v2/TransactionSecond/verify/{transactionkey}/{ash}Response Body
{
"transactionReference": "string",
"transactionAmount": 0,
"transactionDescription": "string",
"walletToken": "string",
"transactionType": "string",
"transactionCategory": "string",
"successUrl": "string",
"cancelUrl": "string",
"transactionKey": "string",
"productName": "string",
"transactionContact": {
"id": "string",
"address": "string",
"city": "string",
"state": "string",
"country": "string",
"zipCode": "string",
"phoneNumber": "string",
"email": "string",
"transactions": [
{
"id": "string",
"transactionType": 0,
"transactionStatus": 0,
"operator": 0,
"transactionAmount": 0,
"transactionWithOutFees": 0,
"transactionReference": "string",
"transactionKey": "string",
"walletToken": "string",
"transactionDescription": "string",
"successUrl": "string",
"cancelUrl": "string",
"productName": "string",
"paymentUrl": "string",
"faildRaison": "string",
"description": "string",
"payCurrency": "string",
"payAmount": 0,
"ash": "string",
"transactionContactId": "string",
"transactionCategory": 0,
"transactionContact": "string",
"paymentAddress": "string",
"realAmount": 0,
"payeeAddress": "string",
"businnesId": "string",
"business": {
"id": "string",
"name": "string",
"description": "string",
"returnUrl": "string",
"callbackUrl": "string",
"logoUrl": "string",
"allowIp": "string",
"balance": 0,
"activateEmail": true,
"prevWidrawAmount": 0,
"transactionFees": 0,
"userId": "string",
"user": {
"id": "string",
"userName": "string",
"normalizedUserName": "string",
"email": "string",
"normalizedEmail": "string",
"emailConfirmed": true,
"passwordHash": "string",
"securityStamp": "string",
"concurrencyStamp": "string",
"phoneNumber": "string",
"phoneNumberConfirmed": true,
"twoFactorEnabled": true,
"lockoutEnd": "2026-06-05T10:17:07.235Z",
"lockoutEnabled": true,
"accessFailedCount": 0,
"fullName": "string",
"enterpriseName": "string",
"websiteUrl": "string",
"status": 0,
"logoName": "string",
"nuiValue": "string",
"type": 0,
"cardId": "string",
"card": {
"id": "string",
"fileName": "string",
"custumFileName": "string"
},
"niuId": "string",
"niu": {
"id": "string",
"fileName": "string",
"custumFileName": "string"
},
"commercialRegisterId": "string",
"commercialRegister": {
"id": "string",
"fileName": "string",
"custumFileName": "string"
},
"taxSheetId": "string",
"taxSheet": {
"id": "string",
"fileName": "string",
"custumFileName": "string"
},
"ribId": "string",
"rib": {
"id": "string",
"fileName": "string",
"custumFileName": "string"
},
"widrawCountTransaction": 0,
"createdAt": "2026-06-05T10:17:07.236Z",
"updatedAt": "2026-06-05T10:17:07.236Z"
},
"businessOperatorBalance": [
{
"id": "string",
"businessId": "string",
"operator": 0,
"amount": 0,
"createdAt": "2026-06-05T10:17:07.236Z",
"updatedAt": "2026-06-05T10:17:07.236Z"
}
],
"createdAt": "2026-06-05T10:17:07.236Z",
"updatedAt": "2026-06-05T10:17:07.236Z"
},
"createdAt": "2026-06-05T10:17:07.236Z",
"updatedAt": "2026-06-05T10:17:07.236Z",
"bulkOperationId": "string"
}
]
},
"transactionStatus": "string",
"paymentUrl": "string",
"raison": "string",
"cryptoPayAmount": 0,
"paymentAddress": "string",
"payeeAddress": "string",
"ash": "string",
"createdAt": "2026-06-05T10:17:07.236Z"
}Authorization: Bearer [token]). It is essential for security.Verify the status of a completed or pending crypto transaction.
The parameter ash corresponds to the Transaction ash (TXID) generated by the network. Without this ash, verification cannot be completed.
| URL Parameter | Type | Required |
|---|---|---|
| transactionkey | string | YES |
| ash | string | YES |
Response Fields
| Field | Type | Required | Description |
|---|---|---|---|
| transactionReference | string | Yes | Unique reference for the transaction |
| transactionAmount | double | Yes | Amount to be paid |
| transactionDescription | string | Yes | Short summary of the purchase |
| walletToken | string | Yes | Internal token for wallet referencing |
| transactionType | string | Yes | Type of transaction |
| transactionCategory | string | Yes | Category of the transaction |
| successUrl | string | Yes | URL to redirect on success |
| cancelUrl | string | Yes | URL to redirect on cancellation |
| transactionKey | string | Yes | Unique technical identifier |
| productName | string | No | Name of the product purchased |
| transactionStatus | string | Yes | Current status (SUCCESS, FAILED, PENDING) |
| paymentUrl | string | Yes | Link to the payment gateway |
| raison | string | No | Detailed reason in case of failure |
| cryptoPayAmount | double | No | Amount in cryptocurrency |
| paymentAddress | string | No | Sender crypto address |
| payeeAddress | string | No | Recipient crypto address |
| ash | string | No | Transaction hash on the blockchain |
| createdAt | datetime | Yes | Transaction creation date |
Customer Details (Contact)
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Contact unique identifier |
| phoneNumber | string | Yes | Customer's mobile number |
| string | Yes | Customer's email address | |
| address | string | No | Physical address |
| city | string | No | Customer's city |
| state | string | No | State or region |
| country | string | No | Customer's country |
| zipCode | string | No | Postal code |
History (Inner Transactions)
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Transaction unique identifier |
| transactionType | string | Yes | Type of transaction |
| transactionStatus | string | Yes | Status of the individual transaction |
| operator | string | Yes | Operator used (MTN, Orange, etc.) |
| transactionAmount | double | Yes | Total amount |
| transactionWithOutFees | double | Yes | Net amount without fees |
| transactionReference | string | Yes | Merchant reference |
| transactionKey | string | Yes | Technical key |
| transactionDescription | string | Yes | Description |
| paymentUrl | string | No | Payment link |
| faildRaison | string | No | Failure details |
| ash | string | No | Blockchain hash |
| createdAt | datetime | Yes | Timestamp |
/api/v2/TransactionSecond/verify/{transactionkey}/{ash}Response Body
{
"transactionReference": "string",
"transactionAmount": 0,
"transactionDescription": "string",
"walletToken": "string",
"transactionType": "string",
"transactionCategory": "string",
"successUrl": "string",
"cancelUrl": "string",
"transactionKey": "string",
"productName": "string",
"transactionContact": {
"id": "string",
"address": "string",
"city": "string",
"state": "string",
"country": "string",
"zipCode": "string",
"phoneNumber": "string",
"email": "string",
"transactions": [
{
"id": "string",
"transactionType": 0,
"transactionStatus": 0,
"operator": 0,
"transactionAmount": 0,
"transactionWithOutFees": 0,
"transactionReference": "string",
"transactionKey": "string",
"walletToken": "string",
"transactionDescription": "string",
"successUrl": "string",
"cancelUrl": "string",
"productName": "string",
"paymentUrl": "string",
"faildRaison": "string",
"description": "string",
"payCurrency": "string",
"payAmount": 0,
"ash": "string",
"transactionContactId": "string",
"transactionCategory": 0,
"transactionContact": "string",
"paymentAddress": "string",
"realAmount": 0,
"payeeAddress": "string",
"businnesId": "string",
"business": {
"id": "string",
"name": "string",
"description": "string",
"returnUrl": "string",
"callbackUrl": "string",
"logoUrl": "string",
"allowIp": "string",
"balance": 0,
"activateEmail": true,
"prevWidrawAmount": 0,
"transactionFees": 0,
"userId": "string",
"user": {
"id": "string",
"userName": "string",
"normalizedUserName": "string",
"email": "string",
"normalizedEmail": "string",
"emailConfirmed": true,
"passwordHash": "string",
"securityStamp": "string",
"concurrencyStamp": "string",
"phoneNumber": "string",
"phoneNumberConfirmed": true,
"twoFactorEnabled": true,
"lockoutEnd": "2026-06-05T10:29:52.518Z",
"lockoutEnabled": true,
"accessFailedCount": 0,
"fullName": "string",
"enterpriseName": "string",
"websiteUrl": "string",
"status": 0,
"logoName": "string",
"nuiValue": "string",
"type": 0,
"cardId": "string",
"card": {
"id": "string",
"fileName": "string",
"custumFileName": "string"
},
"niuId": "string",
"niu": {
"id": "string",
"fileName": "string",
"custumFileName": "string"
},
"commercialRegisterId": "string",
"commercialRegister": {
"id": "string",
"fileName": "string",
"custumFileName": "string"
},
"taxSheetId": "string",
"taxSheet": {
"id": "string",
"fileName": "string",
"custumFileName": "string"
},
"ribId": "string",
"rib": {
"id": "string",
"fileName": "string",
"custumFileName": "string"
},
"widrawCountTransaction": 0,
"createdAt": "2026-06-05T10:29:52.518Z",
"updatedAt": "2026-06-05T10:29:52.518Z"
},
"businessOperatorBalance": [
{
"id": "string",
"businessId": "string",
"operator": 0,
"amount": 0,
"createdAt": "2026-06-05T10:29:52.518Z",
"updatedAt": "2026-06-05T10:29:52.518Z"
}
],
"createdAt": "2026-06-05T10:29:52.518Z",
"updatedAt": "2026-06-05T10:29:52.518Z"
},
"createdAt": "2026-06-05T10:29:52.518Z",
"updatedAt": "2026-06-05T10:29:52.518Z",
"bulkOperationId": "string"
}
]
},
"transactionStatus": "string",
"paymentUrl": "string",
"raison": "string",
"cryptoPayAmount": 0,
"paymentAddress": "string",
"payeeAddress": "string",
"ash": "string",
"createdAt": "2026-06-05T10:29:52.518Z"
}Authorization: Bearer [token]). It is essential for security.