Programmatic access to your 2FAST wallet. Every request is authenticated with your API Key and (optionally) restricted to your whitelisted IPs.
All endpoints are HTTPS and expect application/json.
https://2fast.com.ng/api/08031234567 or 2348031234567).reference per transaction to enable idempotent retries.Authenticate every request with your API Key. You can find and rotate it under Setting → API Key. Send it in the Authorization header:
Authorization: Bearer <YOUR_API_KEY>https://2fast.com.ng/api/data-plans| Field | Type | Required | Description |
|---|---|---|---|
| network | number | string | Yes | 1 (MTN), 2 (AIRTEL) or 3 (GLO) |
| type | string | No | Filter by plan type (e.g. SME, GIFTING, CG, DATASHARE) |
| status | string | No | Filter by plan status (e.g. Active, Inactive) |
| q | string | No | Free-text search over plan_id / volume / description |
| limit | number | No | Max rows to return (1–2000, default 500) |
Sample request
curl -X POST https://2fast.com.ng/api/data-plans \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-d '{
"network": 1,
"type": "SME",
"status": "Active",
"limit": 50
}'Success response
{
"status": "success",
"network": "MTN",
"count": 2,
"data": [
{
"plan_id": "001",
"volume": "1GB",
"type": "SME",
"validity": "30 days",
"our_price": 285,
"telecom_price": 350,
"description": "1GB SME - 30 days",
"sim": "Yes",
"wallet": "Yes",
"device": "No",
"status": "Active"
},
{
"plan_id": "002",
"volume": "2GB",
"type": "SME",
"validity": "30 days",
"our_price": 560,
"telecom_price": 700,
"description": "2GB SME - 30 days",
"sim": "Yes",
"wallet": "Yes",
"device": "No",
"status": "Active"
}
]
}https://2fast.com.ng/api/data| Field | Type | Required | Description |
|---|---|---|---|
| networkId | number | Yes | 1 (MTN), 2 (AIRTEL), 3 (GLO), 4 (T2 MOBILE) |
| planId | string | Yes | Plan ID from the Data Plans API (e.g. 001) |
| phoneNumber | string | Yes | Recipient MSISDN (11 or 13 digits) |
| reference | string | Yes | Your unique idempotent reference |
Sample request
curl -X POST https://2fast.com.ng/api/data \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-d '{
"networkId": 1,
"planId": "001",
"phoneNumber": "08031234567",
"reference": "TXN-2FAST-20260714-0001"
}'Success response
{
"status": "success",
"message": "Activation of 1GB was successful and will expire on 13/08/2026 09:12:47."
}Failed response
{
"status": "error",
"message": "The service is temporarily unavailable. Please try again shortly."
}https://2fast.com.ng/api/airtime| Field | Type | Required | Description |
|---|---|---|---|
| networkId | number | Yes | 1 MTN · 2 Airtel · 3 Glo · 4 T2 Mobile |
| type | string | No | Defaults to VTU. MTN also supports BetaGist, Share & Sell, SNS. Others: VTU, Share & Sell, SNS |
| phoneNumber | string | Yes | Recipient MSISDN |
| amount | number | Yes | Naira value. Minimum ₦50, maximum ₦50,000 per transaction |
| reference | string | Yes | Your unique idempotent reference |
Sample request
curl -X POST https://2fast.com.ng/api/airtime \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-d '{
"networkId": 2,
"type": "VTU",
"phoneNumber": "08021234567",
"amount": 500,
"reference": "AIR-2FAST-20260714-0002"
}'Success response
{
"status": "success",
"message": "You have successfully topped up NGN 500 to 08021234567."
}https://2fast.com.ng/api/Airtime-To-CashThe Airtime-to-Cash flow is a 3-step state machine. Each request sets step to 1, 2 or 3. Networks supported: 1 = MTN, 2 = Airtel. Max airtime per conversion: MTN ₦10,000, Airtel ₦20,000.
Step 1 — request OTP
| Field | Type | Required | Description |
|---|---|---|---|
| step | number | Yes | 1 |
| network | number | Yes | 1 (MTN) or 2 (Airtel) |
| phone_number | string | Yes | The SIM the airtime will be sent from |
curl -X POST https://2fast.com.ng/api/Airtime-To-Cash \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-d '{
"step": 1,
"network": 1,
"phone_number": "08031234567"
}'Step 1 responses
// OTP sent
{ "status": "success", "message": "OTP sent successfully." }
// SIM already active — jump to Step 3
{
"status": "success",
"message": "This SIM is already active. Please proceed to convert airtime.",
"identifier": "3d5f1e0e-...",
"skip_otp": true
}Step 2 — verify OTP
| Field | Type | Required | Description |
|---|---|---|---|
| step | number | Yes | 2 |
| network | number | Yes | 1 (MTN) or 2 (Airtel) |
| phone_number | string | Yes | Same SIM as step 1 |
| otp | string | Yes | 6-digit code sent to the SIM |
curl -X POST https://2fast.com.ng/api/Airtime-To-Cash \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-d '{
"step": 2,
"network": 1,
"phone_number": "08031234567",
"otp": "482913"
}'Step 2 response
{
"status": "success",
"message": "OTP verified. Airtime balance: NGN 1,500.",
"identifier": "3d5f1e0e-a1b2-4c3d-9f8e-6b7a5c4d3e2f",
"airtime_balance": 1500
}Step 3 — convert airtime to wallet
| Field | Type | Required | Description |
|---|---|---|---|
| step | number | Yes | 3 |
| network | number | Yes | 1 (MTN) or 2 (Airtel) |
| identifier | string | Yes | The id returned from step 2 (or step 1 skip_otp) |
| amount | number | Yes | Airtime value to convert (NGN) |
| pin | string | Yes | The SIM PIN used to authorise the share |
| reference | string | Yes | Your unique idempotent reference |
curl -X POST https://2fast.com.ng/api/Airtime-To-Cash \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-d '{
"step": 3,
"network": 1,
"identifier": "3d5f1e0e-a1b2-4c3d-9f8e-6b7a5c4d3e2f",
"amount": 1000,
"pin": "1234",
"reference": "A2C-2FAST-20260714-0003"
}'Step 3 responses
// Successful conversion
{
"status": "success",
"message": "Airtime received. Your wallet has been credited with NGN 800.00."
}
// Awaiting airtime confirmation
{
"status": "success",
"message": "Awaiting airtime confirmation. You will be credited once received."
}https://2fast.com.ng/api/transaction-historyLook up a completed transaction by its reference. The endpoint searches your wallet history (data / airtime / airtime-to-cash). Only rows belonging to your account are returned.
| Field | Type | Required | Description |
|---|---|---|---|
| reference | string | Yes | The exact reference you sent when initiating the transaction |
Sample request
curl -X POST https://2fast.com.ng/api/transaction-history \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-d '{ "reference": "DATA-2FAST-20260714-0001" }'Sample response (wallet_history)
{
"status": "success",
"source": "wallet_history",
"data": {
"reference": "DATA-2FAST-20260714-0001",
"beneficiary": "2348031234567",
"type": "Data",
"network": "MTN",
"volume": "1GB",
"amount": 300,
"fee": 300,
"response": "Activation of 1GB was successful and will expire on 13/08/2026 09:12:47.",
"sender": "2348020000000",
"route": "Sim",
"initiated_by": "Admin",
"balance_before": 5000,
"balance_after": 4700,
"channel": "API",
"webhook": "delivered",
"ip_address": "102.89.34.7",
"date": "2026-07-14T09:12:32Z",
"status": "Successful",
"created_at": "2026-07-14T09:12:32Z",
"updated_at": "2026-07-14T09:12:47Z"
}
}Not found
{ "status": "error", "message": "Transaction not found for the supplied reference." }Configure a webhook URL under Setting → Webhook. When a /data transaction reaches its final state we POST the same JSON body the Data API returned. Respond with any HTTP 2xx within 10 seconds to acknowledge.
Data webhook — successful
POST <your-webhook-url>
Content-Type: application/json
{
"status": "success",
"message": "Activation of 1GB was successful and will expire on 13/08/2026 09:12:47."
}Data webhook — failed
{
"status": "error",
"message": "The service is temporarily unavailable. Please try again shortly."
}All errors follow the same shape:
{
"status": "error",
"message": "Human-readable reason"
}| HTTP | Meaning |
|---|---|
| 400 | Bad request — validation failed |
| 401 | Missing or invalid API Key |
| 403 | IP not whitelisted or KYC not completed |
| 409 | Duplicate reference |
| 422 | Insufficient wallet balance |
| 503 | Provider temporarily unavailable — safe to retry |