List countries and operators
curl --request GET \
--url https://api.kemypay.com/v1/mobile-money/countries \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.kemypay.com/v1/mobile-money/countries"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.kemypay.com/v1/mobile-money/countries', 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://api.kemypay.com/v1/mobile-money/countries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kemypay.com/v1/mobile-money/countries"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.kemypay.com/v1/mobile-money/countries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kemypay.com/v1/mobile-money/countries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": [
{
"country": "CMR",
"name": "Cameroon",
"currencies": [
"XAF"
],
"operators": [
{
"operator": "MTN_CMR",
"name": "MTN",
"currency": "XAF",
"decimals": 0,
"collection": {
"status": "operational",
"available": true,
"min_amount": "1.00",
"max_amount": "1000000.00",
"fee": {
"percent": "3.25",
"fixed_tiers": [],
"fixed_currency": null
}
},
"payout": {
"status": "operational",
"available": true,
"min_amount": "1.00",
"max_amount": "1000000.00",
"fee": {
"percent": "2.3",
"fixed_tiers": [],
"fixed_currency": null
}
},
"refund": {
"status": "operational",
"available": false,
"min_amount": "1.00",
"max_amount": "1000000.00",
"fee": null
}
},
{
"operator": "ORANGE_CMR",
"name": "Orange",
"currency": "XAF",
"decimals": 0,
"collection": {
"status": "closed",
"available": false,
"min_amount": "1.00",
"max_amount": "1000000.00",
"fee": {
"percent": "3.27",
"fixed_tiers": [],
"fixed_currency": null
}
},
"payout": {
"status": "operational",
"available": true,
"min_amount": "1.00",
"max_amount": "1000000.00",
"fee": {
"percent": "2",
"fixed_tiers": [],
"fixed_currency": null
}
},
"refund": {
"status": "operational",
"available": false,
"min_amount": "1.00",
"max_amount": "1000000.00",
"fee": null
}
}
]
}
],
"meta": {
"request_id": "a4f8e2c1b3d97056",
"timestamp": "2026-10-29T10:00:00+00:00",
"mode": "live"
}
}{
"success": false,
"error": {
"code": "COUNTRY_NOT_SUPPORTED",
"message": "Mobile money is not available in GHA for your account."
},
"meta": {
"request_id": "a4f8e2c1b3d97056",
"timestamp": "2026-10-29T10:00:00+00:00",
"mode": "live"
}
}Catalog
List countries and operators
Countries available to your account, with their operators. For each operator and currency, collection,
payout and refund give the live status, whether the operation is available right now, the minimum and
maximum amount per transaction, and your all-in price (fee).
- Operator data is refreshed every 10 minutes. Cache it for a few minutes on your side.
- Show an operator to your customer only when
collection.availableistrue. - Round amounts to the
decimalsof the operator: it can differ between operators of the same currency. - Payouts and refunds are not open yet: their status is shown for information.
GET
/
mobile-money
/
countries
List countries and operators
curl --request GET \
--url https://api.kemypay.com/v1/mobile-money/countries \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.kemypay.com/v1/mobile-money/countries"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.kemypay.com/v1/mobile-money/countries', 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://api.kemypay.com/v1/mobile-money/countries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kemypay.com/v1/mobile-money/countries"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.kemypay.com/v1/mobile-money/countries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kemypay.com/v1/mobile-money/countries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": [
{
"country": "CMR",
"name": "Cameroon",
"currencies": [
"XAF"
],
"operators": [
{
"operator": "MTN_CMR",
"name": "MTN",
"currency": "XAF",
"decimals": 0,
"collection": {
"status": "operational",
"available": true,
"min_amount": "1.00",
"max_amount": "1000000.00",
"fee": {
"percent": "3.25",
"fixed_tiers": [],
"fixed_currency": null
}
},
"payout": {
"status": "operational",
"available": true,
"min_amount": "1.00",
"max_amount": "1000000.00",
"fee": {
"percent": "2.3",
"fixed_tiers": [],
"fixed_currency": null
}
},
"refund": {
"status": "operational",
"available": false,
"min_amount": "1.00",
"max_amount": "1000000.00",
"fee": null
}
},
{
"operator": "ORANGE_CMR",
"name": "Orange",
"currency": "XAF",
"decimals": 0,
"collection": {
"status": "closed",
"available": false,
"min_amount": "1.00",
"max_amount": "1000000.00",
"fee": {
"percent": "3.27",
"fixed_tiers": [],
"fixed_currency": null
}
},
"payout": {
"status": "operational",
"available": true,
"min_amount": "1.00",
"max_amount": "1000000.00",
"fee": {
"percent": "2",
"fixed_tiers": [],
"fixed_currency": null
}
},
"refund": {
"status": "operational",
"available": false,
"min_amount": "1.00",
"max_amount": "1000000.00",
"fee": null
}
}
]
}
],
"meta": {
"request_id": "a4f8e2c1b3d97056",
"timestamp": "2026-10-29T10:00:00+00:00",
"mode": "live"
}
}{
"success": false,
"error": {
"code": "COUNTRY_NOT_SUPPORTED",
"message": "Mobile money is not available in GHA for your account."
},
"meta": {
"request_id": "a4f8e2c1b3d97056",
"timestamp": "2026-10-29T10:00:00+00:00",
"mode": "live"
}
}Authorizations
Your secret API key: sk_live_… (real money) or sk_test_… (test mode).
Query Parameters
Only this country (ISO 3166-1 alpha-3, for example CMR).
Pattern:
^[A-Za-z]{3}$Example:
"CMR"