Airtime
Sync (recommended): the API runs vending before responding. You get the final outcome in the create response: top-level status (success, failed, or pending), response_code (00, 01, or 02), response_message, and a data object. See Field conventions.
| Route | Notes |
|---|---|
POST /v1/transactions/airtime/sync | Airtime only |
POST /v1/transactions/data/sync | Data only (plan_code required) |
For async creates (HTTP 200, response_code 02, then poll status), see Airtime Async.
Bill products require plan_code — see Electricity, Cable TV, or Betting.
Request body
| Field | Required | Description |
|---|---|---|
merchant_code | Yes | Your merchant profile |
customer_msisdn | Yes | Subscriber number (234… or 080…) |
network | Yes | mtn, glo, airtel, 9mobile |
product | Yes* | airtime, data, ELECTRICITY, CABLE, or BETTING |
amount | Yes | Amount in Naira (string) |
client_request_id | Yes | Your unique idempotency key |
plan_code | Data & bills | Data: prefixed code from Data plans (e.g. MTN-8). Bills: catalog id from Electricity, Cable TV, or Betting. Legacy tariff/product ids still work for existing clients. |
*On /transactions/airtime/sync and /transactions/data/sync, product is set by the route.
Create responses use status, response_code, response_message, and data. See Field conventions.
Buy airtime (sync)
curl -X POST "https://api.breezeinnovations.io/v1/transactions/airtime/sync" \
-H "Content-Type: application/json" \
-H "X-Merchant-Key: mk_your_key_id" \
-H "X-Merchant-Secret: your_issued_secret" \
-d '{
"merchant_code": "YOUR_MERCHANT",
"customer_msisdn": "2348012345678",
"network": "glo",
"product": "airtime",
"amount": "200",
"client_request_id": "req-20260517-001"
}'HTTP 200 — successful:
{
"status": "success",
"response_code": "00",
"response_message": "Successful",
"data": {
"internal_reference": "019262ab-7c4d-7000-8000-000000000002",
"msisdn": "2348012345678",
"product": "airtime",
"request_id": "req-20260517-001",
"network": "GLO",
"amount": "200",
"merchant_id": 10,
"created_at": "2026-05-17T10:30:00Z",
"telco_message": "Successful"
}
}Sync create may also include external_reference in data. See Field conventions for timestamp and field details.
Buy data (sync)
curl -X POST "https://api.breezeinnovations.io/v1/transactions/data/sync" \
-H "Content-Type: application/json" \
-H "X-Merchant-Key: mk_your_key_id" \
-H "X-Merchant-Secret: your_issued_secret" \
-d '{
"merchant_code": "YOUR_MERCHANT",
"customer_msisdn": "2348012345678",
"network": "mtn",
"product": "data",
"amount": "500",
"client_request_id": "req-20260517-002",
"plan_code": "MTN-8"
}'Sync responses return the final outcome in one call (response_code 00 or 01) with RFC 3339 data.created_at. See Field conventions.
If you receive response_code 00 or 01, you already have the final outcome — status polling is optional. See Airtime Async — Check status if you need to re-fetch an outcome later.