OniData Developer API
Let your own website or app sell data, airtime, cable TV, electricity, exam pins and recharge cards — powered by our network, paid from your wallet balance.
Base URL · https://myrabbithq.info/api/v1
Introduction
A simple JSON REST API. Every purchase is debited from the wallet balance of the account that owns the API key, at the same prices shown on our website.
🔐 Approval only Access is granted by our team after you submit a request.
🌐 IP locked Calls work only from the server IPs you whitelist (max 5).
🧩 Per-service access You can call only the services we approved for you.
♻️ Safe retries Send a client_reference to prevent double charges.
Server-side only. Never put your API key in a mobile app, browser JavaScript or a public repository. Call the API from your backend.
Getting access
Create an account and log in, then open Developer API in your dashboard.
Submit the access form: your website link, the services you want (data, airtime, cable, electricity, exam pins, recharge cards) and your server IP address(es).
Wait for approval. You get an email and an in-app notice when we approve or decline. Our team may approve only some of the services you asked for.
Generate your API key (confirmed with a one-time code) and copy it — it is shown once.
Fund your wallet and start calling the API from your whitelisted server.
Later you can add or remove whitelisted IPs (up to 5) and change your services from the same page. Every IP change, service change and key generation is confirmed with a one-time code sent to your email. IP changes apply immediately; service changes are sent to our team for re-approval and your current services stay active until then.
Authentication
Send your API key on every request using either header:
Authorization: Bearer YOUR_API_KEYrecommended X-API-Key: YOUR_API_KEYalternative
Requests accept application/json bodies (or standard form fields). All responses are JSON. Rate limit: 60 requests per minute per account (429 RATE_LIMITED when exceeded).
Two open endpoints need no key:
Health check
Returns ok when the API is online.
cURL PHP Node.js Python
Copy curl -X GET "https://myrabbithq.info/api/v1/ping" \
-H "Authorization: Bearer YOUR_API_KEY"Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/ping");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/ping", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
});
console.log(await res.json());Copy import requests
res = requests.request(
"GET", "https://myrabbithq.info/api/v1/ping",
headers={"Authorization": "Bearer YOUR_API_KEY"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "OniData API v1 is online.",
"data": {
"version": "v1"
}
}
Find your server IP
Returns the IP address our server sees for your request. Run this from your server , then whitelist that IP in your dashboard.
cURL PHP Node.js Python
Copy curl -X GET "https://myrabbithq.info/api/v1/my-ip" \
-H "Authorization: Bearer YOUR_API_KEY"Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/my-ip");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/my-ip", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
});
console.log(await res.json());Copy import requests
res = requests.request(
"GET", "https://myrabbithq.info/api/v1/my-ip",
headers={"Authorization": "Bearer YOUR_API_KEY"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "This is the IP address our server sees for your request. Whitelist it under API Access.",
"data": {
"ip": "102.89.12.34"
}
}
IP whitelisting
Every call is checked against the server IPs you registered. If a request comes from any other IP, we refuse it and tell you the IP we saw in the JSON, so you can add it:
Response 403 Forbidden
{
"ok": false,
"code": "IP_NOT_WHITELISTED",
"message": "This request came from IP 197.210.54.8, which is not whitelisted on your account. Add it under API Access \u2192 Whitelisted IPs.",
"your_ip": "197.210.54.8",
"whitelisted_ips": 1
}
Check order on every call: API key → account active → access approved → IP whitelisted → rate limit → service approved . Servers behind a proxy or with several outgoing IPs (IPv4/IPv6) should whitelist each outgoing address.
Avoiding double purchases
Add your own unique client_reference (6–64 characters: letters, numbers, . - _) to any purchase call. If you send the same reference again — for example after a timeout — we return the original result with "duplicate": true and do not charge again. A purchase that failed (and was refunded) can be retried with the same reference.
You can look a transaction up by either reference: GET /transaction?reference=OUR_REF or GET /transaction?client_reference=YOUR_REF.
Account & status
Account details
Your wallet balance, the services approved for you, any service change awaiting review, and the IP we see.
cURL PHP Node.js Python
Copy curl -X GET "https://myrabbithq.info/api/v1/account" \
-H "Authorization: Bearer YOUR_API_KEY"Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/account");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/account", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
});
console.log(await res.json());Copy import requests
res = requests.request(
"GET", "https://myrabbithq.info/api/v1/account",
headers={"Authorization": "Bearer YOUR_API_KEY"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Account details.",
"data": {
"name": "Ada Obi",
"wallet_balance": 25000.5,
"approved_services": [
"data",
"airtime"
],
"services_pending_review": [
"cable"
],
"your_ip": "102.89.12.34"
}
}
Check a transaction
Fetch the current status of any purchase made through the API.
Field Type Required Description
referencestring No Our reference returned by the purchase call. client_referencestring No The reference you supplied. Send one of the two.
cURL PHP Node.js Python
Copy curl -X GET "https://myrabbithq.info/api/v1/transaction?reference=DATA261012093011A1B2C3" \
-H "Authorization: Bearer YOUR_API_KEY"Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/transaction?reference=DATA261012093011A1B2C3");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/transaction?reference=DATA261012093011A1B2C3", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
});
console.log(await res.json());Copy import requests
res = requests.request(
"GET", "https://myrabbithq.info/api/v1/transaction?reference=DATA261012093011A1B2C3",
headers={"Authorization": "Bearer YOUR_API_KEY"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Transaction found.",
"data": {
"reference": "DATA261012093011A1B2C3",
"status": "success",
"service": "data",
"amount": 275,
"recipient": "08031234567",
"network": "mtn",
"description": "MTN 1GB (30 days) \u2013 08031234567",
"wallet_balance_after": 24725.5,
"created_at": "2026-10-12 09:30:11"
}
}
Data
List data plans
All active plans with the plan_id you use to buy. Filter by network. Live IDs are also listed under Plan IDs & codes .
Field Type Required Description
networkstring No mtn, airtel, glo or 9mobile.
cURL PHP Node.js Python
Copy curl -X GET "https://myrabbithq.info/api/v1/data/plans?network=mtn" \
-H "Authorization: Bearer YOUR_API_KEY"Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/data/plans?network=mtn");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/data/plans?network=mtn", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
});
console.log(await res.json());Copy import requests
res = requests.request(
"GET", "https://myrabbithq.info/api/v1/data/plans?network=mtn",
headers={"Authorization": "Bearer YOUR_API_KEY"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Data plans.",
"data": [
{
"plan_id": 12,
"network": "mtn",
"name": "MTN 1GB",
"size": "1GB",
"validity": "30 days",
"type": "sme",
"price": 275
}
]
}
Buy data
Debits your wallet and delivers the bundle.
Field Type Required Description
plan_idinteger Yes From data/plans. phonestring Yes Recipient number, e.g. 08031234567 or 2348031234567. client_referencestring No Your unique reference (see double purchases ).
cURL PHP Node.js Python
Copy curl -X POST "https://myrabbithq.info/api/v1/data/purchase" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"plan_id":12,"phone":"08031234567","client_reference":"order-10045"}'Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/data/purchase");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(['plan_id' => 12, 'phone' => '08031234567', 'client_reference' => 'order-10045']),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/data/purchase", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
"plan_id": 12,
"phone": "08031234567",
"client_reference": "order-10045"
})
});
console.log(await res.json());Copy import requests
res = requests.request(
"POST", "https://myrabbithq.info/api/v1/data/purchase",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"plan_id": 12, "phone": "08031234567", "client_reference": "order-10045"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Purchase successful.",
"data": {
"reference": "REF261012093011A1B2C3",
"status": "success",
"service": "data",
"amount": 275,
"recipient": "08031234567",
"wallet_balance_after": 0,
"created_at": "2026-10-12 09:30:11",
"network": "mtn",
"description": "MTN 1GB \u2013 08031234567",
"network_response": "Dear Customer, you have successfully shared 1GB data to 08031234567.",
"client_reference": "order-10045"
}
}
Airtime
GET /airtime/networksAirtime
List airtime networks
Minimum/maximum amount and the discount you get. You pay amount × (1 − discount_percent ÷ 100).
cURL PHP Node.js Python
Copy curl -X GET "https://myrabbithq.info/api/v1/airtime/networks" \
-H "Authorization: Bearer YOUR_API_KEY"Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/airtime/networks");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/airtime/networks", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
});
console.log(await res.json());Copy import requests
res = requests.request(
"GET", "https://myrabbithq.info/api/v1/airtime/networks",
headers={"Authorization": "Bearer YOUR_API_KEY"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Airtime networks.",
"data": [
{
"network": "mtn",
"min_amount": 50,
"max_amount": 50000,
"discount_percent": 3
}
]
}
POST /airtime/purchaseAirtime
Buy airtime
The amount is the airtime value delivered to the phone; your wallet is charged the discounted price.
Field Type Required Description
networkstring Yes mtn, airtel, glo, 9mobile.phonestring Yes Recipient number. amountnumber Yes Airtime value in ₦ (within the min/max). client_referencestring No Your unique reference.
cURL PHP Node.js Python
Copy curl -X POST "https://myrabbithq.info/api/v1/airtime/purchase" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"network":"mtn","phone":"08031234567","amount":500,"client_reference":"airtime-7781"}'Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/airtime/purchase");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(['network' => 'mtn', 'phone' => '08031234567', 'amount' => 500, 'client_reference' => 'airtime-7781']),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/airtime/purchase", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
"network": "mtn",
"phone": "08031234567",
"amount": 500,
"client_reference": "airtime-7781"
})
});
console.log(await res.json());Copy import requests
res = requests.request(
"POST", "https://myrabbithq.info/api/v1/airtime/purchase",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"network": "mtn", "phone": "08031234567", "amount": 500, "client_reference": "airtime-7781"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Purchase successful.",
"data": {
"reference": "REF261012093011A1B2C3",
"status": "success",
"service": "airtime",
"amount": 485,
"recipient": "08031234567",
"wallet_balance_after": 0,
"created_at": "2026-10-12 09:30:11",
"network": "mtn",
"description": "MTN \u20a6500.00 airtime \u2013 08031234567",
"client_reference": "airtime-7781"
}
}
Cable TV
Validate the smartcard first, show the customer name to your user, then subscribe.
GET /cable/providersCable TV
List providers
Active cable providers.
cURL PHP Node.js Python
Copy curl -X GET "https://myrabbithq.info/api/v1/cable/providers" \
-H "Authorization: Bearer YOUR_API_KEY"Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/cable/providers");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/cable/providers", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
});
console.log(await res.json());Copy import requests
res = requests.request(
"GET", "https://myrabbithq.info/api/v1/cable/providers",
headers={"Authorization": "Bearer YOUR_API_KEY"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Cable providers.",
"data": [
{
"provider": "dstv",
"label": "DSTv"
},
{
"provider": "gotv",
"label": "GOtv"
}
]
}
List plans
Plans (bouquets) for a provider.
Field Type Required Description
providerstring Yes dstv, gotv, startimes, showmax.
cURL PHP Node.js Python
Copy curl -X GET "https://myrabbithq.info/api/v1/cable/plans?provider=dstv" \
-H "Authorization: Bearer YOUR_API_KEY"Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/cable/plans?provider=dstv");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/cable/plans?provider=dstv", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
});
console.log(await res.json());Copy import requests
res = requests.request(
"GET", "https://myrabbithq.info/api/v1/cable/plans?provider=dstv",
headers={"Authorization": "Bearer YOUR_API_KEY"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Cable plans.",
"data": [
{
"plan_id": 5,
"provider": "dstv",
"name": "DStv Compact",
"validity": "30 days",
"price": 15700
}
]
}
POST /cable/verifyCable TV
Validate a smartcard / IUC
Returns the account holder name. Always validate before purchasing.
Field Type Required Description
providerstring Yes Provider code. smartcardstring Yes Smartcard / IUC number (8–15 digits).
cURL PHP Node.js Python
Copy curl -X POST "https://myrabbithq.info/api/v1/cable/verify" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"provider":"dstv","smartcard":"7012345678"}'Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/cable/verify");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(['provider' => 'dstv', 'smartcard' => '7012345678']),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/cable/verify", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
"provider": "dstv",
"smartcard": "7012345678"
})
});
console.log(await res.json());Copy import requests
res = requests.request(
"POST", "https://myrabbithq.info/api/v1/cable/verify",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"provider": "dstv", "smartcard": "7012345678"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Smartcard verified.",
"data": {
"provider": "dstv",
"smartcard": "7012345678",
"customer_name": "ADA OBI"
}
}
POST /cable/purchaseCable TV
Subscribe
Pays the bouquet for the smartcard.
Field Type Required Description
plan_idinteger Yes From cable/plans. smartcardstring Yes Smartcard / IUC number. customer_namestring No Name returned by cable/verify (stored on the receipt). client_referencestring No Your unique reference.
cURL PHP Node.js Python
Copy curl -X POST "https://myrabbithq.info/api/v1/cable/purchase" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"plan_id":5,"smartcard":"7012345678","customer_name":"ADA OBI","client_reference":"tv-2290"}'Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/cable/purchase");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(['plan_id' => 5, 'smartcard' => '7012345678', 'customer_name' => 'ADA OBI', 'client_reference' => 'tv-2290']),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/cable/purchase", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
"plan_id": 5,
"smartcard": "7012345678",
"customer_name": "ADA OBI",
"client_reference": "tv-2290"
})
});
console.log(await res.json());Copy import requests
res = requests.request(
"POST", "https://myrabbithq.info/api/v1/cable/purchase",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"plan_id": 5, "smartcard": "7012345678", "customer_name": "ADA OBI", "client_reference": "tv-2290"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Purchase successful.",
"data": {
"reference": "REF261012093011A1B2C3",
"status": "success",
"service": "cable_tv",
"amount": 15700,
"recipient": "7012345678",
"wallet_balance_after": 0,
"created_at": "2026-10-12 09:30:11",
"description": "DSTV DStv Compact \u2013 7012345678",
"client_reference": "tv-2290"
}
}
Electricity
Validate the meter first, then purchase. Prepaid purchases return the meter token.
GET /electricity/discosElectricity
List distribution companies
Active DisCos with their minimum/maximum purchase amount.
cURL PHP Node.js Python
Copy curl -X GET "https://myrabbithq.info/api/v1/electricity/discos" \
-H "Authorization: Bearer YOUR_API_KEY"Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/electricity/discos");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/electricity/discos", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
});
console.log(await res.json());Copy import requests
res = requests.request(
"GET", "https://myrabbithq.info/api/v1/electricity/discos",
headers={"Authorization": "Bearer YOUR_API_KEY"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Electricity distribution companies. meter_type is \"prepaid\" or \"postpaid\".",
"data": [
{
"disco": "ikedc",
"name": "Ikeja Electric",
"min_amount": 500,
"max_amount": 200000
}
]
}
POST /electricity/verifyElectricity
Validate a meter
Returns the customer name and address registered to the meter.
Field Type Required Description
discostring Yes DisCo code from electricity/discos. meterstring Yes Meter number. meter_typestring Yes prepaid or postpaid.
cURL PHP Node.js Python
Copy curl -X POST "https://myrabbithq.info/api/v1/electricity/verify" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"disco":"ikedc","meter":"45012345678","meter_type":"prepaid"}'Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/electricity/verify");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(['disco' => 'ikedc', 'meter' => '45012345678', 'meter_type' => 'prepaid']),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/electricity/verify", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
"disco": "ikedc",
"meter": "45012345678",
"meter_type": "prepaid"
})
});
console.log(await res.json());Copy import requests
res = requests.request(
"POST", "https://myrabbithq.info/api/v1/electricity/verify",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"disco": "ikedc", "meter": "45012345678", "meter_type": "prepaid"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Meter verified.",
"data": {
"disco": "ikedc",
"meter": "45012345678",
"meter_type": "prepaid",
"customer_name": "ADA OBI",
"address": "12 Allen Ave, Ikeja"
}
}
POST /electricity/purchaseElectricity
Buy electricity
Vends units to the meter.
Field Type Required Description
discostring Yes DisCo code. meterstring Yes Meter number. meter_typestring Yes prepaid or postpaid.phonestring Yes Customer phone (token SMS). amountnumber Yes Amount in ₦ (within the DisCo min/max). customer_namestring No Name from electricity/verify. client_referencestring No Your unique reference.
If a DisCo is handled manually by our team, the response is "status": "pending" with no token yet. Poll GET /transaction — the token appears once the order is completed.
cURL PHP Node.js Python
Copy curl -X POST "https://myrabbithq.info/api/v1/electricity/purchase" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"disco":"ikedc","meter":"45012345678","meter_type":"prepaid","phone":"08031234567","amount":5000,"customer_name":"ADA OBI","client_reference":"pwr-5521"}'Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/electricity/purchase");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(['disco' => 'ikedc', 'meter' => '45012345678', 'meter_type' => 'prepaid', 'phone' => '08031234567', 'amount' => 5000, 'customer_name' => 'ADA OBI', 'client_reference' => 'pwr-5521']),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/electricity/purchase", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
"disco": "ikedc",
"meter": "45012345678",
"meter_type": "prepaid",
"phone": "08031234567",
"amount": 5000,
"customer_name": "ADA OBI",
"client_reference": "pwr-5521"
})
});
console.log(await res.json());Copy import requests
res = requests.request(
"POST", "https://myrabbithq.info/api/v1/electricity/purchase",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"disco": "ikedc", "meter": "45012345678", "meter_type": "prepaid", "phone": "08031234567", "amount": 5000, "customer_name": "ADA OBI", "client_reference": "pwr-5521"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Purchase successful.",
"data": {
"reference": "REF261012093011A1B2C3",
"status": "success",
"service": "electricity",
"amount": 5000,
"recipient": "45012345678",
"wallet_balance_after": 0,
"created_at": "2026-10-12 09:30:11",
"description": "IKEDC prepaid \u20a65,000.00 | Meter: 45012345678",
"token": "1234-5678-9012-3456-7890",
"client_reference": "pwr-5521"
}
}
Exam pins
List exam pin plans
WAEC, NECO, JAMB and NABTEB plans.
Field Type Required Description
exam_typestring No waec, neco, jamb, nabteb.
cURL PHP Node.js Python
Copy curl -X GET "https://myrabbithq.info/api/v1/exam/plans?exam_type=waec" \
-H "Authorization: Bearer YOUR_API_KEY"Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/exam/plans?exam_type=waec");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/exam/plans?exam_type=waec", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
});
console.log(await res.json());Copy import requests
res = requests.request(
"GET", "https://myrabbithq.info/api/v1/exam/plans?exam_type=waec",
headers={"Authorization": "Bearer YOUR_API_KEY"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Exam pin plans.",
"data": [
{
"plan_id": 3,
"exam_type": "waec",
"name": "WAEC Result Checker",
"price": 3500
}
]
}
POST /exam/purchaseExam pins
Buy exam pins
Returns the pins/serials in data.pins (or later via GET /transaction if the order is pending).
Field Type Required Description
plan_idinteger Yes From exam/plans. phonestring Yes Customer phone number. quantityinteger No 1–10. Default 1. client_referencestring No Your unique reference.
cURL PHP Node.js Python
Copy curl -X POST "https://myrabbithq.info/api/v1/exam/purchase" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"plan_id":3,"phone":"08031234567","quantity":1,"client_reference":"exam-310"}'Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/exam/purchase");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(['plan_id' => 3, 'phone' => '08031234567', 'quantity' => 1, 'client_reference' => 'exam-310']),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/exam/purchase", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
"plan_id": 3,
"phone": "08031234567",
"quantity": 1,
"client_reference": "exam-310"
})
});
console.log(await res.json());Copy import requests
res = requests.request(
"POST", "https://myrabbithq.info/api/v1/exam/purchase",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"plan_id": 3, "phone": "08031234567", "quantity": 1, "client_reference": "exam-310"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Purchase successful.",
"data": {
"reference": "REF261012093011A1B2C3",
"status": "success",
"service": "exam",
"amount": 3500,
"recipient": "WAEC",
"wallet_balance_after": 0,
"created_at": "2026-10-12 09:30:11",
"pins": [
{
"pin": "123456789012",
"serial": "WRN123456789"
}
],
"client_reference": "exam-310"
}
}
Recharge card printing
GET /recharge/pricingRecharge cards
Unit prices
Price you pay per card for each network and denomination, plus how many cards are currently in stock (in_stock).
cURL PHP Node.js Python
Copy curl -X GET "https://myrabbithq.info/api/v1/recharge/pricing" \
-H "Authorization: Bearer YOUR_API_KEY"Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/recharge/pricing");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/recharge/pricing", {
method: "GET",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
});
console.log(await res.json());Copy import requests
res = requests.request(
"GET", "https://myrabbithq.info/api/v1/recharge/pricing",
headers={"Authorization": "Bearer YOUR_API_KEY"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Recharge card unit prices and available stock. Quantity per request: 1\u2013500.",
"data": [
{
"network": "mtn",
"denomination": 100,
"unit_price": 97,
"in_stock": 250
}
]
}
POST /recharge/purchaseRecharge cards
Generate cards
Takes real ePINs from our stock, debits unit_price × quantity and returns the PINs with their serial numbers. ePINs do not expire. If we hold fewer cards than you ask for, nothing is charged and the error says how many are left.
Field Type Required Description
networkstring Yes mtn, airtel, glo, 9mobile.denominationinteger Yes 50, 100, 200, 500 or 1000.quantityinteger Yes 1–500. client_referencestring No Your unique reference.
cURL PHP Node.js Python
Copy curl -X POST "https://myrabbithq.info/api/v1/recharge/purchase" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"network":"mtn","denomination":100,"quantity":2,"client_reference":"cards-88"}'Copy <?php
$ch = curl_init("https://myrabbithq.info/api/v1/recharge/purchase");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer YOUR_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(['network' => 'mtn', 'denomination' => 100, 'quantity' => 2, 'client_reference' => 'cards-88']),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);Copy const res = await fetch("https://myrabbithq.info/api/v1/recharge/purchase", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
"network": "mtn",
"denomination": 100,
"quantity": 2,
"client_reference": "cards-88"
})
});
console.log(await res.json());Copy import requests
res = requests.request(
"POST", "https://myrabbithq.info/api/v1/recharge/purchase",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"network": "mtn", "denomination": 100, "quantity": 2, "client_reference": "cards-88"}
)
print(res.json())
Response 200 OK
{
"ok": true,
"message": "Purchase successful.",
"data": {
"reference": "REF261012093011A1B2C3",
"status": "success",
"service": "recharge_card",
"amount": 194,
"recipient": "MTN",
"wallet_balance_after": 0,
"created_at": "2026-10-12 09:30:11",
"network": "mtn",
"description": "MTN \u20a6100 Recharge Cards \u00d7 2",
"pins": [
{
"pin": "1234567890123456",
"serial": "SN000001"
},
{
"pin": "6543210987654321",
"serial": "SN000002"
}
],
"client_reference": "cards-88"
}
}
Plan IDs & codes
Live reference from our system — these are the IDs to send. Prices are what your wallet is charged.
Network codes
Code Network
mtnMTN airtelAirtel gloGlo 9mobile9mobile
Data plans
MTN
plan_id Plan Size Validity Type Price
2MTN SME 1GB 1GB 30 Days sme ₦400.00 3MTN SME 2GB 2GB 30 Days sme ₦810.00
Airtime
network Min Max Discount
mtn₦50.00 ₦5,000.00 2% airtel₦50.00 ₦50,000.00 3% glo₦50.00 ₦50,000.00 3%
Cable TV
provider Name
dstvDSTv gotvGOtv startimesStarTimes showmaxShowmax
GOTV
plan_id Plan Validity Price
1Smallie 1 MONTH ₦2,500.00
Electricity (DisCo codes)
disco Company Min Max
ikedcIkeja Electric ₦500.00 ₦200,000.00 ekedcEko Electricity ₦500.00 ₦200,000.00 aedcAbuja Electricity ₦500.00 ₦200,000.00 ibedcIbadan Electricity ₦500.00 ₦200,000.00 phedcPort Harcourt Electric ₦500.00 ₦200,000.00 kaedcoKaduna Electricity ₦500.00 ₦100,000.00 kedcoKano Electricity ₦500.00 ₦100,000.00 jedJos Electricity ₦500.00 ₦100,000.00 bedcBenin Electricity ₦500.00 ₦100,000.00 eedcEnugu Electricity ₦500.00 ₦100,000.00
Meter types: prepaid, postpaid.
Exam pins
WAEC
plan_id Plan Price
1WAEC Result Checker ₦3,500.00 2WAEC GCE Result Checker ₦3,500.00 3WAEC Scratch Card (Direct) ₦3,800.00
NECO
plan_id Plan Price
4NECO Result Checker ₦250.00 5NECO GCE Result Checker ₦1,000.00
JAMB
plan_id Plan Price
8JAMB Mock ePIN ₦1,000.00 7JAMB ePIN (Direct Entry) ₦2,000.00 6JAMB ePIN (UTME) ₦3,500.00
NABTEB
plan_id Plan Price
9NABTEB Result Checker ₦2,500.00 10NABTEB GCE Result Checker ₦2,500.00
Recharge cards
network ₦50 card ₦100 card ₦200 card ₦500 card ₦1000 card
mtn₦48.50 ₦97.00 ₦194.00 ₦485.00 ₦970.00 airtel₦48.00 ₦96.00 ₦192.00 ₦480.00 ₦960.00 glo₦48.00 ₦96.00 ₦192.00 ₦480.00 ₦960.00 9mobile₦47.50 ₦95.00 ₦190.00 ₦475.00 ₦950.00
Error codes
HTTP code Meaning
401 MISSING_API_KEYNo key was sent. 401 INVALID_API_KEYThe key is wrong or was regenerated/revoked. 403 ACCESS_NOT_APPROVEDYour access request is not approved. 403 ACCESS_SUSPENDEDYour API access is suspended — contact support. 403 ACCOUNT_INACTIVEYour account is not active. 403 IP_NOT_WHITELISTEDThe request IP is not on your whitelist. The response includes your_ip. 403 SERVICE_NOT_APPROVEDThat service is not approved for you. The response lists approved_services. 403 KYC_REQUIREDKYC verification is required for this service. 402 INSUFFICIENT_BALANCEWallet balance too low — fund your wallet. 404 NOT_FOUNDUnknown endpoint or transaction. 405 METHOD_NOT_ALLOWEDUse the HTTP method shown for the endpoint. 409 DUPLICATE_IN_PROGRESSA call with the same client_reference is still processing. 422 VALIDATION_ERRORA field is missing or invalid; fields lists them. 422 VALIDATION_FAILEDSmartcard/meter could not be verified. 422 SERVICE_UNAVAILABLEThe plan/network/provider is unavailable right now. 422 PURCHASE_FAILEDThe provider could not complete the purchase. You were not charged. 429 RATE_LIMITEDToo many requests. 500 SERVER_ERRORUnexpected error — check the transaction status before retrying. 503 API_DISABLEDThe API is temporarily switched off.