Click Airtime

Catalog Lookup

Look up available products, exchange rates, and bundles for a phone number.

Catalog Lookup

Look up the available airtime products for a phone number or network. The API automatically detects the phone's network via HLR lookup, or you can specify a network_id manually for ported numbers. You can also use network_id alone without a phone number to browse products for a known network.

GET /v2/catalog/lookup

Permission required: airtime.read

Query Parameters

ParameterTypeRequiredDescription
phone_numberstringNoPhone number in E.164 format (e.g., +233541112259)
network_idintegerNoOverride auto-detection with a specific network ID

At least one of phone_number or network_id must be provided. When network_id is used alone, the response omits the phone_number field and skips HLR lookup.

Example Request

curl -X GET "https://api.clickairtime.com/v2/catalog/lookup?phone_number=%2B233541112259" \
  -H "Authorization: Bearer ce_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
const response = await fetch(
  'https://api.clickairtime.com/v2/catalog/lookup?phone_number=%2B233541112259',
  {
    headers: {
      'Authorization': 'Bearer ce_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    },
  }
);
const data = await response.json();
import requests

response = requests.get(
    'https://api.clickairtime.com/v2/catalog/lookup',
    params={'phone_number': '+233541112259'},
    headers={
        'Authorization': 'Bearer ce_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    }
)
data = response.json()
$ch = curl_init('https://api.clickairtime.com/v2/catalog/lookup?phone_number=%2B233541112259');
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": {
    "phone_number": "+233541112259",
    "network": {
      "id": 42,
      "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"
        }
      ]
    },
    "sms_notification": {
      "available": true,
      "cost_usd": 0.10
    }
  },
  "meta": {
    "request_id": "req_a1b2c3d4e5f6",
    "timestamp": "2024-01-15T10:30:00.000Z"
  }
}

Response Fields

FieldTypeDescription
phone_numberstringThe queried phone number
network.idintegerNetwork ID (use this in /v2/topups)
network.namestringNetwork operator name
network.countrystringCountry name
network.country_codestringISO 2-letter country code
network.currencystringLocal currency code
exchange_rateobject | nullCurrent exchange rate (null if unavailable)
products.custom_airtimeobjectCustom amount airtime options
products.fixed_bundlesarrayPre-defined data/airtime bundles
sms_notificationobjectSMS notification options and pricing

For ported numbers where auto-detection returns the wrong network, use the network_id parameter to specify the correct network manually. You can also use network_id alone to look up products without a phone number -- see Network Products for a dedicated endpoint.