Payout
Summary
Send money locally with Klasha to bank accounts and mobile money wallets in Africa.
Coverage
NGN
GHS (beta)
KES (beta)
You can transfer money in four easy steps:
Verify the account number
Create transfer recipient
Initiate a transfer
Listen for status.
Before you begin!
Generate a transfer reference
It’s a unique reference sent as requestId
that can be used to uniquely identify a transfer.
Initiate a transfer
Serialize the payload
Encryption Algorithm
You need to encrypt the entire create transfer payload that we specify on the previous point (here). In order to encrypt the body correctly, you’d need the encryptionKey (that you can obtain following this guide here). Find an encryption algorithm code snippet below:
public static String encrypt3DES(String messageToEncrypt, byte[] secret) throws NoSuchPaddingException, NoSuchAlgorithmException,
InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
SecretKeySpec secretKeySpec = new SecretKeySpec(secret, "TripleDES");
byte[] iv = Arrays.copyOfRange(secret, 0, 8);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher encryptCipher = Cipher.getInstance("TripleDES/CBC/PKCS5Padding");
encryptCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec);
byte[] secretMessagesBytes = messageToEncrypt.getBytes(StandardCharsets.UTF_8);
byte[] encryptedMessageBytes = encryptCipher.doFinal(secretMessagesBytes);
return Base64.getEncoder().encodeToString(encryptedMessageBytes);
}
Merchant Payout request
Make a POST call to the Merchant payout request API
POST
{{env_url}}/wallet/merchant/{businessId}/bank/transfer/v2/request
You would need to pass, as a header the x-auth-token. This can be obtained from your merchant dashboard → Settings → Generate API keys → Merchant public key.
Headers
Content-Type
application/json
x-auth-token
Your merchant public key
Authorization
Bearer <token here>
Request body (encrypted):
{
"message": "encrypted-request-body"
}
Listen for a status response
When a transfer is initiated, it could take a few seconds or minutes to be processed. This is why we recommend relying on webhooks for verification as opposed to polling.
Once a transfer is processed, we send the final status of the transfer as a POST request to your webhook URL.
{
"data": {
"reference": "kbtr-3857-011-null-166993253334816",
"createdAt": "2023-03-28T23:01:45.336",
"amount": 1000,
"accountName": "Pastor Bright",
"narration": "certification",
"name": "Steph and sons",
"currency": "NGN",
"bankName": "ACCESS BANK NIGERIA",
"accountNumber": "0690000032",
"status": "failed"
},
"event": "payout"
}
{
"data": {
"reference": "kbtr-3857-011-null-166993253331236",
"createdAt": "2023-03-28T23:01:45.336",
"amount": 1000,
"accountName": "Pastor Bright",
"narration": "certification",
"name": "Steph and sons",
"currency": "NGN",
"bankName": "ACCESS BANK NIGERIA",
"accountNumber": "0690000032",
"status": "successful"
},
"event": "payout"
}
Get wallet balance
To get your wallet balance you would need to make a GET request to the API below:
GET
{{env_url}}/nucleus/business/api/wallets
Headers
Content-Type
application/json
Authorization
Bearer <token>
x-auth-token
<public key>
Response
{
"message": "success",
"error": null,
"data": [
{
"id": 66,
"currency": "NGN",
"ledgerBalance": 100.0,
"availableBalance": 100.0,
"walletType": "BUSINESS",
"businessId": 3,
"createdAt": "2023-12-19 14:54:49",
"updatedAt": "2023-12-19 14:54:49"
}
]
}
The possible statuses are listed and described in the following table:
successful
This is sent when the transfer is successful
failed
This is sent when the transfer fails
pending
This transfer is still in progress. Please wait for either success or failed.
Polling transfer statuses
You can fetch the transfer from the
Find by ref
API on the Postman collection to know the status. See example in the below screenshot.

Source wallet
All transfers would be debited from NGN Wallet balance. Ensure you have sufficient balance before making any transfer request.
Last updated