Errors & codes
Response shapes
| Operation | JSON shape |
|---|---|
| Create (sync or async) | status, response_code, response_message, data |
| Status | status, response_code, response_message, data |
| List | status, data, pagination |
| Wallet balance | status, data, total |
| Gift cards — catalog / quote / availability | status, code, message, data |
| Gift cards — purchase / order status | status, response_code, response_message, data |
| eSIM — catalog / quote | status, code, message, data |
| eSIM — purchase / order status | status, response_code, response_message, data |
| Bill validate (verify customer) | status, code, message, data |
| Bill plans catalog | status, description, data |
| Bill status | status, response_code, response_message, data |
Field conventions (airtime, data, electricity, cable, betting)
These rules apply to every transaction product on the external API.
Create and status
Create and status use the same envelope: status, response_code, response_message, data.
| Field | Location | Values / format |
|---|---|---|
| Outcome word | Top-level status | success, failed, or pending — not 00 / 01 |
| Outcome code | Top-level response_code | 00 success, 01 failed, 02 pending |
| Human message | Top-level response_message | e.g. Successful, Failed, Pending |
| Idempotency echo | data.request_id | Same value you sent as client_request_id |
| Sync timestamp | data.created_at | RFC 3339 on sync create only, e.g. 2026-05-17T10:30:00Z |
| Status timestamp | data.created_at, data.updated_at | YYYY-MM-DD HH:MM:SS on status and list rows |
| Async create | data | No created_at on the immediate pending response |
Optional data fields you may see:
external_reference,telco_message— common on sync airtime and dataplan— plan code echoed on data and bill createsmerchant_name,updated_at— on status and list responsestoken,units— prepaid electricity on sync bill create (and on status)kct1,kct2— optional 20-digit Key Change Tokens when issued for the meter; omitted on most purchasespayment_spent_on— optional on electricity purchase and status when the payment cleared meter debt instead of issuing a token (e.g.debt); omitted otherwise. Response-only — do not send on the request
Telco data.network in responses is typically uppercase (MTN, GLO, …) even when the request used lowercase.
Bill verify (optional)
POST /v1/transactions/verify returns status, code (HTTP-style integer 200), message, and data:
| Field | Location | Values / format |
|---|---|---|
| Outcome word | Top-level status | success on valid customer |
| Code | Top-level code | 200 on success |
| Human message | Top-level message | e.g. customer verified |
| Customer details | data | product, network, msisdn, customer_name, plus product-specific fields (electricity: customer_address, min_amount, max_amount, meter_number, arrears, account_type, meter_type, district, business_unit, district_reference, tariff when the disco returns them) |
Send merchant_code, customer_msisdn, network, product, and plan_code (recommended) or legacy service_id. No client_request_id. See Bill payments — Verify customer.
On rejected meters, smartcards, or betting IDs, HTTP is 400 with status error, integer code 400, and message set to the rejection reason. That is a customer-data problem, not a gateway failure. Verify outages are 502 with a generic message.
Bill products (ELECTRICITY, CABLE, BETTING) are always sync on create — expect response_code 00 or 01, not pending 02. Airtime and data on POST /v1/transactions without a /sync route are async (02 pending until polled).
On dedicated sync routes (/transactions/airtime/sync, /transactions/data/sync), product is set by the route.
Gift cards
Gift card routes use the same authentication and response envelopes as the rest of the Breeze API.
Catalog, quote, availability
Uses status, code (HTTP-style integer, e.g. 200), message, and data.
Purchase and order status
Uses the same envelope as transaction create: status, response_code, response_message, and data.
| Field | Location | Values / format |
|---|---|---|
| Outcome word | Top-level status | success, failed, or pending |
| Outcome code | Top-level response_code | 00, 01, or 02 |
| Idempotency echo | data.request_id | Same value sent on POST /giftcards/orders |
| Card details | data.cards | Present on success; omitted while pending |
| Provider ref | data.reference_code | Upstream order reference when available |
GET /giftcards/orders/{request_id} returns the same envelope as purchase — poll until response_code is 00 or 01.
eSIM
eSIM purchase and status use the same envelope as gift cards (00 / 01 / 02). Success data includes iccid, activation_code, smdp_address, and lpa. Pending orders must not be treated as delivered. See eSIM.
Transaction codes
Inside create and status responses, response_code maps to status:
response_code | status | Meaning |
|---|---|---|
00 | success | Successful |
01 | failed | Failed |
02 | pending | Still processing |
Failed example (status):
{
"status": "failed",
"response_code": "01",
"response_message": "Failed",
"data": {
"request_id": "req-20260517-003",
"internal_reference": "019262ab-7c4d-7000-8000-000000000001"
}
}HTTP status codes
| Status | When |
|---|---|
200 | Success (sync or async create, status, list, balance) |
400 | Invalid JSON, validation error, rejected meter/smartcard/betting ID on bill verify, or missing client_request_id / request_id / request_ref on status GET |
401 | Missing or invalid API key / secret |
403 | Credential cannot access this merchant or transaction |
404 | Merchant or transaction not found |
422 | Duplicate client_request_id or validation error |
500 | Server error — retry with backoff |
502 | Bill verify could not be completed — retry with backoff |
503 | Temporary overload — retry with backoff |
Health check
GET /v1/healthzNo authentication required. Use for uptime monitoring only.