Skip to Content
Data plans

Data plans

List available bundles for a network before calling Transactions with product: "data".

GET /ext/breeze/v1/plans/{network}

Supported {network} values: mtn, glo, airtel, 9mobile.

curl "https://staging-intelligent-70287b6a3284.herokuapp.com/ext/breeze/v1/plans/mtn" \ -H "X-Merchant-Key: mk_live_your_key_id" \ -H "X-Merchant-Secret: sk_live_your_secret"

Response

Each plan includes a stable plan_code (recommended for purchases), plus legacy fields such as id and tarrifTypeId.

{ "status": "2000", "description": "Operation Successful-MTN", "data": [ { "id": 8, "plan_code": "MTN-8", "name": "1GB Daily Plan + 1.5mins", "description": "1GB Daily Plan + 1.5mins", "price": "500", "tarrifTypeId": "18", "validity": "1 Day", "value": "1GB", "group": "daily", "shortCode": "1GB-N500" } ] }
FieldDescription
plan_codeRecommended purchase reference, e.g. MTN-8, GLO-1, AIRTEL-1, 9MOBILE-1
idCatalog index (still returned; legacy clients may use this on GLO/Airtel)
tarrifTypeIdTelco tariff/product id (informational; legacy MTN clients may still send this)
pricePlan price in Naira
shortCodeHuman-readable code (also accepted on purchase)

Buy data

Pass plan_code from the list in your data transaction:

{ "merchant_code": "YOUR_MERCHANT", "customer_msisdn": "2348012345678", "network": "mtn", "product": "data", "amount": "500", "client_request_id": "req-20260517-002", "plan_code": "MTN-8" }

amount should match the plan price from the catalog.

Legacy values (still supported)

Existing integrations do not need to change immediately.

NetworkLegacy plan_code / plan values still accepted
MTNRaw tariff type id, e.g. "18" (bare numbers are treated as tariff ids, not catalog ids)
GLOCatalog id, e.g. "2", or product id, e.g. "DATA-401"
AirtelCatalog id or tarrifTypeId, e.g. "1"
9mobileCatalog id or plan_code; vending is amount-based at the telco

For new MTN integrations, always use prefixed codes like MTN-8 instead of bare numbers — e.g. MTN-34 (500MB plan) vs "34" (legacy tariff id).

Internal API

The authenticated internal API uses the same catalog but the purchase field is named plan (not plan_code):

GET /plans/{network} POST /transactions → { "plan": "MTN-8", ... }
Last updated on