Sogo Logo Developer
Get Started
Bill Payments (VTU) API

Airtime, Data,
Electricity, Cable TV,
Betting & more
across Nigeria

One unified REST API covers all Nigerian bill payment categories - airtime, mobile data, electricity (all 12 DisCos), cable TV, recharge card printing, betting account funding, JAMB, WAEC, and eSIM. One integration, 50+ providers, instant delivery.

buy-airtime.http
Request
Response
POST https://api.sogo.africa/v1/bills/airtime
Authorization:   Bearer sogo_sk_live_••••••••••••••••
Content-Type:    application/json
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000

{
  "network": "mtn",
  "phone":   "08012345678",
  "amount":  1000
}
200 OK  92ms

{
  "message": "Airtime purchase successful.",
  "data": {
    "reference":   "BP_20260524_XXXXXXXXXXXX",
    "status":      "completed",
    "type":        "airtime",
    "network":    "mtn",
    "phone":      "08012345678",
    "amount":     1000,
    "fee":        0,
    "total":      1000,
    "created_at": "2026-05-24T10:30:00Z"
  }
}
7Payment categories
50+Providers
InstantDelivery on most bills
16API endpoints

Every major Nigerian bill payment provider

From the big four telecoms to all 12 electricity distribution companies - the Bills API gives your users access to every provider they need.

Telecoms & eSIM
Electricity DisCos
Cable TV
Betting & Gaming
Education

Airtime, Data & eSIM providers

MTN
Airtel
Glo
9mobile
Smile

Airtime and data services cover MTN, Airtel, Glo, and 9mobile. International eSIM data plans give your users connectivity in 190+ countries.

All 12 Electricity Distribution Companies (DisCos)

AEDC
ABEDC
BEDC
EEDC
EKEDC
IBEDC
IKEDC
JED
KAEDCO
KEDCO
PHED
YEDC

All 12 DisCos covered: Abuja (AEDC), Benin (BEDC), Eko (EKEDC), Enugu (EEDC), Ibadan (IBEDC), Ikeja (IKEDC), Jos (JED), Kaduna (KAEDCO), Kano (KEDCO), Port Harcourt (PHED), Yola (YEDC), and Abuja ABEDC. Meter number verification before payment is supported via the verify-meter endpoint.

Cable TV providers

DSTV
GoTV
StarTimes

Pay subscriptions for DSTV, GoTV, and StarTimes. Smartcard number verification via verify-smartcard confirms the subscriber's name before deduction, preventing wrong-account payments. Package selection from available bouquets is supported via GET /v1/bills/cable-packages.

Betting & gaming platforms (14 providers)

Bet9ja
Betway
SportyBet
1xBet
BangBet
BetKing
Betland
BetLion
Cloudbet
LiveScore Bet
Merrybet
NaijaBet
NairaBet
Supabet

Fund betting accounts for Nigeria's top 14 sports betting platforms. The verify-account endpoint looks up the username before deduction.

Educational payment providers

JAMB
WAEC

Pay JAMB registration fees, result checker, and profile verification fees. WAEC result checker and examination fees. Profile lookup via verify-jamb confirms the candidate's name before payment. View available plans with GET /v1/bills/education-plans.

One pattern for all 7 bill categories

Every bill category follows the same response shape, so one integration handles all of them. Build once, cover all Nigerian bills.

1

Load the catalogue

Call GET /v1/bills/catalog to get all providers, slugs, available types, and metadata in a single response. Cache it and refresh periodically.

2

Verify the recipient

For electricity, cable TV, betting, and JAMB - call the verification endpoint first. Returns the subscriber's name for user confirmation before payment.

3

Submit the payment

Call the category endpoint (e.g. POST /v1/bills/airtime) with provider slug and amount. Deduction and delivery happen in the same request.

4

Confirm via webhook

For asynchronous deliveries, a transaction.completed webhook fires when the bill is confirmed delivered by the provider.

All 16 Bills API endpoints

Organised into three groups: catalogue reads, pre-payment verification, and purchase endpoints.

Group 1 - Catalogue & Pricing (Scope: bills:read)
GET
/v1/bills/catalog
Scope: bills:read

Returns all supported bill types, providers within each type, provider slugs, and type-level metadata. Use this to populate your UI and map provider slugs for payment requests.

catalog.http
Request
Response (excerpt)
GET https://api.sogo.africa/v1/bills/catalog
Authorization: Bearer sogo_sk_live_••••••••••••••••
200 OK  74ms

{
  "data": {
    "airtime": {
      "label":    "Airtime",
      "providers": [
        { "slug": "mtn",    "name": "MTN Nigeria"    },
        { "slug": "airtel", "name": "Airtel Nigeria" },
        { "slug": "glo",    "name": "Glo Nigeria"    },
        { "slug": "9mobile","name": "9mobile"        }
      ]
    },
    "electricity": {
      "label":    "Electricity",
      "providers": [
        { "slug": "aedc",   "name": "AEDC"  },
        // ... 11 more DisCos
      ]
    },
    // ... cable_tv, data, betting, education, epin, esim
  }
}
GET
/v1/bills/data-plans
Scope: bills:read

Returns all available mobile data plans for each telecom provider, including bundle size, validity period, price, and variation code. Filters: ?network=mtn. Use variation codes when calling POST /v1/bills/data.

GET
/v1/bills/cable-packages
Scope: bills:read

Returns subscription packages available for DSTV, GoTV, and StarTimes. Includes package name, channels, monthly price, and variation code. Filter by provider: ?provider=dstv.

GET
/v1/bills/education-plans
Scope: bills:read

Returns available education payment plans for JAMB and WAEC, including plan name, purpose, and price. JAMB plans include UTME registration, direct entry, change of course, and profile verification.

GET
/v1/bills/discount-rates
Scope: bills:read

Returns the discount percentage applied to each bill category and provider for your API key. Use this to calculate the effective cost of each transaction type. Discounts vary by volume and partner tier.

Group 2 - Pre-Payment Verification (Scope: bills:read)

Why verify before paying?

Verification endpoints look up the account holder's name using their meter number, smartcard number, or user ID before any Naira is deducted. Showing "Subscriber: John Doe" before the user confirms prevents wrong-account payments and reduces support incidents significantly. For electricity, verification also returns whether the meter is prepaid or postpaid.

POST
/v1/bills/electricity/verify-meter
Scope: bills:read  ·  No Idempotency-Key needed

Validates a meter number against a specific electricity DisCo. Returns the customer's name, address, and meter type (prepaid/postpaid). No charge is applied.

ParameterTypeRequiredDescription
disco_slugstringrequiredDisCo slug from catalog (e.g. aedc, ikedc, ekedc).
meter_numberstringrequiredThe customer's electricity meter number.
meter_typestringrequiredprepaid or postpaid.
verify-meter.http
Request
Response
POST https://api.sogo.africa/v1/bills/electricity/verify-meter
Authorization: Bearer sogo_sk_live_••••••••••••••••
Content-Type:  application/json

{
  "disco_slug":    "ikedc",
  "meter_number": "45012345678",
  "meter_type":   "prepaid"
}
200 OK  320ms

{
  "message": "Meter verified successfully.",
  "verification": {
    "customer_name": "John Adewale Doe",
    "address":       "12 Lagos Street, Ikeja, Lagos",
    "meter_number": "45012345678",
    "meter_type":   "prepaid"
  }
}
POST
/v1/bills/cable-tv/verify-smartcard
Scope: bills:read  ·  No Idempotency-Key needed

Validates a DSTV, GoTV, or StarTimes smartcard number and returns the subscriber's name and current subscription status.

POST
/v1/bills/education/verify-jamb
Scope: bills:read  ·  No Idempotency-Key needed

Looks up a JAMB registration number or profile ID and returns the candidate's name, date of birth, and exam status. Used to confirm the recipient before paying any JAMB fees.

POST
/v1/bills/bet-funding/verify-account
Scope: bills:read  ·  No Idempotency-Key needed

Validates a betting account ID with the specified platform and returns the account holder's username. Supports all 14 betting providers. Call this before POST /v1/bills/bet-funding.

Group 3 - Purchase Endpoints (Scope: bills:write · Idempotency-Key required)
POST
/v1/bills/airtime
Scope: bills:write  ·  Idempotency-Key required

Purchase airtime for any Nigerian network (MTN, Airtel, Glo, 9mobile). Delivery is instant and confirmed in the same response.

ParameterTypeRequiredDescription
networkstringrequiredNetwork slug: mtn, glo, airtel, t2mobile.
phonestringrequiredNigerian mobile number in format 080XXXXXXXX or +2348XXXXXXXX.
amountintegerrequiredAirtime value in Naira (minimum ₦50, maximum ₦50,000).
airtime.http
Request
Response
PHP
Node
POST https://api.sogo.africa/v1/bills/airtime
Authorization:   Bearer sogo_sk_live_••••••••••••••••
Content-Type:    application/json
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000

{
  "network": "mtn",
  "phone":   "08012345678",
  "amount":  1000
}
200 OK  92ms

{
  "message": "Airtime purchase successful.",
  "data": {
    "reference":  "BP_20260524_XY1234ABCDEF",
    "status":     "completed",
    "type":       "airtime",
    "network":   "mtn",
    "phone":     "08012345678",
    "amount":    1000,
    "fee":       0,
    "total":     1000,
    "created_at":"2026-05-24T10:30:00Z"
  }
}
// PHP - buy ₦1,000 MTN airtime
$client = new \GuzzleHttp\Client;

$response = $client->post('https://api.sogo.africa/v1/bills/airtime', [
    'headers' => [
        'Authorization'   => 'Bearer ' . getenv('SOGO_SECRET_KEY'),
        'Content-Type'    => 'application/json',
        'Idempotency-Key' => \Ramsey\Uuid\Uuid::uuid4()->toString(),
    ],
    'json' => [
        'network' => 'mtn',
        'phone'   => $request->phone,
        'amount'  => (int) $request->amount,
    ],
]);

$data = json_decode($response->getBody(), true)['data'];
// $data['status'] === 'completed' means delivery is done
import { randomUUID } from 'crypto';

const res = await fetch('https://api.sogo.africa/v1/bills/airtime', {
  method: 'POST',
  headers: {
    Authorization:     `Bearer ${process.env.SOGO_SECRET_KEY}`,
    'Content-Type':   'application/json',
    'Idempotency-Key': randomUUID(),
  },
  body: JSON.stringify({
    network: 'mtn',
    phone:   req.body.phone,
    amount:  req.body.amount,
  }),
});

const { data } = await res.json();
// data.status === 'completed' - instant confirmation
POST
/v1/bills/data
Scope: bills:write  ·  Idempotency-Key required

Purchase a mobile data bundle. Required params: network (mtn/glo/airtel/t2mobile/smile), phone, variation_code (from GET /v1/bills/data-plans). Supports all available bundles from 50MB daily plans to unlimited monthly packages.

POST
/v1/bills/electricity
Scope: bills:write  ·  Idempotency-Key required

Pay an electricity bill or buy prepaid token. Required params: disco_slug (DisCo slug), meter_number, meter_type (prepaid/postpaid), amount (in Naira). Always call verify-meter first and show the customer name to the user before submitting.

POST
/v1/bills/cable-tv
Scope: bills:write  ·  Idempotency-Key required

Pay a cable TV subscription. Required params: provider (dstv/gotv/startimes), smartcard_number, subscription_type (renew/change), variation_code (from GET /v1/bills/cable-packages), amount. Call verify-smartcard first to confirm the subscriber name.

POST
/v1/bills/education
Scope: bills:write  ·  Idempotency-Key required

Pay JAMB and WAEC fees. Required params: provider (jamb/waec), variation_code (from GET /v1/bills/education-plans), amount. For JAMB: also pass profile_id (candidate registration number). For WAEC: also pass service_type (result_checker/registration).

POST
/v1/bills/epin
Scope: bills:write  ·  Idempotency-Key required

Purchase electronic recharge card PINs (e-PIN) for bulk airtime resellers and recharge card printing businesses. Returns a list of PIN codes and their serial numbers. Required params: network (mtn/glo/airtel/t2mobile), denomination (100/200/500), quantity.

POST
/v1/bills/bet-funding
Scope: bills:write  ·  Idempotency-Key required

Fund a betting account wallet. Required params: provider (e.g. bet9ja, sportybet), account_id (betting platform user ID), amount. Always call verify-account first to confirm the username.

Transaction status webhooks

Most bill payments complete synchronously - the response already includes status: completed. For asynchronous deliveries (some electricity providers, eSIM), Sogo fires webhooks.

transaction.completed

Asynchronous bill payment has been successfully delivered. For electricity, the payload includes the prepaid token code. For eSIM, activation details are included. Update your user's record and notify them.

transaction.cancelled

The bill payment could not be processed (possible reasons include provider downtime, invalid account details, or service unavailability) and the transaction has been cancelled, firing a transaction.cancelled webhook.

transaction.refunded

Following a cancellation or delivery failure, Sogo automatically refunds the full Naira bill amount back to your Naira wallet balance. Sogo dispatches a transaction.refunded webhook when the refund completes.

50+ providers, one integration

Add Nigerian bill payments to your app today

Get your API keys and start testing in sandbox. Every endpoint, every provider, and every webhook is available in the test environment - no real money needed.