VVTUFlex

Developer API v1

Power your own VTU business with the VTUFlex REST API — airtime, data, electricity and cable TV at reseller pricing. JSON in, JSON out.

Get your API keys →
Quick startAuthenticationEndpointsTransaction responseErrors

Quick start

Base URL

https://jikamshi.online/api/v1/

Buy a data bundle:

curl -X POST https://jikamshi.online/api/v1/data \
  -H "Authorization: Bearer PUBLIC_KEY.SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{"plan_code":"mtn-1gb-30","phone":"08012345678"}'
API access requires a reseller account. Standard accounts can upgrade via support, then generate keys in Developer API.

Authentication

Every request must be authenticated. Send your key pair as a bearer token:

Authorization: Bearer <public_key>.<secret_key>

…or as two separate headers:

X-API-Key:    <public_key>
X-API-Secret: <secret_key>

Your secret is shown only once, at creation. It is stored hashed — if you lose it, revoke the key and create a new one. You can optionally lock a key to specific IPs when you create it.

Endpoints

All amounts are in NGN. POST bodies are JSON. Reseller pricing and channel = "api" apply automatically.

MethodPathParametersDescription
GET /balance Wallet balance for the authenticated reseller.
GET /networks List active networks and which services they support.
GET /data-plans network (e.g. mtn) Data plans for a network (reseller pricing).
GET /tv-plans provider (e.g. dstv) Cable TV bouquets for a provider.
GET /billers type (electricity | tv) Billers for a service type.
GET /transaction reference Look up one of your transactions by reference.
POST /airtime network, phone, amount Buy airtime.
POST /data plan_code, phone Buy a data bundle.
POST /electricity/verify biller, meter, type (prepaid | postpaid) Verify a meter before paying.
POST /electricity biller, meter, type, amount, phone Pay an electricity bill.
POST /tv/verify biller, smartcard Verify a smartcard before paying.
POST /tv plan_code, smartcard, phone Pay/renew a cable TV subscription.

Example responses

GET /balance

{ "success": true, "balance": 15400.00, "currency": "NGN" }

GET /networks

{ "success": true, "networks": [ { "code": "mtn", "name": "MTN", "airtime": true, "data": true } ] }

GET /data-plans

{ "success": true, "network": "mtn", "plans": [ { "plan_code": "mtn-1gb-30", "name": "1GB · 30 days", "type": "SME", "validity": "30 days", "price": 265.00 } ] }

GET /tv-plans

{ "success": true, "provider": "dstv", "plans": [ { "plan_code": "dstv-yanga", "name": "DStv Yanga", "price": 6000.00 } ] }

GET /billers

{ "success": true, "type": "electricity", "billers": [ { "code": "ikeja", "name": "Ikeja Electric", "fee": 0 } ] }

GET /transaction

{ "success": true, "data": { "reference": "VTF-...", "service": "data", "status": "success", "amount": 265.00, "recipient": "08012345678" } }

POST /electricity/verify

{ "success": true, "customer_name": "JANE DOE", "message": "" }

POST /tv/verify

{ "success": true, "customer_name": "JOHN DOE", "message": "" }

Transaction response

Purchase endpoints (/airtime, /data, /electricity, /tv) all return the same envelope. Check status — a vend may be success, processing (poll GET /transaction), or failed (wallet auto-refunded).

{
  "success": true,
  "status": "success",
  "message": "Data purchase successful.",
  "reference": "VTF-8F3A21C0",
  "data": {
    "reference": "VTF-8F3A21C0",
    "service": "data",
    "biller": "mtn",
    "recipient": "08012345678",
    "amount": 265.00,
    "status": "success",
    "token": null,
    "units": null,
    "provider_reference": "PRV-4471",
    "created_at": "2026-07-02 15:40:11"
  }
}

For electricity, token and units carry the meter token and purchased units. Always pass your own idempotency by re-checking reference before retrying a POST.

Errors

Errors return the matching HTTP status with { "success": false, "message": "…" }.

HTTPMessageMeaning
401Missing API credentialsNo key/secret sent, or the Authorization header was dropped.
401Invalid API credentialsPublic key or secret is wrong.
403This API key has been revokedThe key was revoked in your dashboard — generate a new one.
403IP address not allowedCaller IP is not in the key’s IP whitelist.
403Account is not activeThe reseller account is suspended.
404Transaction not foundNo transaction with that reference belongs to you.
422Unknown network / providerThe network or provider code was not recognised.
500Internal errorUnexpected server error — safe to retry idempotently.

Need higher limits, a sandbox, or help integrating? Email support@jikamshi.online.

© 2026 VTUFlex · Home · Your API keys