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.
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.
# 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:
- Log into your Yenllet account at
yenllet.name.ng/loginand navigate to Dashboard → API Settings. - Click the "Generate API Key" button. Your key will be displayed only once — copy and store it securely in a vault or environment variable.
- Use the key in the
Authorizationheader of every request. You can rotate or revoke a key at any time from the same page.
How Transactions Work
Every Yenllet API transaction follows a predictable lifecycle. Understanding it will help you build robust error handling and reconciliation logic.
- Client calls an endpoint (e.g.
POST /airtime/buy) with the required parameters and yourAuthorizationheader. - Yenllet validates the request — checks API key, wallet balance, recipient number format, and provider availability.
- Funds are deducted from your wallet and the transaction is queued for the upstream provider (Clubkonnect / direct aggregator).
- Provider delivers the service (airtime, data, TV, electricity, betting) to the recipient — usually within 1–10 seconds.
- Yenllet returns the final response with a
statusof success, pending, or failed, plus a uniquetransactionId.
Check Wallet Balance
Returns the current prepaid wallet balance associated with your API key. Useful for pre-flight balance checks before initiating transactions.
Response sample
{
"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.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
phone | string | Yes | Recipient phone number (11 digits, starts with 0). Example: 08012345678 |
amount | number | Yes | Airtime amount in NGN. Minimum ₦50, maximum ₦20,000. |
network | string | Yes | One of: MTN, AIRTEL, GLO, 9MOBILE |
reference | string | No | Optional idempotency reference. Prevents duplicate transactions. |
Success response
{
"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
{
"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.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
phone | string | Yes | Recipient phone number (11 digits, e.g. 08012345678) |
network | string | Yes | One of: MTN, AIRTEL, GLO, 9MOBILE |
planId | string | Yes | Plan identifier from GET /plans/data. Example: mtn_1gb_30d |
reference | string | No | Idempotency reference to prevent duplicate orders. |
Success response
{
"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.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
provider | string | Yes | One of: DSTV, GOTV, STARTIMES, SHOWMAX |
smartcard | string | Yes | IUC / smartcard number (numeric). Verify first via POST /tv/verify. |
planId | string | Yes | Plan code from GET /plans/tv. Example: dstv_premium_1m |
customerName | string | No | Customer name returned by the verify endpoint (recommended for audit). |
reference | string | No | Idempotency reference. |
Supported TV providers
| Provider | Code | Smartcard length |
|---|---|---|
| DStv | DSTV | 10 digits |
| GOtv | GOTV | 10 digits |
| Startimes | STARTIMES | 11 digits |
| Showmax | SHOWMAX | — (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.
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
disco | string | Yes | Distribution company code (see table below) |
meter | string | Yes | Meter number (numeric, 11–13 digits) |
meterType | string | Yes | Either PREPAID or POSTPAID |
amount | number | Yes | Amount in NGN. Minimum ₦1,000. |
reference | string | No | Idempotency reference. |
Supported DisCos (12)
| Distribution Company | Code |
|---|---|
| Ikeja Electric | IKEDC |
| Eko Electric | EKEDC |
| Abuja Electric | AEDC |
| Kano Electric | KEDCO |
| Port Harcourt Electric | PHEDC |
| Jos Electric | JEDC |
| Ibadan Electric | IBEDC |
| Kaduna Electric | KAEDC |
| Enugu Electric | EEDC |
| Benin Electric | BEDC |
| Yola Electric | YEDC |
| Sokoto Electric | SED |
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.
Response sample
{
"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.
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.
{
"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.
| Query param | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Full domain name including TLD (e.g. mybrand.com) |
{
"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.
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Full domain name (e.g. mybrand.com) |
regperiod | number | Yes | Registration period in years (1–10) |
nameservers | string[] | No | Array of 2–4 nameservers. Defaults to WhoGoHost NS. |
contacts | object | Yes | Registrant contact details (see below) |
addons | object | No | Addons like ID Protection ({ id_protect: true }) |
firstname, lastname, email, phonenumber, address1, city, state, country (2-letter ISO code, e.g. NG), postcode.
{
"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.
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Existing domain name |
regperiod | number | Yes | Renewal 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.
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to transfer |
eppcode | string | Yes | EPP authorization code from current registrar |
contacts | object | Yes | Registrant contact (same structure as register) |
6. List Your Domains
Returns all domains registered through the authenticated user's account, including expiry dates and status.
{
"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.
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /domains/:domain/information | Get domain info (status, dates, registrar) |
| GET | /domains/:domain/nameservers | Get current nameservers |
| POST | /domains/:domain/nameservers | Update nameservers (2–4 required) |
| GET | /domains/:domain/dns | Get DNS records (A, AAAA, CNAME, MX, TXT, etc.) |
| POST | /domains/:domain/dns | Update DNS records (requires WhoGoHost NS) |
| GET | /domains/:domain/lock | Get domain lock status (prevents transfers) |
| POST | /domains/:domain/lock | Lock or unlock domain ({ lockstatus: "locked" | "unlocked" }) |
| GET | /domains/:domain/eppcode | Get EPP authorization code (for transfers out) |
| GET | /domains/:domain/contact | Get registrant contact details |
| POST | /domains/:domain/contact | Update registrant contact details |
| POST | /domains/:domain/idprotect | Toggle 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.
{
"dnsrecords": [
{ "hostname": "@", "type": "A", "address": "192.168.1.1" },
{ "hostname": "www", "type": "CNAME", "address": "mybrand.com" },
{ "hostname": "@", "type": "MX", "address": "mail.mybrand.com" }
]
}
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.
| TLD | Register | Renew | Transfer | Status |
|---|---|---|---|---|
| Loading live TLD prices… | ||||
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 -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 }
}'
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.
// 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);
// 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());
}
# 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
$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 -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-only endpoints
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /reseller/pricing | Fetch discounted reseller pricing for all plans |
| POST | /reseller/sub-users | Create a sub-user under your reseller account |
| POST | /reseller/fund-sub-user | Credit a sub-user wallet from your main wallet |
| GET | /reseller/transactions | List transactions across all sub-users |
Pricing example (Reseller vs Retail)
{
"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.
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
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.
{
"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
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."
{
"success": true,
"domain": "mybrand.com",
"tld": "com",
"available": true,
"price_register": 15999,
"price_renew": 25000,
"price_transfer": 25000
}
3. Register a Domain
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.
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Full domain name (e.g. mybrand.com) |
regperiod | number | Yes | Years to register (1–10). Default: 1 |
nameservers | string[] | Yes | Array of 2+ nameservers (e.g. ["ns1.cloudflare.com","ns2.cloudflare.com"]) |
contacts | object | Yes | Registrant contact — see below |
addons | object | No | Addons like { id_protect: true } |
firstname, lastname, email, phonenumber, address1, city, state, country (2-letter ISO), postcode
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
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.
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | Domain to transfer |
eppcode | string | Yes | EPP auth code from current registrar |
regperiod | number | No | Years (default 1) |
contacts | object | Yes | Same structure as register |
nameservers | string[] | Yes | 2+ nameservers |
5. Renew a Domain
Extends the registration of a domain you already own. Body: { "domain": "mybrand.com", "regperiod": 1 }
6. List Your Domains
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.
| Method | Endpoint | What it does |
|---|---|---|
| GET | /v1/domains/:domain/information | Get registration status, expiry date, contacts |
| GET | /v1/domains/:domain/nameservers | Get current nameservers |
| POST | /v1/domains/:domain/nameservers | Update nameservers (body: {"nameservers": ["ns1.x.com","ns2.x.com"]}) |
| GET | /v1/domains/:domain/dns | Get all DNS records (A, CNAME, MX, TXT, etc.) |
| POST | /v1/domains/:domain/dns | Add/update DNS records (CNAME, A, MX, TXT, etc.) — see below |
| GET | /v1/domains/:domain/lock | Get registrar-lock status |
| POST | /v1/domains/:domain/lock | Lock/unlock (body: {"lockstatus": "locked"}) |
| GET | /v1/domains/:domain/eppcode | Get EPP code (for transferring out) |
| GET | /v1/domains/:domain/contact | Get WHOIS contact details |
| POST | /v1/domains/:domain/contact | Update WHOIS contacts |
| POST | /v1/domains/:domain/idprotect | Toggle 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.
| DNS field | Description | Example |
|---|---|---|
hostname | Subdomain / host name. Use @ for root domain, www for www subdomain | "@", "www", "mail" |
type | DNS record type | A, AAAA, CNAME, MX, TXT, NS, SRV |
address | The target value — IP for A, hostname for CNAME, server for MX, text for TXT | "192.168.1.1", "mybrand.com" |
priority | Priority (MX records only) | 10, 20 |
{
"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;" }
]
}
GET /v1/domains/:domain/dns first to get the current records, modify the array, then POST it back.
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
- Customer types
mybrand.comin the search box on your site - Your site calls
GET /api/v1/domains/check?domain=mybrand.com→ shows "Available — ₦15,999/yr" - Customer fills in contact form + selects years, clicks "Buy"
- Your site calls
POST /api/v1/domains/registerwith contacts + nameservers - Yenllet charges your wallet, calls WhoGoHost, returns success + order_uid
- Your site shows confirmation to the customer
- Later, customer wants to point DNS to their hosting → your site calls
POST /api/v1/domains/mybrand.com/dns - Customer wants WHOIS privacy →
POST /api/v1/domains/mybrand.com/idprotect - Domain near expiry →
POST /api/v1/domains/renew
Error Codes
Yenllet uses conventional HTTP response codes. Errors include a machine-readable error code and a human-readable message.
| Status | Error code | Meaning | What to do |
|---|---|---|---|
| 400 | INVALID_REQUEST | Missing or invalid parameters | Check the message field for the exact field at fault |
| 401 | UNAUTHORIZED | Missing or invalid API key | Verify the Authorization header and regenerate key if needed |
| 402 | INSUFFICIENT_BALANCE | Wallet balance is too low | Fund your wallet via the dashboard or wallet funding API |
| 404 | PLAN_NOT_FOUND | The supplied planId doesn't exist | Refresh plans via GET /plans and use the latest id |
| 409 | DUPLICATE_REFERENCE | The reference has been used before | Generate a new unique reference for each request |
| 422 | INVALID_RECIPIENT | Phone / meter / smartcard failed validation | Verify the recipient with the appropriate verify endpoint |
| 429 | RATE_LIMIT_EXCEEDED | Too many requests per minute | Implement exponential backoff; reduce request rate |
| 500 | PROVIDER_ERROR | Upstream provider returned an error | Auto-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.
Payload sample
{
"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
| Field | Description |
|---|---|
event | Event type. One of: transaction.completed, transaction.failed, transaction.pending, wallet.funded |
transactionId | Yenllet's unique transaction identifier |
status | Final status: success, failed, or pending |
reference | Your idempotency reference (if supplied) |
signature | HMAC-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
| Network | Code | Prefixes |
|---|---|---|
| MTN Nigeria | MTN | 0703, 0706, 0803, 0806, 0813, 0814, 0816, 0903, 0906, 0913, 0916 |
| Airtel Nigeria | AIRTEL | 0701, 0708, 0802, 0808, 0812, 0901, 0902, 0904, 0907, 0912 |
| Globacom | GLO | 0705, 0805, 0807, 0811, 0815, 0905, 0915 |
| 9mobile | 9MOBILE | 0809, 0817, 0818, 0908, 0909 |
TV providers
| Provider | Code | Plans available |
|---|---|---|
| DStv | DSTV | Premium, Compact Plus, Compact, Confam, Yanga, Padi, HDPVR |
| GOtv | GOTV | Supa, Supa Plus, Max, Jolli, Jinja, Smallie |
| Startimes | STARTIMES | Basic, Classic, Unique, Sport, Nova |
| Showmax | SHOWMAX | Premium, Mobile, Standard |
Betting providers
| Provider | Code | Min / Max (₦) |
|---|---|---|
| Bet9ja | BET9JA | 100 / 500,000 |
| SportyBet | SPORTYBET | 100 / 1,000,000 |
| BetKing | BETKING | 100 / 500,000 |
| 1xBet | 1XBET | 100 / 1,000,000 |
| BangBet | BANGBET | 100 / 500,000 |
Rate Limits
API keys are subject to per-minute and per-day request limits. Limits reset on a rolling window.
| Tier | Requests / min | Requests / day | Concurrent |
|---|---|---|---|
| Standard | 60 | 10,000 | 5 |
| Reseller | 180 | 50,000 | 15 |
| Enterprise | 600 | Unlimited | 50 |
X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers so you can throttle proactively.
Frequently Asked Questions
status field will be failed. A webhook with event transaction.failed is also fired if a webhook URL is configured.
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.
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