Skip to Content
Transactions

Transactions

Sync vs async

Sync (recommended): the API runs vending before responding. You get the final outcome (response_code 00 or 01) in the create response. Use:

RouteNotes
POST /ext/breeze/v1/transactions/airtime/syncAirtime only
POST /ext/breeze/v1/transactions/data/syncData only (plan_code required)

Async: the API stores the transaction, enqueues it, and returns immediately with HTTP 200 and response_code 02 (pending). Poll status until final.

RouteNotes
POST /ext/breeze/v1/transactionsproduct in body: airtime, data, ELECTRICITY, CABLE, or BETTING
POST /ext/breeze/v1/transactions/airtime/asyncForces product: airtime
POST /ext/breeze/v1/transactions/data/asyncForces product: data

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
productYesairtime, 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.

Create and status responses use status, response_code, response_message, and data.

Buy airtime (sync)

curl -X POST "https://staging-intelligent-70287b6a3284.herokuapp.com/ext/breeze/v1/transactions/airtime/sync" \ -H "Content-Type: application/json" \ -H "X-Merchant-Key: mk_live_your_key_id" \ -H "X-Merchant-Secret: sk_live_your_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-17 10:30:00" } }

Buy data (sync)

curl -X POST "https://staging-intelligent-70287b6a3284.herokuapp.com/ext/breeze/v1/transactions/data/sync" \ -H "Content-Type: application/json" \ -H "X-Merchant-Key: mk_live_your_key_id" \ -H "X-Merchant-Secret: sk_live_your_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" }'

Buy airtime (async)

curl -X POST "https://staging-intelligent-70287b6a3284.herokuapp.com/ext/breeze/v1/transactions" \ -H "Content-Type: application/json" \ -H "X-Merchant-Key: mk_live_your_key_id" \ -H "X-Merchant-Secret: sk_live_your_secret" \ -d '{ "merchant_code": "YOUR_MERCHANT", "customer_msisdn": "2348012345678", "network": "mtn", "product": "airtime", "amount": "100", "client_request_id": "req-20260517-003" }'

HTTP 200 — pending (poll status):

{ "status": "pending", "response_code": "02", "response_message": "Pending", "data": { "internal_reference": "019262ab-7c4d-7000-8000-000000000001", "msisdn": "2348012345678", "product": "airtime", "request_id": "req-20260517-003", "network": "mtn", "amount": "100", "plan": "", "merchant_id": 10 } }

Check status

Use after async creates, or to re-fetch an outcome.

GET /ext/breeze/v1/transactions/status/{request_id}

Use the same value you sent as client_request_id.

curl "https://staging-intelligent-70287b6a3284.herokuapp.com/ext/breeze/v1/transactions/status/req-20260517-003" \ -H "X-Merchant-Key: mk_live_your_key_id" \ -H "X-Merchant-Secret: sk_live_your_secret"

HTTP 200 — same envelope as create:

{ "status": "success", "response_code": "00", "response_message": "Successful", "data": { "internal_reference": "019262ab-7c4d-7000-8000-000000000001", "msisdn": "2348012345678", "product": "airtime", "request_id": "req-20260517-003", "network": "mtn", "amount": "100", "merchant_id": 10, "merchant_name": "YOUR_MERCHANT", "created_at": "2026-05-17 10:30:00" } }
response_codestatusMeaning
00successCompleted successfully
01failedFailed
02pendingStill processing

List transactions

GET /ext/breeze/v1/transactions
QueryDefaultDescription
page1Page number
limit10Page size
msisdnFilter by subscriber
networkFilter by network name
statusFilter by status code (integer)
curl "https://staging-intelligent-70287b6a3284.herokuapp.com/ext/breeze/v1/transactions?page=1&limit=20" \ -H "X-Merchant-Key: mk_live_your_key_id" \ -H "X-Merchant-Secret: sk_live_your_secret"

HTTP 200:

{ "status": "success", "data": [], "pagination": { "total": 0, "page": 1, "size": 20, "total_pages": 0 } }

Idempotency

Reusing the same client_request_id for a merchant returns 422. Query status instead of resubmitting.

Last updated on