2Fast2FAST DocsDashboard

Vend Data, Airtime & Airtime-To-Cash

Programmatic access to your 2FAST wallet. Every request is authenticated with your API Key and (optionally) restricted to your whitelisted IPs.

Base URL & content type

All endpoints are HTTPS and expect application/json.

https://2fast.com.ng/api/
  • • All amounts are Naira (NGN). Phone numbers are Nigerian MSISDNs (e.g. 08031234567 or 2348031234567).
  • • Every request must carry your API Key (see below).
  • • Use a fresh, unique reference per transaction to enable idempotent retries.

Authentication

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>
IP whitelist: if you have any IPs whitelisted under Setting → IP Whitelist, only requests from those IPs are accepted. Leave it empty to allow any IP.

Data Plans API — list available plans

POSThttps://2fast.com.ng/api/data-plans
FieldTypeRequiredDescription
networknumber | stringYes1 (MTN), 2 (AIRTEL) or 3 (GLO)
typestringNoFilter by plan type (e.g. SME, GIFTING, CG, DATASHARE)
statusstringNoFilter by plan status (e.g. Active, Inactive)
qstringNoFree-text search over plan_id / volume / description
limitnumberNoMax 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"
    }
  ]
}

Data API — buy a data bundle

POSThttps://2fast.com.ng/api/data
FieldTypeRequiredDescription
networkIdnumberYes1 (MTN), 2 (AIRTEL), 3 (GLO), 4 (T2 MOBILE)
planIdstringYesPlan ID from the Data Plans API (e.g. 001)
phoneNumberstringYesRecipient MSISDN (11 or 13 digits)
referencestringYesYour 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."
}

Airtime API — buy airtime

POSThttps://2fast.com.ng/api/airtime
FieldTypeRequiredDescription
networkIdnumberYes1 MTN · 2 Airtel · 3 Glo · 4 T2 Mobile
typestringNoDefaults to VTU. MTN also supports BetaGist, Share & Sell, SNS. Others: VTU, Share & Sell, SNS
phoneNumberstringYesRecipient MSISDN
amountnumberYesNaira value. Minimum ₦50, maximum ₦50,000 per transaction
referencestringYesYour 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."
}

Airtime-to-Cash API — 3-step conversion flow

POSThttps://2fast.com.ng/api/Airtime-To-Cash

The 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

FieldTypeRequiredDescription
stepnumberYes1
networknumberYes1 (MTN) or 2 (Airtel)
phone_numberstringYesThe 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

FieldTypeRequiredDescription
stepnumberYes2
networknumberYes1 (MTN) or 2 (Airtel)
phone_numberstringYesSame SIM as step 1
otpstringYes6-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

FieldTypeRequiredDescription
stepnumberYes3
networknumberYes1 (MTN) or 2 (Airtel)
identifierstringYesThe id returned from step 2 (or step 1 skip_otp)
amountnumberYesAirtime value to convert (NGN)
pinstringYesThe SIM PIN used to authorise the share
referencestringYesYour 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."
}

Transaction History API — look up a transaction

POSThttps://2fast.com.ng/api/transaction-history

Look 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.

FieldTypeRequiredDescription
referencestringYesThe 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." }

Webhooks

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."
}

Error responses

All errors follow the same shape:

{
  "status": "error",
  "message": "Human-readable reason"
}
HTTPMeaning
400Bad request — validation failed
401Missing or invalid API Key
403IP not whitelisted or KYC not completed
409Duplicate reference
422Insufficient wallet balance
503Provider temporarily unavailable — safe to retry