Ssentezo Wallet API 🚀
Simple, powerful APIs for mobile money payments in Uganda. Collect and disburse money to the last mile through digital platforms.
Introduction
Ssentezo Wallet is a comprehensive payment platform that enables businesses and developers to collect or deliver payments to the last mile through digital platforms like mobile money.
Our simple APIs make it easy to collect your payments in a few minutes. Add our web links to your website to collect payments with zero code.
Environments
LIVE Environment
Real money transactions. Actual money is credited and debited from phone numbers during operations.
https://wallet.ssentezo.com/api
SANDBOX Environment
Testing environment with no real money transactions. Perfect for development and testing.
https://devwallet.ssentezo.com/api
Note: Functionality in LIVE and SANDBOX modes is exactly the same. Only the endpoint URL changes between environments.
Authentication
The API uses HTTP Basic Authentication. You'll need valid API credentials which can be generated from the API Access menu in your Wallet Account.
Important: All requests must contain the Authorization header with base64 encoded credentials.
Authentication Examples
<?php
// Your API credentials
$apiUser = 'your_api_user';
$apiKey = 'your_api_key';
// Encode credentials to base64
$encodedString = base64_encode($apiUser . ':' . $apiKey);
// Example using Guzzle HTTP Client (install with: composer require guzzlehttp/guzzle)
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
$client = new Client();
// Example request configuration
$response = $client->post('https://wallet.ssentezo.com/api/acc_balance', [
'headers' => [
'Authorization' => 'Basic ' . $encodedString,
'Content-Type' => 'application/json',
],
'json' => [
'currency' => 'UGX'
]
]);
// Handle the response
$result = json_decode($response->getBody(), true);
// Process your $result here...
?>
API Limits
No negative figures, exponential figures (e.g., e100), or characters in amounts
Transactions between UGX 500 to UGX 7,000,000
Charges apply as per your Ssentezo agreement
Supported Currency
Uganda Shillings
UGX
HTTP Response Codes
Status Code | Interpretation |
---|---|
202 | Succeeded Transaction |
400 | Failed Transaction |
401 | No Authorization Header |
403 | Invalid Credentials |
422 | Unprocessable Entity |
500 | Internal Server Error |
Transaction Statuses
Transaction still pending. All transactions begin from this state.
Transaction completed successfully.
Transaction failed to complete.
Status not yet determined. Can take up to 48hrs.
API Response Format
✅ Successful Response
{
"response": "OK",
"data": {
"amount": 1834665,
"formatted": "1,834,665",
"currency": "UGX"
}
}
❌ Error Response
{
"response": "ERROR",
"error": {
"message": "The currency field is required."
}
}
Check Account Balance
/api/acc_balance
Get your current wallet balance for a specific currency.
Parameters
Parameter | Type | Required | Description |
---|---|---|---|
currency | String | Required | Currency code (e.g., "UGX") |
Request Example
<?php
use GuzzleHttp\Client;
$client = new Client();
// Example request configuration
$response = $client->post('https://wallet.ssentezo.com/api/acc_balance', [
'headers' => [
'Authorization' => 'Basic ' . base64_encode('your_api_user:your_api_key'),
'Content-Type' => 'application/json',
],
'json' => [
'currency' => 'UGX',
],
]);
// Handle the response
$result = json_decode($response->getBody(), true);
// Process your $result here...
?>
✅ Success Response
{
"response": "OK",
"data": {
"amount": 1834665,
"formatted": "1,834,665",
"currency": "UGX"
}
}
❌ Error Response
{
"response": "ERROR",
"error": {
"message": "The currency field is required."
}
}
MSISDN/Phone Number Verification
/api/msisdn-verification
Verify the name associated with a phone number before processing transactions.
Parameters
Parameter | Type | Required | Description |
---|---|---|---|
msisdn | String | Required | Phone number in international format (e.g., "256709920188") |
Request Example
<?php
use GuzzleHttp\Client;
$requestBody = [
'msisdn' => '256709920188',
];
$client = new Client();
// Example request configuration
$response = $client->post('https://wallet.ssentezo.com/api/msisdn-verification', [
'headers' => [
'Authorization' => 'Basic ' . base64_encode('your_api_user:your_api_key'),
'Content-Type' => 'application/json',
],
'json' => $requestBody,
]);
// Handle the response
$result = json_decode($response->getBody(), true);
// Process your $result here...
?>
✅ Success Response
{
"response": "OK",
"data": {
"msisdn": "256712345678",
"FirstName": "John",
"Surname": "Doe"
}
}
❌ Error Response (Invalid Format)
{
"response": "ERROR",
"error": {
"message": "The msisdn field format is invalid."
}
}
❌ Error Response (Verification Failed)
{
"response": "ERROR",
"error": {
"message": "Failed to verify the name of the holder of the MSISDN"
}
}
Withdraw Funds
/api/withdraw
Send money from your wallet to a mobile money account.
Parameters
Parameter | Type | Required | Description |
---|---|---|---|
externalReference | String | Required | Unique reference (max 250 chars) |
msisdn | String | Required | Phone number in international format |
amount | Number | Required | Amount between 500 and 7,000,000 |
currency | String | Required | Currency code (e.g., "UGX") |
reason | String | Required | Transaction reason/description |
name | String | Optional | Recipient name |
success_callback | String | Optional | Success callback URL |
failure_callback | String | Optional | Failure callback URL |
Request Example
<?php
use GuzzleHttp\Client;
$client = new Client();
$requestBody = [
'externalReference' => 'unique-ref-' . time(),
'msisdn' => '256770691484',
'amount' => 2000,
'currency' => 'UGX',
'reason' => 'Payment for services',
'name' => 'John Doe',
'success_callback' => 'https://yourapp.com/success-callback',
'failure_callback' => 'https://yourapp.com/failure-callback',
];
// Example request configuration
$response = $client->post('https://wallet.ssentezo.com/api/withdraw', [
'headers' => [
'Authorization' => 'Basic ' . base64_encode('your_api_user:your_api_key'),
'Content-Type' => 'application/json',
],
'json' => $requestBody,
]);
// Handle the response
$result = json_decode($response->getBody(), true);
// Process your $result here...
?>
✅ Success Response
{
"response": "OK",
"data": {
"transactionStatus": "PENDING",
"ssentezoWalletReference": "f245ddac-1622-4dad-9a94-4e289bb6b8a4",
"financialTransactionId": "b997c60c6f445185fcd9a3a595533734"
}
}
❌ Error Response
{
"response": "ERROR",
"error": {
"code": "UPPER_CEILING_BREACH",
"message": "Maximum transaction amount is UGX 7,000,000"
}
}
Parameter Descriptions
Collect Money (Deposit)
/api/deposit
Collect money from a mobile money account into your wallet.
Parameters
Parameter | Type | Required | Description |
---|---|---|---|
externalReference | String | Required | Unique reference (max 250 chars) |
msisdn | String | Required | Phone number to collect from |
amount | Number | Required | Amount between 500 and 7,000,000 |
currency | String | Required | Currency code (e.g., "UGX") |
reason | String | Required | Collection reason |
name | String | Optional | Payer name |
success_callback | String | Optional | Success callback URL |
failure_callback | String | Optional | Failure callback URL |
Request Example
<?php
use GuzzleHttp\Client;
$client = new Client();
$requestBody = [
'externalReference' => 'unique-ref-' . time(),
'amount' => 1000,
'msisdn' => '256770691484',
'reason' => 'Payment for services',
'currency' => 'UGX',
'name' => 'John Doe',
'success_callback' => 'https://yourapp.com/success-callback',
'failure_callback' => 'https://yourapp.com/failure-callback',
];
// Example request configuration
$response = $client->post('https://wallet.ssentezo.com/api/deposit', [
'headers' => [
'Authorization' => 'Basic ' . base64_encode('your_api_user:your_api_key'),
'Content-Type' => 'application/json',
],
'json' => $requestBody,
]);
// Handle the response
$result = json_decode($response->getBody(), true);
// Process your $result here...
?>
Example Request Body
{
"externalReference": "unique-ref-123456",
"amount": 1000,
"msisdn": "256770691484",
"reason": "Payment for services",
"currency": "UGX",
"name": "John Doe",
"success_callback": "https://yourapp.com/success-callback",
"failure_callback": "https://yourapp.com/failure-callback"
}
✅ Success Response
{
"response": "OK",
"data": {
"transactionStatus": "PENDING",
"ssentezoWalletReference": "f245ddac-1622-4dad-9a94-4e289bb6b8a4",
"financialTransactionId": "b997c60c6f445185fcd9a3a595533734"
}
}
❌ Validation Error
{
"response": "ERROR",
"error": {
"message": "The given data was invalid.",
"errors": {
"amount": ["The amount field must be at least 500."],
"msisdn": ["The msisdn field is required."],
"externalReference": ["The external reference has already been taken."]
}
}
}
Note: A PENDING status with HTTP 202 means the transaction has been initiated and the payer must enter their Mobile Money PIN. The callback endpoint will be called once the transaction completes.
Check Transaction Status
/api/get_status/{externalReference}
Check the current status of a transaction using your external reference.
URL Parameters
Parameter | Type | Required | Description |
---|---|---|---|
externalReference | String | Required | The external reference used when creating the transaction |
Request Example
<?php
use GuzzleHttp\Client;
$client = new Client();
$externalReference = 'your-external-reference-here';
// Example request configuration
$response = $client->post('https://wallet.ssentezo.com/api/get_status/' . $externalReference, [
'headers' => [
'Authorization' => 'Basic ' . base64_encode('your_api_user:your_api_key'),
'Content-Type' => 'application/json',
],
]);
// Handle the response
$result = json_decode($response->getBody(), true);
// Process your $result here...
*/
?>
✅ Success Response
{
"response": "OK",
"data": {
"transactionStatus": "SUCCEEDED",
"ssentezoWalletReference": "3181ead4-eff9-4b9b-b926-53b41e632ca5",
"externalReference": "rfg54rj59033w4672326hi45h6j6456",
"financialTransactionId": "QkK0UVtkMlCZN1ZEuKVv4NU5l2sFA1uO82fb7ef5f6a2530bc5c2118b34620b5a",
"amount": 3000,
"reason": "Sending money to someone",
"currency": "UGX",
"msisdn": "256770691484",
"transactionTime": "2024-04-24T16:24:58.000000Z"
}
}
Transaction Status Notifications
If you want to be notified immediately when a transaction status changes from PENDING to either SUCCEEDED or FAILED, you can specify callback URLs in your deposit/withdraw requests.
Callback Parameters
- success_callback: URL called when transaction succeeds
- failure_callback: URL called when transaction fails
Sample Callback Data
{
"response": "OK",
"data": {
"transactionStatus": "SUCCEEDED",
"ssentezoWalletReference": "f245ddac-1622-4dad-9a94-4e289bb6b8a4",
"externalReference": "16011650463271",
"financialTransactionId": "f245ddac-1622-4dad-9a94-4e289bb6b8a4-f245ddac-1622-4dad-9a94-4e289bb6b8a4"
}
}
Note 1: Ensure your callback URLs are publicly accessible and resolve within 5 seconds, otherwise the request will timeout.
Note 2: Callback endpoints should not require authentication as our system needs unrestricted access to notify you.
Bank Transfer (Push to Bank)
To push money to a bank account, you need to use two endpoints:
1. Get Banks List
Retrieve supported banks and their IDs
2. Request Transfer
Initiate the bank transfer
1. Get Supported Banks
/api/push-to-bank/get-banks
This endpoint requires no parameters and returns a list of supported banks.
Response Example
{
"response": "OK",
"data": {
"banks": [
{
"id": 3,
"bank_name": "Equity",
"address": "Church House",
"swift_code": "QW2456"
},
{
"id": 4,
"bank_name": "Stanbic Bank",
"address": "Church House",
"swift_code": "QW2456"
},
{
"id": 5,
"bank_name": "Housing Finance Bank",
"address": "Ntinda",
"swift_code": "QWE34E"
}
]
}
}
Code Examples
<?php
use GuzzleHttp\Client;
$client = new Client();
// Example request configuration
$response = $client->post('https://wallet.ssentezo.com/api/push-to-bank/get-banks', [
'headers' => [
'Authorization' => 'Basic ' . base64_encode('your_api_user:your_api_key'),
'Content-Type' => 'application/json',
],
]);
// Handle the response
$result = json_decode($response->getBody(), true);
// Extract banks list
// $banks = $result['data']['banks'];
// Process your $banks here...
?>
2. Request Bank Transfer
/api/push-to-bank/request-bank-transfer
Transfer money from your wallet to a bank account.
Parameters
Parameter | Type | Required | Description |
---|---|---|---|
external_reference | String | Required | Unique transaction identifier |
bank_id | Number | Required | Bank ID from get-banks endpoint |
account_name | String | Required | Bank account holder name |
account_number | String | Required | Bank account number |
amount | Number | Required | Amount (minimum UGX 50,000) |
reason | String | Required | Transaction narration |
Code Examples
<?php
use GuzzleHttp\Client;
$client = new Client();
$requestBody = [
'external_reference' => 'c734d323-8c1c-4160-8649-4df22443aa57',
'bank_id' => 3,
'account_name' => 'John Doe',
'account_number' => '044653389534563',
'amount' => '50000',
'reason' => 'Pushing my money to the bank',
];
// Example request configuration
$response = $client->post('https://wallet.ssentezo.com/api/push-to-bank/request-bank-transfer', [
'headers' => [
'Authorization' => 'Basic ' . base64_encode('your_api_user:your_api_key'),
'Content-Type' => 'application/json',
],
'json' => $requestBody,
]);
// Handle the response
$result = json_decode($response->getBody(), true);
// Process your $result here...
?>
Request Example
{
"external_reference": "c734d323-8c1c-4160-8649-4df22443aa57",
"bank_id": 3,
"account_name": "John Doe",
"account_number": "044653389534563",
"amount": "50000",
"reason": "Pushing my money to the bank"
}
✅ Success Response
{
"response": "OK",
"data": {
"transactionStatus": "PENDING",
"ssentezoWalletReference": "21537d54-bcd1-44a5-8614-717e093483ac",
"externalReference": "82c7d1d6-850b-4e14-a0b7-5379058b17be"
}
}
3. Check Bank Transfer Status
/api/push-to-bank/check-bank-transfer-status
Code Examples
<?php
use GuzzleHttp\Client;
$client = new Client();
$requestBody = [
'external_reference' => 'c734d323-8c1c-4160-8649-4df22443aa57',
];
// Example request configuration
$response = $client->post('https://wallet.ssentezo.com/api/push-to-bank/check-bank-transfer-status', [
'headers' => [
'Authorization' => 'Basic ' . base64_encode('your_api_user:your_api_key'),
'Content-Type' => 'application/json',
],
'json' => $requestBody,
]);
// Handle the response
$result = json_decode($response->getBody(), true);
// Process your $result here...
?>
Request Example
{
"external_reference": "c734d323-8c1c-4160-8649-4df22443aa57"
}
✅ Success Response
{
"response": "OK",
"data": {
"transactionStatus": "SUCCEEDED",
"ssentezoWalletReference": "51c3d7b3-e70a-4016-8839-fe27a5c610fd",
"externalReference": "c734d323-8c1c-4160-8649-4df22443aa57",
"amount": 85000,
"transactionTime": "2024-09-30T12:40:48.000000Z"
}
}
⚠️ Important Notes
- • Minimum bank transfer amount is UGX 50,000
- • Bank transfers may take longer to process than mobile money transactions
- • Always check the transfer status before marking transactions as complete
Ready to Get Started? 💪
You now have everything you need to integrate with Ssentezo Wallet API. Go build something amazing!