IKONECT Developer Documentation v1.0

Build fintech products
at the speed of thought.

A modern REST API for airtime, data bundles, TV subscriptions and electricity payments — all behind a single API key.

Bank-grade security < 300ms responses REST & JSON 99.9% uptime Browse all services →
Airtime
MTN, Airtel, Glo, 9mobile
Data Bundles
SME, Gifting, Corporate
TV
DStv, GOtv, Startimes
Electricity
All Nigerian DISCOs
Wallet
Real-time balance
Status
Track any transaction
Quick Start

Make your first request in 30 seconds

Grab your API key from the profile page, then hit the wallet balance endpoint to confirm everything is wired up.

your-terminal
curl https://www.ikonect.com.ng.kumardata.com.ng/api/v1/balance/ \
  -H "Authorization: Bearer YOUR_API_KEY"
Response: you'll get back {"success": true, "balance": 9684.00}. If you get a 401, double-check your API key.
Authentication

API Keys

Every request must include an API key. We accept four header formats so you can drop us straight into existing integrations:

Recommended
Authorization: Bearer YOUR_API_KEY
Topupmate compatible
Authorization: Token YOUR_API_KEY
Header
X-API-Key: YOUR_API_KEY
Legacy
Token: YOUR_API_KEY
Never expose your API key in client-side JavaScript. Always proxy calls through your backend.
Base URL

Endpoint Root

All endpoints are relative to this base URL. Example: /data/ → https://www.ikonect.com.ng.kumardata.com.ng/api/v1/data/

base-url.txt
https://www.ikonect.com.ng.kumardata.com.ng/api/v1/
Pricing

Service Fees

Fees are deducted from your wallet only on successful API calls. Failed requests cost nothing.

ServiceEndpointFee (₦)
Wallet BalanceGET /balance/Free
AirtimePOST /airtime/Amount entered
Data CatalogGET /dataplans/Free
Data PurchasePOST /data/Plan-dependent
Services CatalogGET /services/Free
TV VerificationPOST /tv/verifyFree
TV SubscriptionPOST /tv/Plan-dependent
Electricity VerificationPOST /electricity/verifyFree
ElectricityPOST /electricity/Amount entered
Transaction StatusPOST /transaction/Free

API Reference

Endpoints

GET /balance/ Free
Get your current wallet balance. Ideal for showing available funds in your UI before initiating a transaction.
request
curl https://www.ikonect.com.ng.kumardata.com.ng/api/v1/balance/ \
  -H "Authorization: Bearer YOUR_API_KEY"
<?php
$ch = curl_init('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/balance/');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer YOUR_API_KEY',
  ],
]);
$res = curl_exec($ch);
curl_close($ch);
echo $res;
const res = await fetch('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/balance/', {
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
  },
});
const data = await res.json();
console.log(data);
import requests

r = requests.get(
    'https://www.ikonect.com.ng.kumardata.com.ng/api/v1/balance/',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
print(r.json())
{
    "success": true,
    "balance": 9684
}
{
    "error": "Invalid API key",
    "code": 401
}
Response will appear here.
POST /airtime/ Auth required Amount entered
Purchase airtime for any Nigerian network. Amount must be between ₦50 and ₦50,000.
ParameterTypeDescription
network* string One of mtn, airtel, glo, 9mobile
phone* string 11-digit Nigerian phone number
amount* number Airtime amount (₦50 – ₦50,000)
airtime_type string One of VTU, Share And Sell, Momo, Awoof. Defaults to VTU.
request
curl -X POST https://www.ikonect.com.ng.kumardata.com.ng/api/v1/airtime/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "network": "mtn",
    "phone": "08011111111",
    "amount": 50,
    "airtime_type": "VTU"
  }'
<?php
$payload = [
  'network' => 'mtn',
  'phone' => '08011111111',
  'amount' => 50,
  'airtime_type' => 'VTU',
];
$ch = curl_init('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/airtime/');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => json_encode($payload),
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json',
  ],
]);
$res = curl_exec($ch);
echo $res;
const res = await fetch('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/airtime/', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    network: 'mtn',
    phone: '08011111111',
    amount: 50,
    airtime_type: 'VTU',
  }),
});
console.log(await res.json());
import requests

r = requests.post(
    'https://www.ikonect.com.ng.kumardata.com.ng/api/v1/airtime/',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json',
    },
    json={
        'network': 'mtn',
        'phone': '08011111111',
        'amount': 50,
        'airtime_type': 'VTU',
    },
)
print(r.json())
{
    "success": true,
    "message": "Airtime purchase successful",
    "status": "successful",
    "reference": "AIRTIME_8381783723501",
    "transaction_id": "17837235038661705761406456",
    "amount": 50,
    "phone": "08011111111",
    "network": "mtn",
    "airtime_type": "VTU",
    "transaction_date": "2026-07-10T22:45:03.000000Z"
}
{
    "error": "Invalid phone number",
    "code": 400
}
{
    "error": "Insufficient balance",
    "code": 402
}
Response will appear here.
GET /dataplans/ Free
Retrieve all active data plans in an Inlomax-compatible structure. Use the returned serviceID when purchasing data. Supports optional filters.
ParameterTypeDescription
network string Filter by network (mtn, airtel, glo, 9mobile)
category string Filter by data type (AWOOF, CORPORATE GIFTING, SOCIAL BUNDLES)
request
curl https://www.ikonect.com.ng.kumardata.com.ng/api/v1/dataplans/ \
  -H "Authorization: Bearer YOUR_API_KEY"
<?php
$ch = curl_init('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/dataplans/?network=mtn');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY'],
]);
echo curl_exec($ch);
const res = await fetch('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/dataplans/?network=mtn', {
  headers: { 'Authorization': 'Bearer YOUR_API_KEY' },
});
console.log(await res.json());
import requests

r = requests.get(
    'https://www.ikonect.com.ng.kumardata.com.ng/api/v1/dataplans/',
    params={'network': 'mtn'},
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
print(r.json())
{
    "success": true,
    "message": "Data plans fetched successfully",
    "dataPlans": [
        {
            "serviceID": "35",
            "network": "GLO",
            "dataPlan": "500MB",
            "amount": "213.00",
            "dataType": "CORPORATE GIFTING",
            "validity": "30 Days"
        },
        {
            "serviceID": "97",
            "network": "MTN",
            "dataPlan": "500MB",
            "amount": "323.00",
            "dataType": "DATA SHARE",
            "validity": "7 Days"
        }
    ]
}
Response will appear here.
POST /data/ Auth required Plan-dependent
Purchase a data plan. Use the serviceID returned by /dataplans/ as data_plan. Both standard and Inlomax/Topupmate-compatible field names are accepted.
ParameterTypeDescription
data_plan* string Plan serviceID from /dataplans/
phone* string 11-digit Nigerian phone number
network string Optional if the plan is unambiguous
ref string Optional client reference (auto-generated)
request
curl -X POST https://www.ikonect.com.ng.kumardata.com.ng/api/v1/data/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "network": "mtn",
    "phone": "08065849433",
    "data_plan": "293"
  }'
<?php
$payload = ['network' => 'mtn', 'phone' => '08065849433', 'data_plan' => '293'];
$ch = curl_init('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/data/');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => json_encode($payload),
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json',
  ],
]);
echo curl_exec($ch);
const res = await fetch('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/data/', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    network: 'mtn',
    phone: '08065849433',
    data_plan: '293',
  }),
});
console.log(await res.json());
import requests

r = requests.post(
    'https://www.ikonect.com.ng.kumardata.com.ng/api/v1/data/',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json',
    },
    json={'network': 'mtn', 'phone': '08065849433', 'data_plan': '293'},
)
print(r.json())
{
    "success": true,
    "status": "successful",
    "reference": "DATA_20260710230247_12345",
    "product_name": "MTN 1GB - 30 Days",
    "amount": 950,
    "phone": "08065849433",
    "network": "mtn",
    "data_plan_id": "293",
    "transaction_date": "2026-07-11 16:20:33"
}
{
    "success": true,
    "status": "pending",
    "message": "Transaction is being processed. Check status shortly.",
    "reference": "DATA_1789676836_1680",
    "amount": 1104,
    "phone": "08063754508",
    "network": "mtn"
}
{
    "error": "Invalid data plan",
    "code": 400
}
Response will appear here.
GET /services/ Free
Fetch all active TV subscription plans and Electricity (DISCO) services in a single call. Ideal for building checkout UIs — pull once, cache, and render.
ParameterTypeDescription
type string Filter by service type: all, tv, electricity (default: all)
provider string Filter TV by provider (dstv, gotv, startimes) or electricity by serviceID
request
curl https://www.ikonect.com.ng.kumardata.com.ng/api/v1/services/ \
  -H "Authorization: Bearer YOUR_API_KEY"
<?php
$ch = curl_init('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/services/');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY'],
]);
echo curl_exec($ch);
const res = await fetch('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/services/', {
  headers: { 'Authorization': 'Bearer YOUR_API_KEY' },
});
const { tvPlans, electricity } = await res.json();
import requests

r = requests.get(
    'https://www.ikonect.com.ng.kumardata.com.ng/api/v1/services/',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
)
print(r.json())
{
    "success": true,
    "message": "Services fetched successfully",
    "tvPlans": [
        {
            "plan_id": 6,
            "provider": "dstv",
            "planName": "DStv Padi",
            "amount": "4800.00"
        },
        {
            "plan_id": 7,
            "provider": "gotv",
            "planName": "GOtv Smallie",
            "amount": "2500.00"
        },
        {
            "plan_id": 11,
            "provider": "gotv",
            "planName": "GOtv Max",
            "amount": "9000.00"
        },
        {
            "plan_id": 12,
            "provider": "startimes",
            "planName": "Startimes Nova",
            "amount": "1000.00"
        }
    ],
    "electricity": [
        {
            "serviceID": "aba-electric",
            "name": "Aba Electric (ABA)"
        },
        {
            "serviceID": "abuja-electric",
            "name": "Abuja Electric (AEDC)"
        },
        {
            "serviceID": "ikeja-electric",
            "name": "Ikeja Electric (IKEDC)"
        }
    ]
}
Response will appear here.
POST /tv/verify Free Verification
Validate a smartcard / IUC number and fetch the current bouquet details before subscribing. Always call this before /tv/ to show the customer what they're paying for.
ParameterTypeDescription
provider* string One of dstv, gotv, startimes, showmax
smartcard_number* string Smartcard / IUC number
request
curl -X POST https://www.ikonect.com.ng.kumardata.com.ng/api/v1/tv/verify \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "dstv",
    "smartcard_number": "1212121212"
  }'
<?php
$payload = ['provider' => 'dstv', 'smartcard_number' => '1212121212'];
$ch = curl_init('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/tv/verify');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => json_encode($payload),
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json',
  ],
]);
echo curl_exec($ch);
const res = await fetch('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/tv/verify', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    provider: 'dstv',
    smartcard_number: '1212121212',
  }),
});
console.log(await res.json());
import requests

r = requests.post(
    'https://www.ikonect.com.ng.kumardata.com.ng/api/v1/tv/verify',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json',
    },
    json={'provider': 'dstv', 'smartcard_number': '1212121212'},
)
print(r.json())
{
    "success": true,
    "message": "Smartcard verified successfully",
    "verified": true,
    "customer_name": "TEST METER",
    "current_bouquet": "N/A",
    "due_date": "2025-02-06T00:00:00",
    "renewal_amount": null,
    "smartcard_number": "1212121212",
    "provider": "dstv"
}
{
    "error": "Verification failed",
    "code": 400
}
Response will appear here.
POST /tv/ Auth required Plan-dependent
Subscribe a smartcard / IUC to a TV bouquet. Use the integer plan_id returned by /services/.
ParameterTypeDescription
provider* string One of dstv, gotv, startimes, showmax
smartcard_number* string Smartcard / IUC number
plan_id* integer Integer plan ID from /services/ (e.g. 6)
phone* string Contact phone for the receipt SMS
request
curl -X POST https://www.ikonect.com.ng.kumardata.com.ng/api/v1/tv/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "dstv",
    "smartcard_number": "1212121212",
    "plan_id": 6,
    "phone": "08105314004"
  }'
<?php
$payload = [
  'provider' => 'dstv',
  'smartcard_number' => '1212121212',
  'plan_id' => 6,
  'phone' => '08105314004',
];
$ch = curl_init('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/tv/');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => json_encode($payload),
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json',
  ],
]);
echo curl_exec($ch);
const res = await fetch('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/tv/', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    provider: 'dstv',
    smartcard_number: '1212121212',
    plan_id: 6,
    phone: '08105314004',
  }),
});
console.log(await res.json());
import requests

r = requests.post(
    'https://www.ikonect.com.ng.kumardata.com.ng/api/v1/tv/',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json',
    },
    json={
        'provider': 'dstv',
        'smartcard_number': '1212121212',
        'plan_id': 6,
        'phone': '08105314004',
    },
)
print(r.json())
{
    "success": true,
    "message": "TV subscription successful",
    "status": "successful",
    "reference": "TV_20260710225259_96097",
    "transaction_id": "17837239798629626427856639",
    "amount": 4800,
    "customer_name": "TEST METER",
    "smartcard_number": "1212121212",
    "provider": "dstv",
    "plan_name": "DStv Padi"
}
{
    "error": "Invalid smartcard number",
    "code": 400
}
Response will appear here.
POST /electricity/verify Free Verification
Validate a meter number and fetch the customer name, address, and tariff before payment.
ParameterTypeDescription
disco* string DISCO serviceID. Both ikeja-electric and its short form ikeja are accepted.
meter_number* string Meter / account number
meter_type* string prepaid or postpaid
request
curl -X POST https://www.ikonect.com.ng.kumardata.com.ng/api/v1/electricity/verify \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "disco": "ikeja-electric",
    "meter_number": "1111111111111",
    "meter_type": "prepaid"
  }'
<?php
$payload = [
  'disco' => 'ikeja-electric',
  'meter_number' => '1111111111111',
  'meter_type' => 'prepaid',
];
$ch = curl_init('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/electricity/verify');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => json_encode($payload),
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json',
  ],
]);
echo curl_exec($ch);
const res = await fetch('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/electricity/verify', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    disco: 'ikeja-electric',
    meter_number: '1111111111111',
    meter_type: 'prepaid',
  }),
});
console.log(await res.json());
import requests

r = requests.post(
    'https://www.ikonect.com.ng.kumardata.com.ng/api/v1/electricity/verify',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json',
    },
    json={
        'disco': 'ikeja-electric',
        'meter_number': '1111111111111',
        'meter_type': 'prepaid',
    },
)
print(r.json())
{
    "success": true,
    "message": "Meter verified successfully",
    "verified": true,
    "customer_name": "TESTMETER1",
    "address": "ABULE EGBA BU ABULE",
    "meter_number": "1111111111111",
    "meter_type": "PREPAID",
    "minimum_purchase": "",
    "outstanding_balance": null
}
{
    "error": "Verification failed",
    "code": 400
}
Response will appear here.
POST /electricity/ Auth required Amount entered
Pay an electricity bill. Use the serviceID from /services/ as the disco parameter.
ParameterTypeDescription
disco* string DISCO serviceID from /services/. Both the full form (ikeja-electric) and its short alias (ikeja) are accepted.
meter_number* string Customer meter / account number
amount* number Payment amount in Naira
phone* string Contact phone for the token SMS
meter_type* string prepaid or postpaid
request
curl -X POST https://www.ikonect.com.ng.kumardata.com.ng/api/v1/electricity/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "disco": "ikeja-electric",
    "meter_number": "1111111111111",
    "amount": 1000,
    "phone": "08105314004",
    "meter_type": "prepaid"
  }'
<?php
$payload = [
  'disco' => 'ikeja-electric',
  'meter_number' => '1111111111111',
  'amount' => 1000,
  'phone' => '08105314004',
  'meter_type' => 'prepaid',
];
$ch = curl_init('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/electricity/');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => json_encode($payload),
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json',
  ],
]);
echo curl_exec($ch);
const res = await fetch('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/electricity/', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    disco: 'ikeja-electric',
    meter_number: '1111111111111',
    amount: 1000,
    phone: '08105314004',
    meter_type: 'prepaid',
  }),
});
console.log(await res.json());
import requests

r = requests.post(
    'https://www.ikonect.com.ng.kumardata.com.ng/api/v1/electricity/',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json',
    },
    json={
        'disco': 'ikeja-electric',
        'meter_number': '1111111111111',
        'amount': 1000,
        'phone': '08105314004',
        'meter_type': 'prepaid',
    },
)
print(r.json())
{
    "success": true,
    "message": "Electricity payment successful",
    "status": "successful",
    "reference": "ELEC_20260710224415_52398",
    "transaction_id": "17837234556263589762807872",
    "amount": 1000,
    "meter_number": "1111111111111",
    "disco": "ikeja-electric",
    "token": "26362054405982757802"
}
{
    "error": "Meter not found",
    "code": 400
}
Response will appear here.
POST /transaction/ Free Status Check
Look up the current state of any transaction — data, airtime, electricity, or TV — by its reference. Useful for polling after a 202 Accepted response, or for recovering from a lost connection after a purchase.
ParameterTypeDescription
reference* string The reference returned by the original purchase request
request
curl -X POST https://www.ikonect.com.ng.kumardata.com.ng/api/v1/transaction/ \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "reference": "DATA_1789676836_1680"
  }'
<?php
$ch = curl_init('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/transaction/');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => json_encode(['reference' => 'DATA_1789676836_1680']),
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json',
  ],
]);
echo curl_exec($ch);
const res = await fetch('https://www.ikonect.com.ng.kumardata.com.ng/api/v1/transaction/', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ reference: 'DATA_1789676836_1680' }),
});
console.log(await res.json());
import requests

r = requests.post(
    'https://www.ikonect.com.ng.kumardata.com.ng/api/v1/transaction/',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json',
    },
    json={'reference': 'DATA_1789676836_1680'},
)
print(r.json())
{
    "success": true,
    "message": "Transaction found.",
    "transaction": {
        "type": "data",
        "reference": "DATA_1789676836_1680",
        "status": "success",
        "amount": 1104,
        "phone": "08063754508",
        "created_at": "2026-09-17 20:27:29",
        "network": "mtn",
        "plan_name": "3GB",
        "provider_reference": "INL|F7CCN4HP15REE2ZFEGLK19R2P"
    }
}
{
    "error": "No transaction found with that reference for your account.",
    "code": 404
}
Response will appear here.
Reference

HTTP Status Codes

Every response carries a standard HTTP status code. 2xx codes mean the request was accepted. 4xx codes mean something was wrong with the request. 5xx codes mean something went wrong on our side or with an upstream provider.

CodeMeaningDescription
200OKRequest succeeded. The transaction is complete — check the status field for successful.
202AcceptedTransaction is being processed by the provider. Not yet final — you'll need to check status shortly. See the note below.
400Bad RequestInvalid or missing parameters, unsupported plan/provider, duplicate reference, or the transaction failed at the provider.
401UnauthorizedMissing or invalid API key.
402Insufficient BalanceWallet balance too low to complete the transaction.
403ForbiddenYour IP is not in the whitelist configured for this API key.
404Not FoundThe requested resource, plan, or transaction does not exist.
405Method Not AllowedWrong HTTP verb — e.g. GET on a POST-only endpoint.
429Rate LimitedToo many requests in the current window. Slow down and retry.
500Server ErrorSomething broke on our end. The transaction was not charged.
503Service UnavailableUpstream provider (VTpass / Inlomax) is temporarily unreachable. Retry in a few seconds.
Handling 202 Accepted: Some providers (notably data purchases) occasionally return a processing state instead of an immediate outcome. In that case the request returns 202 with "status": "pending" and the wallet is charged. Poll POST /transaction/ with the returned reference to fetch the final state, or wait for the automatic reconciliation to complete. Always store the reference returned so you can query the outcome later.

Error response shape

All 4xx and 5xx errors return a JSON object with an error message and an code field equal to the HTTP status.

error-response.json
{
  "error": "Insufficient balance",
  "code": 402
}

Pending response shape

When a provider returns a processing state, the response uses 202 and looks like a normal success — but the transaction is not yet final.

pending-response.json
{
  "success": true,
  "status": "pending",
  "message": "Transaction is being processed. Check status shortly.",
  "reference": "DATA_1789676836_1680",
  "amount": 1104,
  "phone": "08063754508",
  "network": "mtn"
}
Get Help

We're here to help