‹
静
WizeData APIDeveloper docs

Build on WizeData

Airtime, data, cable TV, electricity, exam pins, data pins, social media boost, virtual numbers (USA and other countries), temporary email, number rental and travel eSIM. One API key, one wallet.

Getting started

1. Base URL

https://wizedata.com.ng

2. Authenticate

Open API Access in your account, copy your key and send it in the Authorization header of every request:

Authorization: Token YOUR_API_KEY
Content-Type: application/json

Keep the key on your server. Anyone who has it can spend your wallet. If it leaks, regenerate it in API Access.

3. Send JSON, read JSON

Purchases are POST requests with a JSON body. Every reply is JSON.

{ "status": "success", "Status": "successful" }
{ "status": "fail",    "Status": "failed", "msg": "reason" }
{ "status": "processing", "Status": "processing" }

The newer /api/v2/ endpoints use {"status":"success|fail","msg":"...","data":{...}}.

Rules that keep you safe

  • ref must be unique. Send your own ref with every purchase. Re-using one returns Transaction Ref Already Exist, so a retry can never charge twice.
  • Never retry a "processing" reply. It means the order is still being completed. Look it up with Check a transaction.
  • Timeouts: if your request timed out, check the ref first. Only send again if it does not exist.
  • Duplicate guard: the same purchase repeated inside 30 seconds is rejected.
  • Refunds are automatic. Any order that fails is returned to your wallet straight away.
  • Prices follow your account type (User, Agent or Vendor). Use the catalog endpoints to see your own prices.
  • v2 limits: 60 requests per minute per key.

HTTP status codes

CodeMeaning
200Success, or processing (read the status field)
400Missing or invalid parameter, insufficient balance, duplicate ref, or the provider failed (wallet refunded)
401Missing or invalid API key
402(v2) Insufficient wallet balance
404(v2) Order or route not found
409(v2) Price changed or duplicate order
429(v2) Too many requests
5xxTemporary problem. Check the ref before retrying

Account & status

Check your balance and look up any order by its reference.

GETCheck balance/api/user/

Returns the name on the account and your current wallet balance. Works with GET or POST.

Parameters

No parameters.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/user/' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/user/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/user/"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/user/", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "name": "Doe John",
    "balance": "12,500.00",
    "status": "success"
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Your authorization token is required."
}

Errors

HTTPMessage
401Your authorization token is required.
401Authorization token not found <token>

Notes

  • balance is a text value with thousands separators and 2 decimals. Remove the commas before doing maths.

Try it read only, free

GETCheck a transaction/api/v2/transaction

Look up the status of any order made with your key, using the ref you sent (or the ref returned by the numbers/email/rent/SMM endpoints). Use it whenever a purchase answered "processing" or your server timed out.

Parameters

ParameterTypeRequiredDescription
refstringrequiredThe transaction reference.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/transaction?ref=AIRTIME_123456789' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/transaction?ref=AIRTIME_123456789');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/transaction?ref=AIRTIME_123456789"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/transaction?ref=AIRTIME_123456789", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "ref": "AIRTIME_123456789",
        "service": "Airtime",
        "description": "Purchase of MTN airtime of N100 for 08012345678",
        "amount": 98.5,
        "status": "successful",
        "date": "2026-11-02 10:21:05"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Transaction not found."
}

Errors

HTTPMessage
400ref is required.
404Transaction not found.
401Invalid API key.

Notes

  • status is successful, failed (wallet refunded) or processing (still being completed).

Try it read only, free

GETBalance (v2)/api/v2/balance

Same as Check balance but returns a clean number and your price tier.

Parameters

No parameters.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/balance' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/balance');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/balance"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/balance", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "balance": "12500.00",
        "currency": "NGN",
        "tier": 1
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Invalid API key."
}

Notes

  • tier: 1 = User, 2 = Agent, 3 = Vendor.

Try it read only, free

IDs & catalogs

Every purchase needs numeric IDs (networks, plans, providers). Use these endpoints to list them with YOUR price tier, or see the ID tables at the bottom of this page.

GETList networks/api/v2/catalog/networks

All networks with their IDs and what is switched on right now. Network IDs are NOT the same on every endpoint, so read the note.

Parameters

No parameters.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/catalog/networks' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/catalog/networks');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/catalog/networks"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/catalog/networks", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": 1,
                "recharge_pin_id": 1,
                "data_pin_id": 1,
                "name": "MTN",
                "available": true,
                "airtime": {
                    "vtu": true,
                    "share_and_sell": false,
                    "momo": true
                },
                "data": {
                    "sme": true,
                    "gifting": true,
                    "corporate": true,
                    "coupon": true
                },
                "recharge_pin": true,
                "data_pin": true
            }
        ]
    }
}

Notes

  • Airtime and Data use id.
  • Recharge card pins use recharge_pin_id.
  • Data pins use data_pin_id.

Try it read only, free

GETList data plans/api/v2/catalog/data-plans

Data plans for one network with your price. Use the plan id as data_plan when buying data.

Parameters

ParameterTypeRequiredDescription
networkintegerrequiredNetwork id from List networks.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/catalog/data-plans?network=1' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/catalog/data-plans?network=1');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/catalog/data-plans?network=1"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/catalog/data-plans?network=1", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": 1,
                "name": "1GB - Best Seller (7 Days)",
                "type": "SME",
                "validity_days": 7,
                "price": 395,
                "available": true
            }
        ]
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "network is required (see catalog/networks)."
}

Try it read only, free

GETList data pin plans/api/v2/catalog/data-pins

Data pin plans for one network. Use the id as data_plan on the Data pin endpoint.

Parameters

ParameterTypeRequiredDescription
networkintegerrequireddata_pin_id from List networks.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/catalog/data-pins?network=1' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/catalog/data-pins?network=1');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/catalog/data-pins?network=1"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/catalog/data-pins?network=1", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": 1,
                "name": "750 MB",
                "type": "SME",
                "validity_days": 7,
                "price": 400
            }
        ]
    }
}

Try it read only, free

GETList recharge card plans/api/v2/catalog/recharge-pins

Recharge card denominations for one network. Use the id as plan on the Recharge pin endpoint.

Parameters

ParameterTypeRequiredDescription
networkintegerrequiredrecharge_pin_id from List networks.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/catalog/recharge-pins?network=1' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/catalog/recharge-pins?network=1');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/catalog/recharge-pins?network=1"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/catalog/recharge-pins?network=1", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": 1,
                "face_value": 100,
                "price": 100
            }
        ]
    }
}

Try it read only, free

GETList cable providers/api/v2/catalog/cable-providers

GOTV, DSTV and STARTIMES with their IDs.

Parameters

No parameters.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/catalog/cable-providers' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/catalog/cable-providers');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/catalog/cable-providers"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/catalog/cable-providers", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": 1,
                "name": "GOTV",
                "available": true
            }
        ]
    }
}

Try it read only, free

GETList cable plans/api/v2/catalog/cable-plans

Plans for one cable provider with your price.

Parameters

ParameterTypeRequiredDescription
providerintegerrequiredCable provider id.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/catalog/cable-plans?provider=1' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/catalog/cable-plans?provider=1');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/catalog/cable-plans?provider=1"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/catalog/cable-plans?provider=1", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": 1,
                "name": "Gotv Smallie",
                "validity_days": 30,
                "price": 1900
            }
        ]
    }
}

Try it read only, free

GETList electricity providers/api/v2/catalog/electricity

Distribution companies (DISCOs) with their IDs.

Parameters

No parameters.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/catalog/electricity' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/catalog/electricity');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/catalog/electricity"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/catalog/electricity", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": 1,
                "name": "Ikeja Electric",
                "code": "IE",
                "available": true
            }
        ],
        "meter_types": [
            "prepaid",
            "postpaid"
        ]
    }
}

Try it read only, free

GETList exam pins/api/v2/catalog/exam

Exam providers (WAEC, NECO...) with price and availability.

Parameters

No parameters.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/catalog/exam' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/catalog/exam');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/catalog/exam"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/catalog/exam", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": 1,
                "name": "WAEC",
                "price": 3500,
                "available": true
            }
        ]
    }
}

Try it read only, free

Airtime & Data

POSTBuy airtime/api/airtime/

Instant airtime top-up on MTN, GLO, 9MOBILE and AIRTEL. Your wallet is charged at your tier price, the order is sent to the network, and the wallet is refunded automatically if it fails.

Parameters

ParameterTypeRequiredDescription
networkintegerrequiredNetwork id: 1 MTN, 2 GLO, 3 9MOBILE, 4 AIRTEL.
phonealso accepted: mobile_numberstringrequired11 digit phone number, for example 08012345678.
amountnumberrequiredAmount in naira. Minimum N20, maximum N10000.
airtime_typestringoptionalVTU (default), Share And Sell, Momo or Awoof.
ported_numberalso accepted: Ported_numberstringoptional"true" if the number was ported to another network, otherwise "false" (default).
refstringoptionalYour unique reference. Generated for you when omitted. Must never repeat.

Request example

curl --location 'https://wizedata.com.ng/api/airtime/' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"network":1,"phone":"08012345678","amount":100,"airtime_type":"VTU","ref":"AIRTIME_1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/airtime/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'network' => 1,
        'phone' => '08012345678',
        'amount' => 100,
        'airtime_type' => 'VTU',
        'ref' => 'AIRTIME_1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/airtime/"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "network": 1,
    "phone": "08012345678",
    "amount": 100,
    "airtime_type": "VTU",
    "ref": "AIRTIME_1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/airtime/", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "network": 1,
    "phone": "08012345678",
    "amount": 100,
    "airtime_type": "VTU",
    "ref": "AIRTIME_1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "Status": "successful"
}

Error response HTTP 400

{
    "status": "fail",
    "Status": "failed",
    "msg": "Insufficient balance fund your wallet and try again"
}

Errors

HTTPMessage
401Your authorization token is required.
401Authorization token not found <token> (the key is wrong or the account is not active)
400Only POST method is allowed
400Transaction Ref Already Exist
400Possible Transaction Duplicate, Please Verify Transaction & Try Again After 30 Seconds
400Insufficient balance fund your wallet and try again
400Could Not Complete Transaction, Please Try Again Later
400Provider failure: {"status":"fail","Status":"failed","msg":"..."} and your wallet is refunded automatically
400Network Id Required / Phone Is Required / Amount Is Required / Ref Is Required
400Airtime Type can only be VTU, Share And Sell, Momo, Or Awoof
400The Network id is invalid
400Sorry, MTN is not available at the moment
400Please enter a valid 11 digit phone number
400Minimum airtime you can purchase is N20
400Maximum airtime you can purchase is N10000

Notes

  • A reply of {"status":"processing"} (HTTP 200) means the network has not confirmed yet. Do NOT retry: check it with Check a transaction.
  • The success reply does not repeat the ref. Keep the one you sent.

Try it REAL purchase

POSTBuy data/api/data/

Data bundles on all networks (SME, Gifting, Corporate, Awoof, Coupon). Get the plan id from List data plans.

Parameters

ParameterTypeRequiredDescription
networkintegerrequiredNetwork id: 1 MTN, 2 GLO, 3 9MOBILE, 4 AIRTEL.
data_planalso accepted: planintegerrequiredPlan id from List data plans.
phonealso accepted: mobile_numberstringrequired11 digit phone number.
ported_numberalso accepted: Ported_numberstringoptional"true" or "false" (default).
refstringoptionalYour unique reference. Generated for you when omitted.

Request example

curl --location 'https://wizedata.com.ng/api/data/' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"network":1,"data_plan":1,"phone":"08012345678","ref":"DATA_1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/data/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'network' => 1,
        'data_plan' => 1,
        'phone' => '08012345678',
        'ref' => 'DATA_1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/data/"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "network": 1,
    "data_plan": 1,
    "phone": "08012345678",
    "ref": "DATA_1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/data/", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "network": 1,
    "data_plan": 1,
    "phone": "08012345678",
    "ref": "DATA_1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "Status": "successful"
}

Error response HTTP 400

{
    "status": "fail",
    "Status": "failed",
    "msg": "Sorry, MTN SME is not available at the moment"
}

Errors

HTTPMessage
401Your authorization token is required.
401Authorization token not found <token> (the key is wrong or the account is not active)
400Only POST method is allowed
400Transaction Ref Already Exist
400Possible Transaction Duplicate, Please Verify Transaction & Try Again After 30 Seconds
400Insufficient balance fund your wallet and try again
400Could Not Complete Transaction, Please Try Again Later
400Provider failure: {"status":"fail","Status":"failed","msg":"..."} and your wallet is refunded automatically
400Network Id Required / Data Plan ID Is Required / Phone Is Required / Ref Is Required
400The Network id is invalid
400The Data Plan ID : <id> is invalid
400Sorry, MTN SME is not available at the moment
400Please enter a valid 11 digit phone number

Notes

  • A reply of {"status":"processing"} (HTTP 200) means the bundle is still being delivered. Do NOT retry: check it with Check a transaction.
  • Some providers also add a true_response field with the raw network message.

Try it REAL purchase

Cable TV, Electricity & Exam pins

POSTVerify smart card/api/cabletv/verify/

Check a decoder (IUC / smart card) number and get the customer name BEFORE paying. Always do this first.

Parameters

ParameterTypeRequiredDescription
provideralso accepted: cablenameintegerrequiredCable provider id: 1 GOTV, 2 DSTV, 3 STARTIMES.
iucnumberalso accepted: smart_card_numberstringrequiredSmart card / IUC number.

Request example

curl --location 'https://wizedata.com.ng/api/cabletv/verify/' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"provider":1,"iucnumber":"7012345678"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/cabletv/verify/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'provider' => 1,
        'iucnumber' => '7012345678',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/cabletv/verify/"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "provider": 1,
    "iucnumber": "7012345678",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/cabletv/verify/", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "provider": 1,
    "iucnumber": "7012345678"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "Status": "successful",
    "Customer_Name": "JOHN DOE",
    "name": "JOHN DOE"
}

Error response HTTP 400

{
    "status": "fail",
    "Status": "failed",
    "msg": "Could Not Verify Smart Card/IUC Number"
}

Errors

HTTPMessage
401Your authorization token is required.
400IUC Number Is Required / Cable Provider Id Required
400The Cable Provider id is invalid
400Sorry, GOTV Subscription is not available at the moment
400Could Not Verify Smart Card/IUC Number

Notes

  • Verification is free and does not touch your wallet.

Try it read only, free

POSTPay cable TV/api/cabletv/

Renew or change a GOTV, DSTV or STARTIMES subscription. Get plan ids from List cable plans.

Parameters

ParameterTypeRequiredDescription
provideralso accepted: cablenameintegerrequiredCable provider id.
planalso accepted: cable_plan, cableplanintegerrequiredCable plan id.
iucnumberalso accepted: smart_card_numberstringrequiredSmart card / IUC number.
phonestringrequiredCustomer phone number.
subtypestringoptional"renew" or "change" (default).
refstringoptionalYour unique reference. Generated for you when omitted.

Request example

curl --location 'https://wizedata.com.ng/api/cabletv/' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"provider":1,"plan":1,"iucnumber":"7012345678","phone":"08012345678","subtype":"renew","ref":"CABLE_1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/cabletv/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'provider' => 1,
        'plan' => 1,
        'iucnumber' => '7012345678',
        'phone' => '08012345678',
        'subtype' => 'renew',
        'ref' => 'CABLE_1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/cabletv/"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "provider": 1,
    "plan": 1,
    "iucnumber": "7012345678",
    "phone": "08012345678",
    "subtype": "renew",
    "ref": "CABLE_1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/cabletv/", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "provider": 1,
    "plan": 1,
    "iucnumber": "7012345678",
    "phone": "08012345678",
    "subtype": "renew",
    "ref": "CABLE_1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "Status": "successful"
}

Error response HTTP 400

{
    "status": "fail",
    "Status": "failed",
    "msg": "Insufficient balance fund your wallet and try again"
}

Errors

HTTPMessage
401Your authorization token is required.
401Authorization token not found <token> (the key is wrong or the account is not active)
400Only POST method is allowed
400Transaction Ref Already Exist
400Possible Transaction Duplicate, Please Verify Transaction & Try Again After 30 Seconds
400Insufficient balance fund your wallet and try again
400Could Not Complete Transaction, Please Try Again Later
400Provider failure: {"status":"fail","Status":"failed","msg":"..."} and your wallet is refunded automatically
400Cable Plan ID Is Required / IUC Number Is Required / Cable Provider Id Required / Phone Is Required
400The Cable Provider id is invalid
400The Cable Plan ID is invalid
400Sorry, GOTV Subscription is not available at the moment

Try it REAL purchase

POSTVerify meter number/api/electricity/verify/

Check a meter number and get the customer name BEFORE buying units.

Parameters

ParameterTypeRequiredDescription
provideralso accepted: disconameintegerrequiredElectricity provider id (see the table below).
meternumberstringrequiredMeter number.
metertypestringrequiredprepaid or postpaid.

Request example

curl --location 'https://wizedata.com.ng/api/electricity/verify/' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"provider":1,"meternumber":"45012345678","metertype":"prepaid"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/electricity/verify/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'provider' => 1,
        'meternumber' => '45012345678',
        'metertype' => 'prepaid',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/electricity/verify/"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "provider": 1,
    "meternumber": "45012345678",
    "metertype": "prepaid",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/electricity/verify/", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "provider": 1,
    "meternumber": "45012345678",
    "metertype": "prepaid"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "Status": "successful",
    "Customer_Name": "JOHN DOE",
    "name": "JOHN DOE"
}

Error response HTTP 400

{
    "status": "fail",
    "Status": "failed",
    "msg": "Could Not Verify Meter Number"
}

Errors

HTTPMessage
401Your authorization token is required.
400Meter Type Is Required / Meter Number Is Required / Unit Provider Id Required
400The Electricity Provider id is invalid
400Could Not Verify Meter Number

Try it read only, free

POSTBuy electricity/api/electricity/

Buy prepaid units or pay a postpaid bill for any DISCO. The token is returned in the reply and saved in your history.

Parameters

ParameterTypeRequiredDescription
provideralso accepted: disco_nameintegerrequiredElectricity provider id.
meternumberalso accepted: meter_numberstringrequiredMeter number.
metertypealso accepted: MeterTypestringrequiredprepaid or postpaid.
amountnumberrequiredAmount in naira. Minimum 1000.
phonestringoptionalCustomer phone number.
refstringoptionalYour unique reference. Generated for you when omitted.

Request example

curl --location 'https://wizedata.com.ng/api/electricity/' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"provider":1,"meternumber":"45012345678","metertype":"prepaid","amount":2000,"phone":"08012345678","ref":"METER_1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/electricity/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'provider' => 1,
        'meternumber' => '45012345678',
        'metertype' => 'prepaid',
        'amount' => 2000,
        'phone' => '08012345678',
        'ref' => 'METER_1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/electricity/"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "provider": 1,
    "meternumber": "45012345678",
    "metertype": "prepaid",
    "amount": 2000,
    "phone": "08012345678",
    "ref": "METER_1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/electricity/", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "provider": 1,
    "meternumber": "45012345678",
    "metertype": "prepaid",
    "amount": 2000,
    "phone": "08012345678",
    "ref": "METER_1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "Status": "successful",
    "token": "1234-5678-9012-3456-7890",
    "customerName": "JOHN DOE",
    "customerAddress": "12 Example Street",
    "units": "38.5"
}

Error response HTTP 400

{
    "status": "fail",
    "Status": "failed",
    "msg": "Minimum Unit Purchase Is N1000"
}

Errors

HTTPMessage
401Your authorization token is required.
401Authorization token not found <token> (the key is wrong or the account is not active)
400Only POST method is allowed
400Transaction Ref Already Exist
400Possible Transaction Duplicate, Please Verify Transaction & Try Again After 30 Seconds
400Insufficient balance fund your wallet and try again
400Could Not Complete Transaction, Please Try Again Later
400Provider failure: {"status":"fail","Status":"failed","msg":"..."} and your wallet is refunded automatically
400Amount Is Required / Meter Number Is Required / Provider Id Required / Meter Type Is Required
400Minimum Unit Purchase Is N1000
400The Provider id is invalid
400Sorry, <provider> is not available at the moment

Notes

  • customerName, customerAddress and units are only present when the DISCO returns them.
  • If the reply is {"status":"processing"} the token is still being generated: check it with Check a transaction, the token appears in the description once ready.

Try it REAL purchase

POSTBuy exam pins/api/exam/

WAEC, NECO and other exam result-checker pins. Up to 10 per request.

Parameters

ParameterTypeRequiredDescription
provideralso accepted: exam_nameintegerrequiredExam provider id: 1 WAEC, 2 NECO (NABTEB when switched on).
quantityintegerrequiredHow many pins, 1 to 10.
refstringoptionalYour unique reference. Generated for you when omitted.

Request example

curl --location 'https://wizedata.com.ng/api/exam/' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"provider":1,"quantity":1,"ref":"EXAM_1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/exam/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'provider' => 1,
        'quantity' => 1,
        'ref' => 'EXAM_1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/exam/"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "provider": 1,
    "quantity": 1,
    "ref": "EXAM_1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/exam/", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "provider": 1,
    "quantity": 1,
    "ref": "EXAM_1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "Status": "successful",
    "msg": "PIN: 1234567890 SERIAL: 123456",
    "pin": "PIN: 1234567890 SERIAL: 123456",
    "pins": "PIN: 1234567890 SERIAL: 123456",
    "token": "PIN: 1234567890 SERIAL: 123456"
}

Error response HTTP 400

{
    "status": "fail",
    "Status": "failed",
    "msg": "You cant purchase more than 10 token at a time"
}

Errors

HTTPMessage
401Your authorization token is required.
401Authorization token not found <token> (the key is wrong or the account is not active)
400Only POST method is allowed
400Transaction Ref Already Exist
400Possible Transaction Duplicate, Please Verify Transaction & Try Again After 30 Seconds
400Insufficient balance fund your wallet and try again
400Could Not Complete Transaction, Please Try Again Later
400Provider failure: {"status":"fail","Status":"failed","msg":"..."} and your wallet is refunded automatically
400Provider Id Required / Quantity Is Required
400The Provider id is invalid
400Sorry, <provider> is not available at the moment
400You cant purchase more than 10 token at a time

Notes

  • The pin text is repeated in msg, pin, pins and token so older integrations keep working.

Try it REAL purchase

Data pins & Recharge card pins

POSTBuy data pins/api/datapin/

Printable data pins that customers load themselves. Get plan ids from List data pin plans and the network from data_pin_id.

Parameters

ParameterTypeRequiredDescription
networkintegerrequireddata_pin_id from List networks.
data_planintegerrequiredData pin plan id.
quantityintegerrequiredNumber of pins.
businessnamealso accepted: card_namestringrequiredBusiness name printed on the pin card.
refstringoptionalYour unique reference. Generated for you when omitted.

Request example

curl --location 'https://wizedata.com.ng/api/datapin/' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"network":1,"data_plan":1,"quantity":1,"businessname":"My Shop","ref":"DATAPIN_1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/datapin/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'network' => 1,
        'data_plan' => 1,
        'quantity' => 1,
        'businessname' => 'My Shop',
        'ref' => 'DATAPIN_1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/datapin/"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "network": 1,
    "data_plan": 1,
    "quantity": 1,
    "businessname": "My Shop",
    "ref": "DATAPIN_1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/datapin/", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "network": 1,
    "data_plan": 1,
    "quantity": 1,
    "businessname": "My Shop",
    "ref": "DATAPIN_1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "Status": "successful",
    "quantity": 1,
    "serial": "123456789012",
    "pin": "1234-5678-9012",
    "load_pin": "*460*6*1#",
    "check_balance": "*323*1#"
}

Error response HTTP 400

{
    "status": "fail",
    "Status": "failed",
    "msg": "Business Name Is Required"
}

Errors

HTTPMessage
401Your authorization token is required.
401Authorization token not found <token> (the key is wrong or the account is not active)
400Only POST method is allowed
400Transaction Ref Already Exist
400Possible Transaction Duplicate, Please Verify Transaction & Try Again After 30 Seconds
400Insufficient balance fund your wallet and try again
400Could Not Complete Transaction, Please Try Again Later
400Provider failure: {"status":"fail","Status":"failed","msg":"..."} and your wallet is refunded automatically
400Data Plan ID Is Required / Quantity Is Required / Network Id Required / Business Name Is Required
400The Network id is invalid
400Invalid Data Plan Id
400Network Not Available

Try it REAL purchase

POSTBuy recharge card pins/api/rechargepin/

Printable airtime recharge cards. Get plan ids from List recharge card plans.

Parameters

ParameterTypeRequiredDescription
networkintegerrequiredrecharge_pin_id from List networks (1 MTN, 2 AIRTEL, 3 GLO, 4 9MOBILE).
planintegerrequiredRecharge card plan id.
quantityintegerrequiredNumber of cards.
businessnamealso accepted: card_namestringrequiredBusiness name printed on the card.
refstringoptionalYour unique reference. Generated for you when omitted.

Request example

curl --location 'https://wizedata.com.ng/api/rechargepin/' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"network":1,"plan":1,"quantity":1,"businessname":"My Shop","ref":"EPIN_1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/rechargepin/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'network' => 1,
        'plan' => 1,
        'quantity' => 1,
        'businessname' => 'My Shop',
        'ref' => 'EPIN_1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/rechargepin/"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "network": 1,
    "plan": 1,
    "quantity": 1,
    "businessname": "My Shop",
    "ref": "EPIN_1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/rechargepin/", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "network": 1,
    "plan": 1,
    "quantity": 1,
    "businessname": "My Shop",
    "ref": "EPIN_1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "Status": "successful",
    "quantity": 1,
    "serial": "123456789012",
    "pin": "1234-5678-9012-3456",
    "load_pin": "*311*Pin#",
    "check_balance": "*310#"
}

Error response HTTP 400

{
    "status": "fail",
    "Status": "failed",
    "msg": "Insufficient balance fund your wallet and try again"
}

Errors

HTTPMessage
401Your authorization token is required.
401Authorization token not found <token> (the key is wrong or the account is not active)
400Only POST method is allowed
400Transaction Ref Already Exist
400Possible Transaction Duplicate, Please Verify Transaction & Try Again After 30 Seconds
400Insufficient balance fund your wallet and try again
400Could Not Complete Transaction, Please Try Again Later
400Provider failure: {"status":"fail","Status":"failed","msg":"..."} and your wallet is refunded automatically
400Plan ID Is Required / Quantity Is Required / Network Id Required / Business Name Is Required
400Invalid Network Id
400Invalid Plan Id
400Network Not Available

Notes

  • This endpoint uses a different network numbering from airtime and data. Read the network table at the bottom of this page.

Try it REAL purchase

Alpha Topup

POSTAlpha Topup/api/alphatopup/

Alpha Topup purchase for a phone number.

Parameters

ParameterTypeRequiredDescription
phonestringrequiredPhone number.
amountnumberrequiredAmount of Alpha Topup to buy.
refstringoptionalYour unique reference.

Request example

curl --location 'https://wizedata.com.ng/api/alphatopup/' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"phone":"08012345678","amount":1000,"ref":"ALPHA_1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/alphatopup/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'phone' => '08012345678',
        'amount' => 1000,
        'ref' => 'ALPHA_1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/alphatopup/"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "phone": "08012345678",
    "amount": 1000,
    "ref": "ALPHA_1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/alphatopup/", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "phone": "08012345678",
    "amount": 1000,
    "ref": "ALPHA_1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "Status": "successful"
}

Error response HTTP 400

{
    "status": "fail",
    "Status": "failed",
    "msg": "Insufficient balance fund your wallet and try again"
}

Errors

HTTPMessage
401Your authorization token is required.
401Authorization token not found <token> (the key is wrong or the account is not active)
400Only POST method is allowed
400Transaction Ref Already Exist
400Possible Transaction Duplicate, Please Verify Transaction & Try Again After 30 Seconds
400Insufficient balance fund your wallet and try again
400Could Not Complete Transaction, Please Try Again Later
400Provider failure: {"status":"fail","Status":"failed","msg":"..."} and your wallet is refunded automatically
400Amount Is Required / Phone Is Required

Notes

  • Alpha Topup can be delivered manually. If you see processing, use Check a transaction.

Try it REAL purchase

Social Media Boost (SMM)

GETList SMM services/api/v2/smm/services

All Social Media Boost services with your rate per 1000, minimum, maximum and any extra fields a service needs.

Parameters

No parameters.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/smm/services' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/smm/services');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/smm/services"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/smm/services", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": 12,
                "platform": "Instagram",
                "name": "Instagram Followers",
                "type": "Default",
                "rate_per_1000": 1500,
                "min": 100,
                "max": 50000,
                "extra_fields": [],
                "flat_price": false
            }
        ]
    }
}

Try it read only, free

POSTPlace an SMM order/api/v2/smm/order

Order followers, likes, views and more. Charged as quantity / 1000 x rate_per_1000, refunded automatically if the provider rejects it.

Parameters

ParameterTypeRequiredDescription
service_idintegerrequiredService id from List SMM services.
target_linkstringrequiredProfile or post link.
quantityintegerrequiredQuantity between min and max.
client_refstringoptionalYour unique reference. Sending the same one again never double-charges.
(extra fields)stringoptionalServices with extra_fields (comments, keywords, usernames...) need those too.

Request example

curl --location 'https://wizedata.com.ng/api/v2/smm/order' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"service_id":12,"target_link":"https://instagram.com/yourpage","quantity":1000,"client_ref":"smm-1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/smm/order');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'service_id' => 12,
        'target_link' => 'https://instagram.com/yourpage',
        'quantity' => 1000,
        'client_ref' => 'smm-1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/smm/order"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "service_id": 12,
    "target_link": "https://instagram.com/yourpage",
    "quantity": 1000,
    "client_ref": "smm-1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/smm/order", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "service_id": 12,
    "target_link": "https://instagram.com/yourpage",
    "quantity": 1000,
    "client_ref": "smm-1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "Your order has been placed.",
    "data": {
        "ref": "SMM_1A2B3C4D1762080000",
        "amount": 1500,
        "balance": "11000.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Insufficient balance. Fund your wallet and try again."
}

Errors

HTTPMessage
401Invalid API key.
400service_id and target_link are required.
400The selected service is invalid.
400Quantity must be between <min> and <max>.
402Insufficient balance. Fund your wallet and try again.
409Possible duplicate order. Please wait 60 seconds and try again.
502The provider could not accept this order. You were not charged.

Notes

  • Track it with Check a transaction using data.ref.

Try it REAL purchase

GETCheck an SMM order/api/v2/smm/order

Status of one SMM order.

Parameters

ParameterTypeRequiredDescription
refstringrequiredThe ref returned when you placed the order.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/smm/order?ref=SMM_1A2B3C4D1762080000' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/smm/order?ref=SMM_1A2B3C4D1762080000');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/smm/order?ref=SMM_1A2B3C4D1762080000"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/smm/order?ref=SMM_1A2B3C4D1762080000", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "transref": "SMM_1A2B3C4D1762080000",
            "target_link": "https://instagram.com/yourpage",
            "quantity": 1000,
            "amount": 1500,
            "status": "Pending",
            "date": "2026-11-02 10:21:05"
        }
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Order not found."
}

Try it read only, free

POSTPlace an SMM order (original endpoint)/api/smm/

The original Social Media Boost endpoint, still supported. It does not return a ref, so prefer the v2 endpoint above for new work.

Parameters

ParameterTypeRequiredDescription
service_idintegerrequiredService id.
target_linkstringrequiredProfile or post link.
quantityintegerrequiredQuantity.

Request example

curl --location 'https://wizedata.com.ng/api/smm/' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"service_id":12,"target_link":"https://instagram.com/yourpage","quantity":1000}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/smm/');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'service_id' => 12,
        'target_link' => 'https://instagram.com/yourpage',
        'quantity' => 1000,
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/smm/"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "service_id": 12,
    "target_link": "https://instagram.com/yourpage",
    "quantity": 1000,
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/smm/", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "service_id": 12,
    "target_link": "https://instagram.com/yourpage",
    "quantity": 1000
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "Your Social Media Boost order has been placed successfully!"
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Insufficient balance fund your wallet and try again"
}

Errors

HTTPMessage
401Your authorization token is required.
401Authorization token not found <token> (the key is wrong or the account is not active)
400Only POST method is allowed
400Transaction Ref Already Exist
400Possible Transaction Duplicate, Please Verify Transaction & Try Again After 30 Seconds
400Insufficient balance fund your wallet and try again
400Could Not Complete Transaction, Please Try Again Later
400Provider failure: {"status":"fail","Status":"failed","msg":"..."} and your wallet is refunded automatically
400Service ID Is Required
400Invalid Service Id / Invalid Quantity / Service Not Available

Try it REAL purchase

Virtual Numbers: USA & other countries

Receive SMS verification codes on a virtual number. Receive only (no calls). USA numbers use ver=sms4 (Server 1) or sms5 (Server 2). Numbers from other countries (UK, Canada and more) use ver=sms6 with a country id from List countries.

GETList countries/api/v2/otp/countries

Countries available for numbers outside the USA. Use the id as country with ver=sms6.

Parameters

No parameters.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/otp/countries' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/otp/countries');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/otp/countries"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/otp/countries", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": "110",
                "name": "United Kingdom",
                "code": "GB",
                "prefix": "44"
            },
            {
                "id": "36",
                "name": "Canada",
                "code": "CA",
                "prefix": "1"
            }
        ],
        "note": "United States numbers use /otp/services?ver=sms4 or sms5. Other countries use ver=sms6 with country=<id>."
    }
}

Try it read only, free

GETList apps/api/v2/otp/services

Apps you can verify with a number, with your price and stock. For ver=sms6 you must also pass the country. Server 1 prices are estimates until you buy.

Parameters

ParameterTypeRequiredDescription
verstringoptionalsms4 = USA Server 1 (default), sms5 = USA Server 2, sms6 = other countries.
countrystringoptionalCountry id from List countries. Required when ver=sms6.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/otp/services?ver=sms4' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/otp/services?ver=sms4');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/otp/services?ver=sms4"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/otp/services?ver=sms4", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": "whatsapp",
                "name": "WhatsApp",
                "price": 3120,
                "stock": 120
            }
        ],
        "stale": false
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Unavailable right now."
}

Try it read only, free

POSTGet a number/api/v2/otp/buy

Buys one number for one app (USA or another country). Your wallet is charged immediately and refunded automatically if no code arrives or the order is cancelled.

Parameters

ParameterTypeRequiredDescription
verstringoptionalsms4 (USA Server 1, default), sms5 (USA Server 2) or sms6 (other countries).
countrystringoptionalCountry id from List countries. Required when ver=sms6.
servicestringrequiredApp id from List apps, for example whatsapp.
area_codestringoptional3-digit USA area code, if you want a specific one.
max_pricenumberoptionalHighest price in naira you accept.
client_refstringoptionalYour unique reference.

Request example

curl --location 'https://wizedata.com.ng/api/v2/otp/buy' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"ver":"sms4","service":"whatsapp","max_price":3500,"client_ref":"num-1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/otp/buy');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'ver' => 'sms4',
        'service' => 'whatsapp',
        'max_price' => 3500,
        'client_ref' => 'num-1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/otp/buy"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "ver": "sms4",
    "service": "whatsapp",
    "max_price": 3500,
    "client_ref": "num-1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/otp/buy", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "ver": "sms4",
    "service": "whatsapp",
    "max_price": 3500,
    "client_ref": "num-1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "id": 123,
            "ref": "OTP_9F8E7D6C1762080000",
            "type": "sms4",
            "kind": "buy",
            "label": "WhatsApp",
            "period": null,
            "identity": "+12025550199",
            "status": "waiting",
            "code": null,
            "message": null,
            "note": null,
            "price": 3120,
            "created_at": "2026-11-02T10:21:05+01:00",
            "expires_at": "2026-11-02T10:41:05+01:00",
            "seconds_left": 1200,
            "final": false,
            "can_cancel": true,
            "cancel_in": 0,
            "can_reuse": false,
            "can_renew": false
        },
        "balance": "9380.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "The price changed to ₦3,400.00. Please confirm again.",
    "data": {
        "price": 3400,
        "code": "price_changed"
    }
}

Errors

HTTPMessage
401Invalid API key.
402Insufficient wallet balance.
409Price changed (data.price has the new price).
429Too many orders per minute.
503Service unavailable or out of stock.
502Provider could not supply a number. data.refunded is true; you were not charged.

Notes

  • All v2 endpoints work with the same key: Authorization: Token YOUR_API_KEY (Bearer also works). Limit: 60 requests per minute.
  • client_ref makes a purchase safe to retry: sending the same client_ref again returns the same order and never charges twice. Always send it.
  • max_price (naira) protects you from price changes: if the price went above it you get HTTP 409 and are not charged.
  • Use data.order.identity as the phone number (with the + sign).

Try it REAL purchase

GETCheck for the code/api/v2/otp/check

Poll this every 10 to 20 seconds. When data.order.status is "received" the code is in data.order.code.

Parameters

ParameterTypeRequiredDescription
idstringrequiredOrder id or ref from Get a USA number.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/otp/check?id=123' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/otp/check?id=123');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/otp/check?id=123"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/otp/check?id=123", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "id": 123,
            "ref": "OTP_9F8E7D6C1762080000",
            "type": "sms4",
            "kind": "buy",
            "label": "WhatsApp",
            "period": null,
            "identity": "+12025550199",
            "status": "received",
            "code": "482193",
            "message": "Your WhatsApp code is 482-193",
            "note": null,
            "price": 3120,
            "created_at": "2026-11-02T10:21:05+01:00",
            "expires_at": "2026-11-02T10:41:05+01:00",
            "seconds_left": null,
            "final": true,
            "can_cancel": false,
            "cancel_in": 0,
            "can_reuse": true,
            "can_renew": false
        },
        "balance": "9380.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Order not found."
}

Notes

  • status: waiting, received, cancelled, expired, failed. final:true means nothing will change any more.
  • cancelled, expired and failed orders are refunded automatically.

Try it read only, free

POSTCancel and refund/api/v2/otp/cancel

Cancel while still waiting. Refunded in full. Numbers from other countries (sms6) can only be cancelled 6 minutes after purchase.

Parameters

ParameterTypeRequiredDescription
idstringrequiredOrder id or ref.

Request example

curl --location 'https://wizedata.com.ng/api/v2/otp/cancel' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"id":123}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/otp/cancel');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'id' => 123,
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/otp/cancel"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "id": 123,
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/otp/cancel", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "id": 123
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "id": 123,
            "ref": "OTP_9F8E7D6C1762080000",
            "type": "sms4",
            "kind": "buy",
            "label": "WhatsApp",
            "period": null,
            "identity": "+12025550199",
            "status": "cancelled",
            "code": null,
            "message": null,
            "note": "Cancelled; refunded to your wallet.",
            "price": 3120,
            "created_at": "2026-11-02T10:21:05+01:00",
            "expires_at": "2026-11-02T10:41:05+01:00",
            "seconds_left": 1200,
            "final": true,
            "can_cancel": false,
            "cancel_in": 0,
            "can_reuse": false,
            "can_renew": false
        },
        "balance": "12500.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "This order can no longer be cancelled."
}

Errors

HTTPMessage
400This order can no longer be cancelled.
404Order not found.

Try it REAL purchase

POSTReuse a number/api/v2/otp/reuse

Receive another code on a USA number you already used (charged). Only for USA orders (sms4/sms5) with status received.

Parameters

ParameterTypeRequiredDescription
idstringrequiredOrder id or ref of a received order.
max_pricenumberoptionalHighest price you accept.
client_refstringoptionalYour unique reference.

Request example

curl --location 'https://wizedata.com.ng/api/v2/otp/reuse' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"id":123,"client_ref":"num-1002"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/otp/reuse');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'id' => 123,
        'client_ref' => 'num-1002',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/otp/reuse"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "id": 123,
    "client_ref": "num-1002",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/otp/reuse", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "id": 123,
    "client_ref": "num-1002"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "id": 124,
            "ref": "OTP_9F8E7D6C1762080000",
            "type": "sms4",
            "kind": "reuse",
            "label": "WhatsApp",
            "period": null,
            "identity": "+12025550199",
            "status": "waiting",
            "code": null,
            "message": null,
            "note": null,
            "price": 3120,
            "created_at": "2026-11-02T10:21:05+01:00",
            "expires_at": "2026-11-02T10:41:05+01:00",
            "seconds_left": 1200,
            "final": false,
            "can_cancel": true,
            "cancel_in": 0,
            "can_reuse": false,
            "can_renew": false
        },
        "balance": "6260.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "This number can no longer be reused."
}

Try it REAL purchase

Temporary Email

A temporary email address to receive a verification code.

GETList email services/api/v2/email/sites

Services you can receive an email code for.

Parameters

No parameters.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/email/sites' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/email/sites');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/email/sites"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/email/sites", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": "telegram",
                "name": "Telegram",
                "price": 1400,
                "stock": 1
            }
        ]
    }
}

Try it read only, free

GETList inbox domains/api/v2/email/domains

Inbox domains available for one service, with your price.

Parameters

ParameterTypeRequiredDescription
sitestringrequiredService id.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/email/domains?site=telegram' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/email/domains?site=telegram');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/email/domains?site=telegram"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/email/domains?site=telegram", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": "@outlook.com",
                "name": "@outlook.com",
                "price": 1100,
                "stock": 100
            }
        ]
    }
}

Try it read only, free

POSTGet an email address/api/v2/email/buy

Creates a temporary email address. Refunded automatically if no code arrives.

Parameters

ParameterTypeRequiredDescription
sitestringrequiredService id.
domainstringrequiredDomain from List inbox domains, for example @outlook.com.
max_pricenumberoptionalHighest price you accept.
client_refstringoptionalYour unique reference.

Request example

curl --location 'https://wizedata.com.ng/api/v2/email/buy' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"site":"telegram","domain":"@outlook.com","client_ref":"mail-1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/email/buy');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'site' => 'telegram',
        'domain' => '@outlook.com',
        'client_ref' => 'mail-1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/email/buy"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "site": "telegram",
    "domain": "@outlook.com",
    "client_ref": "mail-1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/email/buy", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "site": "telegram",
    "domain": "@outlook.com",
    "client_ref": "mail-1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "id": 123,
            "ref": "EML_1A2B3C4D1762080000",
            "type": "email",
            "kind": "buy",
            "label": "Telegram @outlook.com",
            "period": null,
            "identity": "user1234@outlook.com",
            "status": "waiting",
            "code": null,
            "message": null,
            "note": null,
            "price": 3120,
            "created_at": "2026-11-02T10:21:05+01:00",
            "expires_at": "2026-11-02T10:41:05+01:00",
            "seconds_left": 1200,
            "final": false,
            "can_cancel": true,
            "cancel_in": 0,
            "can_reuse": false,
            "can_renew": false
        },
        "balance": "11400.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "That email domain is not available right now."
}

Notes

  • All v2 endpoints work with the same key: Authorization: Token YOUR_API_KEY (Bearer also works). Limit: 60 requests per minute.
  • client_ref makes a purchase safe to retry: sending the same client_ref again returns the same order and never charges twice. Always send it.
  • max_price (naira) protects you from price changes: if the price went above it you get HTTP 409 and are not charged.

Try it REAL purchase

GETCheck for the code/api/v2/email/check

Poll every 10 to 20 seconds until data.order.status is received.

Parameters

ParameterTypeRequiredDescription
idstringrequiredOrder id or ref.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/email/check?id=125' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/email/check?id=125');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/email/check?id=125"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/email/check?id=125", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "id": 123,
            "ref": "OTP_9F8E7D6C1762080000",
            "type": "email",
            "kind": "buy",
            "label": "Telegram @outlook.com",
            "period": null,
            "identity": "user1234@outlook.com",
            "status": "received",
            "code": "381920",
            "message": null,
            "note": null,
            "price": 3120,
            "created_at": "2026-11-02T10:21:05+01:00",
            "expires_at": "2026-11-02T10:41:05+01:00",
            "seconds_left": null,
            "final": true,
            "can_cancel": false,
            "cancel_in": 0,
            "can_reuse": true,
            "can_renew": false
        },
        "balance": "11400.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Order not found."
}

Try it read only, free

POSTCancel and refund/api/v2/email/cancel

Allowed 2 minutes after purchase, while still waiting.

Parameters

ParameterTypeRequiredDescription
idstringrequiredOrder id or ref.

Request example

curl --location 'https://wizedata.com.ng/api/v2/email/cancel' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"id":125}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/email/cancel');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'id' => 125,
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/email/cancel"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "id": 125,
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/email/cancel", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "id": 125
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "status": "cancelled",
            "final": true
        },
        "balance": "12500.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Email orders can be cancelled after 2 minutes.",
    "data": {
        "wait": 45,
        "code": "too_early"
    }
}

Try it REAL purchase

Rent a USA Number

Keep a USA number for days or months. Rentals are final: no cancel, no refund, never auto-renewed.

GETList rentable apps/api/v2/rent/apps

Apps you can rent a number for.

Parameters

ParameterTypeRequiredDescription
verstringoptionalrent4 = monthly (default), rent5 = daily and weekly.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/rent/apps?ver=rent4' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/rent/apps?ver=rent4');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/rent/apps?ver=rent4"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/rent/apps?ver=rent4", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": "WhatsApp",
                "name": "WhatsApp",
                "price": 9900,
                "stock": 1
            }
        ]
    }
}

Try it read only, free

GETList rental periods/api/v2/rent/durations

Periods and prices for one app.

Parameters

ParameterTypeRequiredDescription
verstringoptionalrent4 (default) or rent5.
appstringrequiredApp id from List rentable apps.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/rent/durations?ver=rent4&app=WhatsApp' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/rent/durations?ver=rent4&app=WhatsApp');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/rent/durations?ver=rent4&app=WhatsApp"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/rent/durations?ver=rent4&app=WhatsApp", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": "thirtyDay",
                "name": "1 month",
                "price": 9900,
                "months": 1
            },
            {
                "id": "ninetyDay",
                "name": "3 months",
                "price": 26990,
                "months": 3
            }
        ]
    }
}

Try it read only, free

POSTRent a number/api/v2/rent/buy

Rents a USA number. FINAL: it cannot be cancelled or refunded, and it never auto-renews.

Parameters

ParameterTypeRequiredDescription
verstringoptionalrent4 (default) or rent5.
appstringrequiredApp id.
durationstringrequiredPeriod id from List rental periods.
confirm_finalbooleanrequiredMust be true: you accept that rentals are final.
max_pricenumberoptionalHighest price you accept.
client_refstringoptionalYour unique reference.

Request example

curl --location 'https://wizedata.com.ng/api/v2/rent/buy' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"ver":"rent4","app":"WhatsApp","duration":"thirtyDay","confirm_final":true,"client_ref":"rent-1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/rent/buy');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'ver' => 'rent4',
        'app' => 'WhatsApp',
        'duration' => 'thirtyDay',
        'confirm_final' => true,
        'client_ref' => 'rent-1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/rent/buy"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "ver": "rent4",
    "app": "WhatsApp",
    "duration": "thirtyDay",
    "confirm_final": True,
    "client_ref": "rent-1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/rent/buy", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "ver": "rent4",
    "app": "WhatsApp",
    "duration": "thirtyDay",
    "confirm_final": true,
    "client_ref": "rent-1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "id": 123,
            "ref": "OTP_9F8E7D6C1762080000",
            "type": "rent4",
            "kind": "buy",
            "label": "WhatsApp",
            "period": "thirtyDay",
            "identity": "+12025550199",
            "status": "active",
            "code": null,
            "message": null,
            "note": null,
            "price": 3120,
            "created_at": "2026-11-02T10:21:05+01:00",
            "expires_at": "2026-12-02T10:21:05+01:00",
            "seconds_left": null,
            "final": true,
            "can_cancel": false,
            "cancel_in": 0,
            "can_reuse": false,
            "can_renew": true
        },
        "balance": "2600.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Please confirm that you understand rentals are final and cannot be cancelled."
}

Notes

  • All v2 endpoints work with the same key: Authorization: Token YOUR_API_KEY (Bearer also works). Limit: 60 requests per minute.
  • client_ref makes a purchase safe to retry: sending the same client_ref again returns the same order and never charges twice. Always send it.
  • max_price (naira) protects you from price changes: if the price went above it you get HTTP 409 and are not charged.
  • If the provider does not answer clearly, the order comes back as processing and is completed or refunded automatically within 30 minutes. Check it with Check a transaction.

Try it REAL purchase

GETYour rented numbers/api/v2/rent/numbers

All numbers you have rented.

Parameters

No parameters.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/rent/numbers' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/rent/numbers');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/rent/numbers"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/rent/numbers", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": []
    }
}

Try it read only, free

GETRead rental messages/api/v2/rent/messages

Messages received on a rented number.

Parameters

ParameterTypeRequiredDescription
idstringrequiredOrder id or ref of the rental.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/rent/messages?id=126' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/rent/messages?id=126');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/rent/messages?id=126"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/rent/messages?id=126", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "messages": [
            {
                "text": "Your verification code is 442193",
                "sender": "WhatsApp",
                "time": "2026-11-02 10:30:11"
            }
        ]
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "No messages for this order."
}

Try it read only, free

POSTRenew a rental/api/v2/rent/renew

Extends a rented number (charged). Server rent5 renews for the same period only.

Parameters

ParameterTypeRequiredDescription
idstringrequiredOrder id or ref of the rental.
durationstringrequiredPeriod id.
max_pricenumberoptionalHighest price you accept.
client_refstringoptionalYour unique reference.

Request example

curl --location 'https://wizedata.com.ng/api/v2/rent/renew' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"id":126,"duration":"thirtyDay","client_ref":"renew-1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/rent/renew');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'id' => 126,
        'duration' => 'thirtyDay',
        'client_ref' => 'renew-1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/rent/renew"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "id": 126,
    "duration": "thirtyDay",
    "client_ref": "renew-1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/rent/renew", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "id": 126,
    "duration": "thirtyDay",
    "client_ref": "renew-1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "status": "active"
        },
        "balance": "2600.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "This rental cannot be renewed."
}

Try it REAL purchase

Travel eSIM

Mobile data for trips. Choose a destination, buy a plan, then install the eSIM with the QR code. Delivered eSIMs are final.

GETList destinations/api/v2/esim/destinations

Places you can buy an eSIM for, with the number of plans and the lowest price.

Parameters

ParameterTypeRequiredDescription
scopestringoptionalcountry (default), regional or global.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/esim/destinations?scope=country' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/esim/destinations?scope=country');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/esim/destinations?scope=country"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/esim/destinations?scope=country", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": "TR",
                "name": "Turkey",
                "plans": 14,
                "from_price": 2100
            }
        ]
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Travel eSIM is not available yet."
}

Errors

HTTPMessage
401Invalid API key.
501Travel eSIM is not available yet.
503Unavailable right now.

Try it read only, free

GETList plans/api/v2/esim/plans

Data plans for one destination with your price. Use the plan id when buying.

Parameters

ParameterTypeRequiredDescription
scopestringoptionalcountry (default), regional or global.
codestringrequiredDestination id from List destinations, for example TR.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/esim/plans?scope=country&code=TR' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/esim/plans?scope=country&code=TR');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/esim/plans?scope=country&code=TR"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/esim/plans?scope=country&code=TR", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": "plan_abc123",
                "name": "Turkey 1GB 7 Days",
                "data": "1 GB",
                "validity_days": 7,
                "networks": "Turkcell",
                "supports_topup": true,
                "price": 2100
            }
        ]
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Unavailable right now."
}

Try it read only, free

POSTBuy an eSIM/api/v2/esim/buy

Buys one eSIM. Your wallet is charged and the eSIM is issued straight away. If the provider cannot issue it you are refunded automatically. Delivered eSIMs are final.

Parameters

ParameterTypeRequiredDescription
plan_idstringrequiredPlan id from List plans.
max_pricenumberoptionalHighest price in naira you accept.
client_refstringoptionalYour unique reference. Sending the same one again never double-charges.

Request example

curl --location 'https://wizedata.com.ng/api/v2/esim/buy' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"plan_id":"plan_abc123","max_price":2500,"client_ref":"esim-1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/esim/buy');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'plan_id' => 'plan_abc123',
        'max_price' => 2500,
        'client_ref' => 'esim-1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/esim/buy"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "plan_id": "plan_abc123",
    "max_price": 2500,
    "client_ref": "esim-1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/esim/buy", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "plan_id": "plan_abc123",
    "max_price": 2500,
    "client_ref": "esim-1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "id": 130,
            "ref": "ESM_1A2B3C4D1762080000",
            "type": "esim",
            "kind": "buy",
            "label": "Turkey 1GB 7 Days",
            "period": "7 days",
            "identity": "8901234567890123456",
            "status": "active",
            "code": null,
            "message": null,
            "note": null,
            "price": 2100,
            "created_at": "2026-11-03T10:21:05+01:00",
            "expires_at": null,
            "seconds_left": null,
            "final": true,
            "can_cancel": false,
            "cancel_in": 0,
            "can_reuse": false,
            "can_check": false,
            "can_topup": true,
            "is_esim": true
        },
        "balance": "17900.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "The price changed to ₦2,300.00. Please confirm again.",
    "data": {
        "price": 2300,
        "code": "price_changed"
    }
}

Errors

HTTPMessage
401Invalid API key.
402Insufficient wallet balance.
409Price changed (data.price has the new price).
501Travel eSIM is not available yet.
502Provider could not issue the eSIM. data.refunded is true; you were not charged.

Notes

  • All v2 endpoints work with the same key: Authorization: Token YOUR_API_KEY (Bearer also works). Limit: 60 requests per minute.
  • client_ref makes a purchase safe to retry: sending the same client_ref again returns the same order and never charges twice. Always send it.
  • max_price (naira) protects you from price changes: if the price went above it you get HTTP 409 and are not charged.
  • If the provider does not answer clearly the order comes back as processing and is completed or refunded automatically. Check it with Check an eSIM order.

Try it REAL purchase

GETCheck an eSIM order/api/v2/esim/order

Status of an eSIM order.

Parameters

ParameterTypeRequiredDescription
idstringrequiredOrder id or ref.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/esim/order?id=130' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/esim/order?id=130');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/esim/order?id=130"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/esim/order?id=130", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "id": 130,
            "ref": "ESM_1A2B3C4D1762080000",
            "type": "esim",
            "kind": "buy",
            "label": "Turkey 1GB 7 Days",
            "period": "7 days",
            "identity": "8901234567890123456",
            "status": "active",
            "code": null,
            "message": null,
            "note": null,
            "price": 2100,
            "created_at": "2026-11-03T10:21:05+01:00",
            "expires_at": null,
            "seconds_left": null,
            "final": true,
            "can_cancel": false,
            "cancel_in": 0,
            "can_reuse": false,
            "can_check": false,
            "can_topup": true,
            "is_esim": true
        },
        "balance": "17900.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Order not found."
}

Try it read only, free

GETGet the install code/api/v2/esim/qrcode

The QR code and text needed to install the eSIM. Treat it like a password: anyone who has it can install the eSIM.

Parameters

ParameterTypeRequiredDescription
idstringrequiredOrder id or ref.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/esim/qrcode?id=130' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/esim/qrcode?id=130');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/esim/qrcode?id=130"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/esim/qrcode?id=130", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "lpa": "LPA:1$smdp.example$ACTIVATION",
        "qr_data_url": "data:image/png;base64,iVBOR...",
        "smdp_address": "smdp.example",
        "activation_code": "ACTIVATION",
        "install_urls": {
            "ios": "https://...",
            "android": "https://..."
        }
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Your eSIM is still being prepared. Try again in a moment."
}

Errors

HTTPMessage
400Your eSIM is still being prepared. Try again in a moment.
400This eSIM can no longer be installed.

Try it read only, free

GETData usage/api/v2/esim/usage

Remaining data. Some carriers do not report usage (tracking is false then).

Parameters

ParameterTypeRequiredDescription
idstringrequiredOrder id or ref.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/esim/usage?id=130' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/esim/usage?id=130');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/esim/usage?id=130"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/esim/usage?id=130", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "tracking": true,
        "remaining_mb": 512,
        "total_mb": 1024,
        "expires_at": "2026-11-10 10:21:05"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "Usage is not available right now."
}

Try it read only, free

GETList top-ups/api/v2/esim/topups

Top-up packages available for an eSIM, with your price.

Parameters

ParameterTypeRequiredDescription
idstringrequiredOrder id or ref.

Request example

curl --location --request GET 'https://wizedata.com.ng/api/v2/esim/topups?id=130' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/esim/topups?id=130');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/esim/topups?id=130"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}

response = requests.get(url, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/esim/topups?id=130", {
  method: "GET",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "items": [
            {
                "id": "topup_1",
                "name": "1GB 7 Days",
                "label": "1 GB · 7 days",
                "price": 3250
            }
        ]
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "This eSIM cannot be topped up."
}

Try it read only, free

POSTTop up an eSIM/api/v2/esim/topup

Adds a top-up package to an eSIM (charged).

Parameters

ParameterTypeRequiredDescription
idstringrequiredOrder id or ref of the eSIM.
packagestringrequiredPackage id from List top-ups.
max_pricenumberoptionalHighest price you accept.
client_refstringoptionalYour unique reference.

Request example

curl --location 'https://wizedata.com.ng/api/v2/esim/topup' \
  --header 'Authorization: Token YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{"id":130,"package":"topup_1","client_ref":"topup-1001"}'
<?php
$ch = curl_init('https://wizedata.com.ng/api/v2/esim/topup');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Token YOUR_API_KEY',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'id' => 130,
        'package' => 'topup_1',
        'client_ref' => 'topup-1001',
    ]),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($response);
import requests

url = "https://wizedata.com.ng/api/v2/esim/topup"
headers = {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "id": 130,
    "package": "topup_1",
    "client_ref": "topup-1001",
}

response = requests.post(url, json=payload, headers=headers, timeout=60)
print(response.status_code, response.json())
const response = await fetch("https://wizedata.com.ng/api/v2/esim/topup", {
  method: "POST",
  headers: {
    "Authorization": "Token YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "id": 130,
    "package": "topup_1",
    "client_ref": "topup-1001"
}),
});
console.log(response.status, await response.json());

Success response HTTP 200

{
    "status": "success",
    "msg": "OK",
    "data": {
        "order": {
            "id": 131,
            "ref": "ESM_1A2B3C4D1762080000",
            "type": "esim",
            "kind": "topup",
            "label": "Top-up: 1GB 7 Days",
            "period": "7 days",
            "identity": "8901234567890123456",
            "status": "active",
            "code": null,
            "message": null,
            "note": null,
            "price": 3250,
            "created_at": "2026-11-03T10:21:05+01:00",
            "expires_at": null,
            "seconds_left": null,
            "final": true,
            "can_cancel": false,
            "cancel_in": 0,
            "can_reuse": false,
            "can_check": false,
            "can_topup": true,
            "is_esim": true
        },
        "balance": "14650.00"
    }
}

Error response HTTP 400

{
    "status": "fail",
    "msg": "That top-up is not available."
}

Try it REAL purchase

ID tables

Read live from our system, so they are always current.

Networks for Airtime and Data

Use this id as network on /api/airtime/ and /api/data/.

IDNetworkStatus
1MTNOn
2GLOOn
39MOBILEOn
4AIRTELOn

Networks for Recharge card pins

Different numbering! Use this id as network on /api/rechargepin/.

IDNetwork
1MTN
2AIRTEL
3GLO
49MOBILE

Networks for Data pins

Different numbering! Use this id as network on /api/datapin/.

IDNetwork
1MTN
3GLO
4AIRTEL
59MOBILE

Cable TV providers

Use as provider on /api/cabletv/ and /api/cabletv/verify/.

IDProviderStatus
1GOTVOn
2DSTVOn
3STARTIMESOn

Electricity providers (DISCOs)

Use as provider on /api/electricity/ and /api/electricity/verify/. meter type: prepaid or postpaid.

IDProviderCodeStatus
1Ikeja ElectricIEOn
2Eko ElectricEKEDCOn
3Kano ElectricKEDCOOn
4Port Harcourt ElectricPHEDCOn
5Jos ElectricJEDOn
6Ibadan ElectricIBEDCOn
7Kaduna ElectricKEDCOn
8Abuja ElectricAEDCOn
9Enugu ElectricENUGUOn
10Benin ElectricBENINOn
11Yola ElectricYOLAOn

Exam providers

Use as provider on /api/exam/.

IDExamPriceStatus
1WAECN3500On
2NECON1350On
3NABTEBN900Off

静  WizeData API · questions? contact support from your dashboard
Terms · Privacy · KYC & Abuse · Reseller & API Terms (using your API key means you accept them)