search
Developer Reference

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.

Base URL https://api.strongmb.ng/v1
Overview

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.

info This API is currently in v1. Breaking changes will be communicated via email before deployment.
Request Format
HTTP
POST /v1/purchases/airtime HTTP/1.1
Host: api.strongmb.ng
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Accept: application/json
warning Always check metadata.code in every response. Do not rely only on HTTP status codes when deciding transaction state.
Response Format
JSON
{
  "status": true,
  "message": "Request successful",
  "data": { // payload varies per endpoint },
  "metadata": {
    "code": "MACHINE_READABLE_CODE",
    "timestamp": 1773796899,
    "trace_id": "05E3F2360E"
  }
}
Authentication

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.

1
Find your API Key
Log in to your Strongmb dashboard, open the Developer tab, and copy your API key. Keep it safe — do not share it.
2
Add the key to every request
Include it as a Bearer token in the Authorization header of every API request.
3
Keep it secret
Never expose your API key in frontend code or public repositories. Store it in environment variables.
Authorization Header
Authorization: Bearer YOUR_API_KEY
warning Store your API key securely in environment variables and never expose it in frontend code or public repositories.
Base URL

Use the sandbox URL during development and the live URL in production.

Production
Live https://api.strongmb.ng/v1
Sandbox
Test https://sandbox.api.strongmb.ng/v1
Error Codes

The API uses standard HTTP status codes. All error responses include a machine-readable code and a human-readable message.

HTTP CodeMeaningCommon Cause
200OKRequest was successful
201CreatedTransaction completed successfully
400Bad RequestMissing or invalid parameters
401UnauthorizedMissing or invalid API key
402Insufficient BalanceWallet balance too low for the transaction
403ForbiddenAccount is inactive or suspended
404Not FoundResource does not exist
422Unprocessable EntityValidation failed — invalid phone, missing field
429Too Many RequestsDaily limit exceeded — contact support to increase
503Service UnavailableProvider gateway is temporarily down
Error Response Example
JSON — 422 Validation Error
{
  "status": false,
  "message": "Invalid mobile number.",
  "data": null,
  "metadata": {
    "code": "ERR_INVALID_MOBILE_NUMBER",
    "timestamp": 1773797071,
    "trace_id": "99643G15FA"
  }
}
Metadata Response Codes

Every API response includes a metadata.code field. Use this value — not the HTTP status — to determine the exact outcome of each request.

CodeHTTPDescription
TRANSACTION_SUCCESSFUL201The transaction completed successfully. Funds have been deducted and the service delivered.
ERR_TRANSACTION_PROCESSING200The transaction is being processed. Poll by reference to get the final status.
ERR_MISSING_OR_INVALID_FIELDS400One or more required fields are missing or contain invalid values.
ERR_INVALID_REFERENCE_FORMAT400The reference field contains invalid characters. Only a-z A-Z 0-9 are allowed.
ERR_REFERENCE_ALREADY_EXISTS400A transaction with this reference already exists. Each reference must be unique.
ERR_INVALID_AIRTIME_AMOUNT400The airtime amount is invalid. Ensure it is a positive number within the allowed range.
ERR_INSUFFICIENT_BALANCE402Your wallet balance is too low. Fund your wallet and try again.
ERR_ACCOUNT_INACTIVE403Your account is inactive or suspended. Contact support to reactivate.
ERR_RESOURCE_NOT_FOUND404The requested resource does not exist. Verify the endpoint URL and path parameters.
ERR_INVALID_PRODUCT_CODE_OR_INACTIVE404The product code does not exist or the product is currently inactive.
ERR_TRANSACTION_FAILED500The transaction was attempted but failed. Check the status and contact support if wallet was debited.
ERR_PRODUCT_GATEWAY_UNAVAILABLE503The service provider gateway is temporarily unavailable. Retry after a short delay.
ERR_INTERNAL_SERVER_ERROR500An unexpected server error. Contact support with the trace_id from the response.
SDKs

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 strongmb-php
composer require strongmb/strongmb-php
Node.js @strongmb/node
npm install @strongmb/node
Python strongmb
pip install strongmb
Quick Start — Buy 1 GB Data
PHP
<?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();
}
Node.js
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());
  }
})();
Python
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())
check_circle All SDKs handle authentication, JSON serialization, and error mapping automatically. You only need your API key and a unique reference per transaction.

For full SDK documentation, installation guides, and exception handling → SDK Documentation

Account
GET /user Get authenticated user details

Returns the profile and account information of the currently authenticated user.

Headers
HeaderValueRequired
AuthorizationBearer YOUR_API_KEYRequired
JSON Response
{
  "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"
  }
}
JSON Response
{
  "status": false,
  "message": "Unauthenticated. Invalid or missing API key.",
  "data": null,
  "metadata": {
    "code": "ERR_UNAUTHENTICATED",
    "timestamp": 1773796900,
    "trace_id": "A1B2C3D4E5"
  }
}
GET /wallets Get all user wallets

Returns all wallets associated with the authenticated user including balances, limits, and status.

JSON Response
{
  "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"
  }
}
GET /transactions List transaction history

Returns the most recent transactions for the authenticated user.

JSON Response
{
  "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"
  }
}
JSON Response
{
  "status": false,
  "message": "No transactions found.",
  "data": null,
  "metadata": {
    "code": "ERR_TRANSACTIONS_NOT_FOUND",
    "timestamp": 1773797291,
    "trace_id": "FF009820DE"
  }
}
GET /transactions/{reference} Get transaction by reference

Returns a single transaction that matches the provided reference.

Path Parameter
ParameterTypeRequiredDescription
referencestringRequiredUnique transaction reference e.g. SMBD260aa1352a53aaa7sFAC9
JSON Response
{
  "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"
  }
}
JSON Response
{
  "status": false,
  "message": "Transaction not found.",
  "data": null,
  "metadata": {
    "code": "ERR_TRANSACTIONS_NOT_FOUND",
    "timestamp": 1773797291,
    "trace_id": "FF009820DE"
  }
}
Airtime
GET /products/airtime Airtime plans and product codes

Returns available airtime providers and their product codes. Use the product_code when making a purchase.

JSON Response
{
  "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"
  }
}
POST /purchases/airtime Purchase airtime

Top up airtime for any Nigerian network. Amount is deducted from the user's wallet balance.

info The reference must be unique per transaction and contain only a-z A-Z 0-9. No spaces, dashes, or special characters allowed.
Request Body
FieldTypeRequiredDescription
phonestringRequiredRecipient phone number (e.g. 0812345678)
product_codestringRequiredFrom /products/airtime (e.g. smb_mtn_vtu)
amountstringRequiredAirtime face value in Naira as string (e.g. "100")
referencestringRequiredYour unique reference. a-zA-Z0-9 only.
Request Example
JSON Payload
{
  "phone": "0812345678",
  "product_code": "smb_mtn_vtu",
  "amount": "100",
  "reference": "SMBD260aa1352a53aaa7sFAC9"
}
JSON — 200 Processing
{
  "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" }
}
JSON — 201 Successful
{
  "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" }
}
JSON — 402
{
  "status": false,
  "message": "Insufficient wallet balance.",
  "data": null,
  "metadata": { "code": "ERR_INSUFFICIENT_BALANCE", "timestamp": 1773797069, "trace_id": "97641EF3D8" }
}
JSON — 404
{
  "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" }
}
JSON — 422
{
  "status": false,
  "message": "Invalid mobile number.",
  "data": null,
  "metadata": { "code": "ERR_INVALID_MOBILE_NUMBER", "timestamp": 1773797071, "trace_id": "99643G15FA" }
}
JSON — 429
{
  "status": false,
  "message": "Daily limit exceeded. Contact support to increase.",
  "data": null,
  "metadata": { "code": "ERR_DAILY_LIMIT_EXCEEDED", "timestamp": 1773797073, "trace_id": "BB645I37HC" }
}
JSON — 503
{
  "status": false,
  "message": "Service provider temporarily unavailable.",
  "data": null,
  "metadata": { "code": "ERR_PRODUCT_GATEWAY_UNAVAILABLE", "timestamp": 1773797070, "trace_id": "98642F04E9" }
}
Data
GET /products/internet Get data plans and product codes

Returns all available data plans. Use the product_code from each plan when making a purchase.

JSON Response
{
  "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" }
}
POST /purchases/data Purchase a data plan

Purchase a data plan using a product_code obtained from /products/internet.

Request Body
FieldTypeRequiredDescription
phonestringRequiredRecipient phone number
product_codestringRequiredFrom /products/internet (e.g. smb_mtn_sme_1gb_30days)
referencestringRequiredUnique reference. a-zA-Z0-9 only.
Request Example
JSON Payload
{
  "phone": "0812345678",
  "product_code": "smb_mtn_sme_1gb_30days",
  "reference": "SMsadkjhdfkgfjaaa1fhaa"
}
JSON — 200 Processing
{
  "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" }
}
JSON — 201 Successful
{
  "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" }
}
JSON — 402
{
  "status": false,
  "message": "Insufficient wallet balance.",
  "data": null,
  "metadata": { "code": "ERR_INSUFFICIENT_BALANCE", "timestamp": 1773797069, "trace_id": "97641EF3D8" }
}
JSON — 404
{
  "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" }
}
JSON — 422
{
  "status": false,
  "message": "Invalid mobile number.",
  "data": null,
  "metadata": { "code": "ERR_INVALID_MOBILE_NUMBER", "timestamp": 1773797071, "trace_id": "99643G15FA" }
}
JSON — 429
{
  "status": false,
  "message": "Daily limit exceeded. Contact support to increase.",
  "data": null,
  "metadata": { "code": "ERR_DAILY_LIMIT_EXCEEDED", "timestamp": 1773797073, "trace_id": "BB645I37HC" }
}
JSON — 503
{
  "status": false,
  "message": "Service provider temporarily unavailable.",
  "data": null,
  "metadata": { "code": "ERR_PRODUCT_GATEWAY_UNAVAILABLE", "timestamp": 1773797070, "trace_id": "98642F04E9" }
}
Cable TV

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.

info Cable TV requires a two-step flow: first call /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.
1
Get Products
Fetch available plans from GET /products/cable-tv. Note the product_code for the plan you want to purchase.
2
Verify the Smart Card
Call POST /customer-validation/cable-tv with the smart card number and product_code. Save the verify_token from the response.
3
Purchase the Subscription
Call POST /purchases/cable-tv with the verify_token, product_code, amount, and your unique reference.
GET /products/cable-tv Get cable TV plans and product codes

Returns all available cable TV plans grouped by provider. Use the product_code from each plan when verifying the customer and making a purchase.

JSON Response
{
  "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" }
}
POST /customer-validation/cable-tv Verify a smart card number

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.

Request Body
FieldTypeRequiredDescription
customer_numberstringRequiredThe customer's smart card number (10–15 digits)
product_codestringRequiredProduct code from /products/cable-tv — identifies the provider
Request Example
JSON Payload
{
  "customer_number": "1234567890",
  "product_code": "smb_dst_pla_0c506"
}
JSON — 200 Verified
{
  "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" }
}
JSON — 400 Invalid Account
{
  "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" }
}
JSON — 400 Invalid Provider
{
  "status": false,
  "message": "The selected provider is invalid or unsupported.",
  "data": null,
  "metadata": { "code": "ERR_INVALID_CABLE_TV_PROVIDER", "timestamp": 1786313350, "trace_id": "8A1D2E3F4B" }
}
Response Codes
CodeHTTPMeaning
CABLE_TV_ACCOUNT_VERIFIED200Smart card is valid. Save the verify_token — it is required in the purchase request.
ERR_INVALID_CABLE_TV_ACCOUNT400Smart card number is not found or the account is inactive.
ERR_INVALID_CABLE_TV_PROVIDER400The product_code maps to a provider that is not supported.
POST /purchases/cable-tv Purchase a cable TV subscription

Subscribes the customer to a cable TV plan. Requires a valid verify_token from the customer validation step.

Request Body
FieldTypeRequiredDescription
customer_numberstringRequiredThe customer's smart card number
product_codestringRequiredProduct code of the plan from /products/cable-tv
amountnumberRequiredThe plan amount in Naira — must match the plan's amount from the products endpoint
referencestringRequiredYour unique transaction reference. a-zA-Z0-9 only, max 50 characters
verify_tokenstringRequiredThe token returned from /customer-validation/cable-tv
Request Example
JSON Payload
{
  "customer_number": "2019244514",
  "product_code": "smb_dst_pla_0c506",
  "amount": 2400,
  "reference": "SMBD260aad1352sdda53ssdC9",
  "verify_token": "YVVIeHIwMTNmVXlZWEp3dnlGeUQwSlJpYkVRZmYyMXpscDNlZW9kY0s3VT0="
}
JSON — 201 Successful
{
  "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" }
}
JSON — 200 Processing
{
  "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" }
}
JSON — 200 Failed (refunded)
{
  "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" }
}
JSON — 400 Duplicate Reference
{
  "status": false,
  "message": "Reference already exist. Please use a unique reference.",
  "data": null,
  "metadata": { "code": "ERR_REFERENCE_ALREADY_EXISTS", "timestamp": 1786313474, "trace_id": "0CB29BB82A" }
}
JSON — 402 Insufficient Balance
{
  "status": false,
  "message": "Insufficient wallet balance.",
  "data": null,
  "metadata": { "code": "ERR_INSUFFICIENT_BALANCE", "timestamp": 1786313600, "trace_id": "1D2E3F4A5B" }
}
Response Codes
CodeHTTPMeaning
TRANSACTION_SUCCESSFUL201Subscription activated. Funds deducted and service delivered.
ERR_TRANSACTION_PROCESSING200Transaction submitted, pending provider confirmation. Poll by reference.
ERR_TRANSACTION_FAILED200Transaction attempted but failed. Amount automatically refunded to wallet.
ERR_REFERENCE_ALREADY_EXISTS400This reference is already used. Each transaction must have a unique reference.
ERR_INSUFFICIENT_BALANCE402Wallet balance is too low. Fund your wallet and retry.
warning The 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.
Electricity

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.

info Electricity requires a two-step flow: first call /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.
1
Get Products
Fetch available electricity products from GET /products/electricity. Note the product_code and the meter_type (prepaid / postpaid) for the plan you want.
2
Verify the Meter
Call POST /customer-validation/electricity with the meter number, meter type, and product code. Save the verify_token from the response.
3
Purchase
Call POST /purchases/electricity with the verify_token, meter details, amount, and your unique reference.
GET /products/electricity Get electricity products and product codes

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.

JSON Response
{
  "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" }
}
POST /customer-validation/electricity Verify a meter number

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.

Request Body
FieldTypeRequiredDescription
meter_numberstringRequiredThe customer's meter number (10–15 digits)
meter_typestringRequiredprepaid or postpaid — must match the product from /products/electricity
product_codestringRequiredProduct code from /products/electricity — identifies the DISCO provider
Request Example
JSON Payload
{
  "meter_number": "30530268918",
  "meter_type": "prepaid",
  "product_code": "smb_ked_pre"
}
JSON — 200 Verified
{
  "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" }
}
JSON — 400 Invalid Meter
{
  "status": false,
  "message": "Invalid meter number or the account is inactive.",
  "data": null,
  "metadata": { "code": "ERR_INVALID_ELECTRICITY_ACCOUNT", "timestamp": 1786315707, "trace_id": "25D2EAF951" }
}
JSON — 404 Invalid Product
{
  "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" }
}
Response Codes
CodeHTTPMeaning
ELECTRICITY_METER_VERIFIED200Meter is valid. Save the verify_token — it is required in the purchase request.
ERR_INVALID_ELECTRICITY_ACCOUNT400Meter number not found or the account is inactive.
ERR_INVALID_PRODUCT_CODE_OR_INACTIVE404The product_code does not exist or the product is currently inactive.
POST /purchases/electricity Purchase electricity

Purchases a prepaid token or pays a postpaid bill. Requires a valid verify_token from the meter validation step.

Request Body
FieldTypeRequiredDescription
meter_numberstringRequiredThe customer's meter number
meter_typestringRequiredprepaid or postpaid
product_codestringRequiredProduct code from /products/electricity
amountnumberRequiredAmount in Naira to purchase. Must be at or above the plan's min_amount
referencestringRequiredYour unique transaction reference. a-zA-Z0-9 only, max 50 characters
verify_tokenstringRequiredThe token returned from /customer-validation/electricity
Request Example
JSON Payload
{
  "meter_number": "30530268918",
  "meter_type": "prepaid",
  "product_code": "smb_ked_pre",
  "amount": 2400,
  "reference": "SMBD0113s53pafsslsdsdkdsdFdAdssdC9",
  "verify_token": "Ri8zQkZNaHpXcCsyckJDUzBPSUZkUXVFTWxJbk9VRFY2aDlqTWdUZjFyST0="
}
JSON — 201 Successful
{
  "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" }
}
JSON — 200 Processing
{
  "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" }
}
JSON — 200 Failed (refunded)
{
  "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" }
}
JSON — 400 Duplicate Reference
{
  "status": false,
  "message": "Reference already exist. Please use a unique reference.",
  "data": null,
  "metadata": { "code": "ERR_REFERENCE_ALREADY_EXISTS", "timestamp": 1786315900, "trace_id": "3C1D2E4F5A" }
}
JSON — 402 Insufficient Balance
{
  "status": false,
  "message": "Insufficient wallet balance.",
  "data": null,
  "metadata": { "code": "ERR_INSUFFICIENT_BALANCE", "timestamp": 1786315920, "trace_id": "4D2E3F5A6B" }
}
Response Codes
CodeHTTPMeaning
TRANSACTION_SUCCESSFUL201Purchase complete. For prepaid, the token is delivered to the meter. For postpaid, the bill is paid.
ERR_TRANSACTION_PROCESSING200Transaction submitted, pending provider confirmation. Poll by reference.
ERR_TRANSACTION_FAILED200Transaction attempted but failed. Amount automatically refunded to wallet.
ERR_REFERENCE_ALREADY_EXISTS400This reference is already used. Each transaction must have a unique reference.
ERR_INSUFFICIENT_BALANCE402Wallet balance is too low. Fund your wallet and retry.
warning The verify_token is single-use and expires. Always verify the meter immediately before purchasing — do not cache and reuse tokens across separate purchase attempts.
Tools

Free endpoints available to all developers — requires a standard API key.

GET /v1/tools/phone/check Check a phone number for fraud reports

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.

info This endpoint is free — no charge, just include your standard API key. See strongmb.ng/reports/phone-reports to submit a report.
Query Parameters
ParameterTypeRequiredDescription
phonestringRequiredNigerian mobile number, 11 digits starting with 0 (e.g. 08012345678)
Request Example
HTTP
GET /v1/tools/phone/check?phone=08012345678 HTTP/1.1
Host: api.strongmb.ng
Authorization: Bearer sk_live_...
Accept: application/json
JSON — 200 Found
{
  "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"
  }
}
JSON — 404 Not Found
{
  "status": false,
  "message": "No reports found for this phone number.",
  "data": null,
  "metadata": {
    "code": "ERR_PHONE_NUMBER_NOT_FOUND",
    "timestamp": 1779217786,
    "trace_id": "EB13653CA4"
  }
}
JSON — 422 Invalid
{
  "status": false,
  "message": "Invalid phone number.",
  "data": null,
  "metadata": {
    "code": "ERR_INVALID_MOBILE_NUMBER",
    "timestamp": 1779217800,
    "trace_id": "FA123456B7"
  }
}
Response Codes
CodeHTTPMeaning
PHONE_REPORT_STATS_FETCHED200Number 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_FOUND404No reports exist for this number. It is not in the fraud database — safe to proceed with the transaction.
ERR_INVALID_MOBILE_NUMBER422The phone query parameter is not a valid Nigerian mobile number. Must be 11 digits starting with 0 (e.g. 08012345678).
info Set your own threshold. Strict platforms block at report_count >= 1; lenient ones at report_count >= 3 or higher. Your platform, your rules.