ABS Vendor API
Sell airtime, data, electricity and airtime vouchers programmatically. One API key, three request styles, and a full sandbox so you can build and test without spending a naira.
https://absvendor.com — all endpoints are HTTPS only.There are three ways to talk to ABS Vendor, all sharing the same API key:
Direct API
Richest surface — airtime, data, electricity, vouchers, meter validation. Form-encoded.
MSorg style
JSON, drop-in for platforms built around the MaskawaSub/MSorg shape.
Adex style
JSON, drop-in for platforms built around the Adex shape.
Authentication
Every request is authenticated with your secret API key, sent as a Bearer token in the Authorization header. Generate or rotate your key from Dashboard → API Keys.
Authorization: Bearer abs_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxThe Partner (MSorg/Adex) endpoints additionally accept Token <key> and Basic base64(username:key) for compatibility. Your key is the only credential — there is no separate partner ID.
Sandbox / test mode
Add sandbox=true to any spend request (airtime, data, electricity, voucher) — or send the header X-ABS-Sandbox: 1. The request runs the full pipeline (auth, validation, ID lookup, PIN/IP/cap checks) but does not charge your wallet and does not vend. The response is shape-identical to a live one, with "sandbox": true added.
curl -X POST https://absvendor.com/api/user/transaction/buy_airtime.php \ -H "Authorization: Bearer abs_live_YOUR_KEY" \ -F "airtimetid=MTNAIR6TFD" \ -F "phoneno=08012345678" \ -F "amount=100" \ -F "sandbox=1"
Rate limits & controls
- Rate limit: 300 requests per 60 minutes per key.
- IP whitelist (Partner endpoints): if set, requests from other IPs are rejected (403).
- Daily spend cap (Partner endpoints): caps NGN spent per UTC day (429 when exceeded).
- Transaction PIN (Partner endpoints): if enabled, send
pinon every spend call.
Responses & errors
Each style uses its own envelope. A successful spend always means the wallet was debited and the order was created.
Direct API envelope
// success { "status": true, "text": "Successful", "data": { ... } } // failure { "status": false, "text": "Please check your input...", "error": { "code": 141, "text": "The body request is not valid..." } }
Partner MSorg envelope
{ "Status": "successful", ... }
{ "Status": "failed", "message": "<reason>" }Partner Adex envelope
{ "status": "success", ... }
{ "status": "failed", "message": "<reason>" }| HTTP | Meaning |
|---|---|
| 200 | Success |
| 400 / code 141 | Invalid or missing parameter (often a wrong product ID — see below) |
| 401 | Missing/invalid API key, or PIN required and wrong/absent |
| 403 | API disabled for key, or IP not whitelisted |
| 404 | Unknown network / plan / provider |
| 429 | Rate limit or daily spend cap exceeded |
Finding product IDs
This is the #1 cause of code 141. Airtime and data use different product IDs, and the network name (e.g. "MTN") is never a valid ID. Always pull live values from Get System Data (Direct) or List Networks / List Data Plans (Partner).
| You're buying | Send as | Where to get it | Example |
|---|---|---|---|
| Airtime | airtimetid | System Data → airtimeproviders[].product_trackid (or .trackid) | MTNAIR6TFD |
| Data | airtimetid = network, cardunittid = plan | List Data Plans → network_id + id | MTN56TFD + 6BO1H |
| Electricity | provider_tid | System Data → electricity services | disco service trackid |
| Voucher | airtimetid = network, cardunittid = unit | System Data → voucherproviders[] | MTNAIR6TFD + HBSI2 |
MTN56TFD is the MTN data network. For airtime use the MTN airtime ID (MTNAIR6TFD or its provider trackid). Mixing them returns code 141.Choosing an integration
| Direct (native) | MSorg | Adex | |
|---|---|---|---|
| Body format | form-encoded | JSON | JSON |
| Airtime / Data | ✔ | ✔ | ✔ |
| Electricity / Vouchers / Meter | ✔ | — | — |
| IP whitelist · daily cap · PIN | — | ✔ | ✔ |
| Best for | New integrations | MSorg-compatible apps | Adex-compatible apps |
Direct · Buy Airtime
| Field | Req | Description |
|---|---|---|
airtimetid | required | Airtime network ID — product trackid (e.g. MTNAIR6TFD) or provider trackid (e.g. MNH5Y) |
phoneno | required | Recipient NG number, e.g. 08012345678 |
amount | required | NGN, whole number, minimum 50 |
coupon_code | optional | Discount coupon |
sandbox | optional | 1 to simulate |
curl -X POST https://absvendor.com/api/user/transaction/buy_airtime.php \ -H "Authorization: Bearer abs_live_YOUR_KEY" \ -F "airtimetid=MTNAIR6TFD" \ -F "phoneno=08012345678" \ -F "amount=100"
{ "status": true,
"data": { "coupon_applied": false, "final_amount": 100 },
"text": "Successful" }Direct · Buy Data
| Field | Req | Description |
|---|---|---|
airtimetid | required | Data network product trackid (List Data Plans → network_id), e.g. MTN56TFD |
cardunittid | required | Data plan trackid (List Data Plans → id), e.g. 6BO1H |
phoneno | required | Recipient NG number |
coupon_code | optional | Discount coupon |
sandbox | optional | 1 to simulate |
curl -X POST https://absvendor.com/api/user/transaction/buy_data.php \ -H "Authorization: Bearer abs_live_YOUR_KEY" \ -F "airtimetid=MTN56TFD" \ -F "cardunittid=6BO1H" \ -F "phoneno=08012345678"
Direct · Buy Electricity
| Field | Req | Description |
|---|---|---|
provider_tid | required | Disco service trackid (from System Data electricity services) |
meter_number | required | Meter number (digits, ≥ 6) |
amount | required | NGN, whole number, minimum 1000 |
sandbox | optional | 1 to simulate |
curl -X POST https://absvendor.com/api/user/transaction/buy_electricity.php \ -H "Authorization: Bearer abs_live_YOUR_KEY" \ -F "provider_tid=SERVICE_TRACKID" \ -F "meter_number=12345678901" \ -F "amount=1000"
Direct · Buy Airtime Voucher
| Field | Req | Description |
|---|---|---|
airtimetid | required | Network product trackid (System Data → voucherproviders[].product_trackid), e.g. MTNAIR6TFD |
cardunittid | required | Voucher unit trackid (e.g. HBSI2 = MTN ₦500) |
totalunit | required | Quantity, 1–30 |
sandbox | optional | 1 to simulate |
curl -X POST https://absvendor.com/api/user/transaction/buy_airtime_voucher.php \ -H "Authorization: Bearer abs_live_YOUR_KEY" \ -F "airtimetid=MTNAIR6TFD" \ -F "cardunittid=HBSI2" \ -F "totalunit=1"
Direct · Validate Meter
Read-only — returns the meter owner's name/address. No charge.
| Field | Req | Description |
|---|---|---|
meter_number | required | Meter number |
provider_tid | required | Disco service trackid |
curl -X POST https://absvendor.com/api/user/transaction/validate_meter.php \ -H "Authorization: Bearer abs_live_YOUR_KEY" \ -F "meter_number=12345678901" \ -F "provider_tid=SERVICE_TRACKID"
Direct · Get System Data
Returns the full live catalog: airtimeproviders, data plans/providers, electricity services, voucherproviders, and network_allowed_numbers. Use it to discover every ID above.
curl https://absvendor.com/api/user/system/get_system_data.php \
-H "Authorization: Bearer abs_live_YOUR_KEY"{ "status": true,
"data": {
"airtimeproviders": [
{ "name": "MTN Airtime Nigeria",
"product_trackid": "MTNAIR6TFD", "trackid": "MNH5Y" }
] } }MSorg · Balance / Account
curl https://absvendor.com/api/partner/v1/user.php \
-H "Authorization: Bearer abs_live_YOUR_KEY"{ "Status": "successful", "username": "reseller",
"wallet_balance": "5000.00", "currency": "NGN",
"api_daily_cap": "10000.00", "api_daily_spent": "500.00" }MSorg · List Networks
{ "Status": "successful", "count": 4,
"networks": [ { "id": "MTNAIR6TFD", "name": "MTN Airtime Nigeria" } ] }MSorg · List Data Plans
{ "Status": "successful", "count": 123,
"plans": [
{ "id": "6BO1H", "network_id": "MTN56TFD",
"plan_network": "MTN", "plan_name": "1GB Daily", "plan_amount": "290.00" }
] }MSorg · Buy Airtime
| Field | Req | Description |
|---|---|---|
network | required | Network id from List Networks, e.g. MTNAIR6TFD |
mobile_number | required | Recipient NG number |
amount | required | NGN, minimum 50 |
pin | if enabled | Transaction PIN (when key requires it) |
sandbox | optional | true to simulate |
curl -X POST https://absvendor.com/api/partner/v1/topup.php \ -H "Authorization: Bearer abs_live_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"network":"MTNAIR6TFD","mobile_number":"08012345678","amount":100}'
{ "Status": "successful", "ident": "BA-...",
"network": "MTNAIR6TFD", "mobile_number": "08012345678",
"amount": "100", "balance_after": "4900.00" }MSorg · Buy Data
| Field | Req | Description |
|---|---|---|
network | required | Network id (List Data Plans → network_id), e.g. MTN56TFD |
plan | required | Plan id (List Data Plans → id), e.g. 6BO1H |
mobile_number | required | Recipient NG number |
pin | if enabled | Transaction PIN |
sandbox | optional | true to simulate |
curl -X POST https://absvendor.com/api/partner/v1/data.php \ -H "Authorization: Bearer abs_live_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"network":"MTN56TFD","plan":"6BO1H","mobile_number":"08012345678"}'
MSorg · Requery Transaction
{ "Status": "successful", "ident": "BA-...",
"amount": "100.00", "mobile_number": "08012345678" }Status maps to successful, Processing, failed, or Refund.
Adex · Login / Balance
Accepts Basic base64(username:key), Token <key>, or Bearer <key>.
{ "status": "success", "AccessToken": "abs_live_...",
"balance": "5000.00", "username": "reseller" }Adex · Buy Airtime
| Field | Req | Description |
|---|---|---|
network | required | 1=MTN, 2=Airtel, 3=GLO, 4=9mobile (or a network trackid) |
phone | required | Recipient NG number |
amount | required | NGN, minimum 50 |
request-id | optional | Your idempotency reference |
sandbox | optional | true to simulate |
curl -X POST https://absvendor.com/api/partner/v1/adex/topup.php \ -H "Authorization: Token abs_live_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"network":1,"phone":"08012345678","amount":100,"request-id":"ref-123"}'
{ "network": "MTN", "status": "success",
"amount": 100, "phone_number": "08012345678",
"newbal": 4900, "request-id": "ref-123" }Adex · Buy Data
| Field | Req | Description |
|---|---|---|
network | required | 1=MTN, 2=Airtel, 3=GLO, 4=9mobile |
phone | required | Recipient NG number |
data_plan | required | Plan trackid (List Data Plans → id), e.g. 6BO1H |
request-id | optional | Your idempotency reference |
sandbox | optional | true to simulate |
curl -X POST https://absvendor.com/api/partner/v1/adex/data.php \ -H "Authorization: Token abs_live_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"network":1,"phone":"08012345678","data_plan":"6BO1H"}'