Power your own VTU business with the VTUFlex REST API — airtime, data, electricity and cable TV at reseller pricing. JSON in, JSON out.
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"}'
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.
All amounts are in NGN. POST bodies are JSON. Reseller pricing and channel = "api" apply automatically.
| Method | Path | Parameters | Description |
|---|---|---|---|
| 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. |
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": "" }
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 return the matching HTTP status with { "success": false, "message": "…" }.
| HTTP | Message | Meaning |
|---|---|---|
| 401 | Missing API credentials | No key/secret sent, or the Authorization header was dropped. |
| 401 | Invalid API credentials | Public key or secret is wrong. |
| 403 | This API key has been revoked | The key was revoked in your dashboard — generate a new one. |
| 403 | IP address not allowed | Caller IP is not in the key’s IP whitelist. |
| 403 | Account is not active | The reseller account is suspended. |
| 404 | Transaction not found | No transaction with that reference belongs to you. |
| 422 | Unknown network / provider | The network or provider code was not recognised. |
| 500 | Internal error | Unexpected server error — safe to retry idempotently. |
Need higher limits, a sandbox, or help integrating? Email support@jikamshi.online.
© 2026 VTUFlex · Home · Your API keys