Skip to Content

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.

RouteNotes
POST /v1/transactions/airtime/syncAirtime only
POST /v1/transactions/data/syncData 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

FieldRequiredDescription
merchant_codeYesYour merchant profile
customer_msisdnYesSubscriber number (234… or 080…)
networkYesmtn, glo, airtel, 9mobile
productYes*airtime, data, ELECTRICITY, CABLE, or BETTING
amountYesAmount in Naira (string)
client_request_idYesYour unique idempotency key
plan_codeData & billsData: 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.

Last updated on