Create Payment Link
curl --request POST \
--url https://sandbox.users.niobi.co/api/v2/payment-link-api/create \
--header 'Content-Type: application/json' \
--data '
{
"client_id": "K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr",
"salt": "justrandomstring",
"sender": "John.co",
"params": {
"business_name": "my business",
"item_name": "item name",
"callback_url": "https://webhook.site/unique-id",
"redirection_url": "https://webhook.site/unique-id",
"amount": "5000",
"logo": "This is brand logo. Use the base64 format to upload a file of maximum 2MB size.",
"country_id": "This is integer value. You can get country id from supported country table attached here.",
"currency": "KES"
},
"timestamp": 1709363033,
"signature": "2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807"
}
'import requests
url = "https://sandbox.users.niobi.co/api/v2/payment-link-api/create"
payload = {
"client_id": "K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr",
"salt": "justrandomstring",
"sender": "John.co",
"params": {
"business_name": "my business",
"item_name": "item name",
"callback_url": "https://webhook.site/unique-id",
"redirection_url": "https://webhook.site/unique-id",
"amount": "5000",
"logo": "This is brand logo. Use the base64 format to upload a file of maximum 2MB size.",
"country_id": "This is integer value. You can get country id from supported country table attached here.",
"currency": "KES"
},
"timestamp": 1709363033,
"signature": "2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807"
}
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: 'K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr',
salt: 'justrandomstring',
sender: 'John.co',
params: {
business_name: 'my business',
item_name: 'item name',
callback_url: 'https://webhook.site/unique-id',
redirection_url: 'https://webhook.site/unique-id',
amount: '5000',
logo: 'This is brand logo. Use the base64 format to upload a file of maximum 2MB size.',
country_id: 'This is integer value. You can get country id from supported country table attached here.',
currency: 'KES'
},
timestamp: 1709363033,
signature: '2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807'
})
};
fetch('https://sandbox.users.niobi.co/api/v2/payment-link-api/create', 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/v2/payment-link-api/create",
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' => 'K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr',
'salt' => 'justrandomstring',
'sender' => 'John.co',
'params' => [
'business_name' => 'my business',
'item_name' => 'item name',
'callback_url' => 'https://webhook.site/unique-id',
'redirection_url' => 'https://webhook.site/unique-id',
'amount' => '5000',
'logo' => 'This is brand logo. Use the base64 format to upload a file of maximum 2MB size.',
'country_id' => 'This is integer value. You can get country id from supported country table attached here.',
'currency' => 'KES'
],
'timestamp' => 1709363033,
'signature' => '2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807'
]),
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/v2/payment-link-api/create"
payload := strings.NewReader("{\n \"client_id\": \"K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr\",\n \"salt\": \"justrandomstring\",\n \"sender\": \"John.co\",\n \"params\": {\n \"business_name\": \"my business\",\n \"item_name\": \"item name\",\n \"callback_url\": \"https://webhook.site/unique-id\",\n \"redirection_url\": \"https://webhook.site/unique-id\",\n \"amount\": \"5000\",\n \"logo\": \"This is brand logo. Use the base64 format to upload a file of maximum 2MB size.\",\n \"country_id\": \"This is integer value. You can get country id from supported country table attached here.\",\n \"currency\": \"KES\"\n },\n \"timestamp\": 1709363033,\n \"signature\": \"2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807\"\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/v2/payment-link-api/create")
.header("Content-Type", "application/json")
.body("{\n \"client_id\": \"K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr\",\n \"salt\": \"justrandomstring\",\n \"sender\": \"John.co\",\n \"params\": {\n \"business_name\": \"my business\",\n \"item_name\": \"item name\",\n \"callback_url\": \"https://webhook.site/unique-id\",\n \"redirection_url\": \"https://webhook.site/unique-id\",\n \"amount\": \"5000\",\n \"logo\": \"This is brand logo. Use the base64 format to upload a file of maximum 2MB size.\",\n \"country_id\": \"This is integer value. You can get country id from supported country table attached here.\",\n \"currency\": \"KES\"\n },\n \"timestamp\": 1709363033,\n \"signature\": \"2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.users.niobi.co/api/v2/payment-link-api/create")
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\": \"K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr\",\n \"salt\": \"justrandomstring\",\n \"sender\": \"John.co\",\n \"params\": {\n \"business_name\": \"my business\",\n \"item_name\": \"item name\",\n \"callback_url\": \"https://webhook.site/unique-id\",\n \"redirection_url\": \"https://webhook.site/unique-id\",\n \"amount\": \"5000\",\n \"logo\": \"This is brand logo. Use the base64 format to upload a file of maximum 2MB size.\",\n \"country_id\": \"This is integer value. You can get country id from supported country table attached here.\",\n \"currency\": \"KES\"\n },\n \"timestamp\": 1709363033,\n \"signature\": \"2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Payment link created successfully.",
"data": {}
}{
"success": false,
"message": "Payment link was not created."
}{
"success": false,
"message": "Entity integration record not found."
}Payment Links
Create Payment Link
POST
/
api
/
v2
/
payment-link-api
/
create
Create Payment Link
curl --request POST \
--url https://sandbox.users.niobi.co/api/v2/payment-link-api/create \
--header 'Content-Type: application/json' \
--data '
{
"client_id": "K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr",
"salt": "justrandomstring",
"sender": "John.co",
"params": {
"business_name": "my business",
"item_name": "item name",
"callback_url": "https://webhook.site/unique-id",
"redirection_url": "https://webhook.site/unique-id",
"amount": "5000",
"logo": "This is brand logo. Use the base64 format to upload a file of maximum 2MB size.",
"country_id": "This is integer value. You can get country id from supported country table attached here.",
"currency": "KES"
},
"timestamp": 1709363033,
"signature": "2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807"
}
'import requests
url = "https://sandbox.users.niobi.co/api/v2/payment-link-api/create"
payload = {
"client_id": "K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr",
"salt": "justrandomstring",
"sender": "John.co",
"params": {
"business_name": "my business",
"item_name": "item name",
"callback_url": "https://webhook.site/unique-id",
"redirection_url": "https://webhook.site/unique-id",
"amount": "5000",
"logo": "This is brand logo. Use the base64 format to upload a file of maximum 2MB size.",
"country_id": "This is integer value. You can get country id from supported country table attached here.",
"currency": "KES"
},
"timestamp": 1709363033,
"signature": "2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807"
}
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: 'K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr',
salt: 'justrandomstring',
sender: 'John.co',
params: {
business_name: 'my business',
item_name: 'item name',
callback_url: 'https://webhook.site/unique-id',
redirection_url: 'https://webhook.site/unique-id',
amount: '5000',
logo: 'This is brand logo. Use the base64 format to upload a file of maximum 2MB size.',
country_id: 'This is integer value. You can get country id from supported country table attached here.',
currency: 'KES'
},
timestamp: 1709363033,
signature: '2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807'
})
};
fetch('https://sandbox.users.niobi.co/api/v2/payment-link-api/create', 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/v2/payment-link-api/create",
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' => 'K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr',
'salt' => 'justrandomstring',
'sender' => 'John.co',
'params' => [
'business_name' => 'my business',
'item_name' => 'item name',
'callback_url' => 'https://webhook.site/unique-id',
'redirection_url' => 'https://webhook.site/unique-id',
'amount' => '5000',
'logo' => 'This is brand logo. Use the base64 format to upload a file of maximum 2MB size.',
'country_id' => 'This is integer value. You can get country id from supported country table attached here.',
'currency' => 'KES'
],
'timestamp' => 1709363033,
'signature' => '2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807'
]),
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/v2/payment-link-api/create"
payload := strings.NewReader("{\n \"client_id\": \"K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr\",\n \"salt\": \"justrandomstring\",\n \"sender\": \"John.co\",\n \"params\": {\n \"business_name\": \"my business\",\n \"item_name\": \"item name\",\n \"callback_url\": \"https://webhook.site/unique-id\",\n \"redirection_url\": \"https://webhook.site/unique-id\",\n \"amount\": \"5000\",\n \"logo\": \"This is brand logo. Use the base64 format to upload a file of maximum 2MB size.\",\n \"country_id\": \"This is integer value. You can get country id from supported country table attached here.\",\n \"currency\": \"KES\"\n },\n \"timestamp\": 1709363033,\n \"signature\": \"2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807\"\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/v2/payment-link-api/create")
.header("Content-Type", "application/json")
.body("{\n \"client_id\": \"K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr\",\n \"salt\": \"justrandomstring\",\n \"sender\": \"John.co\",\n \"params\": {\n \"business_name\": \"my business\",\n \"item_name\": \"item name\",\n \"callback_url\": \"https://webhook.site/unique-id\",\n \"redirection_url\": \"https://webhook.site/unique-id\",\n \"amount\": \"5000\",\n \"logo\": \"This is brand logo. Use the base64 format to upload a file of maximum 2MB size.\",\n \"country_id\": \"This is integer value. You can get country id from supported country table attached here.\",\n \"currency\": \"KES\"\n },\n \"timestamp\": 1709363033,\n \"signature\": \"2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.users.niobi.co/api/v2/payment-link-api/create")
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\": \"K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr\",\n \"salt\": \"justrandomstring\",\n \"sender\": \"John.co\",\n \"params\": {\n \"business_name\": \"my business\",\n \"item_name\": \"item name\",\n \"callback_url\": \"https://webhook.site/unique-id\",\n \"redirection_url\": \"https://webhook.site/unique-id\",\n \"amount\": \"5000\",\n \"logo\": \"This is brand logo. Use the base64 format to upload a file of maximum 2MB size.\",\n \"country_id\": \"This is integer value. You can get country id from supported country table attached here.\",\n \"currency\": \"KES\"\n },\n \"timestamp\": 1709363033,\n \"signature\": \"2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Payment link created successfully.",
"data": {}
}{
"success": false,
"message": "Payment link was not created."
}{
"success": false,
"message": "Entity integration record not found."
}Please make sure to generate a new
signature whenever you are creating a new payment link.List of Supported Countries
| Country Id | Country | Code | Currency | Payment Methods | Status |
|---|---|---|---|---|---|
| 1 | Kenya | 254 | KES | Send Money, PayBill, Till, Pesalink, RTGS, EFT, M-Pesa B2B | Active |
| 2 | Benin | 229 | XOF | MTN MOMO, MOOV | Active |
| 3 | Cote D’Ivoire | 225 | XOF | MTN MOMO, Orange, MOOV MoMo, Wave MoMo, SICA | Active |
| 4 | Cameroon | 237 | XAF | MTN MOMO, Orange, SYSTAC, SYGMA | Active |
| 5 | DRC | 243 | CDF | Airtel, Orange, Vodacom | Active |
| 7 | Malawi | 265 | MWK | Airtel, TNM | Q3 2026 |
| 8 | Rwanda | 250 | RWF | MTN MOMO, Airtel, eKash | Active |
| 9 | Senegal | 221 | XOF | Orange, Free, Wave | Active |
| 10 | Tanzania | 255 | TZS | Airtel, Halotel, Tigo, Vodacom MPESA, EAPS | Active |
| 11 | Uganda | 256 | UGX | MTN MOMO, Airtel, EAPS | Active |
| 12 | Zambia | 260 | ZMW | MTN MOMO, Zamtel, Airtel, ZIPSS | Q3 2026 |
| 13 | Sierra Leone | 232 | SLE | Orange | Active |
| 15 | South Africa | 27 | ZAR | RTC, EFT | Active |
| 16 | Ghana | 233 | GHS | MTN Momo, Airtel Tigo, Vodafone | Active |
| 17 | Nigeria | 234 | NGN | Bank Transfer, Opay, Palmpay | Active |
| 18 | Burkina Faso | 226 | XOF | Orange, Moov | Active |
| 19 | Canada | 1 | CAD | SWIFT | Active |
| 20 | China | 86 | CNY | CNAP Payout, CNAP Payin, AliPay, WeChat Pay | Q4 2026 |
| 21 | Egypt | 20 | EGP | Vodafone Cash, Orange Cash, Etisalat Cash | Q1 2027 |
| 22 | Ethiopia | 251 | ETB | Tele-Birr, M-Birr | Q1 2027 |
| 23 | Europe | EU | EUR | SEPA | Active |
| 24 | Mali | 223 | XOF | Orange, Moov | Active |
| 25 | Mozambique | 258 | MZN | Vodacom MPESA, Movitel, Tmcel, SIMO | Q1 2027 |
| 26 | Pakistan | 92 | PKR | SWIFT, Raast, JazzCash, Easypaisa | Q4 2026 |
| 27 | Stablecoins | CRYPTO | USDT/USDC | ERC20, TRC20, Polygon, Solana | Active |
| 28 | Togo | 228 | XOF | Moov, T Money | Active |
| 29 | UAE | 971 | AED | SWIFT | Active |
| 30 | United Kingdom | 44 | GBP | SWIFT, FPS | Q4 2026 |
| 31 | United States | 1 | USD | SWIFT, ACH, Fedwire | Q4 2026 |
For Senegal Orange deposits, the end user receives an SMS with a shortcode after the deposit is initiated. They dial the shortcode, triggering a USSD prompt where they input their PIN to approve the transaction.
Body
application/json
Payload for creating a payment link for API
The Client id is your public key which is generated when you are creating a new API integration from our app.
Example:
"K1PoY1WYricSpXh6Wm24twnk6ecPJOWrHGsqiKJr"
Salt is used for security purposes. This is a random string and can be unique value for each request or always the same.
Example:
"justrandomstring"
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
Example:
"John.co"
Show child attributes
Show child attributes
this is the current timestamp when the request is being made
Example:
1709363033
Example:
"2193d01d50d4bd5da234ac0e0add5d4ccb40907a1b1ab27a12d2c1d88a5d5807"
⌘I

