Bridge API DocsBridge API Docs
Bridge API Docs
Api reference

Send Airtime / Top-up

Send airtime or top-up mobile credit via the Bridge API

Send Airtime / Top-up

Send airtime to a customer number on a supported mobile network. The API accepts the request and processes it asynchronously; final status is delivered to your callback URL.

Endpoint

POST https://api.bridgeagw.com/send_airtime

Request Headers

Authorization: Basic <base64_encoded_credentials>
Content-Type: application/json

Request Body

{
  "service_id": 55,
  "reference": "Test payment",
  "transaction_id": "ksnyew2kei4a-alnlapk-uou",
  "trans_type": "ATP",
  "amount": 5,
  "customer_number": "0244000001",
  "nw": "MTN",
  "callback_url": "https://webhook.site/0b429e73-ce5c-420b-af82-a346fb577c43",
  "request_time": "2025-10-03 23:50"
}

Parameters

ParameterTypeRequiredDescription
service_idintegerYesYour service identifier
referencestringYesTransaction reference or description
transaction_idstringYesUnique transaction identifier
trans_typestringYesMust be ATP for airtime / top-up
amountnumberYesAirtime amount
customer_numberstringYesRecipient phone number (MSISDN)
nwstringYesMobile network code (e.g. MTN, VOD, AIR)
callback_urlstringYesURL for asynchronous status notifications
request_timestringYesRequest timestamp

Supported Networks (nw)

Use the same network codes as mobile money collections:

NetworkCode
MTN Mobile MoneyMTN
Telecel CashVOD
AirtelTigo MoneyAIR

Response

Accepted (202)

{
  "response_message": "Request successfully received for processing",
  "response_code": "202"
}

Example Usage

curl -X POST "https://api.bridgeagw.com/send_airtime" \
  -H "Authorization: Basic <your_credentials>" \
  -H "Content-Type: application/json" \
  -d '{
    "service_id": 55,
    "reference": "Test payment",
    "transaction_id": "ksnyew2kei4a-alnlapk-uou",
    "trans_type": "ATP",
    "amount": 5,
    "customer_number": "0244000001",
    "nw": "MTN",
    "callback_url": "https://your-site.com/webhook/airtime-status",
    "request_time": "2025-10-03 23:50"
  }'
const response = await fetch('https://api.bridgeagw.com/send_airtime', {
  method: 'POST',
  headers: {
    'Authorization': 'Basic <your_credentials>',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    service_id: 55,
    reference: "Test payment",
    transaction_id: "ksnyew2kei4a-alnlapk-uou",
    trans_type: "ATP",
    amount: 5,
    customer_number: "0244000001",
    nw: "MTN",
    callback_url: "https://your-site.com/webhook/airtime-status",
    request_time: "2025-10-03 23:50"
  })
});

const result = await response.json();
console.log(result);
import requests

url = "https://api.bridgeagw.com/send_airtime"
headers = {
    "Authorization": "Basic <your_credentials>",
    "Content-Type": "application/json"
}
data = {
    "service_id": 55,
    "reference": "Test payment",
    "transaction_id": "ksnyew2kei4a-alnlapk-uou",
    "trans_type": "ATP",
    "amount": 5,
    "customer_number": "0244000001",
    "nw": "MTN",
    "callback_url": "https://your-site.com/webhook/airtime-status",
    "request_time": "2025-10-03 23:50"
}

response = requests.post(url, headers=headers, json=data)
result = response.json()
print(result)

Sandbox testing

In sandbox mode, airtime (trans_type: "ATP") uses the same MSISDN allowlist as mobile money payments. Only the allowlisted numbers below work; real or non-allowlisted numbers return 019. See the API Reference sandbox overview for the full list.

Scenariocustomer_numbernwExpected response_codeCallback sent?
Success (MTN)0244000001MTN202Yes → 000/SUCCESS
Success (Vodafone)0200000002VOD202Yes → 000/SUCCESS
Success (AirtelTigo)0270000003AIR202Yes → 000/SUCCESS
Failure0244000009MTN015No
Invalid0540010000MTN019No
Limit exceeded0244000001MTN016 (amount > 10000)No

Example sandbox request:

{
  "service_id": 12345,
  "reference": "Airtime top-up",
  "transaction_id": "ATP-SANDBOX-001",
  "trans_type": "ATP",
  "amount": 5,
  "customer_number": "0244000001",
  "nw": "MTN",
  "callback_url": "https://your-site.com/webhook/airtime-status",
  "request_time": "2026-01-15T14:30:00Z"
}

Callbacks

After you receive 202, rely on your callback_url for final status. See Callbacks.