For Business🌐 India
Developer Docs

Build with the Pay2All API

Clean REST APIs for recharge, bill payment, AEPS, DMT and payouts β€” plus flight & bus booking with instant UAT Sandbox & LIVE environments, holiday packages and gift cards β€” with Bearer authentication and predictable JSON responses.

Introduction

The Pay2All API lets you add recharge, bill payment, banking, payouts and travel commerce β€” flights, buses, holiday packages and gift cards β€” to your own app or portal. All requests are made over HTTPS to the base URL below and return JSON.

BASEhttps://pay2all.in/api/v1

Every live transaction is funded from your single Pay2All e-wallet. Fund the wallet, call an endpoint, and the amount plus your commission is settled automatically.

Endpoints and payloads shown here are interactive. You can toggle between UAT (Sandbox) and LIVE (Production) modes on every supported API endpoint.

Environments: UAT vs LIVE

Pay2All provides a unified environment switch so you can test your integration thoroughly before conducting real transactions.

● UAT / Sandbox Mode
Zero Risk

Returns deterministic, realistic test data without debiting your wallet balance or calling live upstream providers. Ideal for local dev, automated testing, and CI/CD pipelines.

Parameter: "mode": "UAT"
● LIVE / Production Mode
Live Orders

Connects directly to live airline GDS, bus operators, and billers. Generates authentic PNRs and instantly settles transactions against your wallet balance.

Parameter: "mode": "LIVE" (or omit mode)

How to specify the environment

You can toggle between UAT and LIVE in three simple ways:

  • JSON Body (Recommended): Include "mode": "UAT" in the POST body.
  • Query Parameter: Append ?mode=UAT to the request URL.
  • HTTP Header: Send header X-Mode: UAT with your request.
Where UAT works: Recharge, Flight Booking and Bus Booking. Read-only APIs (Providers, Number Lookup, Plan Lookup) always return live data and never debit your wallet, so you can call them while testing. Other transactional APIs (bill payment, verification, payout, gift cards) run in LIVE only.

Authentication

Authenticate every request with your secret API key as a Bearer token in the Authorization header (or an x-api-token header). Keep your key secret β€” never expose it in client-side code.

Authorization header
curl https://pay2all.in/api/v1/balance \
  -H "Authorization: Bearer YOUR_API_KEY"

Generate and rotate your token from your dashboard (Developer β†’ API token). A missing, invalid or revoked token returns status_id 2 with a message. If you set an IP whitelist, calls are only accepted from those server IPs.

Flight Booking

Book domestic and international flights in three streamlined steps: search fares, book the selected fare, then issue the ticket. Toggle between UAT (Sandbox) and LIVE below to view request payloads and responses for both modes.

1. Flight Search

POST/flights/searchLive / UAT fare search
FieldTypeDescription
origin requiredstringOrigin 3-letter IATA airport code, e.g. DEL.
destination requiredstringDestination 3-letter IATA airport code, e.g. BOM.
depart_date requiredstringDeparture date in YYYY-MM-DD format.
return_datestringReturn date for round trips (optional).
adultsnumberAdult traveller count (default 1).
children / infantsnumberChild / infant counts.
cabin_classstringEconomy, PremiumEconomy, Business or First.
modestringUAT for mock sandbox results (no ERP call), or LIVE for live airline GDS.
Search Request (cURL)
No Wallet Debit β€’ Mock Data
curl -X POST https://pay2all.in/api/v1/flights/search \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "origin": "DEL",
    "destination": "BOM",
    "depart_date": "2026-09-25",
    "adults": 1,
    "cabin_class": "Economy",
    "mode": "UAT"
  }'
Search Response
No Wallet Debit β€’ Mock Data
{
  "status_id": 1,
  "message": "3 flight(s) found.",
  "data": {
    "traceId": "UAT-TRACE",
    "count": 3,
    "results": [
      {
        "resultIndex": "UAT-FL-1",
        "traceId": "UAT-TRACE",
        "airline": "IndiGo",
        "airlineCode": "6E",
        "flightNo": "6E 2145",
        "origin": "DEL",
        "destination": "BOM",
        "depTime": "2026-09-25T06:10:00",
        "arrTime": "2026-09-25T08:25:00",
        "durationMin": 135,
        "stops": 0,
        "price": 4599,
        "currency": "INR",
        "isLcc": true,
        "fareName": "SAVER",
        "refundable": false,
        "seatsLeft": 9,
        "cabinBaggage": "7 KG",
        "checkinBaggage": "15 KG"
      },
      {
        "resultIndex": "UAT-FL-2",
        "traceId": "UAT-TRACE",
        "airline": "Air India",
        "airlineCode": "AI",
        "flightNo": "AI 805",
        "origin": "DEL",
        "destination": "BOM",
        "depTime": "2026-09-25T09:30:00",
        "arrTime": "2026-09-25T11:40:00",
        "durationMin": 130,
        "stops": 0,
        "price": 5299,
        "currency": "INR",
        "isLcc": false,
        "fareName": "FLEXI",
        "refundable": true,
        "seatsLeft": 5,
        "cabinBaggage": "7 KG",
        "checkinBaggage": "15 KG"
      }
    ],
    "mode": "UAT"
  }
}

2. Book the selected fare

POST/flights/bookHold the fare for passengers
FieldTypeDescription
trace_id requiredstringFrom the search response.
result_index requiredstringThe chosen fare's result_index.
email / mobile requiredstringLead passenger contact details.
passengers requiredarrayEach: title, first_name, last_name, pax_type (1=Adult, 2=Child, 3=Infant), gender (1=M, 2=F), is_lead_pax.
gstinstringGSTIN for the tax invoice (optional).
modestringUAT for sandbox mock booking, or LIVE.
Book Request (cURL)
No Wallet Debit β€’ Mock Data
curl -X POST https://pay2all.in/api/v1/flights/book \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "trace_id": "UAT-TRACE",
    "result_index": "UAT-FL-1",
    "email": "agent@shop.in",
    "mobile": "9876543210",
    "passengers": [
      {
        "title": "Mr",
        "first_name": "Sagar",
        "last_name": "Kumar",
        "pax_type": 1,
        "gender": 1,
        "is_lead_pax": true
      }
    ],
    "mode": "UAT"
  }'
Book Response
No Wallet Debit β€’ Mock Data
{
  "status_id": 1,
  "message": "Fare booked successfully.",
  "data": {
    "success": true,
    "blockKey": null,
    "pnr": "UAT729104",
    "bookingId": "UAT-BK-29182391",
    "status": "Confirmed",
    "message": null,
    "mode": "UAT"
  }
}

3. Issue the ticket

POST/flights/ticketConfirm & get the PNR
Ticket Request (cURL)
No Wallet Debit β€’ Mock Data
curl -X POST https://pay2all.in/api/v1/flights/ticket \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "trace_id": "UAT-TRACE",
    "result_index": "UAT-FL-1",
    "booking_id": "UAT-BK-29182391",
    "pnr": "UAT729104",
    "mode": "UAT"
  }'
Ticket Response
No Wallet Debit β€’ Mock Data
{
  "status_id": 1,
  "message": "Ticket issued successfully.",
  "data": {
    "success": true,
    "blockKey": null,
    "pnr": "UAT729104",
    "bookingId": "UAT-BK-29182391",
    "status": "Confirmed",
    "mode": "UAT"
  }
}

In LIVE mode, the fare is debited from your wallet on ticketing. In UAT mode, simulated PNRs (e.g. UAT729104) and booking IDs are returned instantly without wallet debits.

Bus Booking

Integrate bus ticketing across thousands of operators: look up cities, search trips, fetch the seat layout, and book the chosen seats with full UAT Sandbox and LIVE support.

1. City Autocomplete

GET/buses/cities?q=delCity lookup
City Autocomplete Request
curl "https://pay2all.in/api/v1/buses/cities?q=del" \
  -H "Authorization: Bearer YOUR_API_KEY"
City Autocomplete Response
{
  "status_id": 1,
  "message": "Cities fetched successfully.",
  "data": { "cities": [ { "id": "122", "name": "Delhi" }, { "id": "124", "name": "Dehradun" } ] }
}

2. Bus Search

POST/buses/searchAvailable trips
FieldTypeDescription
source_id requiredstringOrigin city id (from city autocomplete).
destination_id requiredstringDestination city id.
date requiredstringDate of journey, YYYY-MM-DD.
modestringUAT for simulated trips, or LIVE for real supplier schedules.
Bus Search Request (cURL)
No Wallet Debit β€’ Mock Data
curl -X POST https://pay2all.in/api/v1/buses/search \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "source_id": "122",
    "destination_id": "56",
    "date": "2026-09-25",
    "mode": "UAT"
  }'
Bus Search Response
No Wallet Debit β€’ Mock Data
{
  "status_id": 1,
  "message": "2 bus(es) found.",
  "data": {
    "count": 2,
    "results": [
      {
        "id": "UAT-BUS-1",
        "operator": "UAT Travels",
        "busType": "AC Sleeper (2+1)",
        "departure": "21:30",
        "arrival": "05:45",
        "durationMin": 495,
        "fareMin": 899,
        "fareMax": 1299,
        "currency": "INR",
        "seatsAvailable": 28,
        "ac": true,
        "sleeper": true,
        "singleSeats": 2,
        "amenities": ["Charging Point", "Water Bottle", "Blanket"],
        "boardingCount": 2,
        "droppingCount": 2
      },
      {
        "id": "UAT-BUS-2",
        "operator": "Demo Roadways",
        "busType": "Non-AC Seater (2+2)",
        "departure": "22:15",
        "arrival": "06:30",
        "durationMin": 495,
        "fareMin": 599,
        "fareMax": 799,
        "currency": "INR",
        "seatsAvailable": 40,
        "ac": false,
        "sleeper": false,
        "singleSeats": 0,
        "amenities": ["Water Bottle"],
        "boardingCount": 2,
        "droppingCount": 2
      }
    ],
    "mode": "UAT"
  }
}

3. Seat Layout & Boarding Points

POST/buses/seat-layoutSeat map & boarding points
FieldTypeDescription
id requiredstringTrip ID returned by /buses/search.
modestringUAT for mock 40-seat layout, or LIVE.
Seat Layout Request (cURL)
No Wallet Debit β€’ Mock Data
curl -X POST https://pay2all.in/api/v1/buses/seat-layout \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "UAT-BUS-1",
    "mode": "UAT"
  }'
Seat Layout Response
No Wallet Debit β€’ Mock Data
{
  "status_id": 1,
  "message": "Seat layout fetched successfully.",
  "data": {
    "count": 40,
    "decks": 1,
    "rows": 10,
    "cols": 4,
    "seats": [
      { "no": "A1", "row": 0, "col": 0, "deck": 0, "fare": 799, "available": true, "ladies": true, "sleeper": false },
      { "no": "B1", "row": 0, "col": 1, "deck": 0, "fare": 799, "available": true, "ladies": false, "sleeper": false }
    ],
    "boardingPoints": [
      { "id": "BP1", "name": "Central Bus Stand", "time": "21:30" },
      { "id": "BP2", "name": "Highway Toll Plaza", "time": "22:00" }
    ],
    "droppingPoints": [
      { "id": "DP1", "name": "City Center", "time": "05:45" },
      { "id": "DP2", "name": "Airport Road", "time": "06:15" }
    ],
    "mode": "UAT"
  }
}

4. Confirm Seats & Book

POST/buses/bookIssue ticket & generate PNR
FieldTypeDescription
trip_id requiredstringSelected trip ID.
boarding_id / dropping_idstringChosen boarding & dropping point IDs.
email / mobile requiredstringPassenger contact details.
passengers requiredarrayEach: seat, name, age, gender, fare.
modestringUAT for mock confirmation, or LIVE.
Bus Book Request (cURL)
No Wallet Debit β€’ Mock Data
curl -X POST https://pay2all.in/api/v1/buses/book \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "trip_id": "UAT-BUS-1",
    "boarding_id": "BP1",
    "dropping_id": "DP1",
    "email": "agent@shop.in",
    "mobile": "9876543210",
    "passengers": [
      { "seat": "A1", "name": "Sagar Kumar", "age": 29, "gender": "Male", "fare": 799 }
    ],
    "mode": "UAT"
  }'
Bus Book Response
No Wallet Debit β€’ Mock Data
{
  "status_id": 1,
  "message": "Bus booked successfully.",
  "data": {
    "success": true,
    "blockKey": "UAT-BLK-819203",
    "pnr": "UATB992834",
    "bookingId": "UAT-BBK-91823901",
    "status": "Confirmed",
    "message": null,
    "mode": "UAT"
  }
}

Wallet balance

GET/balanceCurrent wallet balance
Response
{
  "status_id": 1,
  "message": "Wallet balance fetched successfully.",
  "data": { "organization": "Acme", "balance": 4761.00, "currency": "INR" }
}

Every response uses the same envelope: status_id (1 = success, 2 = failed, 3 = pending), a human message, and a data object on success.

Providers

Find the live provider_id required for recharge and bill-payment requests. Search by provider, service, code or ID, then copy the value directly into your API payload.

GET/providers/publicPublic provider directory Β· no API key required
24 live providers
Mobile RechargeMOBILE
service_id 1
ProviderCodeprovider_id
AirtelAIRTEL
1
JioJIO
2
Vi (Vodafone Idea)VI
3
BSNLBSNL
4
DTH RechargeDTH
service_id 2
ProviderCodeprovider_id
Tata PlayTATAPLAY
5
Airtel Digital TVAIRTEL_DTH
6
Dish TVDISHTV
7
d2hD2H
8
Sun DirectSUNDIRECT
9
AEPS BankingAEPS
service_id 8
ProviderCodeprovider_id
Cash WithdrawalACW
22
Balance EnquiryABE
23
Mini StatementAMS
24
Cash DepositACD
25
Money TransferDMT
service_id 9
ProviderCodeprovider_id
DMTDMT
15
UTI PANPAN
service_id 10
ProviderCodeprovider_id
Account VerificationVERIFY
service_id 11
ProviderCodeprovider_id
Bank Account VerifyVERIFY_BANK
10
UPI VerifyVERIFY_UPI
11
TRAVELTRAVEL
service_id 17
ProviderCodeprovider_id
Flight BookingFLIGHT_BOOKING
14
Hotel BookingHOTEL_BOOKING
19
Bus BookingBUS_BOOKING
20
Tour PackagesTOUR_PACKAGES
21
Recharge & BillsRECHARGE
service_id 18
ProviderCodeprovider_id
Bill PaymentBILL_PAYMENT
13
Developer / APIAPI
service_id 19
ProviderCodeprovider_id
BBPS Bill PaymentBILL_PAYMENT
service_id 22
ProviderCodeprovider_id
eChallanECHALLAN
service_id 23
ProviderCodeprovider_id
eChallan LookupECHALLAN LOOKUP
16
CRMCRM
service_id 24
ProviderCodeprovider_id
CRMCRM
17
VIEWPLANVIEWPLAN
service_id 25
ProviderCodeprovider_id
VIEWPLANVIEWPLAN
18
Gift VouchersGIFT_CARDS
service_id 26
ProviderCodeprovider_id
NUMBER LOOLUPNUMBERLOOKUP
service_id 27
ProviderCodeprovider_id

Fetch the catalogue by API

The authenticated catalogue uses the same live data shown above. Use service_id to group services and send provider_id in transactional requests.

GET/providersServices & provider ids
Request
curl https://pay2all.in/api/v1/providers \
  -H "Authorization: Bearer YOUR_API_KEY"
Response
{
  "status_id": 1,
  "message": "Providers fetched successfully.",
  "data": {
    "services": [
      {
        "service_id": 1,
        "service": "Mobile Recharge",
        "code": "MOBILE",
        "providers": [
          { "provider_id": 2, "name": "Jio", "code": "JIO" },
          { "provider_id": 1, "name": "Airtel", "code": "AIRTEL" }
        ]
      }
    ]
  }
}

Number Lookup

Find the operator of a mobile number or DTH subscriber ID before recharging β€” and, for mobile, its telecom circle. Use it to pre-select the operator for your customer, then pass the returned provider_id to /recharge and /plans, and circle_id to /plans. Read-only; no wallet is debited. Needs the Number Lookup (Mobile & DTH) API subscription.

POST/lookupOperator (and circle) of a number
FieldTypeDescription
number requiredstring10-digit mobile number (+91 / 0 prefix is fine), or DTH subscriber / VC number (6–16 digits).
typestringmobile (default) or dth. You can send service_id 1 (mobile) or 2 (DTH) instead.
Request β€” mobile
curl -X POST https://pay2all.in/api/v1/lookup \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "number": "9876543210", "type": "mobile" }'
Response
{
  "status_id": 1,
  "message": "Operator found.",
  "data": {
    "number": "9876543210",
    "type": "mobile",
    "service_id": 1,
    "provider_id": 1,
    "provider_name": "Airtel",
    "circle_id": 18,
    "circle_code": 18,
    "circle_name": "Punjab"
  }
}

Response fields

FieldDescription
provider_idOur provider id β€” send it as provider_id to /recharge and /plans. Same ids as GET /providers. null if the operator isn't enabled for recharge on your account.
provider_nameOperator name, e.g. Jio, Airtel, Vi, BSNL, Tata Play.
circle_idNumeric telecom circle id (mobile only) β€” send it as circle_id to /plans. Same ids as GET /plans/circles. null for DTH. circle_code carries the same value for older integrations.
circle_nameCircle / state name, e.g. Delhi NCR, Tamil Nadu.

DTH

Request β€” DTH
curl -X POST https://pay2all.in/api/v1/lookup \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "number": "1234567890", "type": "dth" }'

Not found

New, ported or unrecognised numbers return status_id: 2. Ask your customer to choose the operator instead. Invalid numbers return a validation message with status_id: 2.

Response β€” not found
{
  "status_id": 2,
  "message": "Operator not found for this number. Please select it manually."
}

Plan Lookup

Fetch live recharge plans for an operator β€” show your customer the plans, then send the chosen amount to /recharge with the same provider_id. Mobile plans also need the telecom circle; DTH plans don't. Read-only; no wallet is debited.

Typical flow: POST /lookup with the customer's number β†’ it returns provider_id and circle_id β†’ GET /plans?provider_id=…&circle_id=… β†’ customer picks a plan β†’ POST /recharge with the same provider_id and the plan's amount.

Fetch plans

GET/plansLive plans for a provider (+ circle)
Query paramTypeDescription
provider_id requirednumberThe same provider id you send to /recharge β€” from POST /lookup or GET /providers (e.g. Jio = 2).
circle_id mobilenumberTelecom circle id from POST /lookup or GET /plans/circles (e.g. Delhi NCR = 5). Not needed for DTH providers.
plan_typenumberOptional category filter, where the plan vendor supports it.
Request β€” mobile
curl "https://pay2all.in/api/v1/plans?provider_id=2&circle_id=5" \
  -H "Authorization: Bearer YOUR_API_KEY"
Response
{
  "status_id": 1,
  "message": "42 plan(s) found.",
  "data": {
    "provider_id": 2,
    "provider_name": "Jio",
    "service_id": 1,
    "type": "mobile",
    "circle_id": 5,
    "circle_name": "Delhi NCR",
    "count": 42,
    "categories": ["Popular", "Data", "Unlimited"],
    "plans": [
      {
        "plan_id": null,
        "amount": 239,
        "validity": "28 days",
        "description": "1.5GB/day + Unlimited calls",
        "data": null,
        "category": "Popular"
      }
    ],
    "groups": ["Popular", "Data", "Unlimited"],
    "records": { "Popular": [ { "rs": "239", "validity": "28 days", "desc": "1.5GB/day + Unlimited calls" } ] }
  }
}

Response fields

FieldDescription
provider_id / provider_nameThe operator the plans belong to β€” the same provider_id to send to /recharge.
service_id / type1 / mobile or 2 / dth.
circle_id / circle_nameThe circle the plans are for (mobile). null for DTH.
plans[]Flat list of plans: amount (β‚Ή, number), validity, description, data (data benefit, when given), category and plan_id (vendor plan id, when given). Fields not provided by the operator are null.
categoriesCategory names, in display order β€” group plans by category to build tabs.
groups / recordsThe same plans grouped by category in the older format (rs, desc, validity). Kept for existing integrations; use plans for new ones.

DTH plans

Pass only the DTH provider_id (Tata Play, Dish TV, Airtel Digital TV, Sun Direct, d2h).

Request β€” DTH
curl "https://pay2all.in/api/v1/plans?provider_id=5" \
  -H "Authorization: Bearer YOUR_API_KEY"

Telecom circles

If you don't use /lookup, let the customer pick their circle from this list.

GET/plans/circlesTelecom circles to choose from
Request
curl https://pay2all.in/api/v1/plans/circles \
  -H "Authorization: Bearer YOUR_API_KEY"
Response
{
  "status_id": 1,
  "message": "Telecom circles fetched successfully.",
  "data": {
    "count": 23,
    "circles": [
      { "circle_id": 5, "name": "Delhi NCR" },
      { "circle_id": 13, "name": "Maharashtra" }
    ]
  }
}

Older parameters still work: operator (name) or operator_code instead of provider_id, and circle_code instead of circle_id.

Recharge

Process prepaid, postpaid, DTH and data-card recharges. In LIVE mode the amount is debited from your wallet; if the operator fails, it is refunded automatically. Use UAT to test your whole integration first β€” same validation and response format, but no operator call and no wallet debit.

POST/rechargeUAT / LIVE recharge
FieldTypeDescription
client_id requiredstringYour own unique transaction id (≀64 chars). Reusing one returns the original result (idempotent).
provider_id requirednumberProvider id from POST /lookup, the live directory above or GET /providers (e.g. Jio = 2).
number requiredstring10-digit mobile, or DTH subscriber / VC number.
amount requirednumberRecharge amount in β‚Ή β€” e.g. a plan's amount from /plans.
typestringMOBILE or DTH. Auto-detected from the provider if omitted.
customer_mobilestringContact number for DTH / receipts.
modestringUAT for a simulated recharge (no operator call, no wallet debit), or LIVE (default). Also accepted as ?mode=UAT or an X-Mode: UAT header.
Recharge Request (cURL)
No Wallet Debit β€’ Mock Data
curl -X POST https://pay2all.in/api/v1/recharge \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "TEST-1001",
    "provider_id": 2,
    "number": "9876543210",
    "amount": 239,
    "mode": "UAT"
  }'
Recharge Response
No Wallet Debit β€’ Mock Data
{
  "status_id": 1,
  "message": "Recharge successful (UAT β€” no wallet debit).",
  "data": {
    "txn_id": "UAT-TXN-4f1c2a9be07d",
    "client_id": "TEST-1001",
    "order_id": "UAT-ORD-31840562",
    "utr": "UAT77210948",
    "report_id": "UAT-RPT-05519237",
    "provider_id": 2,
    "provider_name": "Jio",
    "service_id": 1,
    "operator": "Jio",
    "number": "9876543210",
    "amount": 239,
    "currency": "INR",
    "wallet_balance": 4761.00,
    "mode": "UAT"
  }
}

Response fields

FieldDescription
status_id1 success, 2 failed (wallet refunded), 3 pending β€” wait for the webhook.
txn_id / order_idOur transaction and order references.
utr / report_idOperator reference numbers (on success).
provider_id / provider_name / service_idThe operator the recharge was placed with β€” the same ids as /providers, /lookup and /plans.
wallet_balanceYour wallet balance after the recharge. Unchanged in UAT.
modeUAT or LIVE.

UAT test numbers

In UAT the last digit of number decides the result, so you can test every status your code must handle:

Number ends inResultExample
1status_id 2 β€” failed9876543211
2status_id 3 β€” pending9876543212
any other digitstatus_id 1 β€” success9876543210
UAT checks everything LIVE checks β€” your API key, IP whitelist, Recharge API subscription, client_id, provider_id, number format and amount β€” so a request that works in UAT is ready for LIVE. UAT ids start with UAT-, repeating a client_id returns the same ids, and no webhook is sent.

Bill Payment

Use your developer API key, not a login token. All routes below are relative to the v1 base URL. Calls use the configured live BBPS provider; there is no simulated UAT mode.

Examples below are illustrative. Use IDs, field names and references returned by your own requests.

1. Get categories

GET/bbps/categoriesList bill-payment categories

No query parameters or request body required.

Category directory
curl 'https://pay2all.in/api/v1/bbps/categories' -H 'Authorization: Bearer YOUR_API_KEY'

Response: data is an array containing name and billerSlug. Use the returned slug below.

Response example (directory fields)
{
  "status_id": 1,
  "message": "Request successful.",
  "data": [
    {
      "name": "Electricity",
      "billerSlug": "electricity"
    }
  ]
}

2. Get billers

GET/bbps/billersFind billers by category
Query parameterTypeDescription
category requiredstringThe billerSlug returned by categories. URL-encode this value.
Billers in a category
curl 'https://pay2all.in/api/v1/bbps/billers?category=RETURNED_CATEGORY_SLUG' -H 'Authorization: Bearer YOUR_API_KEY'

Response: data.title and data.billers[], with billerId and billerName. Do not use recharge provider IDs.

Response example (directory fields)
{
  "status_id": 1,
  "message": "Request successful.",
  "data": {
    "title": "Electricity",
    "billers": [
      {
        "billerId": "BILLER_ID",
        "billerName": "Example Electricity Biller"
      }
    ]
  }
}

3. Get biller details

GET/bbps/billers/:billerIdLoad customer input fields
Path parameterTypeDescription
billerId requiredstringThe billerId from the biller directory, not a recharge provider ID.
Biller details
curl 'https://pay2all.in/api/v1/bbps/billers/BILLER_ID' -H 'Authorization: Bearer YOUR_API_KEY'

Use data.params to build the form. Preserve the exact field names, string values, validation rules and fetchRequirement. The example Consumer Number field is illustrative.

Response example (parameter metadata varies by biller)
{
  "status_id": 1,
  "message": "Request successful.",
  "data": {
    "billerId": "BILLER_ID",
    "billerName": "Example Electricity Biller",
    "fetchRequirement": "MANDATORY",
    "params": [
      {
        "paramName": "Consumer Number",
        "dataType": "NUMERIC",
        "optional": "false",
        "minLength": "10",
        "maxLength": "10"
      }
    ]
  }
}

4. Fetch the bill

POST/bbps/fetchRetrieve bill and payment reference
Body fieldTypeDescription
biller_id requiredstringBiller ID from the directory.
params requiredobjectExact customer field names mapped to string values. Preserve leading zeros.
mobile_numberstringCustomer contact mobile, exactly 10 digits. Forwarded to the provider; does not replace registered-mobile fields required inside params.
Fetch Request
curl -X POST https://pay2all.in/api/v1/bbps/fetch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "biller_id": "BILLER_ID_FROM_DIRECTORY",
    "mobile_number": "9876543210",
    "params": { "Consumer Number": "1234567890" }
  }'

Successful fetch returns data.referenceId, amount, customerName, dueDate, billNumber and additionalInfo. Nullable fields may be absent from the bill. Fetch does not debit the wallet.

Successful fetch response example
{
  "status_id": 1,
  "message": "Request successful.",
  "data": {
    "ok": true,
    "amount": 540,
    "currentBalance": null,
    "dueDate": "2026-10-15",
    "billDate": "2026-10-01",
    "customerName": "Example Customer",
    "billNumber": "BILL-001",
    "billPeriod": "Monthly",
    "referenceId": "FETCH_REFERENCE",
    "additionalInfo": [],
    "message": "Successful"
  }
}

5. Pay from your wallet

POST/bbps/paySubmit a bill payment
Body fieldTypeDescription
client_id requiredstringYour unique transaction ID, maximum 64 characters. Reuse for retries.
biller_id requiredstringSame biller ID used for fetch.
reference_id requiredstringdata.referenceId from the successful fetch response.
params requiredobjectSame customer field names and string values sent for fetch.
amount requirednumberPositive INR amount, maximum two decimal places. Follow the biller's amount rules.
mobile requiredstringCustomer mobile number containing exactly 10 digits.
Pay Request
curl -X POST https://pay2all.in/api/v1/bbps/pay \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "BILL-20261003-001",
    "biller_id": "BILLER_ID_FROM_DIRECTORY",
    "amount": 540,
    "reference_id": "REFERENCE_ID_FROM_FETCH_RESPONSE",
    "params": { "Consumer Number": "1234567890" },
    "mobile": "9876543210"
  }'

Send the fetched reference as reference_id, the same biller and customer parameters, a positive INR amount (maximum two decimal places), a 10-digit mobile, and a unique client_id of at most 64 characters. Your organization wallet must have sufficient funds.

Payment responses include data.id, clientId, status, statusId, amount, orderId, utr, reportId and walletBalance. Top-level status_id: 1 success, 2 failed, 3 pending. Pending is not a failure.

Successful payment response example
{
  "status_id": 1,
  "message": "Payment successful.",
  "data": {
    "id": "TRANSACTION_ID",
    "kind": "BILL",
    "status": "SUCCESS",
    "statusId": 1,
    "amount": 540,
    "orderId": "ORDER_ID",
    "utr": "BILLER_REFERENCE",
    "reportId": "REPORT_ID",
    "clientId": "BILL-20261003-001",
    "message": "Payment successful.",
    "walletBalance": 4460
  }
}

6. Check transaction status

GET/bbps/transactions/:clientIdRead your latest stored payment status
Path parameterTypeDescription
clientId requiredstringThe client_id submitted with payment, maximum 64 characters. URL-encode this value.
Transaction status
curl 'https://pay2all.in/api/v1/bbps/transactions/BILL-20261003-001' -H 'Authorization: Bearer YOUR_API_KEY'
Pending status response example
{
  "status_id": 3,
  "message": "PENDING",
  "data": {
    "id": "TRANSACTION_ID",
    "clientId": "BILL-20261003-001",
    "status": "PENDING",
    "statusId": 3,
    "amount": 540,
    "orderId": null,
    "utr": null,
    "reportId": null,
    "message": null,
    "createdAt": "2026-10-03T06:00:00.000Z"
  }
}

Status codes & errors

Payment status_idMeaningAction
1SuccessfulPayment confirmed. Save the transaction and biller references.
2FailedConfirmed provider failure; wallet debit is refunded.
3PendingAwait confirmation. Do not pay again with a new client ID.

This returns the latest stored status for your organization, not a new provider inquiry. After a timeout, check status and retry only with the same client ID and identical payment details. Never create a fresh ID for an uncertain payment. Confirmed failures are refunded; pending payments remain debited until resolved.

Validation errors return HTTP 400, invalid tokens or IP restrictions return 401, and provider-fetch failures return 503, with a JSON message. Handle non-2xx responses before reading the success envelope. Keep API keys on your server.

Verification

Verify bank account or UPI ID registered holder names before initiating transfers.

Bank account verification

POST/verify/bank_accountFetch account holder name
FieldTypeDescription
client_id requiredstringYour unique tracking ID (≀64 chars).
provider_id requirednumberVerification provider id (e.g. 127).
number requiredstringBank account number.
ifsc requiredstring11-character IFSC code.
mobile_numberstringAccount holder's mobile (optional).
Request
curl -X POST https://pay2all.in/api/v1/verify/bank_account \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "AT0018aa1",
    "provider_id": 127,
    "mobile_number": "8860181421",
    "number": "8802034056",
    "ifsc": "AIRP0000001"
  }'
Response
{
  "status_id": 1,
  "message": "Account verified.",
  "data": {
    "client_id": "AT0018aa1",
    "name": "RAHUL KUMAR",
    "bank_name": "AIRTEL PAYMENTS BANK",
    "number": "8802034056",
    "ifsc": "AIRP0000001"
  }
}

UPI verification

POST/verify/upiFetch UPI holder name
Request
curl -X POST https://pay2all.in/api/v1/verify/upi \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "A2812586",
    "provider_id": 384,
    "number": "pay2all@pingpay"
  }'
Response
{
  "status_id": 1,
  "message": "UPI verified.",
  "data": {
    "client_id": "A2812586",
    "name": "PAY2ALL TECHNOLOGIES",
    "number": "pay2all@pingpay"
  }
}

AEPS & DMT

Offer Aadhaar-based banking (AEPS) and domestic money transfer (DMT) to your retailers.

POST/aeps/withdrawalAadhaar cash withdrawal
POST/dmt/remitterOnboard a remitter (OTP KYC)
POST/dmt/transferSend money via IMPS / NEFT

Payout

Send instant single or bulk payouts to any bank account or UPI ID via IMPS, NEFT, RTGS or UPI.

POST/payout
Request
curl -X POST https://pay2all.in/api/v1/payout \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 5000,
    "mode": "IMPS",
    "account": "1234567890",
    "ifsc": "HDFC0000123",
    "name": "Rahul Kumar",
    "reference": "PO-5501"
  }'

Holiday Packages

Surface curated holiday packages on your storefront and capture customer enquiries.

GET/holidays/packagesList packages (filterable)
Request
curl "https://pay2all.in/api/v1/holidays/packages?destination=Bali&theme=honeymoon" \
  -H "Authorization: Bearer YOUR_API_KEY"
Response
{
  "status_id": 1,
  "message": "Packages fetched successfully.",
  "data": {
    "rows": [
      {
        "id": 14,
        "slug": "magical-bali-5n6d",
        "title": "Magical Bali 5N/6D",
        "destination": "Bali",
        "nights": 5,
        "days": 6,
        "price_from": 41999,
        "currency": "INR",
        "theme": "Honeymoon",
        "image": "https://cdn.pay2all.in/holidays/bali.jpg"
      }
    ],
    "total": 37
  }
}
GET/holidays/packages/{slug}Full package detail
Request
curl "https://pay2all.in/api/v1/holidays/packages/magical-bali-5n6d" \
  -H "Authorization: Bearer YOUR_API_KEY"
Response
{
  "status_id": 1,
  "message": "Package fetched successfully.",
  "data": {
    "id": 14,
    "slug": "magical-bali-5n6d",
    "title": "Magical Bali 5N/6D",
    "destination": "Bali",
    "nights": 5,
    "days": 6,
    "price_from": 41999,
    "itinerary": [ { "day": 1, "title": "Arrival & Kuta Beach", "details": "Airport pickup, hotel check-in…" } ],
    "inclusions": ["4-star hotel", "Daily breakfast", "Airport transfers"],
    "exclusions": ["Airfare", "Visa"],
    "gallery": ["https://cdn.pay2all.in/holidays/bali-1.jpg"]
  }
}
POST/holidays/packages/{id}/enquirySubmit a customer enquiry
Request
curl -X POST https://pay2all.in/api/v1/holidays/packages/14/enquiry \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Sagar Kumar",
    "email": "sagar@example.com",
    "phone": "9876543210",
    "travel_date": "2026-11-02",
    "travellers": 2,
    "message": "Honeymoon package, sea-view room preferred."
  }'
Response
{
  "status_id": 1,
  "message": "Enquiry received. Our travel desk will contact the customer shortly.",
  "data": { "enquiry_id": 501, "package_id": 14 }
}

Gift Cards

Sell e-gift vouchers from popular brands with instant automated issuance. Send the API token as Authorization: Bearer YOUR_API_KEY.

GET/gift-cardsLive gift-card catalogue
Request
curl "https://pay2all.in/api/v1/gift-cards" \
  -H "Authorization: Bearer YOUR_API_KEY"
Response
{
  "status_id": 1,
  "message": "Gift cards fetched successfully.",
  "data": {
    "rows": [
      {
        "slug": "amazon-pay-e-gift-card",
        "product_id": "Q3ZDILtvAyLbKZ",
        "name": "Amazon Pay e-Gift Card",
        "brand": "Amazon",
        "image": "https://cdn.pay2all.in/gift/amazon.png",
        "denominations": [100, 250, 500, 1000],
        "min": 10,
        "max": 10000,
        "discount_pct": 2
      }
    ]
  }
}
POST/gift-cards/purchaseBuy a voucher
FieldTypeDescription
client_idstringRequired unique reference. Reusing it returns the original order and prevents duplicate purchases.
product_idstringRequired external product ID returned by the catalogue endpoint.
amountnumberRequired denomination or an amount within the card's allowed range.
quantitynumberOptional, 1–10. Defaults to 1.
recipientstringOptional customer email address or mobile number.
Request
curl -X POST https://pay2all.in/api/v1/gift-cards/purchase \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "GIFT-INV-1001",
    "product_id": "Q3ZDILtvAyLbKZ",
    "amount": 500,
    "quantity": 1,
    "recipient": "customer@example.com"
  }'
Response
{
  "status_id": 1,
  "message": "Gift voucher purchased successfully.",
  "data": {
    "order_id": "GV-000318",
    "client_id": "GIFT-INV-1001",
    "name": "Amazon Pay e-Gift Card",
    "amount": 500,
    "quantity": 1,
    "price": 490,
    "status": "SUCCESS",
    "voucher_code": "AMZN-XXXX-XXXX-1234",
    "voucher_pin": "4821",
    "wallet_balance": 13461.50
  }
}

eChallan & RC Lookup

Look up pending traffic challans and full RC / vehicle details by registration number. Send the API token as Authorization: Bearer YOUR_API_KEY.

POST/echallanChallans + RC details for a vehicle
FieldTypeDescription
rc requiredstringVehicle registration number, e.g. DL01AB1234.
refreshbooleanOptional. true runs a paid live lookup (wallet-debited); default returns the latest cached result.
request_idstringOptional. A unique key so a retried live refresh is never charged twice.
Request
curl -X POST https://pay2all.in/api/v1/echallan \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "rc": "DL01AB1234",
    "refresh": false
  }'
Response
{
  "status_id": 1,
  "message": "2 pending challan(s) found.",
  "data": {
    "rc": "DL01AB1234",
    "vehicle": {
      "rcNo": "DL01AB1234",
      "owner": "RAHUL SHARMA",
      "maker": "MARUTI SWIFT VXI",
      "fuel": "PETROL",
      "rto": "MALL ROAD, DELHI",
      "regDate": "2019-04-12",
      "insuranceUpto": "2026-04-11",
      "fitnessUpto": "2034-04-11",
      "pucUpto": "2026-10-10"
    },
    "challans": [
      {
        "challanNo": "DL1234567890",
        "date": "2026-08-21",
        "amount": 500,
        "offence": "Over speeding",
        "status": "Pending",
        "pending": true,
        "paymentUrl": "https://echallan.parivahan.gov.in/..."
      }
    ],
    "count": 3,
    "pendingCount": 2,
    "pendingAmount": 1500,
    "refreshed": false,
    "charged": 0,
    "lookupCharge": 3,
    "walletBalance": null
  }
}
A live refresh:true lookup is charged from your wallet (see lookupCharge / charged in the response). Cached lookups are free.

Webhooks

Register a webhook URL in your dashboard (Developer β†’ API settings). When a pending transaction settles, we POST this JSON to your URL. Match it to your request by client_id.

Webhook Payload
{
  "txn_id": "cmsc…",
  "client_id": "TXN-1001",
  "status_id": 1,
  "utr": "JIO-99823",
  "report_id": "88231",
  "amount": 239,
  "wallet_balance": 4522.00
}

Errors

Every response carries a status_id and a human-readable message. Check status_id first, then read message for the reason.

status_idMeaning
1Success β€” the request completed and data is returned.
2Failed β€” see message (invalid token, missing field, insufficient balance, inactive provider, or operator decline). Any debited amount is refunded.
3Pending β€” accepted and processing; the final result arrives via webhook.

Going live

Ready to launch? Here's the path from sandbox to production:

  • Register and complete your business KYC to unlock live keys.
  • Test every flow in the sandbox using "mode": "UAT" with zero wallet risk.
  • Fund your e-wallet and switch to "mode": "LIVE" (or omit the mode parameter).
  • Register your webhook URL and go live.
Need help integrating? Our developer team can guide your engineers through onboarding and review your integration before you launch.
Developers β€” API Docs, Keys & Sandbox | Pay2All