Network Products
List available products, exchange rates, and bundles for a specific network.
Network Products
Retrieve the full product catalog for a specific network, including exchange rates, custom airtime limits, and fixed bundles. This is useful when you already know the network and want to browse available products without performing a phone number lookup.
GET /v2/catalog/products
Permission required: airtime.read
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
network_id | integer | Yes | Network ID from /v2/catalog/networks or /v2/catalog/countries |
Example Request
curl -X GET "https://api.clickairtime.com/v2/catalog/products?network_id=22" \
-H "Authorization: Bearer ce_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"const response = await fetch(
'https://api.clickairtime.com/v2/catalog/products?network_id=22',
{
headers: {
'Authorization': 'Bearer ce_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
},
}
);
const data = await response.json();import requests
response = requests.get(
'https://api.clickairtime.com/v2/catalog/products',
params={'network_id': 22},
headers={
'Authorization': 'Bearer ce_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
}
)
data = response.json()$ch = curl_init('https://api.clickairtime.com/v2/catalog/products?network_id=22');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ce_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = json_decode(curl_exec($ch));Example Response
{
"success": true,
"data": {
"network": {
"id": 22,
"name": "MTN Ghana",
"country": "Ghana",
"country_code": "GH",
"currency": "GHS"
},
"exchange_rate": {
"source_currency": "USD",
"destination_currency": "GHS",
"rate": 12.35
},
"products": {
"custom_airtime": {
"available": true,
"min_amount_local": 1,
"max_amount_local": 5000,
"local_currency": "GHS"
},
"fixed_bundles": [
{
"id": 101,
"name": "500MB Data - 30 Days",
"type": "DATA",
"price_usd": 2.50,
"local_value": "500MB Data - 30 Days",
"local_currency": "GHS",
"description": "500MB Data - 30 Days"
},
{
"id": 102,
"name": "1GB Data - 30 Days",
"type": "DATA",
"price_usd": 4.00,
"local_value": "1GB Data - 30 Days",
"local_currency": "GHS",
"description": "1GB Data - 30 Days"
},
{
"id": 201,
"name": "GHS 5 Airtime",
"type": "AIRTIME",
"price_usd": 0.45,
"local_value": "5.00",
"local_currency": "GHS",
"description": "GHS 5 Airtime Top-Up"
}
]
},
"sms_notification": {
"available": true,
"cost_usd": 0.10
}
},
"meta": {
"request_id": "req_p1r2o3d4u5c6",
"timestamp": "2024-01-15T10:30:00.000Z"
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
network | object | Network information |
network.id | integer | Network ID |
network.name | string | Network operator name |
network.country | string | Country name |
network.country_code | string | ISO 2-letter country code |
network.currency | string | Local currency code |
exchange_rate | object | null | Current exchange rate (null if unavailable) |
exchange_rate.source_currency | string | Your wallet currency |
exchange_rate.destination_currency | string | Local currency |
exchange_rate.rate | number | Exchange rate multiplier |
products.custom_airtime | object | Custom amount airtime options |
products.custom_airtime.available | boolean | Whether custom amounts are supported |
products.custom_airtime.min_amount_local | number | Minimum amount in local currency |
products.custom_airtime.max_amount_local | number | Maximum amount in local currency |
products.fixed_bundles | array | Pre-defined data/airtime bundles |
products.fixed_bundles[].id | integer | Product ID (use in POST /v2/topups) |
products.fixed_bundles[].name | string | Product name |
products.fixed_bundles[].type | string | AIRTIME or DATA |
products.fixed_bundles[].price_usd | number | Cost in USD |
sms_notification | object | SMS notification options and pricing |
This endpoint returns the same product data as Catalog Lookup, but without requiring a phone number. Use it to build product selection UIs before a phone number is entered.
