REST API • v1

Yenllet API Documentation

Build powerful VTU apps, reseller platforms, and wallet integrations with our RESTful API. Instantly deliver airtime, data, electricity, TV subscriptions, and betting top-ups across Nigeria.

Base URL https://yenllet.name.ng/api/v1

Authentication

All API requests must include your secret API key in the Authorization header as a Bearer token. Keep your API key confidential — never expose it in client-side code that end users can inspect.

Header format Authorization: Bearer YOUR_API_KEY
cURL
# Example: authenticate and fetch wallet balance
curl -X GET "https://yenllet.name.ng/api/v1/wallet/balance" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"

Getting Your API Key

Generate your secret API key in three simple steps from the Yenllet dashboard:

  1. Log into your Yenllet account at yenllet.name.ng/login and navigate to Dashboard → API Settings.
  2. Click the "Generate API Key" button. Your key will be displayed only once — copy and store it securely in a vault or environment variable.
  3. Use the key in the Authorization header of every request. You can rotate or revoke a key at any time from the same page.
Security note Treat your API key like a password. Do not commit it to public repositories or share it in chat. If compromised, revoke it immediately and generate a new one.

How Transactions Work

Every Yenllet API transaction follows a predictable lifecycle. Understanding it will help you build robust error handling and reconciliation logic.

  1. Client calls an endpoint (e.g. POST /airtime/buy) with the required parameters and your Authorization header.
  2. Yenllet validates the request — checks API key, wallet balance, recipient number format, and provider availability.
  3. Funds are deducted from your wallet and the transaction is queued for the upstream provider (Clubkonnect / direct aggregator).
  4. Provider delivers the service (airtime, data, TV, electricity, betting) to the recipient — usually within 1–10 seconds.
  5. Yenllet returns the final response with a status of success, pending, or failed, plus a unique transactionId.
Important — auto-refund If a transaction fails at the provider level, Yenllet automatically refunds the deducted amount to your wallet within 60 seconds. Do not double-charge your own customers in this scenario — listen for the webhook or poll the transaction status first.

Check Wallet Balance

Returns the current prepaid wallet balance associated with your API key. Useful for pre-flight balance checks before initiating transactions.

GET /wallet/balance

Response sample

JSON • 200 OK
{
  "success": true,
  "balance": 15423.50,
  "currency": "NGN",
  "walletId": "yw_8f3a9c2e1d",
  "lastUpdated": "2026-01-15T14:32:11Z"
}

Buy Airtime

Deliver instant airtime to any Nigerian phone number. Supports MTN, Airtel, Glo, and 9mobile.

POST /airtime/buy

Parameters

FieldTypeRequiredDescription
phonestringYesRecipient phone number (11 digits, starts with 0). Example: 08012345678
amountnumberYesAirtime amount in NGN. Minimum ₦50, maximum ₦20,000.
networkstringYesOne of: MTN, AIRTEL, GLO, 9MOBILE
referencestringNoOptional idempotency reference. Prevents duplicate transactions.

Success response

JSON • 200 OK
{
  "success": true,
  "status": "success",
  "transactionId": "yx_air_9f2a1c7e",
  "network": "MTN",
  "phone": "08012345678",
  "amount": 500,
  "previousBalance": 15423.50,
  "newBalance": 14923.50,
  "createdAt": "2026-01-15T14:33:02Z"
}

Error response

JSON • 400 Bad Request
{
  "success": false,
  "status": "failed",
  "error": "INSUFFICIENT_BALANCE",
  "message": "Wallet balance is too low for this transaction."
}

Buy Data

Purchase a data bundle for any Nigerian number. Pass a valid planId from GET /plans/data.

POST /data/buy

Parameters

FieldTypeRequiredDescription
phonestringYesRecipient phone number (11 digits, e.g. 08012345678)
networkstringYesOne of: MTN, AIRTEL, GLO, 9MOBILE
planIdstringYesPlan identifier from GET /plans/data. Example: mtn_1gb_30d
referencestringNoIdempotency reference to prevent duplicate orders.

Success response

JSON • 200 OK
{
  "success": true,
  "status": "success",
  "transactionId": "yx_dat_4b8c2a1f",
  "network": "MTN",
  "phone": "08012345678",
  "plan": "1GB - 30 Days",
  "amount": 350,
  "newBalance": 14573.50,
  "createdAt": "2026-01-15T14:34:18Z"
}

Subscribe TV

Renew or activate a DStv, GOtv, Startimes, or Showmax subscription. Always call POST /tv/verify first to validate the smartcard / IUC number.

POST /tv/subscribe

Parameters

FieldTypeRequiredDescription
providerstringYesOne of: DSTV, GOTV, STARTIMES, SHOWMAX
smartcardstringYesIUC / smartcard number (numeric). Verify first via POST /tv/verify.
planIdstringYesPlan code from GET /plans/tv. Example: dstv_premium_1m
customerNamestringNoCustomer name returned by the verify endpoint (recommended for audit).
referencestringNoIdempotency reference.

Supported TV providers

ProviderCodeSmartcard length
DStvDSTV10 digits
GOtvGOTV10 digits
StartimesSTARTIMES11 digits
ShowmaxSHOWMAX— (email-based)

Pay Electricity

Purchase prepaid electricity tokens for any of the 12 distribution companies (DisCos) in Nigeria. For prepaid meters, a token is returned in the response.

POST /electricity/pay

Parameters

FieldTypeRequiredDescription
discostringYesDistribution company code (see table below)
meterstringYesMeter number (numeric, 11–13 digits)
meterTypestringYesEither PREPAID or POSTPAID
amountnumberYesAmount in NGN. Minimum ₦1,000.
referencestringNoIdempotency reference.

Supported DisCos (12)

Distribution CompanyCode
Ikeja ElectricIKEDC
Eko ElectricEKEDC
Abuja ElectricAEDC
Kano ElectricKEDCO
Port Harcourt ElectricPHEDC
Jos ElectricJEDC
Ibadan ElectricIBEDC
Kaduna ElectricKAEDC
Enugu ElectricEEDC
Benin ElectricBEDC
Yola ElectricYEDC
Sokoto ElectricSED

Get All Plans

Returns the full catalogue of available plans across all categories: data, TV, and betting. Cache this response for up to 1 hour.

GET /plans

Response sample

JSON • 200 OK
{
  "success": true,
  "data": {
    "data_plans": [
      { "id": "mtn_1gb_30d", "network": "MTN", "name": "1GB - 30 Days", "price": 350 },
      { "id": "airtel_2gb_30d", "network": "AIRTEL", "name": "2GB - 30 Days", "price": 750 }
    ],
    "tv_plans": [ ... ],
    "betting_providers": [ ... ]
  }
}

Domains API

Yenllet's Domains API lets you search, register, renew, transfer, and fully manage domain names through the WhoGoHost reseller platform — all from a single integrated wallet. Every domain operation is paid from the user's Yenllet wallet balance, so no separate billing is required.

Authentication All domain endpoints (except GET /domains/tlds and GET /domains/check) require the standard Authorization: Bearer YOUR_JWT_TOKEN header. Public endpoints are rate-limited to 30 requests per minute per IP.

1. List Available TLDs & Pricing

Returns all top-level domains you can register through Yenllet, along with wholesale cost, selling price, and markup. Public endpoint — no auth required.

GET /api/domains/tlds
JSON • 200 OK
{
  "success": true,
  "tlds": [
    {
      "tld": "com",
      "register_wholesale": 8200,
      "register_sell": 9200,
      "renew_sell": 9200,
      "transfer_sell": 9200,
      "is_active": true
    },
    { "tld": "com.ng", "register_sell": 5200, ... }
  ]
}

2. Check Domain Availability

Checks if a domain is available for registration and returns the selling price for the matching TLD. Public endpoint.

GET /api/domains/check?domain=mybrand.com
Query paramTypeRequiredDescription
domainstringYesFull domain name including TLD (e.g. mybrand.com)
JSON • 200 OK (available)
{
  "success": true,
  "domain": "mybrand.com",
  "available": true,
  "price_register": 9200,
  "price_renew": 9200
}

3. Register a New Domain

Registers a domain for the specified number of years. Deducts the total cost from the user's Yenllet wallet. Nameservers default to WhoGoHost's (ns1.whogohost.com, ns2.whogohost.com) if not provided.

POST /api/domains/register
FieldTypeRequiredDescription
domainstringYesFull domain name (e.g. mybrand.com)
regperiodnumberYesRegistration period in years (1–10)
nameserversstring[]NoArray of 2–4 nameservers. Defaults to WhoGoHost NS.
contactsobjectYesRegistrant contact details (see below)
addonsobjectNoAddons like ID Protection ({ id_protect: true })
Contact object structure All fields are required: firstname, lastname, email, phonenumber, address1, city, state, country (2-letter ISO code, e.g. NG), postcode.
JSON • 200 OK
{
  "success": true,
  "message": "Domain mybrand.com registered successfully for 1 year(s).",
  "domain": "mybrand.com",
  "regperiod": 1,
  "amount_charged": 9200
}

4. Renew a Domain

Extends the registration period of an existing domain. The domain must already be registered through Yenllet.

POST /api/domains/renew
FieldTypeRequiredDescription
domainstringYesExisting domain name
regperiodnumberYesRenewal period in years (1–10)

5. Transfer a Domain

Transfers a domain from another registrar to Yenllet. Requires the EPP code from the current registrar. The transfer process typically takes 5–7 days.

POST /api/domains/transfer
FieldTypeRequiredDescription
domainstringYesDomain to transfer
eppcodestringYesEPP authorization code from current registrar
contactsobjectYesRegistrant contact (same structure as register)

6. List Your Domains

Returns all domains registered through the authenticated user's account, including expiry dates and status.

GET /api/domains/my
JSON • 200 OK
{
  "success": true,
  "domains": [
    {
      "domain": "mybrand.com",
      "regdate": "2026-01-15",
      "expirydate": "2027-01-15",
      "status": "active",
      "id_protect": false
    }
  ]
}

7. Domain Management Endpoints

Each domain you register can be fully managed. All management endpoints follow the pattern /api/domains/:domain/<action> and require authentication.

MethodEndpointPurpose
GET/domains/:domain/informationGet domain info (status, dates, registrar)
GET/domains/:domain/nameserversGet current nameservers
POST/domains/:domain/nameserversUpdate nameservers (2–4 required)
GET/domains/:domain/dnsGet DNS records (A, AAAA, CNAME, MX, TXT, etc.)
POST/domains/:domain/dnsUpdate DNS records (requires WhoGoHost NS)
GET/domains/:domain/lockGet domain lock status (prevents transfers)
POST/domains/:domain/lockLock or unlock domain ({ lockstatus: "locked" | "unlocked" })
GET/domains/:domain/eppcodeGet EPP authorization code (for transfers out)
GET/domains/:domain/contactGet registrant contact details
POST/domains/:domain/contactUpdate registrant contact details
POST/domains/:domain/idprotectToggle WHOIS ID protection ({ enabled: true | false })

8. Update DNS Records

Add, modify, or delete DNS records. DNS management only works if your domain's nameservers point to WhoGoHost (ns1.whogohost.com / ns2.whogohost.com). Otherwise, manage DNS at your nameserver provider.

POST /api/domains/:domain/dns
JSON • Request Body
{
  "dnsrecords": [
    { "hostname": "@", "type": "A", "address": "192.168.1.1" },
    { "hostname": "www", "type": "CNAME", "address": "mybrand.com" },
    { "hostname": "@", "type": "MX", "address": "mail.mybrand.com" }
  ]
}
Supported DNS record types A, AAAA, CNAME, MX, TXT, NS, SRV, CAA. The entire record set is replaced on each POST — send ALL records you want to keep, not just the ones you're adding.

9. Supported TLDs & Live Pricing

Yenllet supports all TLDs available through WhoGoHost. Pricing is set by the admin from the Domains tab — the table below fetches live prices from the API and updates automatically.

TLDRegisterRenewTransferStatus
Loading live TLD prices…
Live pricing The table above fetches prices directly from GET /api/domains/tlds. When admin updates a TLD's price from the admin panel, this table updates on the next page load — no redeploy needed. TLDs showing ₦1,000 have not had their wholesale price set yet (admin must set it manually from the WhoGoHost reseller dashboard).

10. Domain Registration cURL Example

cURL
curl -X POST "https://yenllet.name.ng/api/domains/register" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "mybrand.com",
    "regperiod": 1,
    "nameservers": ["ns1.whogohost.com", "ns2.whogohost.com"],
    "contacts": {
      "firstname": "John",
      "lastname": "Doe",
      "email": "john@example.com",
      "phonenumber": "08012345678",
      "address1": "123 Main St",
      "city": "Lagos",
      "state": "Lagos",
      "country": "NG",
      "postcode": "100001"
    },
    "addons": { "id_protect": true }
  }'
Refund policy Domain registrations are non-refundable once the registry confirms the domain is active. If registration fails at the registry level, the full amount is automatically refunded to your Yenllet wallet within 60 seconds. Always verify domain availability with GET /domains/check before calling POST /domains/register.

Code Examples

Copy-paste examples in your favourite language. All examples show how to buy ₦500 MTN airtime.

JavaScript • Node.js
// npm install node-fetch (Node 18+ has fetch built-in)
const res = await fetch('https://yenllet.name.ng/api/v1/airtime/buy', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    phone: '08012345678',
    amount: 500,
    network: 'MTN',
    reference: 'my-order-001'
  })
});
const data = await res.json();
console.log(data.transactionId);
TypeScript • Next.js Route Handler
// app/api/airtime/route.ts
import { NextResponse } from 'next/server';

export async function POST(req: Request) {
  const { phone, amount, network } = await req.json();
  const res = await fetch('https://yenllet.name.ng/api/v1/airtime/buy', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.YENLLET_API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ phone, amount, network })
  });
  return NextResponse.json(await res.json());
}
Python • requests
# pip install requests
import requests

url = "https://yenllet.name.ng/api/v1/airtime/buy"
headers = {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json",
}
payload = {
    "phone": "08012345678",
    "amount": 500,
    "network": "MTN",
    "reference": "my-order-001",
}

response = requests.post(url, json=payload, headers=headers)
data = response.json()
print(data["transactionId"])
PHP • cURL
<?php
$ch = curl_init("https://yenllet.name.ng/api/v1/airtime/buy");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Authorization: Bearer YOUR_API_KEY",
    "Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    "phone"     => "08012345678",
    "amount"    => 500,
    "network"    => "MTN",
    "reference" => "my-order-001"
]));

$response = curl_exec($ch);
$data = json_decode($response, true);
echo $data["transactionId"];
cURL
curl -X POST "https://yenllet.name.ng/api/v1/airtime/buy" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phone":"08012345678","amount":500,"network":"MTN","reference":"my-order-001"}'

Reseller API

Yenllet's Reseller tier is designed for businesses reselling VTU services at volume. You get discounted pricing, a white-label dashboard, and dedicated endpoints.

Reseller benefits Up to 8% discount on every transaction • White-label dashboard • Sub-user management • Priority settlement • Dedicated support channel.

Reseller-only endpoints

MethodEndpointPurpose
GET/reseller/pricingFetch discounted reseller pricing for all plans
POST/reseller/sub-usersCreate a sub-user under your reseller account
POST/reseller/fund-sub-userCredit a sub-user wallet from your main wallet
GET/reseller/transactionsList transactions across all sub-users

Pricing example (Reseller vs Retail)

JSON • GET /reseller/pricing
{
  "mtn_1gb_30d": { "retail": 350, "reseller": 322, "discount_pct": 8 },
  "dstv_premium_1m": { "retail": 24500, "reseller": 22540, "discount_pct": 8 }
}

Reseller Domain API

Mirror what Yenllet does with WhoGoHost: your customer searches and buys a domain on your site, your site calls these endpoints with your x-api-key header, Yenllet charges your wallet, calls WhoGoHost, and the domain is registered in your Yenllet account. No manual login to Yenllet needed — full automation.

Authentication — different from the user API All reseller domain endpoints use the x-api-key header (NOT Authorization: Bearer). Generate your reseller API key from Dashboard → Profile → Reseller API Keys. The key starts with ylrsk_.

1. List TLDs & Prices

GET /api/v1/domains/tlds

Returns all active TLDs with sell prices. Use this to build your domain search page. No request body needed — just the x-api-key header.

Response sample
{
  "success": true,
  "tlds": [
    { "tld": "com", "register_sell": 15999, "renew_sell": 25000, "transfer_sell": 25000 },
    { "tld": "com.ng", "register_sell": 4000, "renew_sell": 8200, "transfer_sell": 8200 }
  ]
}

2. Check Domain Availability

GET /api/v1/domains/check?domain=mybrand.com

Checks if a domain is available AND returns the price for that TLD. Use this on your search page — when the user types a domain, call this to show "Available — ₦15,999/year" or "Already taken."

Response (available)
{
  "success": true,
  "domain": "mybrand.com",
  "tld": "com",
  "available": true,
  "price_register": 15999,
  "price_renew": 25000,
  "price_transfer": 25000
}

3. Register a Domain

POST /api/v1/domains/register

Registers a domain. Charges your reseller wallet, calls WhoGoHost, and the domain is owned by your Yenllet account. On failure, your wallet is auto-refunded.

FieldTypeRequiredDescription
domainstringYesFull domain name (e.g. mybrand.com)
regperiodnumberYesYears to register (1–10). Default: 1
nameserversstring[]YesArray of 2+ nameservers (e.g. ["ns1.cloudflare.com","ns2.cloudflare.com"])
contactsobjectYesRegistrant contact — see below
addonsobjectNoAddons like { id_protect: true }
contacts object — all fields required: firstname, lastname, email, phonenumber, address1, city, state, country (2-letter ISO), postcode
cURL
curl -X POST "https://yenllet.name.ng/api/v1/domains/register" \
  -H "x-api-key: ylrsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "mybrand.com",
    "regperiod": 1,
    "nameservers": ["ns1.cloudflare.com", "ns2.cloudflare.com"],
    "contacts": {
      "firstname": "John",
      "lastname": "Doe",
      "email": "john@example.com",
      "phonenumber": "08012345678",
      "address1": "123 Main St",
      "city": "Lagos",
      "state": "Lagos",
      "country": "NG",
      "postcode": "100001"
    }
  }'

4. Transfer a Domain

POST /api/v1/domains/transfer

Transfer a domain from another registrar to your Yenllet account. Requires the EPP authorization code from the current registrar. Transfer takes 5–7 days to complete.

FieldTypeRequiredDescription
domainstringYesDomain to transfer
eppcodestringYesEPP auth code from current registrar
regperiodnumberNoYears (default 1)
contactsobjectYesSame structure as register
nameserversstring[]Yes2+ nameservers

5. Renew a Domain

POST /api/v1/domains/renew

Extends the registration of a domain you already own. Body: { "domain": "mybrand.com", "regperiod": 1 }

6. List Your Domains

GET /api/v1/domains/my

Returns all domains registered through your reseller API key. Use this to build a "My Domains" dashboard for your customers.

7. Domain Management — DNS, Nameservers, Lock & More

Once a domain is registered, your customers can fully manage it through your site. All management endpoints use the pattern /api/v1/domains/:domain/<action> and require the x-api-key header. A domain can only be managed by the reseller who owns it.

MethodEndpointWhat it does
GET/v1/domains/:domain/informationGet registration status, expiry date, contacts
GET/v1/domains/:domain/nameserversGet current nameservers
POST/v1/domains/:domain/nameserversUpdate nameservers (body: {"nameservers": ["ns1.x.com","ns2.x.com"]})
GET/v1/domains/:domain/dnsGet all DNS records (A, CNAME, MX, TXT, etc.)
POST/v1/domains/:domain/dnsAdd/update DNS records (CNAME, A, MX, TXT, etc.) — see below
GET/v1/domains/:domain/lockGet registrar-lock status
POST/v1/domains/:domain/lockLock/unlock (body: {"lockstatus": "locked"})
GET/v1/domains/:domain/eppcodeGet EPP code (for transferring out)
GET/v1/domains/:domain/contactGet WHOIS contact details
POST/v1/domains/:domain/contactUpdate WHOIS contacts
POST/v1/domains/:domain/idprotectToggle WHOIS ID protection (body: {"enabled": true})

8. DNS Record Management — CNAME, A, MX, TXT & More

Your customers can manage DNS records directly from your site. DNS management only works if the domain's nameservers point to WhoGoHost (ns1.whogohost.com / ns2.whogohost.com). If the customer is using Cloudflare or another DNS provider, they need to manage DNS there.

POST /api/v1/domains/:domain/dns
DNS fieldDescriptionExample
hostnameSubdomain / host name. Use @ for root domain, www for www subdomain"@", "www", "mail"
typeDNS record typeA, AAAA, CNAME, MX, TXT, NS, SRV
addressThe target value — IP for A, hostname for CNAME, server for MX, text for TXT"192.168.1.1", "mybrand.com"
priorityPriority (MX records only)10, 20
Request body — full DNS management example
{
  "dnsrecords": [
    { "hostname": "@", "type": "A", "address": "192.168.1.1" },
    { "hostname": "www", "type": "CNAME", "address": "mybrand.com" },
    { "hostname": "@", "type": "MX", "address": "mail.mybrand.com", "priority": 10 },
    { "hostname": "@", "type": "TXT", "address": "v=spf1 include:_spf.google.com ~all" },
    { "hostname": "_dmarc", "type": "TXT", "address": "v=DMARC1; p=none;" }
  ]
}
Important — full replacement The POST replaces ALL DNS records on the domain. Send every record you want to keep, not just the new ones. Call GET /v1/domains/:domain/dns first to get the current records, modify the array, then POST it back.
Supported DNS record types: A (IPv4), AAAA (IPv6), CNAME (alias), MX (mail), TXT (text/SPF/DMARC), NS (nameserver), SRV (service). TTL is managed automatically by WhoGoHost's DNS editor.

9. Complete Flow — How Your Customer Buys a Domain

  1. Customer types mybrand.com in the search box on your site
  2. Your site calls GET /api/v1/domains/check?domain=mybrand.com → shows "Available — ₦15,999/yr"
  3. Customer fills in contact form + selects years, clicks "Buy"
  4. Your site calls POST /api/v1/domains/register with contacts + nameservers
  5. Yenllet charges your wallet, calls WhoGoHost, returns success + order_uid
  6. Your site shows confirmation to the customer
  7. Later, customer wants to point DNS to their hosting → your site calls POST /api/v1/domains/mybrand.com/dns
  8. Customer wants WHOIS privacy → POST /api/v1/domains/mybrand.com/idprotect
  9. Domain near expiry → POST /api/v1/domains/renew
Refund policy Domain registrations are non-refundable once the registry confirms the domain is active. If registration fails at WhoGoHost's level (domain taken, invalid contacts), the full amount is auto-refunded to your reseller wallet within 60 seconds. Always check availability first.

Error Codes

Yenllet uses conventional HTTP response codes. Errors include a machine-readable error code and a human-readable message.

StatusError codeMeaningWhat to do
400INVALID_REQUESTMissing or invalid parametersCheck the message field for the exact field at fault
401UNAUTHORIZEDMissing or invalid API keyVerify the Authorization header and regenerate key if needed
402INSUFFICIENT_BALANCEWallet balance is too lowFund your wallet via the dashboard or wallet funding API
404PLAN_NOT_FOUNDThe supplied planId doesn't existRefresh plans via GET /plans and use the latest id
409DUPLICATE_REFERENCEThe reference has been used beforeGenerate a new unique reference for each request
422INVALID_RECIPIENTPhone / meter / smartcard failed validationVerify the recipient with the appropriate verify endpoint
429RATE_LIMIT_EXCEEDEDToo many requests per minuteImplement exponential backoff; reduce request rate
500PROVIDER_ERRORUpstream provider returned an errorAuto-refund issued; retry once after 30 seconds

Webhooks

Yenllet fires webhooks for transaction status changes so you can update your own system in real time without polling. Configure your webhook URL in Dashboard → API Settings → Webhooks.

Respond fast Your endpoint must respond with HTTP 200 within 5 seconds. Slow responses will trigger retries (up to 5 attempts over 24 hours).

Payload sample

POST • your webhook URL
{
  "event": "transaction.completed",
  "transactionId": "yx_air_9f2a1c7e",
  "type": "airtime",
  "status": "success",
  "amount": 500,
  "recipient": "08012345678",
  "reference": "my-order-001",
  "timestamp": "2026-01-15T14:33:05Z",
  "signature": "sha256=ab12cd34ef56..."
}

Webhook fields

FieldDescription
eventEvent type. One of: transaction.completed, transaction.failed, transaction.pending, wallet.funded
transactionIdYenllet's unique transaction identifier
statusFinal status: success, failed, or pending
referenceYour idempotency reference (if supplied)
signatureHMAC-SHA256 signature of the payload using your webhook secret. Always verify this!

Supported Providers

Yenllet integrates with every major Nigerian network, TV provider, electricity DisCo, and betting platform.

Networks

NetworkCodePrefixes
MTN NigeriaMTN0703, 0706, 0803, 0806, 0813, 0814, 0816, 0903, 0906, 0913, 0916
Airtel NigeriaAIRTEL0701, 0708, 0802, 0808, 0812, 0901, 0902, 0904, 0907, 0912
GlobacomGLO0705, 0805, 0807, 0811, 0815, 0905, 0915
9mobile9MOBILE0809, 0817, 0818, 0908, 0909

TV providers

ProviderCodePlans available
DStvDSTVPremium, Compact Plus, Compact, Confam, Yanga, Padi, HDPVR
GOtvGOTVSupa, Supa Plus, Max, Jolli, Jinja, Smallie
StartimesSTARTIMESBasic, Classic, Unique, Sport, Nova
ShowmaxSHOWMAXPremium, Mobile, Standard

Betting providers

ProviderCodeMin / Max (₦)
Bet9jaBET9JA100 / 500,000
SportyBetSPORTYBET100 / 1,000,000
BetKingBETKING100 / 500,000
1xBet1XBET100 / 1,000,000
BangBetBANGBET100 / 500,000

Rate Limits

API keys are subject to per-minute and per-day request limits. Limits reset on a rolling window.

TierRequests / minRequests / dayConcurrent
Standard6010,0005
Reseller18050,00015
Enterprise600Unlimited50
Headers to monitor Every response includes X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers so you can throttle proactively.

Frequently Asked Questions

Log into your Yenllet dashboard, navigate to Dashboard → API Settings, and click "Generate API Key". The key is shown only once — store it securely. You can rotate or revoke it at any time.
Yenllet automatically refunds the deducted amount to your wallet within 60 seconds. The transaction's status field will be failed. A webhook with event transaction.failed is also fired if a webhook URL is configured.
Yes. A single API key can be used from any number of servers, subject to your tier's rate limits (see Rate Limits). For multi-team setups, consider generating separate keys per environment via the dashboard.
Yes. Pass a unique reference field on every transaction request. If Yenllet receives the same reference twice, the second request is rejected with HTTP 409 and error code DATABASE_REFERENCE / DUPLICATE_REFERENCE, preventing double-charges.
Each webhook payload includes a signature field containing sha256=.... Compute HMAC-SHA256 of the raw request body using your webhook secret (from Dashboard → API Settings) and compare it to the signature. Reject the request if they don't match.

Ready to Build?

Create a free Yenllet account, generate your API key, and ship your VTU product today. No setup fees, no minimum volume.

Create Free Account