Skip to Content
Bill paymentsElectricity

Electricity

DisCo names and typical min/max (no plan IDs): Catalog.

Pay prepaid or postpaid electricity for Nigerian DisCos. Put the meter number in msisdn and send the matching plan_code from the plans list — each DisCo exposes separate prepaid and postpaid catalog entries. Optionally send phone as the customer’s mobile number (not the meter).

POST /v1/transactions

External create is sync — the response includes the final outcome (response_code 00 or 01). No status polling required. Response shapes: Field conventions.

1. List electricity plans

GET /v1/plans/bills/electricity

Optional filter: ?network=Ikeja Electric.

curl "https://api.subthingy.io/v1/plans/bills/electricity?network=Ikeja Electric" \ -H "X-Merchant-Key: mk_your_key_id" \ -H "X-Merchant-Secret: your_issued_secret"

Use the returned plan id as plan_code on purchase.

DisCo network values

networkProvider
Ikeja ElectricIkeja Electric (Lagos)
EKEDCEko Electric
AEDCAbuja Electric
IBEDCIbadan Electric
EEDCEnugu Electric
KEDCOKano Electric
JEDJos Electric
PHEDPort Harcourt Electric
BEDCBenin Electric
ABEDCAba Electric
KAEDCOKaduna Electric
YEDCYola Electric
ABAAba Power

Prepaid vs postpaid

List plans with GET /v1/plans/bills/electricity (optionally filter by network). Each DisCo returns separate prepaid and postpaid rows — pass the plan id as plan_code.

DisCoPrepaid plan_codePostpaid plan_code
Ikeja Electric10011002
EKEDC10031015
AEDC10041016
IBEDC10051017
EEDC10061018
KEDCO10071019
JED10081020
PHED10091010
BEDC10111021
KAEDCO10121022
YEDC10131023
ABEDC10141024

Successful prepaid purchases include token and units in data. Postpaid purchases return a receipt without a token.

2. Pay electricity

curl -X POST "https://api.subthingy.io/v1/transactions" \ -H "Content-Type: application/json" \ -H "X-Merchant-Key: mk_your_key_id" \ -H "X-Merchant-Secret: your_issued_secret" \ -d '{ "merchant": "YOUR_MERCHANT", "msisdn": "10000000001", "phone": "08012345678", "network": "Ikeja Electric", "product": "ELECTRICITY", "plan_code": "1001", "amount": "5000", "request_ref": "subthingy-bill-ikeja-001" }'
FieldRequiredDescription
merchant or merchant_codeYesYour merchant profile
msisdn or customer_msisdnYesMeter number
phoneNoCustomer mobile (080… or 234…). Not the meter. Omit if you do not have it.
networkYesBiller name (e.g. Ikeja Electric)
productYesELECTRICITY
plan_codeYesCatalog id from plans list
amountYesPayment amount in Naira (string)
request_ref or client_request_idYesUnique idempotency key

HTTP 200 — success (prepaid):

{ "status": "success", "response_code": "00", "response_message": "Successful", "data": { "internal_reference": "019262ab-7c4d-7000-8000-000000000010", "msisdn": "10000000001", "product": "ELECTRICITY", "request_id": "subthingy-bill-ikeja-001", "network": "Ikeja Electric", "amount": "5000", "plan": "1001", "merchant_id": 10, "created_at": "2026-05-17T10:30:00Z", "token": "1234-5678-9012-3456-7890", "units": "45.2 kWh" } }

Successful prepaid electricity includes token and units in the create data response (and again on status payload). kct1 and kct2 are optional 20-digit Key Change Tokens — present only when issued for the meter; load both on the meter before the recharge token when they appear. Omitted on most purchases.

When the DisCo applies the payment to outstanding meter debt instead of issuing a token, create data and status payload may include payment_spent_on (e.g. "debt") with no token. This field is response-only.

Failed purchases return response_code 01 with status failed.

3. Check status (optional)

To re-fetch a transaction later:

GET /v1/transactions/status?request_ref={request_ref}

See Bill payments overview — Check status.

Test meters

On test credentials, only these meters are accepted. Purchase returns the same success envelope as live (response_code 00, response_message Successful) and is simulated. Any other meter is rejected.

TypemsisdnCreate data extras
Prepaid10000000001Any prepaid plan_code (e.g. 1001). token: 47861234567890123456, units: 10.00 kWh (Ikeja Electric), customer_name: Test Customer
Postpaid10000000002Any postpaid plan_code (e.g. 1002, 1010, 1017). customer_name: Test Customer (no token)

Live credentials always require a real meter.

Ask your account manager to enable electricity on your merchant profile before go-live.

Last updated on