API Documentation
The Strongmb REST API lets you integrate airtime, data, cable TV, electricity, and bill payment services directly into your application. All requests return JSON.
The Strongmb API is a REST API. All responses are JSON. All requests must be made over HTTPS. Requests made over plain HTTP will be rejected.
POST /v1/purchases/airtime HTTP/1.1 Host: api.strongmb.ng Authorization: Bearer YOUR_API_KEY Content-Type: application/json Accept: application/json
{
"status": true,
"message": "Request successful",
"data": { // payload varies per endpoint },
"metadata": {
"code": "MACHINE_READABLE_CODE",
"timestamp": 1773796899,
"trace_id": "05E3F2360E"
}
}All API requests require authentication using a Bearer token in the Authorization header. In your dashboard, click the Developer tab to view your API key.
Authorization: Bearer YOUR_API_KEYUse the sandbox URL during development and the live URL in production.
The API uses standard HTTP status codes. All error responses include a machine-readable code and a human-readable message.
| HTTP Code | Meaning | Common Cause |
|---|---|---|
| 200 | OK | Request was successful |
| 201 | Created | Transaction completed successfully |
| 400 | Bad Request | Missing or invalid parameters |
| 401 | Unauthorized | Missing or invalid API key |
| 402 | Insufficient Balance | Wallet balance too low for the transaction |
| 403 | Forbidden | Account is inactive or suspended |
| 404 | Not Found | Resource does not exist |
| 422 | Unprocessable Entity | Validation failed — invalid phone, missing field |
| 429 | Too Many Requests | Daily limit exceeded — contact support to increase |
| 503 | Service Unavailable | Provider gateway is temporarily down |
{
"status": false,
"message": "Invalid mobile number.",
"data": null,
"metadata": {
"code": "ERR_INVALID_MOBILE_NUMBER",
"timestamp": 1773797071,
"trace_id": "99643G15FA"
}
}Every API response includes a metadata.code field. Use this value — not the HTTP status — to determine the exact outcome of each request.
| Code | HTTP | Description |
|---|---|---|
| TRANSACTION_SUCCESSFUL | 201 | The transaction completed successfully. Funds have been deducted and the service delivered. |
| ERR_TRANSACTION_PROCESSING | 200 | The transaction is being processed. Poll by reference to get the final status. |
| ERR_MISSING_OR_INVALID_FIELDS | 400 | One or more required fields are missing or contain invalid values. |
| ERR_INVALID_REFERENCE_FORMAT | 400 | The reference field contains invalid characters. Only a-z A-Z 0-9 are allowed. |
| ERR_REFERENCE_ALREADY_EXISTS | 400 | A transaction with this reference already exists. Each reference must be unique. |
| ERR_INVALID_AIRTIME_AMOUNT | 400 | The airtime amount is invalid. Ensure it is a positive number within the allowed range. |
| ERR_INSUFFICIENT_BALANCE | 402 | Your wallet balance is too low. Fund your wallet and try again. |
| ERR_ACCOUNT_INACTIVE | 403 | Your account is inactive or suspended. Contact support to reactivate. |
| ERR_RESOURCE_NOT_FOUND | 404 | The requested resource does not exist. Verify the endpoint URL and path parameters. |
| ERR_INVALID_PRODUCT_CODE_OR_INACTIVE | 404 | The product code does not exist or the product is currently inactive. |
| ERR_TRANSACTION_FAILED | 500 | The transaction was attempted but failed. Check the status and contact support if wallet was debited. |
| ERR_PRODUCT_GATEWAY_UNAVAILABLE | 503 | The service provider gateway is temporarily unavailable. Retry after a short delay. |
| ERR_INTERNAL_SERVER_ERROR | 500 | An unexpected server error. Contact support with the trace_id from the response. |
Official client libraries for the Strongmb API. Install one package and start buying airtime, data, and more in minutes — no manual HTTP setup needed.
<?php require 'vendor/autoload.php'; use Strongmb\Strongmb; $strongmb = new Strongmb('YOUR_API_KEY'); $response = $strongmb->data->purchase( phone: '08012345678', productCode: 'smb_mtn_sme_1gb_30days', reference: 'MYAPP' . strtoupper(uniqid()), ); if ($response->successful()) { $data = $response->data(); echo 'Sent to ' . $data['recipient'] . ' | Balance: ₦' . $data['balance_after']; } elseif ($response->processing()) { echo 'Processing — reference: ' . $response->data()['reference']; } elseif ($response->failed()) { echo 'Failed. Trace ID: ' . $response->traceId(); }
const { Strongmb } = require('@strongmb/node');
const strongmb = new Strongmb('YOUR_API_KEY');
(async () => {
const response = await strongmb.data.purchase({
phone: '08012345678',
productCode: 'smb_mtn_sme_1gb_30days',
reference: 'MYAPP' + Date.now(),
});
if (response.successful()) {
const data = response.data();
console.log('Sent to', data.recipient, '| Balance: ₦' + data.balance_after);
} else if (response.processing()) {
console.log('Processing — reference:', response.data().reference);
} else if (response.failed()) {
console.log('Failed. Trace ID:', response.traceId());
}
})();from strongmb import Strongmb client = Strongmb("YOUR_API_KEY") response = client.data.purchase( phone="08012345678", product_code="smb_mtn_sme_1gb_30days", reference="MYAPP123456", ) if response.successful(): data = response.data() print(f"Sent to {data['recipient']} | Balance: ₦{data['balance_after']:,}") elif response.processing(): print("Processing — reference:", response.data()["reference"]) elif response.failed(): print("Failed. Trace ID:", response.trace_id())
reference per transaction.
For full SDK documentation, installation guides, and exception handling → SDK Documentation
Returns the profile and account information of the currently authenticated user.
| Header | Value | Required |
|---|---|---|
| Authorization | Bearer YOUR_API_KEY | Required |
{
"status": true,
"message": "User details retrieved successfully",
"data": {
"account": {
"name": "Strongmb User",
"email": "[email protected]",
"phone": "09077193312",
"account_status": "active",
"kyc_status": "incomplete",
"tier": "tier 1"
}
},
"metadata": {
"code": "USER_DETAILS_RETRIEVED",
"timestamp": 1773796899,
"trace_id": "05E3F2360E"
}
}{
"status": false,
"message": "Unauthenticated. Invalid or missing API key.",
"data": null,
"metadata": {
"code": "ERR_UNAUTHENTICATED",
"timestamp": 1773796900,
"trace_id": "A1B2C3D4E5"
}
}Returns all wallets associated with the authenticated user including balances, limits, and status.
{
"status": true,
"message": "Wallet details retrieved successfully",
"data": {
"wallets": [
{
"id": "c99c1747-d5d4-4a51-bbfc-d82d1b2c5640",
"type": "primary_ngn",
"currency": "NGN",
"balance": 44584,
"locked_balance": 0,
"tier": "tier 1",
"transaction_limit": 100000,
"balance_limit": 500000,
"status": "normal",
"updated_at": "2026-03-15 02:27:54+01"
}
]
},
"metadata": {
"code": "WALLET_DETAILS_RETRIEVED",
"timestamp": 1773796949,
"trace_id": "D9E6E57BE9"
}
}Returns the most recent transactions for the authenticated user.
{
"status": true,
"message": "Transactions retrieved successfully",
"data": {
"count": 50,
"transactions": [
{
"uuid": "72f69533-5f11-45d6-8f26-a553f890b277",
"wallet_type": "primary_ngn",
"direction": "debit",
"type": "airtime",
"amount": 99,
"balance_before": 44114,
"balance_after": 44015,
"status": "successful",
"date": "2026-03-18 02:26:38+01",
"reference": "SMBD260aa1352a53aaa7sFAC9",
"details": {
"provider": "mtn",
"recipient": "0812345678",
"airtime_amount": 100,
"performed_via": "api"
}
}
]
},
"metadata": {
"code": "TRANSACTIONS_RETRIEVED",
"timestamp": 1773797290,
"trace_id": "DF008819CD"
}
}{
"status": false,
"message": "No transactions found.",
"data": null,
"metadata": {
"code": "ERR_TRANSACTIONS_NOT_FOUND",
"timestamp": 1773797291,
"trace_id": "FF009820DE"
}
}Returns a single transaction that matches the provided reference.
| Parameter | Type | Required | Description |
|---|---|---|---|
| reference | string | Required | Unique transaction reference e.g. SMBD260aa1352a53aaa7sFAC9 |
{
"status": true,
"message": "Transaction details retrieved successfully",
"data": {
"transaction": {
"uuid": "72f69533-5f11-45d6-8f26-a553f890b277",
"wallet_type": "primary_ngn",
"direction": "debit",
"type": "airtime",
"amount": 99,
"balance_before": 44114,
"balance_after": 44015,
"status": "successful",
"date": "2026-03-18 02:26:38+01",
"reference": "SMBD260aa1352a53aaa7sFAC9",
"details": {
"provider": "mtn",
"recipient": "0812345678",
"airtime_amount": 100,
"performed_via": "api"
}
}
},
"metadata": {
"code": "TRANSACTION_DETAILS_RETRIEVED",
"timestamp": 1773797403,
"trace_id": "F07C7189C0"
}
}{
"status": false,
"message": "Transaction not found.",
"data": null,
"metadata": {
"code": "ERR_TRANSACTIONS_NOT_FOUND",
"timestamp": 1773797291,
"trace_id": "FF009820DE"
}
}Returns available airtime providers and their product codes. Use the product_code when making a purchase.
{
"status": true,
"message": "Products retrieved successfully",
"data": {
"billers": {
"551978d5-1a65-41d5-904f-f2fd667b98a5": {
"name": "MTN NIGERIA",
"description": "Airtime",
"products": {
"vtu": {
"name": "VTU",
"api_access": true,
"plans": [
{
"name": "MTN AIRTIME",
"discount": 1,
"pricing_model": "percent",
"product_code": "smb_mtn_vtu"
}
]
}
}
}
}
},
"metadata": {
"code": "PRODUCTS_RETRIEVED",
"timestamp": 1773797472,
"trace_id": "6D7C4DE84B"
}
}Top up airtime for any Nigerian network. Amount is deducted from the user's wallet balance.
| Field | Type | Required | Description |
|---|---|---|---|
| phone | string | Required | Recipient phone number (e.g. 0812345678) |
| product_code | string | Required | From /products/airtime (e.g. smb_mtn_vtu) |
| amount | string | Required | Airtime face value in Naira as string (e.g. "100") |
| reference | string | Required | Your unique reference. a-zA-Z0-9 only. |
{
"phone": "0812345678",
"product_code": "smb_mtn_vtu",
"amount": "100",
"reference": "SMBD260aa1352a53aaa7sFAC9"
}{
"status": true,
"message": "Airtime purchase is being processed.",
"data": {
"transaction_status": "processing",
"type": "airtime",
"provider": "mtn",
"recipient": "0812345678",
"airtime_amount": 100,
"reference": "SMBD260aa1352a53aaa7sFAC9",
"currency": "NGN",
"balance_before": "44114.00",
"balance_after": "44015.00",
"amount": 99
},
"metadata": { "code": "ERR_TRANSACTION_PROCESSING", "timestamp": 1773797068, "trace_id": "96640DE2C7" }
}{
"status": true,
"message": "Airtime purchased successfully.",
"data": {
"transaction_status": "successful",
"type": "airtime",
"provider": "mtn",
"recipient": "0812345678",
"airtime_amount": 100,
"reference": "SMBD260aa1352a53aaa7sFAC9",
"currency": "NGN",
"balance_before": "44114.00",
"balance_after": "44015.00",
"amount": 99
},
"metadata": { "code": "TRANSACTION_SUCCESSFUL", "timestamp": 1773797069, "trace_id": "C2D3E4F5A6" }
}{
"status": false,
"message": "Insufficient wallet balance.",
"data": null,
"metadata": { "code": "ERR_INSUFFICIENT_BALANCE", "timestamp": 1773797069, "trace_id": "97641EF3D8" }
}{
"status": false,
"message": "Product code is invalid or currently inactive.",
"data": null,
"metadata": { "code": "ERR_INVALID_PRODUCT_CODE_OR_INACTIVE", "timestamp": 1773797072, "trace_id": "AA644H26GB" }
}{
"status": false,
"message": "Invalid mobile number.",
"data": null,
"metadata": { "code": "ERR_INVALID_MOBILE_NUMBER", "timestamp": 1773797071, "trace_id": "99643G15FA" }
}{
"status": false,
"message": "Daily limit exceeded. Contact support to increase.",
"data": null,
"metadata": { "code": "ERR_DAILY_LIMIT_EXCEEDED", "timestamp": 1773797073, "trace_id": "BB645I37HC" }
}{
"status": false,
"message": "Service provider temporarily unavailable.",
"data": null,
"metadata": { "code": "ERR_PRODUCT_GATEWAY_UNAVAILABLE", "timestamp": 1773797070, "trace_id": "98642F04E9" }
}Returns all available data plans. Use the product_code from each plan when making a purchase.
{
"status": true,
"message": "Products retrieved successfully",
"data": {
"billers": {
"551978d5-...": {
"name": "MTN NIGERIA",
"products": {
"sme": {
"name": "SME",
"api_access": true,
"plans": [
{
"name": "100MB",
"bundle_size_mb": 100,
"amount": 120,
"validity": "2DAYS",
"product_code": "smb_mtn_sme_100mb_2days"
},
{
"name": "1GB",
"bundle_size_mb": 1024,
"amount": 470,
"validity": "30DAYS",
"product_code": "smb_mtn_sme_1gb_30days"
}
]
}
}
}
}
},
"metadata": { "code": "PRODUCTS_RETRIEVED", "timestamp": 1773797441, "trace_id": "EA3E9D3EDC" }
}Purchase a data plan using a product_code obtained from /products/internet.
| Field | Type | Required | Description |
|---|---|---|---|
| phone | string | Required | Recipient phone number |
| product_code | string | Required | From /products/internet (e.g. smb_mtn_sme_1gb_30days) |
| reference | string | Required | Unique reference. a-zA-Z0-9 only. |
{
"phone": "0812345678",
"product_code": "smb_mtn_sme_1gb_30days",
"reference": "SMsadkjhdfkgfjaaa1fhaa"
}{
"status": true,
"message": "Data purchase is being processed.",
"data": {
"transaction_status": "processing",
"type": "data",
"provider": "mtn",
"title": "1gb mtn sme data",
"recipient": "0812345678",
"data_type": "sme",
"plan": "1gb",
"validity": "30days",
"bundle_size_mb": 1024,
"reference": "SMsadkjhdfkgfjaaa1fhaa",
"currency": "NGN",
"balance_before": "44584.00",
"balance_after": "44114.00",
"amount": 470
},
"metadata": { "code": "ERR_TRANSACTION_PROCESSING", "timestamp": 1773797068, "trace_id": "96640DE2C7" }
}{
"status": true,
"message": "Data purchased successfully.",
"data": {
"transaction_status": "successful",
"type": "data",
"provider": "mtn",
"title": "1gb mtn sme data",
"recipient": "0812345678",
"plan": "1gb",
"validity": "30days",
"bundle_size_mb": 1024,
"reference": "SMsadkjhdfkgfjaaa1fhaa",
"currency": "NGN",
"balance_before": "44584.00",
"balance_after": "44114.00",
"amount": 470
},
"metadata": { "code": "TRANSACTION_SUCCESSFUL", "timestamp": 1773797069, "trace_id": "D4E5F6A7B8" }
}{
"status": false,
"message": "Insufficient wallet balance.",
"data": null,
"metadata": { "code": "ERR_INSUFFICIENT_BALANCE", "timestamp": 1773797069, "trace_id": "97641EF3D8" }
}{
"status": false,
"message": "Product code is invalid or currently inactive.",
"data": null,
"metadata": { "code": "ERR_INVALID_PRODUCT_CODE_OR_INACTIVE", "timestamp": 1773797072, "trace_id": "AA644H26GB" }
}{
"status": false,
"message": "Invalid mobile number.",
"data": null,
"metadata": { "code": "ERR_INVALID_MOBILE_NUMBER", "timestamp": 1773797071, "trace_id": "99643G15FA" }
}{
"status": false,
"message": "Daily limit exceeded. Contact support to increase.",
"data": null,
"metadata": { "code": "ERR_DAILY_LIMIT_EXCEEDED", "timestamp": 1773797073, "trace_id": "BB645I37HC" }
}{
"status": false,
"message": "Service provider temporarily unavailable.",
"data": null,
"metadata": { "code": "ERR_PRODUCT_GATEWAY_UNAVAILABLE", "timestamp": 1773797070, "trace_id": "98642F04E9" }
}Subscribe customers to DSTV, GOtv, and Startimes packages. Cable TV uses a two-step flow — verify the smart card first, then purchase with the returned token.
/customer-validation/cable-tv to verify the smart card and receive a verify_token, then pass that token in the purchase request. This confirms the smart card is valid before any funds are charged.
GET /products/cable-tv. Note the product_code for the plan you want to purchase.POST /customer-validation/cable-tv with the smart card number and product_code. Save the verify_token from the response.POST /purchases/cable-tv with the verify_token, product_code, amount, and your unique reference.Returns all available cable TV plans grouped by provider. Use the product_code from each plan when verifying the customer and making a purchase.
{
"status": true,
"message": "Products retrieved successfully",
"data": {
"billers": {
"f5d6d1f5-547f-4025-8e6e-0b7ce26438bf": {
"name": "DSTV",
"id": "f5d6d1f5-547f-4025-8e6e-0b7ce26438bf",
"description": "Cable TV",
"icon": "https://cdn.strongmb.ng/assets/icon/cable/dstv-cf1c5524.png",
"products": {
"pl": {
"name": "PLAN",
"id": "b5ee7467-e2d9-48c0-9986-6428ea1719eb",
"api_access": true,
"plans": [
{
"id": "8c3dbb4e-93ff-4c89-9dd3-cd631c7e0003",
"name": "CONFAM BOUQUET E36 MONTH 8",
"amount": 36920,
"currency": "NGN",
"pricing_model": "fixed",
"product_code": "smb_dst_pla_a0e4d"
},
{
"id": "60808b32-46e4-4a12-92e8-66301dda047c",
"name": "NOVA - 1 MONTH",
"amount": 2400,
"currency": "NGN",
"pricing_model": "fixed",
"product_code": "smb_dst_pla_0c506"
}
]
}
}
},
"03210bcc-5121-4dfc-9bf5-b68f3e638665": {
"name": "GOTV",
"id": "03210bcc-5121-4dfc-9bf5-b68f3e638665",
"description": "Cable TV",
"icon": "https://cdn.strongmb.ng/assets/icon/cable/gotv-cf1c5524.png",
"products": {
"pl": {
"name": "PLAN",
"id": "d8b5f039-6728-41d2-9903-28156c3749c6",
"api_access": true,
"plans": [
{
"id": "fbe5ba02-be4c-48a8-add8-5325e6d55c2b",
"name": "GOTV YANGA 2 MONTHS",
"amount": 3000,
"currency": "NGN",
"pricing_model": "fixed",
"product_code": "smb_got_pla_9990e"
}
]
}
}
}
}
},
"metadata": { "code": "PRODUCTS_RETRIEVED", "timestamp": 1786063574, "trace_id": "43D4649702" }
}Verifies that a smart card number belongs to a valid account. On success, returns the account details and a verify_token that is required in the purchase request.
| Field | Type | Required | Description |
|---|---|---|---|
| customer_number | string | Required | The customer's smart card number (10–15 digits) |
| product_code | string | Required | Product code from /products/cable-tv — identifies the provider |
{
"customer_number": "1234567890",
"product_code": "smb_dst_pla_0c506"
}{
"status": true,
"message": "Smart card number verified successfully.",
"data": {
"details": {
"smart_card_number": "1234567890",
"customer_name": "EXAMPLE NAME",
"provider": "dstv",
"renewal_amount": "5800",
"due_date": "2026-08-10T00:00:00",
"current_bouquet": ""
},
"verify_token": "cFRDbDk2WmZXamVPTm1vdy9RSnBiQzVxczJUR08zL1hLZWdmZm9YZStvOD0="
},
"metadata": { "code": "CABLE_TV_ACCOUNT_VERIFIED", "timestamp": 1786313276, "trace_id": "3DC1C5CD55" }
}{
"status": false,
"message": "Invalid smart card number or the account is inactive.",
"data": null,
"metadata": { "code": "ERR_INVALID_CABLE_TV_ACCOUNT", "timestamp": 1786313342, "trace_id": "733C6EFE05" }
}{
"status": false,
"message": "The selected provider is invalid or unsupported.",
"data": null,
"metadata": { "code": "ERR_INVALID_CABLE_TV_PROVIDER", "timestamp": 1786313350, "trace_id": "8A1D2E3F4B" }
}| Code | HTTP | Meaning |
|---|---|---|
| CABLE_TV_ACCOUNT_VERIFIED | 200 | Smart card is valid. Save the verify_token — it is required in the purchase request. |
| ERR_INVALID_CABLE_TV_ACCOUNT | 400 | Smart card number is not found or the account is inactive. |
| ERR_INVALID_CABLE_TV_PROVIDER | 400 | The product_code maps to a provider that is not supported. |
Subscribes the customer to a cable TV plan. Requires a valid verify_token from the customer validation step.
| Field | Type | Required | Description |
|---|---|---|---|
| customer_number | string | Required | The customer's smart card number |
| product_code | string | Required | Product code of the plan from /products/cable-tv |
| amount | number | Required | The plan amount in Naira — must match the plan's amount from the products endpoint |
| reference | string | Required | Your unique transaction reference. a-zA-Z0-9 only, max 50 characters |
| verify_token | string | Required | The token returned from /customer-validation/cable-tv |
{
"customer_number": "2019244514",
"product_code": "smb_dst_pla_0c506",
"amount": 2400,
"reference": "SMBD260aad1352sdda53ssdC9",
"verify_token": "YVVIeHIwMTNmVXlZWEp3dnlGeUQwSlJpYkVRZmYyMXpscDNlZW9kY0s3VT0="
}{
"status": true,
"message": "Transaction completed successfully.",
"data": {
"transaction_status": "successful",
"type": "cable_tv",
"provider": "dstv",
"title": "₦2,400 Subscription",
"recipient": "2019244514",
"recipient_name": null,
"package_name": "Nova - 1 Month",
"package_amount": 2400,
"fee": "0.00",
"reference": "SMBD260aa1352dda53aawasss7ssFAsdC9",
"date": "2026-08-09 23:11:20",
"currency": "NGN",
"balance_before": "676888.55",
"balance_after": "674488.55",
"amount": "2400.00"
},
"metadata": { "code": "TRANSACTION_SUCCESSFUL", "timestamp": 1786313487, "trace_id": "0B890B3763" }
}{
"status": true,
"message": "Cable tv subscription is being processed.",
"data": {
"transaction_status": "processing",
"type": "cable_tv",
"provider": "dstv",
"title": "₦2,400 Subscription",
"recipient": "2019244514",
"recipient_name": null,
"package_name": "Nova - 1 Month",
"package_amount": 2400,
"fee": "0.00",
"reference": "SMBD260aad1352dda53aawasss7ssFAsdC9",
"date": "2026-08-09 23:11:47",
"currency": "NGN",
"balance_before": "674488.55",
"balance_after": "672088.55",
"amount": "2400.00"
},
"metadata": { "code": "ERR_TRANSACTION_PROCESSING", "timestamp": 1786313515, "trace_id": "880E71335E" }
}{
"status": false,
"message": "Your transaction has failed, amount has been refunded to your wallet.",
"data": {
"transaction_status": "failed",
"type": "cable_tv",
"provider": "dstv",
"title": "₦2,400 Subscription",
"recipient": "2019244514",
"package_name": "Nova - 1 Month",
"package_amount": 2400,
"reference": "SMBD260aad35dffdg2fsddak53ssdC9",
"date": "2026-08-09 23:16:13",
"currency": "NGN"
},
"metadata": { "code": "ERR_TRANSACTION_FAILED", "timestamp": 1786313790, "trace_id": "2C9EE727A6" }
}{
"status": false,
"message": "Reference already exist. Please use a unique reference.",
"data": null,
"metadata": { "code": "ERR_REFERENCE_ALREADY_EXISTS", "timestamp": 1786313474, "trace_id": "0CB29BB82A" }
}{
"status": false,
"message": "Insufficient wallet balance.",
"data": null,
"metadata": { "code": "ERR_INSUFFICIENT_BALANCE", "timestamp": 1786313600, "trace_id": "1D2E3F4A5B" }
}| Code | HTTP | Meaning |
|---|---|---|
| TRANSACTION_SUCCESSFUL | 201 | Subscription activated. Funds deducted and service delivered. |
| ERR_TRANSACTION_PROCESSING | 200 | Transaction submitted, pending provider confirmation. Poll by reference. |
| ERR_TRANSACTION_FAILED | 200 | Transaction attempted but failed. Amount automatically refunded to wallet. |
| ERR_REFERENCE_ALREADY_EXISTS | 400 | This reference is already used. Each transaction must have a unique reference. |
| ERR_INSUFFICIENT_BALANCE | 402 | Wallet balance is too low. Fund your wallet and retry. |
verify_token is single-use and expires. Always verify the smart card immediately before purchasing — do not cache and reuse tokens across separate purchase attempts.
Purchase prepaid tokens and pay postpaid bills for all major electricity DISCOs in Nigeria. Like Cable TV, electricity uses a two-step flow — verify the meter first, then purchase.
/customer-validation/electricity to verify the meter number and receive a verify_token, then pass that token in the purchase request. Include meter_type (prepaid or postpaid) in both steps.
GET /products/electricity. Note the product_code and the meter_type (prepaid / postpaid) for the plan you want.POST /customer-validation/electricity with the meter number, meter type, and product code. Save the verify_token from the response.POST /purchases/electricity with the verify_token, meter details, amount, and your unique reference.Returns all available electricity providers and their prepaid/postpaid products. Use the product_code and meter_type when verifying the meter and making a purchase. Note that electricity uses min_amount — the amount is flexible, not fixed.
{
"status": true,
"message": "Products retrieved successfully",
"data": {
"billers": {
"333a208d-a0b7-4aef-a46e-db115c6429ea": {
"name": "KANO ELECTRICITY DISTRIBUTION COMPANY",
"id": "333a208d-a0b7-4aef-a46e-db115c6429ea",
"description": "Electricity",
"icon": "https://cdn.strongmb.ng/assets/icon/electricity/kedco-cf1c5524.png",
"products": {
"post": {
"name": "POSTPAID",
"id": "c947d44a-2737-4939-9bbc-0e50152f5a78",
"api_access": true,
"plans": [
{
"id": "a79ffd84-8051-4672-8896-b687e24e45f3",
"name": "POSTPAID",
"min_amount": 100,
"currency": "NGN",
"pricing_model": "fixed",
"product_code": "smb_ked_pos"
}
]
},
"pre": {
"name": "PREPAID",
"id": "2f7704c1-bda7-4e13-a60c-56c29ada265a",
"api_access": true,
"plans": [
{
"id": "248eb2c7-c4df-48eb-b900-9f093edf9b9c",
"name": "PREPAID",
"min_amount": 0,
"currency": "NGN",
"pricing_model": "fixed",
"product_code": "smb_ked_pre"
}
]
}
}
}
}
},
"metadata": { "code": "PRODUCTS_RETRIEVED", "timestamp": 1786315619, "trace_id": "7A60BC9A90" }
}Verifies that a meter number belongs to a valid account. On success, returns the customer details and a verify_token required in the purchase request.
| Field | Type | Required | Description |
|---|---|---|---|
| meter_number | string | Required | The customer's meter number (10–15 digits) |
| meter_type | string | Required | prepaid or postpaid — must match the product from /products/electricity |
| product_code | string | Required | Product code from /products/electricity — identifies the DISCO provider |
{
"meter_number": "30530268918",
"meter_type": "prepaid",
"product_code": "smb_ked_pre"
}{
"status": true,
"message": "Meter number verified successfully.",
"data": {
"details": {
"customer_name": "ALH. DAHIRU IBRAHIM",
"address": "MAMMAGA HOTORO, KANO",
"provider": "kedco",
"meter_number": "30530268918",
"meter_type": "prepaid"
},
"verify_token": "R2RGWmFIbmJLSm9SQ0xpdElKVmo2NHZsTkRrT0Z6cjBOL0Zwd0J0QVh5az0="
},
"metadata": { "code": "ELECTRICITY_METER_VERIFIED", "timestamp": 1786315618, "trace_id": "492FA8565B" }
}{
"status": false,
"message": "Invalid meter number or the account is inactive.",
"data": null,
"metadata": { "code": "ERR_INVALID_ELECTRICITY_ACCOUNT", "timestamp": 1786315707, "trace_id": "25D2EAF951" }
}{
"status": false,
"message": "Invalid product code or the product is inactive.",
"data": null,
"metadata": { "code": "ERR_INVALID_PRODUCT_CODE_OR_INACTIVE", "timestamp": 1786315732, "trace_id": "2B70560DA2" }
}| Code | HTTP | Meaning |
|---|---|---|
| ELECTRICITY_METER_VERIFIED | 200 | Meter is valid. Save the verify_token — it is required in the purchase request. |
| ERR_INVALID_ELECTRICITY_ACCOUNT | 400 | Meter number not found or the account is inactive. |
| ERR_INVALID_PRODUCT_CODE_OR_INACTIVE | 404 | The product_code does not exist or the product is currently inactive. |
Purchases a prepaid token or pays a postpaid bill. Requires a valid verify_token from the meter validation step.
| Field | Type | Required | Description |
|---|---|---|---|
| meter_number | string | Required | The customer's meter number |
| meter_type | string | Required | prepaid or postpaid |
| product_code | string | Required | Product code from /products/electricity |
| amount | number | Required | Amount in Naira to purchase. Must be at or above the plan's min_amount |
| reference | string | Required | Your unique transaction reference. a-zA-Z0-9 only, max 50 characters |
| verify_token | string | Required | The token returned from /customer-validation/electricity |
{
"meter_number": "30530268918",
"meter_type": "prepaid",
"product_code": "smb_ked_pre",
"amount": 2400,
"reference": "SMBD0113s53pafsslsdsdkdsdFdAdssdC9",
"verify_token": "Ri8zQkZNaHpXcCsyckJDUzBPSUZkUXVFTWxJbk9VRFY2aDlqTWdUZjFyST0="
}{
"status": true,
"message": "Transaction completed successfully.",
"data": {
"transaction_status": "successful",
"type": "electricity",
"meter_type": "prepaid",
"provider": "kedco",
"title": "₦2,400 Subscription",
"recipient": "30530268918",
"recipient_name": null,
"fee": "0.00",
"reference": "SMBD0113s53pafsslsdsdkdsdFdAdssdC9",
"date": "2026-08-08 01:11:26",
"currency": "NGN",
"balance_before": "683772.55",
"balance_after": "681372.55",
"amount": "2400.00",
"amount_subscribe": "2400.00"
},
"metadata": { "code": "TRANSACTION_SUCCESSFUL", "timestamp": 1786147888, "trace_id": "AA28782686" }
}{
"status": true,
"message": "Electricity subscription is being processed.",
"data": {
"transaction_status": "processing",
"type": "electricity",
"meter_type": "prepaid",
"provider": "kedco",
"title": "₦2,400 Subscription",
"recipient": "30530268918",
"recipient_name": null,
"fee": "0.00",
"reference": "SMBD0113s53pafsslsdsddsdFdAdssdC9",
"date": "2026-08-09 23:50:06",
"currency": "NGN",
"balance_before": "645688.55",
"balance_after": "643288.55",
"amount": "2400.00",
"amount_subscribe": "2400.00"
},
"metadata": { "code": "ERR_TRANSACTION_PROCESSING", "timestamp": 1786315811, "trace_id": "70019BFD79" }
}{
"status": false,
"message": "Your transaction has failed, amount has been refunded to your wallet.",
"data": {
"transaction_status": "failed",
"type": "electricity",
"meter_type": "prepaid",
"provider": "kedco",
"title": "₦2,400 Subscription",
"recipient": "30530268918",
"fee": "0.00",
"reference": "SMBD0113s53pafssdsddkjsd9",
"date": "2026-08-09 23:51:02",
"currency": "NGN",
"amount_subscribe": "2400.00"
},
"metadata": { "code": "ERR_TRANSACTION_FAILED", "timestamp": 1786315867, "trace_id": "EB97885F82" }
}{
"status": false,
"message": "Reference already exist. Please use a unique reference.",
"data": null,
"metadata": { "code": "ERR_REFERENCE_ALREADY_EXISTS", "timestamp": 1786315900, "trace_id": "3C1D2E4F5A" }
}{
"status": false,
"message": "Insufficient wallet balance.",
"data": null,
"metadata": { "code": "ERR_INSUFFICIENT_BALANCE", "timestamp": 1786315920, "trace_id": "4D2E3F5A6B" }
}| Code | HTTP | Meaning |
|---|---|---|
| TRANSACTION_SUCCESSFUL | 201 | Purchase complete. For prepaid, the token is delivered to the meter. For postpaid, the bill is paid. |
| ERR_TRANSACTION_PROCESSING | 200 | Transaction submitted, pending provider confirmation. Poll by reference. |
| ERR_TRANSACTION_FAILED | 200 | Transaction attempted but failed. Amount automatically refunded to wallet. |
| ERR_REFERENCE_ALREADY_EXISTS | 400 | This reference is already used. Each transaction must have a unique reference. |
| ERR_INSUFFICIENT_BALANCE | 402 | Wallet balance is too low. Fund your wallet and retry. |
verify_token is single-use and expires. Always verify the meter immediately before purchasing — do not cache and reuse tokens across separate purchase attempts.
Free endpoints available to all developers — requires a standard API key.
Checks a Nigerian phone number against the Strongmb community fraud database. Returns the number of times it has been reported and the first/last seen dates. Use this before processing a purchase to flag potentially fraudulent recipients.
| Parameter | Type | Required | Description |
|---|---|---|---|
| phone | string | Required | Nigerian mobile number, 11 digits starting with 0 (e.g. 08012345678) |
GET /v1/tools/phone/check?phone=08012345678 HTTP/1.1 Host: api.strongmb.ng Authorization: Bearer sk_live_... Accept: application/json
{
"status": true,
"message": "Phone number report stats fetched successfully.",
"data": {
"phone": "09077993326",
"report_count": 3,
"first_seen": "March 19, 2026, 12:00 AM",
"last_seen": "May 19, 2026, 8:08 PM"
},
"metadata": {
"code": "PHONE_REPORT_STATS_FETCHED",
"timestamp": 1779217836,
"trace_id": "DD971F54D8"
}
}{
"status": false,
"message": "No reports found for this phone number.",
"data": null,
"metadata": {
"code": "ERR_PHONE_NUMBER_NOT_FOUND",
"timestamp": 1779217786,
"trace_id": "EB13653CA4"
}
}{
"status": false,
"message": "Invalid phone number.",
"data": null,
"metadata": {
"code": "ERR_INVALID_MOBILE_NUMBER",
"timestamp": 1779217800,
"trace_id": "FA123456B7"
}
}| Code | HTTP | Meaning |
|---|---|---|
| PHONE_REPORT_STATS_FETCHED | 200 | Number is in the fraud database. Read report_count to set your own block threshold — higher means more developers reported it. first_seen and last_seen show how long it has been active. |
| ERR_PHONE_NUMBER_NOT_FOUND | 404 | No reports exist for this number. It is not in the fraud database — safe to proceed with the transaction. |
| ERR_INVALID_MOBILE_NUMBER | 422 | The phone query parameter is not a valid Nigerian mobile number. Must be 11 digits starting with 0 (e.g. 08012345678). |
report_count >= 1; lenient ones at report_count >= 3 or higher. Your platform, your rules.