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.
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.
curl https://www.ikonect.com.ng.kumardata.com.ng/api/v1/balance/ \
-H "Authorization: Bearer YOUR_API_KEY"
API Keys
Every request must include an API key. We accept four header formats so you can drop us straight into existing integrations:
Authorization: Bearer YOUR_API_KEY
Authorization: Token YOUR_API_KEY
X-API-Key: YOUR_API_KEY
Token: YOUR_API_KEY
Endpoint Root
All endpoints are relative to this base URL. Example: /data/ → https://www.ikonect.com.ng.kumardata.com.ng/api/v1/data/
https://www.ikonect.com.ng.kumardata.com.ng/api/v1/
Service Fees
Fees are deducted from your wallet only on successful API calls. Failed requests cost nothing.
Endpoints
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
}
| Parameter | Type | Description |
|---|---|---|
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. |
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
}
serviceID when purchasing data. Supports optional filters.| Parameter | Type | Description |
|---|---|---|
network |
string | Filter by network (mtn, airtel, glo, 9mobile) |
category |
string | Filter by data type (AWOOF, CORPORATE GIFTING, SOCIAL BUNDLES) |
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"
}
]
}
serviceID returned by /dataplans/ as data_plan. Both standard and Inlomax/Topupmate-compatible field names are accepted.| Parameter | Type | Description |
|---|---|---|
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) |
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
}
| Parameter | Type | Description |
|---|---|---|
type |
string | Filter by service type: all, tv, electricity (default: all) |
provider |
string | Filter TV by provider (dstv, gotv, startimes) or electricity by serviceID |
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)"
}
]
}
/tv/ to show the customer what they're paying for.| Parameter | Type | Description |
|---|---|---|
provider* |
string | One of dstv, gotv, startimes, showmax |
smartcard_number* |
string | Smartcard / IUC number |
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
}
plan_id returned by /services/.| Parameter | Type | Description |
|---|---|---|
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 |
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
}
| Parameter | Type | Description |
|---|---|---|
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 |
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
}
| Parameter | Type | Description |
|---|---|---|
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 |
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
}
reference. Useful for polling after a 202 Accepted response, or for recovering from a lost connection after a purchase.| Parameter | Type | Description |
|---|---|---|
reference* |
string | The reference returned by the original purchase 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
}
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.
| Code | Meaning | Description |
|---|---|---|
200 | OK | Request succeeded. The transaction is complete — check the status field for successful. |
202 | Accepted | Transaction is being processed by the provider. Not yet final — you'll need to check status shortly. See the note below. |
400 | Bad Request | Invalid or missing parameters, unsupported plan/provider, duplicate reference, or the transaction failed at the provider. |
401 | Unauthorized | Missing or invalid API key. |
402 | Insufficient Balance | Wallet balance too low to complete the transaction. |
403 | Forbidden | Your IP is not in the whitelist configured for this API key. |
404 | Not Found | The requested resource, plan, or transaction does not exist. |
405 | Method Not Allowed | Wrong HTTP verb — e.g. GET on a POST-only endpoint. |
429 | Rate Limited | Too many requests in the current window. Slow down and retry. |
500 | Server Error | Something broke on our end. The transaction was not charged. |
503 | Service Unavailable | Upstream provider (VTpass / Inlomax) is temporarily unreachable. Retry in a few seconds. |
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": "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.
{
"success": true,
"status": "pending",
"message": "Transaction is being processed. Check status shortly.",
"reference": "DATA_1789676836_1680",
"amount": 1104,
"phone": "08063754508",
"network": "mtn"
}