Purchase data bundles programmatically. Integrate directly into your apps using your wallet balance and agent pricing.
https://api.kingflexygh.com/api/v2Authorization: kf_live_your_api_key_hereGhana networks only. This API fulfils MTN, Telecel, AT-iShare, and AT-BigTime — Ghanaian numbers and Ghanaian networks exclusively. There is no support for international numbers, foreign telecom networks, or any country outside Ghana.
All API requests must include your API key in the Authorization header — no Bearer prefix required.
Authorization: kf_live_your_api_key_here
Important: Your API key is shown only once when generated. Store it securely — losing it requires generating a new key, which permanently revokes the old one.
All responses follow a consistent JSON structure:
Success
{
"success": true,
"data": { ... },
"meta": {
"timestamp": "2026-...",
"version": "v2"
}
}Error
{
"success": false,
"error": {
"code": 400,
"message": "..."
}
}Five endpoints — all require a valid API key in the Authorization header.
/api/v2/packagesList all available data packages with pricing for your account role. Call this first to discover valid network and size combinations.
Query Parameters
networkstringoptionalFilter by network: MTN, Telecel, AT-iShare, AT-BigTime (case-sensitive)size_gbnumberoptionalFilter by exact GB size e.g. 5Response
{
"success": true,
"data": {
"packages": [
{
"id": "uuid-...",
"network": "MTN",
"size": "5GB",
"volume_gb": 5,
"price": 4.50,
"currency": "GHS"
}
],
"total": 12
}
}Code Sample
# All packages curl -X GET https://api.kingflexygh.com/api/v2/packages \ -H "Authorization: kf_live_your_api_key_here" # Filter by network curl -X GET "https://api.kingflexygh.com/api/v2/packages?network=MTN" \ -H "Authorization: kf_live_your_api_key_here" # Filter by network + size curl -X GET "https://api.kingflexygh.com/api/v2/packages?network=MTN&size_gb=5" \ -H "Authorization: kf_live_your_api_key_here"
/api/v2/data/purchasePurchase a single data bundle for a recipient phone number. Deducts from your wallet instantly.
Request Body
{
"network": "MTN",
"volume_gb": 5,
"recipient": "0551617309",
"reference": "order_001"
}Response
{
"success": true,
"data": {
"order_id": "uuid-...",
"reference": "order_001",
"status": "pending",
"network": "MTN",
"size": "5GB",
"recipient": "0551617309",
"price": 4.50,
"new_balance": 120.50
}
}Code Sample
curl -X POST https://api.kingflexygh.com/api/v2/data/purchase \
-H "Authorization: kf_live_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"network": "MTN",
"volume_gb": 5,
"recipient": "0551617309",
"reference": "order_001"
}'/api/v2/data/bulkPurchase up to 100 data bundles in a single batch. A validation failure (invalid network, package not found, out of stock) rejects the whole batch and nothing is charged; the one exception is MTN recipients not yet whitelisted with our supplier — those orders are skipped individually while the rest of the batch is placed and charged normally.
Request Body
{
"orders": [
{
"network": "MTN",
"volume_gb": 5,
"recipient": "0551617309",
"reference": "b_001"
},
{
"network": "Telecel",
"volume_gb": 2,
"recipient": "0201234567",
"reference": "b_002"
}
]
}Response
{
"success": true,
"data": {
"orders_placed": 2,
"total_cost": 7.00,
"new_balance": 113.50,
"orders": [
{ "order_id": "...", "reference": "b_001", "status": "pending" }
],
"skipped": []
}
}Code Sample
curl -X POST https://api.kingflexygh.com/api/v2/data/bulk \
-H "Authorization: kf_live_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"orders": [
{"network":"MTN","volume_gb":5,"recipient":"0551617309","reference":"b_001"},
{"network":"Telecel","volume_gb":2,"recipient":"0201234567","reference":"b_002"}
]
}'/api/v2/wallet/balanceRetrieve your current wallet balance in GHS. Use before large orders to verify you have sufficient funds.
Response
{
"success": true,
"data": {
"balance": 124.50,
"currency": "GHS"
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/wallet/balance \ -H "Authorization: kf_live_your_api_key_here"
/api/v2/orders/{reference}Check the fulfillment status of an order using the reference code you provided when placing it.
Response
{
"success": true,
"data": {
"order_id": "uuid-...",
"reference": "order_001",
"status": "completed",
"network": "MTN",
"size": "5GB",
"recipient": "0551617309",
"price": 4.50,
"source": "api",
"created_at": "2026-..."
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/orders/your_reference_here \ -H "Authorization: kf_live_your_api_key_here"
Check your own role and, if it's time-limited, how many days are left — no support ticket needed.
/api/v2/account/roleReturns your current role and, for dealer/agent, the days remaining before it lapses.
Response
{
"success": true,
"data": {
"role": "dealer",
"is_active": true,
"is_permanent": false,
"expires_at": "2026-...",
"days_remaining": 12
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/account/role \ -H "Authorization: kf_live_your_api_key_here"
Send MTN, Telecel, or AT airtime to a beneficiary at face value — no fee — on behalf of your customers, and earn a share of KiNG FLEXY GH's provider commission on every top-up. This endpoint only accepts a Commission Services key (prefix kf_cs_live_...); a standard key is rejected with 403.
/api/v2/airtime/purchaseSend airtime to a beneficiary at face value from your wallet. Auto-dispatches in the background — poll GET /airtime/orders/{reference} for the final status.
Request Body
{
"network": "MTN",
"beneficiary_phone": "0551617309",
"amount": 10,
"reference": "air_001"
}Response
{
"success": true,
"data": {
"order_id": "uuid-...",
"reference": "air_001",
"status": "pending",
"network": "MTN",
"beneficiary_phone": "0551617309",
"airtime_amount": 10,
"fee_amount": 0,
"total_paid": 10,
"new_balance": 90
}
}Code Sample
curl -X POST https://api.kingflexygh.com/api/v2/airtime/purchase \
-H "Authorization: kf_cs_live_your_commission_key_here" \
-H "Content-Type: application/json" \
-d '{
"network": "MTN",
"beneficiary_phone": "0551617309",
"amount": 10,
"reference": "air_001"
}'/api/v2/airtime/ordersList your most recent airtime orders.
Response
{
"success": true,
"data": {
"orders": [ { "order_id": "uuid-...", "reference": "air_001", "status": "completed", "network": "MTN", "airtime_amount": 10 } ]
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/airtime/orders \ -H "Authorization: kf_cs_live_your_commission_key_here"
/api/v2/airtime/orders/{reference}Check the status of one airtime order using the reference you sent when placing it.
Response
{
"success": true,
"data": {
"order_id": "uuid-...",
"reference": "air_001",
"status": "refunded",
"network": "MTN",
"beneficiary_phone": "0551617309",
"airtime_amount": 10,
"reason": "The transaction could not be completed by the payment provider."
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/airtime/orders/air_001 \ -H "Authorization: kf_cs_live_your_commission_key_here"
Sell WAEC/BECE/WASSCE results checker vouchers. Same standard key.
recipientPhone / recipientEmail are optional and have no fallback to your own account: omit both and KiNG FLEXY GH sends nothing — you own delivering the voucher to your customer./api/v2/resultschecker/typesList available voucher types with YOUR OWN role-based price and current stock.
Response
{
"success": true,
"data": {
"types": [ { "type_id": "uuid-...", "name": "WAEC BECE", "price": 18, "available_count": 412, "is_active": true } ]
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/resultschecker/types \ -H "Authorization: kf_live_your_api_key_here"
/api/v2/resultschecker/purchaseBuy voucher(s). Stock is checked BEFORE your wallet is touched — insufficient stock is rejected upfront, never charged then refunded.
Request Body
{
"typeId": "uuid-of-a-type-from-GET-types",
"quantity": 1,
"reference": "rc_001",
"recipientPhone": "0551617309",
"recipientEmail": "customer@example.com"
}Response
{
"success": true,
"data": {
"order": { "id": "uuid-...", "reference": "rc_001", "status": "completed", "type_name": "WAEC BECE", "quantity": 1, "unit_price": 18, "total_paid": 18 },
"vouchers": [ { "id": "uuid-...", "pin": "1234-5678-9012", "serial_number": "SN-000123" } ],
"new_balance": 82
}
}Code Sample
curl -X POST https://api.kingflexygh.com/api/v2/resultschecker/purchase \
-H "Authorization: kf_live_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"typeId": "uuid-of-a-type-from-GET-types",
"quantity": 1,
"reference": "rc_001"
}'/api/v2/resultschecker/ordersList your most recent results checker orders.
Response
{
"success": true,
"data": {
"orders": [ { "id": "uuid-...", "reference": "rc_001", "status": "completed", "type_name": "WAEC BECE", "quantity": 1 } ]
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/resultschecker/orders \ -H "Authorization: kf_live_your_api_key_here"
/api/v2/resultschecker/orders/{reference}Look up one order, including its vouchers again if you need to recover them.
Response
{
"success": true,
"data": {
"order": { "id": "uuid-...", "reference": "rc_001", "status": "completed" },
"vouchers": [ { "id": "uuid-...", "pin": "1234-5678-9012", "serial_number": "SN-000123" } ]
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/resultschecker/orders/rc_001 \ -H "Authorization: kf_live_your_api_key_here"
Register an MTN AFA agent on behalf of your customer. Same standard key.
/api/v2/afa/registerSubmit an AFA registration. Requires a valid Ghana Card and a supported region.
Request Body
{
"reference": "afa_001",
"full_name": "Kwame Mensah",
"phone": "0551617309",
"id_type": "Ghana Card",
"id_number": "GHA-123456789-0",
"date_of_birth": "1995-04-12",
"region": "Greater Accra",
"location": "Madina"
}Response
{
"success": true,
"data": {
"order_id": "uuid-...",
"reference": "afa_001",
"status": "pending",
"new_balance": 64.0
}
}Code Sample
curl -X POST https://api.kingflexygh.com/api/v2/afa/register \
-H "Authorization: kf_live_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"reference": "afa_001",
"full_name": "Kwame Mensah",
"phone": "0551617309",
"id_type": "Ghana Card",
"id_number": "GHA-123456789-0",
"date_of_birth": "1995-04-12",
"region": "Greater Accra",
"location": "Madina"
}'/api/v2/afa/ordersList your most recent AFA registrations.
Response
{
"success": true,
"data": {
"orders": [ { "id": "uuid-...", "reference": "afa_001", "status": "pending" } ]
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/afa/orders \ -H "Authorization: kf_live_your_api_key_here"
/api/v2/afa/orders/{reference}Check the status of one AFA registration.
Response
{
"success": true,
"data": {
"id": "uuid-...",
"reference": "afa_001",
"status": "processing"
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/afa/orders/afa_001 \ -H "Authorization: kf_live_your_api_key_here"
Send bulk and transactional SMS from your own systems — OTPs, order updates, campaigns — with per-recipient delivery tracking.
/api/v2/sms/sendSend an SMS to one or many recipients. Small sends (≤500 recipients) dispatch immediately and return per-send results; larger sends are queued and processed within a minute.
Request Body
{
"message": "Your order #123 is ready. Thank you!",
"recipients": ["0551234567", "0209876543"],
"sender": "AcmeGH",
"reference": "order-123"
}Response
{
"success": true,
"data": {
"campaignId": "uuid-...",
"status": "completed",
"recipients": 2,
"segments": 1,
"creditsCharged": 2,
"sender": "AcmeGH",
"sent": 2,
"failed": 0,
"balance": 498
}
}Code Sample
curl -X POST https://api.kingflexygh.com/api/v2/sms/send \
-H "Authorization: kf_sms_live_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"message": "Your order #123 is ready for pickup. Thank you!",
"recipients": ["0551234567", "0209876543"],
"sender": "AcmeGH"
}'/api/v2/sms/sendersList the sender IDs this API key may send under — your approved own sender IDs plus the shared pool senders. Use these exact values for the sender field.
Response
{
"success": true,
"data": {
"mode": "business",
"defaultSender": "AcmeGH",
"senders": [
{ "sender": "AcmeGH", "type": "own", "isDefault": true },
{ "sender": "KFT SMS", "type": "pool", "isDefault": false }
]
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/sms/senders \ -H "Authorization: kf_sms_live_your_api_key_here"
/api/v2/sms/messages/{campaignId}Delivery status for a send. Returns the campaign summary, a delivery rollup, and per-recipient statuses (100 per page).
Query Parameters
pagenumberoptionalZero-based page of per-recipient rows (100/page)statusstringoptionalFilter rows: queued, sent, delivered, undelivered, failed, expired, rejectedResponse
{
"success": true,
"data": {
"campaign": {
"id": "uuid-...",
"sender_used": "AcmeGH",
"recipients_count": 2,
"segments": 1,
"credits_charged": 2,
"status": "completed",
"created_at": "2026-..."
},
"delivery": { "delivered": 2 },
"messages": [
{
"recipient": "233551234567",
"status": "delivered",
"status_updated_at": "2026-..."
}
],
"page": 0
}
}Code Sample
curl -X GET "https://api.kingflexygh.com/api/v2/sms/messages/your_campaign_id?status=delivered" \ -H "Authorization: kf_sms_live_your_api_key_here"
/api/v2/sms/campaignsList your recent SMS campaigns, newest first — a discovery endpoint that complements GET /sms/messages/{campaignId} for when you don't already have a campaign id on hand.
Query Parameters
pagenumberoptionalZero-based page, 30 per page (default 0)statusstringoptionalFilter: queued, processing, completed, failed, blockedfromstringoptionalISO date — only campaigns created on/after this datetostringoptionalISO date — only campaigns created on/before this dateResponse
{
"success": true,
"data": {
"campaigns": [
{
"id": "uuid-...",
"status": "completed",
"recipients_count": 2,
"segments": 1,
"credits_charged": 2,
"sender_used": "AcmeGH",
"source": "api",
"scheduled_at": null,
"created_at": "2026-..."
}
],
"page": 0
}
}Code Sample
curl -X GET "https://api.kingflexygh.com/api/v2/sms/campaigns?status=completed" \ -H "Authorization: kf_sms_live_your_api_key_here"
/api/v2/sms/balanceYour SMS credit balance and account mode.
Response
{
"success": true,
"data": {
"credits": 498,
"totalPurchased": 600,
"totalUsed": 102,
"mode": "business",
"accountStatus": "active"
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/sms/balance \ -H "Authorization: kf_sms_live_your_api_key_here"
Pay ECG, Ghana Water, DSTV, GOtv, or StarTimes bills at face value on behalf of your customers — and earn a share of KiNG FLEXY GH's provider commission on every payment.
Separate key required. These four endpoints only accept a Commission Services key (prefix kf_cs_live_...) — a standard key is rejected with 403. The reverse is also true: a Commission Services key is rejected with 403 on every other /api/v2/* endpoint (packages, data purchases, wallet, SMS, etc.).
Generate one from Dashboard → Developer API — no shop required. Your commission is paid into a dedicated Commission Wallet, separate from shop earnings. Like the standard key, it starts pending and needs admin approval before it works.
How the money moves: the bill's face value is debited from your main wallet when you call POST /pay. Once the order reaches completed, your commission_share_percent cut of the platform's commission is credited automatically to your Commission Wallet — transfer it instantly to your main or shop wallet, or withdraw it via Paystack Mobile Money.
/api/v2/utilities/billersFull biller catalog for utility bill payments — including currently disabled billers, so you can build your UI without hardcoding which ones are live.
Response
{
"success": true,
"data": {
"billers": [
{
"key": "ecg",
"label": "ECG Prepaid & Postpaid",
"enabled": true,
"account_label": "Meter number",
"requires_phone": true,
"lookup_by": "phone",
"links_phone_to_account": true,
"has_amount_due": true
},
{
"key": "dstv",
"label": "DSTV",
"enabled": true,
"account_label": "Smartcard number",
"requires_phone": false,
"lookup_by": "account",
"links_phone_to_account": false,
"has_amount_due": true
}
],
"min_amount": 1,
"max_amount": 1000,
"currency": "GHS"
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/utilities/billers \ -H "Authorization: kf_cs_live_your_commission_key_here"
/api/v2/utilities/lookupVerify an account before paying. Always show your customer the returned name (or, for ECG, the linked meters) and get their confirmation before calling /pay.
Query Parameters
billerstringOne of: ecg, ghana_water, dstv, gotv, startimesaccountstringMeter/smartcard/account number, max 30 chars. Required for every biller, including ecg — for ecg pass the phone number here too if you have no separate meter number, since the query actually runs on phone.phonestringoptionalCustomer phone, max 30 chars. Required for ghana_water. For ecg, this is what the lookup actually queries by — supply it, not just account.Response
{
"success": true,
"data": {
"account_name": "KWAME MENSAH",
"account_number": "7041234567",
"amount_due": 245.80,
"bouquet": null,
"meters": []
}
}Code Sample
# DSTV — query by smartcard number curl -X GET "https://api.kingflexygh.com/api/v2/utilities/lookup?biller=dstv&account=7041234567" \ -H "Authorization: kf_cs_live_your_commission_key_here" # ECG — query by phone (account is still required; pass the same number) curl -X GET "https://api.kingflexygh.com/api/v2/utilities/lookup?biller=ecg&phone=0551617309&account=0551617309" \ -H "Authorization: kf_cs_live_your_commission_key_here"
reference on /pay is a pure idempotency key, not a distinct-payment key. Reusing the same reference — even with a different biller, account, or amount — returns the details of the ORIGINAL order and never charges you again; it does not re-validate against the new values you sent. Use a unique reference for every distinct bill. Reuse the same reference ONLY to safely retry the exact same payment (e.g. after a network timeout).
/api/v2/utilities/payPay a bill at face value from your wallet. Auto-dispatches to the biller in the background — poll GET /orders/{reference} for the final status.
Request Body
{
"biller": "dstv",
"account": "7041234567",
"amount": 65.00,
"reference": "bill_dstv_7041234567_01"
}Response
{
"success": true,
"data": {
"reference": "UTIL-DSTV-3f9a2b1c4d5e6f70",
"order_id": "uuid-...",
"status": "pending",
"biller": "dstv",
"account": "7041234567",
"amount": 65.00,
"commission_share_percent": 40,
"new_balance": 435.00
}
}Code Sample
# DSTV — account-only biller
curl -X POST https://api.kingflexygh.com/api/v2/utilities/pay \
-H "Authorization: kf_cs_live_your_commission_key_here" \
-H "Content-Type: application/json" \
-d '{
"biller": "dstv",
"account": "7041234567",
"amount": 65.00,
"reference": "bill_dstv_7041234567_01"
}'
# ECG — account is the METER (from lookup meters[]), phone is required too
curl -X POST https://api.kingflexygh.com/api/v2/utilities/pay \
-H "Authorization: kf_cs_live_your_commission_key_here" \
-H "Content-Type: application/json" \
-d '{
"biller": "ecg",
"account": "3701234567",
"phone": "0551617309",
"amount": 50.00,
"reference": "bill_ecg_3701234567_01"
}'/api/v2/utilities/orders/{reference}Poll the fulfillment status of a utility bill order using the reference from the /pay response. Only returns orders that belong to your own account.
Response
{
"success": true,
"data": {
"reference": "UTIL-DSTV-3f9a2b1c4d5e6f70",
"status": "refunded",
"payment_status": "paid",
"biller": "dstv",
"account_number": "7041234567",
"account_name": "KWAME MENSAH",
"amount": 65.00,
"commission_earned": null,
"reason": "The transaction could not be completed by the payment provider.",
"created_at": "2026-...",
"updated_at": "2026-..."
}
}Code Sample
curl -X GET https://api.kingflexygh.com/api/v2/utilities/orders/UTIL-DSTV-3f9a2b1c4d5e6f70 \ -H "Authorization: kf_cs_live_your_commission_key_here"
Rate Limits (per key)
| Endpoint | Limit |
|---|---|
GET /billers | 30 / min |
GET /lookup | 10 / min |
POST /pay | 6 / min |
GET /orders/{reference} | 30 / min |
Error Codes (this section)
| Code | When it occurs |
|---|---|
| 400 | Invalid biller/account/phone/amount/reference, or insufficient wallet balance |
| 401 | Missing or invalid API key |
| 403 | Wrong key type (commission key required here; standard key required everywhere else), key pending/revoked, or account suspended |
| 404 | Account/meter/smartcard not found (lookup), or order not found (status) |
| 409 | Duplicate order — same biller + account + amount resent within 30s without a reference |
| 429 | Rate limit exceeded — see limits above |
| 502 | Billing provider temporarily unreachable — retry shortly (lookup only) |
| 503 | Utility bills, or this specific biller, currently disabled by an admin |
One key type, one purpose — a standard key covers data, results checker and AFA; a Commission Services key covers utilities and airtime; an SMS key covers SMS. A key is confined to its own section — a standard key cannot call /utilities/*, /airtime/*, or /sms/*, and vice versa.
Standard key — data, results checker, AFA
reference per order — it becomes your idempotency key. A retry with the SAME reference and body safely returns the existing order instead of charging twice; reusing a reference for a genuinely DIFFERENT order returns 409 instead of a silent duplicate charge.GET .../orders/{reference} after placing an order rather than assuming success from the initial pending status.GET /account/role — pricing is expiry-aware everywhere, so a lapsed reseller is automatically billed as a customer the moment their tier expires.Commission Services key — utilities, airtime
GET /utilities/billers and GET /utilities/lookup before POST /utilities/pay — the payment call validates against what lookup returns, so skipping it just produces avoidable 400s./utilities/* and /airtime/* only — it cannot reach data, results checker, AFA, or SMS endpoints.SMS key
GET /sms/senders for your approved sender IDs before sending — an unapproved sender ID is rejected outright.GET /sms/balance before a large campaign so you don't hit a funding failure mid-send.?page= rather than assuming one call covers a whole campaign.Network number validation
We detect a recipient/beneficiary's network from the number's prefix before submitting an order. As of this writing:
| Network | Prefixes |
|---|---|
| MTN | 024, 025, 053, 054, 055, 059 |
| Telecel | 020, 050 |
| AirtelTigo | 026, 027, 056, 057 |
These are not guaranteed to stay fixed — Ghanaian operators occasionally get reassigned or new ranges opened by the regulator. Don't hardcode this list as a permanent source of truth in your own client-side validation; our API's response is the final word on whether a number/network pairing is accepted, and it's worth re-checking this page periodically for changes.
| Network Value | Provider | Notes |
|---|---|---|
"MTN" | MTN Ghana | Most widely available bundles |
"Telecel" | Telecel Ghana (formerly Vodafone) | |
"AT-iShare" | AirtelTigo iShare | AirtelTigo bundle type 1 |
"AT-BigTime" | AirtelTigo BigTime | AirtelTigo bundle type 2 |
GET /packages to see exactly which networks and sizes are currently available.This is the complete list — the four networks above are the only ones this API serves. There is no network value for any carrier outside Ghana, and none will be accepted.
| Code | When it occurs |
|---|---|
| 400 | Bad request — invalid phone, volume_gb, network value, or malformed body |
| 401 | Missing or invalid API key |
| 403 | Key pending approval, revoked, suspended account, or role not allowed |
| 404 | Package or order not found for the given network/size/reference |
| 409 | Duplicate reference — an order with this reference already exists. On /data/purchase specifically, an MTN recipient not yet whitelisted with our supplier also returns 409 (see that endpoint's notes) — /data/bulk skips those orders individually instead of returning an error. |
| 429 | Rate limit exceeded — back off and retry after a short delay |
| 500 | Internal server error — contact support if persistent |
| 503 | API feature temporarily disabled by administrator |
Complete runnable data purchase example. Select your language.
curl -X POST https://api.kingflexygh.com/api/v2/data/purchase \
-H "Authorization: kf_live_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"network": "MTN",
"volume_gb": 5,
"recipient": "0551617309",
"reference": "order_001"
}'