Ssentezo Wallet API 🚀

Simple, powerful APIs for mobile money payments in Uganda. Collect and disburse money to the last mile through digital platforms.

✅ Mobile Money
✅ Bank Transfers
✅ Real-time Status
✅ Phone number verification

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
Register for LIVE →

SANDBOX Environment

Testing environment with no real money transactions. Perfect for development and testing.

https://devwallet.ssentezo.com/api
Register for SANDBOX →

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
<?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

UG

Uganda Shillings

UGX

Supported

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

PENDING

Transaction still pending. All transactions begin from this state.

SUCCEEDED

Transaction completed successfully.

FAILED

Transaction failed to complete.

INDETERMINATE

Status not yet determined. Can take up to 48hrs.

API Response Format

✅ Successful Response

JSON
{
  "response": "OK",
  "data": {
    "amount": 1834665,
    "formatted": "1,834,665",
    "currency": "UGX"
  }
}

❌ Error Response

JSON
{
  "response": "ERROR",
  "error": {
    "message": "The currency field is required."
  }
}

Check Account Balance

POST /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
<?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

JSON
{
  "response": "OK",
  "data": {
    "amount": 1834665,
    "formatted": "1,834,665",
    "currency": "UGX"
  }
}

❌ Error Response

JSON
{
  "response": "ERROR",
  "error": {
    "message": "The currency field is required."
  }
}

MSISDN/Phone Number Verification

POST /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
<?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

JSON
{
  "response": "OK",
  "data": {
    "msisdn": "256712345678",
    "FirstName": "John",
    "Surname": "Doe"
  }
}

❌ Error Response (Invalid Format)

JSON
{
  "response": "ERROR",
  "error": {
    "message": "The msisdn field format is invalid."
  }
}

❌ Error Response (Verification Failed)

JSON
{
  "response": "ERROR",
  "error": {
    "message": "Failed to verify the name of the holder of the MSISDN"
  }
}

Withdraw Funds

POST /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
<?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

JSON
{
  "response": "OK",
  "data": {
    "transactionStatus": "PENDING",
    "ssentezoWalletReference": "f245ddac-1622-4dad-9a94-4e289bb6b8a4",
    "financialTransactionId": "b997c60c6f445185fcd9a3a595533734"
  }
}

❌ Error Response

JSON
{
  "response": "ERROR",
  "error": {
    "code": "UPPER_CEILING_BREACH",
    "message": "Maximum transaction amount is UGX 7,000,000"
  }
}

Parameter Descriptions

externalReference: Unique identifier for your transaction (max 250 characters). Must be unique across all transactions.
msisdn: Phone number in international format (e.g., 256770691484)
amount: Amount without formatting or non-numeric characters. Must be between UGX 500 - 7,000,000
financialTransactionId: Unique ID from the network provider (MTN/Airtel) for tracking

Collect Money (Deposit)

POST /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
<?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

JSON
{
  "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

JSON
{
  "response": "OK",
  "data": {
    "transactionStatus": "PENDING",
    "ssentezoWalletReference": "f245ddac-1622-4dad-9a94-4e289bb6b8a4",
    "financialTransactionId": "b997c60c6f445185fcd9a3a595533734"
  }
}

❌ Validation Error

JSON
{
  "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

POST /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
<?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

JSON
{
  "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

JSON
{
  "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

POST /api/push-to-bank/get-banks

This endpoint requires no parameters and returns a list of supported banks.

Response Example

JSON
{
  "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
<?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

POST /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
<?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

JSON
{
  "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

JSON
{
  "response": "OK",
  "data": {
    "transactionStatus": "PENDING",
    "ssentezoWalletReference": "21537d54-bcd1-44a5-8614-717e093483ac",
    "externalReference": "82c7d1d6-850b-4e14-a0b7-5379058b17be"
  }
}

3. Check Bank Transfer Status

POST /api/push-to-bank/check-bank-transfer-status

Code Examples

PHP
<?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

JSON
{
  "external_reference": "c734d323-8c1c-4160-8649-4df22443aa57"
}

✅ Success Response

JSON
{
  "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!