curl --request POST \
--url https://sandbox.users.niobi.co/api/v4/niobi-unified-collections \
--header 'Content-Type: application/json' \
--data '
{
"client_id": "<string>",
"sender": "<string>",
"timestamp": 123,
"salt": "<string>",
"signature": "<string>",
"params": {
"amount": 123,
"mobile": "<string>",
"country_id": 123,
"currency": "<string>",
"payment_method_type": "<string>",
"callback_url": "<string>",
"third_party_reference_1": "<string>",
"third_party_reference_2": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"account_name": "<string>",
"bank_code": "<string>",
"successful_url": "<string>",
"failure_url": "<string>"
}
}
'import requests
url = "https://sandbox.users.niobi.co/api/v4/niobi-unified-collections"
payload = {
"client_id": "<string>",
"sender": "<string>",
"timestamp": 123,
"salt": "<string>",
"signature": "<string>",
"params": {
"amount": 123,
"mobile": "<string>",
"country_id": 123,
"currency": "<string>",
"payment_method_type": "<string>",
"callback_url": "<string>",
"third_party_reference_1": "<string>",
"third_party_reference_2": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"account_name": "<string>",
"bank_code": "<string>",
"successful_url": "<string>",
"failure_url": "<string>"
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
client_id: '<string>',
sender: '<string>',
timestamp: 123,
salt: '<string>',
signature: '<string>',
params: {
amount: 123,
mobile: '<string>',
country_id: 123,
currency: '<string>',
payment_method_type: '<string>',
callback_url: '<string>',
third_party_reference_1: '<string>',
third_party_reference_2: '<string>',
first_name: '<string>',
last_name: '<string>',
account_name: '<string>',
bank_code: '<string>',
successful_url: '<string>',
failure_url: '<string>'
}
})
};
fetch('https://sandbox.users.niobi.co/api/v4/niobi-unified-collections', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.users.niobi.co/api/v4/niobi-unified-collections",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'client_id' => '<string>',
'sender' => '<string>',
'timestamp' => 123,
'salt' => '<string>',
'signature' => '<string>',
'params' => [
'amount' => 123,
'mobile' => '<string>',
'country_id' => 123,
'currency' => '<string>',
'payment_method_type' => '<string>',
'callback_url' => '<string>',
'third_party_reference_1' => '<string>',
'third_party_reference_2' => '<string>',
'first_name' => '<string>',
'last_name' => '<string>',
'account_name' => '<string>',
'bank_code' => '<string>',
'successful_url' => '<string>',
'failure_url' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.users.niobi.co/api/v4/niobi-unified-collections"
payload := strings.NewReader("{\n \"client_id\": \"<string>\",\n \"sender\": \"<string>\",\n \"timestamp\": 123,\n \"salt\": \"<string>\",\n \"signature\": \"<string>\",\n \"params\": {\n \"amount\": 123,\n \"mobile\": \"<string>\",\n \"country_id\": 123,\n \"currency\": \"<string>\",\n \"payment_method_type\": \"<string>\",\n \"callback_url\": \"<string>\",\n \"third_party_reference_1\": \"<string>\",\n \"third_party_reference_2\": \"<string>\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"account_name\": \"<string>\",\n \"bank_code\": \"<string>\",\n \"successful_url\": \"<string>\",\n \"failure_url\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.users.niobi.co/api/v4/niobi-unified-collections")
.header("Content-Type", "application/json")
.body("{\n \"client_id\": \"<string>\",\n \"sender\": \"<string>\",\n \"timestamp\": 123,\n \"salt\": \"<string>\",\n \"signature\": \"<string>\",\n \"params\": {\n \"amount\": 123,\n \"mobile\": \"<string>\",\n \"country_id\": 123,\n \"currency\": \"<string>\",\n \"payment_method_type\": \"<string>\",\n \"callback_url\": \"<string>\",\n \"third_party_reference_1\": \"<string>\",\n \"third_party_reference_2\": \"<string>\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"account_name\": \"<string>\",\n \"bank_code\": \"<string>\",\n \"successful_url\": \"<string>\",\n \"failure_url\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.users.niobi.co/api/v4/niobi-unified-collections")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"client_id\": \"<string>\",\n \"sender\": \"<string>\",\n \"timestamp\": 123,\n \"salt\": \"<string>\",\n \"signature\": \"<string>\",\n \"params\": {\n \"amount\": 123,\n \"mobile\": \"<string>\",\n \"country_id\": 123,\n \"currency\": \"<string>\",\n \"payment_method_type\": \"<string>\",\n \"callback_url\": \"<string>\",\n \"third_party_reference_1\": \"<string>\",\n \"third_party_reference_2\": \"<string>\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"account_name\": \"<string>\",\n \"bank_code\": \"<string>\",\n \"successful_url\": \"<string>\",\n \"failure_url\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Verification token was sent to your mobile number. Kindly verify to proceed with payment.",
"data": {
"amount": 10,
"callback_url": "https://example.com",
"country_id": 1,
"currency": "KES",
"mobile": "254xxxxxxxxx0",
"payment_method_type": "send money",
"third_party_reference_1": "",
"third_party_reference_2": "",
"status": "success",
"payment_step": 1,
"payment_token": null
},
"status_code": "000000"
}{
"success": false,
"message": "Niobi user not found or Country was not found or Transaction was not created!"
}{
"success": false,
"message": "Entity integration record not found or Client id not matched or Request was not verified."
}{
"success": false,
"message": "User not found!"
}Submit Niobi Unified Collections
Handles payment processing for Niobi, supporting multiple payment methods.
curl --request POST \
--url https://sandbox.users.niobi.co/api/v4/niobi-unified-collections \
--header 'Content-Type: application/json' \
--data '
{
"client_id": "<string>",
"sender": "<string>",
"timestamp": 123,
"salt": "<string>",
"signature": "<string>",
"params": {
"amount": 123,
"mobile": "<string>",
"country_id": 123,
"currency": "<string>",
"payment_method_type": "<string>",
"callback_url": "<string>",
"third_party_reference_1": "<string>",
"third_party_reference_2": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"account_name": "<string>",
"bank_code": "<string>",
"successful_url": "<string>",
"failure_url": "<string>"
}
}
'import requests
url = "https://sandbox.users.niobi.co/api/v4/niobi-unified-collections"
payload = {
"client_id": "<string>",
"sender": "<string>",
"timestamp": 123,
"salt": "<string>",
"signature": "<string>",
"params": {
"amount": 123,
"mobile": "<string>",
"country_id": 123,
"currency": "<string>",
"payment_method_type": "<string>",
"callback_url": "<string>",
"third_party_reference_1": "<string>",
"third_party_reference_2": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"account_name": "<string>",
"bank_code": "<string>",
"successful_url": "<string>",
"failure_url": "<string>"
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
client_id: '<string>',
sender: '<string>',
timestamp: 123,
salt: '<string>',
signature: '<string>',
params: {
amount: 123,
mobile: '<string>',
country_id: 123,
currency: '<string>',
payment_method_type: '<string>',
callback_url: '<string>',
third_party_reference_1: '<string>',
third_party_reference_2: '<string>',
first_name: '<string>',
last_name: '<string>',
account_name: '<string>',
bank_code: '<string>',
successful_url: '<string>',
failure_url: '<string>'
}
})
};
fetch('https://sandbox.users.niobi.co/api/v4/niobi-unified-collections', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.users.niobi.co/api/v4/niobi-unified-collections",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'client_id' => '<string>',
'sender' => '<string>',
'timestamp' => 123,
'salt' => '<string>',
'signature' => '<string>',
'params' => [
'amount' => 123,
'mobile' => '<string>',
'country_id' => 123,
'currency' => '<string>',
'payment_method_type' => '<string>',
'callback_url' => '<string>',
'third_party_reference_1' => '<string>',
'third_party_reference_2' => '<string>',
'first_name' => '<string>',
'last_name' => '<string>',
'account_name' => '<string>',
'bank_code' => '<string>',
'successful_url' => '<string>',
'failure_url' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.users.niobi.co/api/v4/niobi-unified-collections"
payload := strings.NewReader("{\n \"client_id\": \"<string>\",\n \"sender\": \"<string>\",\n \"timestamp\": 123,\n \"salt\": \"<string>\",\n \"signature\": \"<string>\",\n \"params\": {\n \"amount\": 123,\n \"mobile\": \"<string>\",\n \"country_id\": 123,\n \"currency\": \"<string>\",\n \"payment_method_type\": \"<string>\",\n \"callback_url\": \"<string>\",\n \"third_party_reference_1\": \"<string>\",\n \"third_party_reference_2\": \"<string>\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"account_name\": \"<string>\",\n \"bank_code\": \"<string>\",\n \"successful_url\": \"<string>\",\n \"failure_url\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.users.niobi.co/api/v4/niobi-unified-collections")
.header("Content-Type", "application/json")
.body("{\n \"client_id\": \"<string>\",\n \"sender\": \"<string>\",\n \"timestamp\": 123,\n \"salt\": \"<string>\",\n \"signature\": \"<string>\",\n \"params\": {\n \"amount\": 123,\n \"mobile\": \"<string>\",\n \"country_id\": 123,\n \"currency\": \"<string>\",\n \"payment_method_type\": \"<string>\",\n \"callback_url\": \"<string>\",\n \"third_party_reference_1\": \"<string>\",\n \"third_party_reference_2\": \"<string>\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"account_name\": \"<string>\",\n \"bank_code\": \"<string>\",\n \"successful_url\": \"<string>\",\n \"failure_url\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.users.niobi.co/api/v4/niobi-unified-collections")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"client_id\": \"<string>\",\n \"sender\": \"<string>\",\n \"timestamp\": 123,\n \"salt\": \"<string>\",\n \"signature\": \"<string>\",\n \"params\": {\n \"amount\": 123,\n \"mobile\": \"<string>\",\n \"country_id\": 123,\n \"currency\": \"<string>\",\n \"payment_method_type\": \"<string>\",\n \"callback_url\": \"<string>\",\n \"third_party_reference_1\": \"<string>\",\n \"third_party_reference_2\": \"<string>\",\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"account_name\": \"<string>\",\n \"bank_code\": \"<string>\",\n \"successful_url\": \"<string>\",\n \"failure_url\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Verification token was sent to your mobile number. Kindly verify to proceed with payment.",
"data": {
"amount": 10,
"callback_url": "https://example.com",
"country_id": 1,
"currency": "KES",
"mobile": "254xxxxxxxxx0",
"payment_method_type": "send money",
"third_party_reference_1": "",
"third_party_reference_2": "",
"status": "success",
"payment_step": 1,
"payment_token": null
},
"status_code": "000000"
}{
"success": false,
"message": "Niobi user not found or Country was not found or Transaction was not created!"
}{
"success": false,
"message": "Entity integration record not found or Client id not matched or Request was not verified."
}{
"success": false,
"message": "User not found!"
}signature whenever you are creating a collection request.List of Supported Countries
| Country Id | Country | Code | Currency | Payment Methods | Status |
|---|---|---|---|---|---|
| 1 | Kenya | 254 | KES | send money | Active |
| 2 | Benin | 229 | XOF | Mtn, Moov | Active |
| 3 | Cote D’Ivoire | 225 | XOF | Mtn,Orange, Moov, Wave | Active |
| 4 | Cameroon | 237 | XAF | Mtn, Orange | Active |
| 5 | DRC | 243 | CDF | Airtel, Orange, Vodacom | Active |
| 8 | Rwanda | 250 | RWF | Mtn, Airtel | Active |
| 9 | Senegal | 221 | XOF | Orange, Free, Wave | Active |
| 10 | Tanzania | 255 | TZS | Airtel, Halotel, Tigo, Vodacom | Active |
| 11 | Uganda | 256 | UGX | Mtn, Airtel | Active |
| 12 | Zambia | 260 | ZMW | Mtn, Zamtel, Airtel | Q3 2026 |
| 13 | Sierra Leone | 232 | SLE | Orange | Active |
| 15 | South Africa | 27 | ZAR | bank | Active |
| 16 | Ghana | 233 | GHS | Mtn, At(AirtelTigo), Vodafone | Active |
| 17 | Nigeria | 234 | NGN | bank(Opay, Palmpay) | Active |
| 19 | Burkina Faso | 226 | XOF | Orange, Moov | Active |
| 18 | Mali | 223 | XOF | Orange, Moov | Active |
| 20 | Togo | 228 | XOF | Moov, T-money | Active |
| Country | Code | Currency | Payment Methods |
|---|---|---|---|
| Ethiopia | 251 | ETB | teleBirr, mBirr |
| Malawi | 265 | MWK | Airtel, tnm |
| Egypt | 20 | EGP | Vodafone, Orange |
| Mozambique | 258 | MZN | Vodacom, Movitel, Tmcel |
NGN Virtual Account — Supported Bank Codes
Pass one of the following codes asbank_code in your request to select the bank that will issue the virtual account.
| Bank Code | Bank Name |
|---|---|
| 17001 | 78 Finance Company Limited |
| 17002 | Fidelity Bank Limited |
| 17003 | Globus Bank Limited |
Body
Data needed for niobi unified collection
The Client id is your public key which is generated when you are creating a new API integration from our app.
The Sender is the title of the API Integration which was created through our app. you can just copy this title and use it whenever making a new signature
this is the current timestamp when the request is being made
Salt is used for security purposes. This is a random string and can be unique value for each request or always the same.
this is the signature which was generated after signing the request. you can copy it from the response we provide from the api/niobi-signature endpoint
Show child attributes
Show child attributes
Response
Success
true
Explains the action payers need to take to complete the transaction. Wording varies depending on the payment processor or channel.
"Verification token was sent to your mobile number. Kindly verify to proceed with payment. / We've sent a verification prompt to your phone. Please approve it to complete your payment."
{
"amount": 10,
"callback_url": "https://example.com",
"country_id": 1,
"currency": "KES",
"mobile": "254xxxxxxxxx0",
"payment_method_type": "send money",
"third_party_reference_1": "",
"third_party_reference_2": "",
"status": "success",
"payment_step": 1,
"payment_token": null
}
"000000"

