Submefast API VTU Get API key

Submefast VTU API

Sell airtime, data, cable TV, electricity, exam PINs, recharge and data cards, and betting top-ups from your own website or app — paid from your Submefast wallet at your account's prices.

Base URL
https://sub.submefast.com/api/v1

  1. Create a Submefast account and ask us to upgrade it to a Vendor account.
  2. Log in, open Developer API and generate your Live API Key (it starts with sub_live_). Keep it on your server — never in a browser or mobile app.
  3. Fund your wallet. Every purchase is charged from it.
  4. Call the catalog for plan IDs, then make purchases with your key and your 4-digit transaction PIN.
curl https://sub.submefast.com/api/v1/balance.php \
  -H 'Authorization: Bearer YOUR_API_KEY'

Authentication

Send your API key in the Authorization header on every request. Purchase requests are POST with a JSON body.

Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
  • Every purchase also needs your 4-digit transaction pin in the body. Three wrong PINs lock purchases for 10 minutes.
  • Your key stops working if you change or reset your password or generate a new key. Generate a new one in Developer API and update your server.
  • A missing, wrong or revoked key returns 401: {"status":"error","success":false,"message":"Unauthorized: Invalid or missing token"}.

Responses & status

Every response is JSON with a status of success, pending or error, and a readable message. Money is in naira.

statusHTTPWhat it means
success200The purchase was delivered. data.reference is your receipt number.
pending200Paid and sent to the provider, waiting for confirmation. Check it with Transaction status until it is final. If it fails, your wallet is refunded automatically.
error + refunded: true400The provider declined it. Your wallet has already been refunded. reference identifies the refunded transaction.
error400Nothing was bought — wrong input, wrong PIN, insufficient balance, a limit reached, or a duplicate request. Read message.
error401 / 403 / 405 / 429Bad key / service not available on this account / wrong HTTP method / too many requests.

For pending purchases, set a webhook to be told when they become final, or check Transaction status (for example every 30–60 seconds).

Webhooks

Save a webhook URL under Developer API → Webhook Configuration. When a purchase that returned pending becomes final, we POST this JSON to it (failed deliveries are retried for up to a day):

{
    "event": "transaction.success",
    "reference": "SUB7E1BC10B4B3D1791190455",
    "data": {
        "reference": "SUB7E1BC10B4B3D1791190455",
        "status": "success",
        "refunded": false,
        "category": "airtime",
        "amount": 490.0,
        "description": "₦500 MTN airtime to 08031234567"
    },
    "timestamp": "2026-10-08T14:15:02Z"
}
  • event is transaction.success or transaction.failed. A failed purchase is refunded to your wallet (refunded: true).
  • Verify it came from us: the X-Signature header is the hex HMAC-SHA256 of the raw request body, using your API key as the secret. Compare it in constant time and ignore requests that don't match.
  • Reply with any 2xx status. Handle repeats safely — use reference to ignore an event you already processed.
  • Need the electricity token or PINs? Fetch them with Transaction status.
  • The URL must be a public internet address (https:// recommended).
$body = file_get_contents('php://input');
$sig  = hash_hmac('sha256', $body, getenv('API_KEY'));
if (!hash_equals($sig, $_SERVER['HTTP_X_SIGNATURE'] ?? '')) { http_response_code(401); exit; }
$event = json_decode($body, true);
// mark $event['reference'] as $event['data']['status'] in your system
http_response_code(200);

Limits & duplicates

  • Purchases: up to 30 requests per minute per account. Meter and smartcard checks: 20 per 5 minutes. Over the limit returns 429.
  • Daily spending limits apply per account (your account level's limit, set by us). Reaching one returns "Transaction limit reached. Contact Admin."
  • Duplicate protection: the same purchase (for example the same number, network and amount) sent again while the first is still pending, or within 30 seconds after it succeeded, is refused instead of charged twice. Wait and check the first one with Transaction status.
  • Phone numbers are 11-digit local numbers (08031234567), not +234….

Wallet balance

GET https://sub.submefast.com/api/v1/balance.php

Your current wallet and cashback balance.

curl -X GET 'https://sub.submefast.com/api/v1/balance.php' \
  -H 'Authorization: Bearer YOUR_API_KEY'
{
    "status": "success",
    "data": {
        "wallet_balance": 152830.5,
        "cashback_balance": 120.0,
        "currency": "NGN"
    }
}

Service catalog

GET https://sub.submefast.com/api/v1/catalog.php

Data plans, cable TV plans, electricity companies, exam PIN and recharge-card prices — priced for your account level. Call this to get the IDs the purchase endpoints need.

Use data_plans[].id as plan_id for Buy data, cable_plans[].id as plan_id for cable TV, cable_plans[].cable_id for smartcard validation and discos[].disco_id for electricity. The catalog's own plan_id field is an internal code — don't send it.

curl -X GET 'https://sub.submefast.com/api/v1/catalog.php' \
  -H 'Authorization: Bearer YOUR_API_KEY'
{
    "status": "success",
    "data": {
        "data_plans": [
            {
                "id": 41,
                "network": "MTN",
                "plan_id": "211",
                "plan_name": "MTN SME 1GB",
                "display_name": "1GB",
                "data_type": "SME",
                "data_size": "1GB",
                "validity": "30 Days",
                "selling_price": "250.00",
                "network_id": 1,
                "cashback_type": null,
                "cashback_value": null
            }
        ],
        "cable_plans": [
            {
                "id": 7,
                "provider": "GOTV",
                "cable_id": 1,
                "plan_id": "gotv-max",
                "plan_name": "GOtv Max",
                "display_name": null,
                "selling_price": "8500.00"
            }
        ],
        "discos": [
            {
                "disco_id": 1,
                "disco_name": "Ikeja Electric",
                "charge": "100.00"
            }
        ],
        "exam_prices": {
            "WAEC": 3500.0,
            "NECO": 1300.0
        },
        "recharge_card_prices": {
            "MTN": {
                "100": 98.0,
                "200": 196.0
            }
        },
        "bulk_sms_pricing": null,
        "cashback": {
            "airtime": null,
            "data": null
        }
    }
}

Buy airtime

POST https://sub.submefast.com/api/v1/airtime.php

Send airtime to any Nigerian number. You are charged the face value less your account level's discount.

Body (JSON)

FieldTypeDescription
networkstringrequiredMTN, GLO, AIRTEL or 9MOBILE (not case-sensitive).
phonestringrequired11-digit local number, e.g. 08031234567 (not +234…).
amountnumberrequiredBetween ₦50 and ₦10,000.
pinstringrequiredYour 4-digit transaction PIN (the one you use on the website). 3 wrong PINs lock purchases for 10 minutes.
curl -X POST 'https://sub.submefast.com/api/v1/airtime.php' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"network":"MTN","phone":"08031234567","amount":500,"pin":"1234"}'
{
    "status": "success",
    "message": "₦500 MTN airtime sent to 08031234567",
    "data": {
        "reference": "SUB7E1BC10B4B3D1791190455",
        "cashback_earned": 0.0,
        "balance_before": 152830.5,
        "balance_after": 152340.5
    }
}

Buy data

POST https://sub.submefast.com/api/v1/data.php

Send a data bundle. The network comes from the plan; the price is your account level's plan price.

Body (JSON)

FieldTypeDescription
networkstringrequiredThe plan's network (MTN, GLO, AIRTEL, 9MOBILE).
phonestringrequired11-digit local number.
plan_idintegerrequireddata_plans[].id from the catalog.
pinstringrequiredYour 4-digit transaction PIN (the one you use on the website). 3 wrong PINs lock purchases for 10 minutes.
promo_codestringoptionalA promo code, if you have one (one use per account).
curl -X POST 'https://sub.submefast.com/api/v1/data.php' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"network":"MTN","phone":"08031234567","plan_id":41,"pin":"1234"}'
{
    "status": "success",
    "message": "1GB MTN data sent to 08031234567",
    "data": {
        "reference": "SUB7E1BC10B4B3D1791190455",
        "cashback_earned": 0.0,
        "balance_before": 152830.5,
        "balance_after": 152580.5
    }
}

Validate meter

POST https://sub.submefast.com/api/v1/validate_meter.php

Look up the customer name on a meter before you buy. Free.

Body (JSON)

FieldTypeDescription
disco_idintegerrequireddiscos[].disco_id from the catalog.
meter_numberstringrequiredThe meter number.
meter_typestringrequiredprepaid or postpaid (lowercase).
curl -X POST 'https://sub.submefast.com/api/v1/validate_meter.php' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"disco_id":1,"meter_number":"45031234567","meter_type":"prepaid"}'
{
    "status": "success",
    "data": {
        "name": "ADEBAYO JOHN",
        "address": "12 ALLEN AVENUE IKEJA"
    }
}

Buy electricity

POST https://sub.submefast.com/api/v1/electricity.php

Buy a prepaid token or pay a postpaid bill. Your wallet is charged the amount plus the electricity company's service charge.

Body (JSON)

FieldTypeDescription
disco_idintegerrequireddiscos[].disco_id from the catalog.
meter_numberstringrequiredThe meter number.
meter_typestringrequiredprepaid or postpaid (lowercase).
amountnumberrequiredBetween ₦1,000 and ₦50,000.
pinstringrequiredYour 4-digit transaction PIN (the one you use on the website). 3 wrong PINs lock purchases for 10 minutes.
phonestringoptionalCustomer phone number (some providers send the token by SMS).

If the provider confirms the payment but sends no token, token is "Check meter". Get the token later from Transaction status.

curl -X POST 'https://sub.submefast.com/api/v1/electricity.php' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"disco_id":1,"meter_number":"45031234567","meter_type":"prepaid","amount":5000,"pin":"1234"}'
{
    "status": "success",
    "success": true,
    "message": "Token: 1234-5678-9012-3456-7890",
    "pending": false,
    "data": {
        "reference": "SUB7E1BC10B4B3D1791190455",
        "token": "1234-5678-9012-3456-7890",
        "cashback_earned": 0.0,
        "pending": false,
        "balance_before": 152830.5,
        "balance_after": 147730.5
    }
}

Validate smartcard

POST https://sub.submefast.com/api/v1/validate-cable.php

Look up the customer name on a smartcard / IUC number before you subscribe. Free.

Body (JSON)

FieldTypeDescription
cable_idintegerrequired1 = GOTV, 2 = DSTV, 3 = STARTIMES (cable_plans[].cable_id).
smartcardstringrequiredSmartcard / IUC number, digits only.
curl -X POST 'https://sub.submefast.com/api/v1/validate-cable.php' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"cable_id":2,"smartcard":"7023456789"}'
{
    "status": "success",
    "success": true,
    "message": "SmartCard verified successfully.",
    "data": {
        "name": "ADEBAYO JOHN",
        "customer_name": "ADEBAYO JOHN",
        "smartcard": "7023456789"
    }
}

Subscribe cable TV

POST https://sub.submefast.com/api/v1/cabletv.php

Renew or buy a DSTV, GOTV or Startimes bouquet. The provider comes from the plan.

Body (JSON)

FieldTypeDescription
plan_idintegerrequiredcable_plans[].id from the catalog.
smartcardstringrequiredSmartcard / IUC number.
pinstringrequiredYour 4-digit transaction PIN (the one you use on the website). 3 wrong PINs lock purchases for 10 minutes.
phonestringoptionalCustomer phone number.
curl -X POST 'https://sub.submefast.com/api/v1/cabletv.php' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"plan_id":7,"smartcard":"7023456789","pin":"1234"}'
{
    "status": "success",
    "message": "GOtv Max subscription successful",
    "data": {
        "reference": "SUB7E1BC10B4B3D1791190455",
        "cashback_earned": 0.0,
        "balance_before": 152830.5,
        "balance_after": 144330.5
    }
}

Buy exam PINs

POST https://sub.submefast.com/api/v1/exam_pin.php

Result-checker PINs. Price per PIN is in exam_prices in the catalog.

Body (JSON)

FieldTypeDescription
exam_namestringrequiredOne of: WAEC, NECO, NABTEB.
quantityintegerrequired1 to 5.
pinstringrequiredYour 4-digit transaction PIN (the one you use on the website). 3 wrong PINs lock purchases for 10 minutes.
curl -X POST 'https://sub.submefast.com/api/v1/exam_pin.php' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"exam_name":"WAEC","quantity":1,"pin":"1234"}'
{
    "status": "success",
    "message": "1 WAEC PIN(s) purchased",
    "data": {
        "reference": "SUB7E1BC10B4B3D1791190455",
        "pins": [
            "PIN: 123456789012 | Serial: WRN123456789"
        ],
        "balance_before": 152830.5,
        "balance_after": 149330.5
    }
}

Buy recharge cards

POST https://sub.submefast.com/api/v1/recharge_card.php

Printable airtime recharge PINs. GET on the same URL lists networks and available denominations.

Body (JSON)

FieldTypeDescription
network_idintegerrequired1 = MTN, 2 = GLO, 3 = AIRTEL, 4 = 9MOBILE.
denominationintegerrequired100, 200, 500 or 1000 (whichever are available — see the GET).
quantityintegeroptional1 to 50. Default 1.
pinstringrequiredYour 4-digit transaction PIN (the one you use on the website). 3 wrong PINs lock purchases for 10 minutes.
name_on_cardstringoptionalBusiness name printed on the cards (max 30 characters).
curl -X POST 'https://sub.submefast.com/api/v1/recharge_card.php' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"network_id":1,"denomination":100,"quantity":2,"pin":"1234"}'
{
    "status": "success",
    "message": "2 card(s) ready",
    "data": {
        "reference": "SUB7E1BC10B4B3D1791190455",
        "pins": [
            {
                "pin": "1234567890123456",
                "serial": "SN000123"
            },
            {
                "pin": "6543210987654321",
                "serial": "SN000124"
            }
        ],
        "balance_before": 152830.5,
        "balance_after": 152634.5
    }
}

Buy data cards

POST https://sub.submefast.com/api/v1/data_card.php

Printable data PINs for a data plan.

Body (JSON)

FieldTypeDescription
plan_idintegerrequireddata_plans[].id from the catalog.
quantityintegeroptional1 to 5. Default 1.
pinstringrequiredYour 4-digit transaction PIN (the one you use on the website). 3 wrong PINs lock purchases for 10 minutes.
name_on_cardstringoptionalBusiness name printed on the cards (max 30 characters).
curl -X POST 'https://sub.submefast.com/api/v1/data_card.php' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"plan_id":41,"quantity":1,"pin":"1234"}'
{
    "status": "success",
    "message": "1 data card(s) ready",
    "data": {
        "reference": "SUB7E1BC10B4B3D1791190455",
        "pins": [
            {
                "pin": "1234567890",
                "memo": "Dial *460*6*1# to load"
            }
        ],
        "balance_before": 152830.5,
        "balance_after": 152580.5
    }
}

Betting platforms

GET https://sub.submefast.com/api/v1/betting.php

Platforms you can fund, with their service charge.

curl -X GET 'https://sub.submefast.com/api/v1/betting.php' \
  -H 'Authorization: Bearer YOUR_API_KEY'
{
    "status": "success",
    "success": true,
    "platforms": [
        {
            "id": 3,
            "platform_name": "Bet9ja",
            "charge": "100.00"
        }
    ]
}

Fund betting wallet

POST https://sub.submefast.com/api/v1/betting.php

Top up a customer's betting account. Your wallet is charged the amount plus the platform charge. To check the customer first, send "action": "validate_customer" with plan_id and customer_id only.

Body (JSON)

FieldTypeDescription
plan_idintegerrequiredPlatform id from Betting platforms.
customer_idstringrequiredThe customer's ID on the platform.
amountnumberrequiredBetween ₦100 and ₦5,000.
pinstringrequiredYour 4-digit transaction PIN (the one you use on the website). 3 wrong PINs lock purchases for 10 minutes.
customer_namestringoptionalFrom validation, if you already have it.
curl -X POST 'https://sub.submefast.com/api/v1/betting.php' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"plan_id":3,"customer_id":"12345678","amount":1000,"pin":"1234"}'
{
    "status": "success",
    "success": true,
    "message": "Betting wallet funded successfully.",
    "pending": false,
    "data": {
        "reference": "SUB7E1BC10B4B3D1791190455",
        "cashback_earned": 0.0,
        "balance_before": 152830.5,
        "balance_after": 151730.5
    }
}

Transaction status

GET https://sub.submefast.com/api/v1/receipt.php

Look up one of your transactions by reference — use it to follow a pending purchase until it is final, and to fetch tokens and PINs again.

Query parameters

FieldTypeDescription
referencestring (query)requiredThe reference a purchase returned.

status is pending or processing (not final yet — check again in a minute), success, or failed / reversed (your wallet was refunded).

curl -X GET 'https://sub.submefast.com/api/v1/receipt.php?reference=SUB7E1BC10B4B3D1791190455' \
  -H 'Authorization: Bearer YOUR_API_KEY'
{
    "status": "success",
    "success": true,
    "data": {
        "id": 9021,
        "reference": "SUB7E1BC10B4B3D1791190455",
        "transaction_ref": "SUB7E1BC10B4B3D1791190455",
        "category": "electricity",
        "type": "debit",
        "amount": 5100.0,
        "status": "success",
        "description": "Ikeja Electric prepaid ₦5,000",
        "phone": "",
        "balance_before": 152830.5,
        "balance_after": 147730.5,
        "created_at": "2026-10-08 14:13:42",
        "pins": [],
        "token": "1234-5678-9012-3456-7890",
        "meta": {
            "meter": "45031234567"
        }
    }
}

Transaction history

GET https://sub.submefast.com/api/v1/transactions.php

Your transactions, newest first.

Query parameters

FieldTypeDescription
pageinteger (query)optionalPage number. Default 1.
per_pageinteger (query)optional10 to 50. Default 20.
filterstring (query)optionalOne category: airtime, data, electricity, cabletv, exam_pin, recharge_card, data_card.
curl -X GET 'https://sub.submefast.com/api/v1/transactions.php?page=1&per_page=20&filter=airtime' \
  -H 'Authorization: Bearer YOUR_API_KEY'
{
    "status": "success",
    "data": {
        "data": [
            {
                "id": 9021,
                "transaction_ref": "SUB7E1BC10B4B3D1791190455",
                "type": "debit",
                "category": "airtime",
                "amount": "490.00",
                "description": "₦500 MTN airtime to 08031234567",
                "status": "success",
                "created_at": "2026-10-08 14:13:42"
            }
        ],
        "total": 1,
        "page": 1,
        "per_page": 20,
        "total_pages": 1
    }
}

© Submefast 2026 · Home · Contact