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.
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.
Environments: UAT vs LIVE
Pay2All provides a unified environment switch so you can test your integration thoroughly before conducting real transactions.
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.
"mode": "UAT"Connects directly to live airline GDS, bus operators, and billers. Generates authentic PNRs and instantly settles transactions against your wallet balance.
"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=UATto the request URL. - HTTP Header: Send header
X-Mode: UATwith your request.
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.
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
| Field | Type | Description |
|---|---|---|
origin required | string | Origin 3-letter IATA airport code, e.g. DEL. |
destination required | string | Destination 3-letter IATA airport code, e.g. BOM. |
depart_date required | string | Departure date in YYYY-MM-DD format. |
return_date | string | Return date for round trips (optional). |
adults | number | Adult traveller count (default 1). |
children / infants | number | Child / infant counts. |
cabin_class | string | Economy, PremiumEconomy, Business or First. |
mode | string | UAT for mock sandbox results (no ERP call), or LIVE for live airline GDS. |
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"
}'{
"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
| Field | Type | Description |
|---|---|---|
trace_id required | string | From the search response. |
result_index required | string | The chosen fare's result_index. |
email / mobile required | string | Lead passenger contact details. |
passengers required | array | Each: title, first_name, last_name, pax_type (1=Adult, 2=Child, 3=Infant), gender (1=M, 2=F), is_lead_pax. |
gstin | string | GSTIN for the tax invoice (optional). |
mode | string | UAT for sandbox mock booking, or LIVE. |
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"
}'{
"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
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"
}'{
"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
curl "https://pay2all.in/api/v1/buses/cities?q=del" \
-H "Authorization: Bearer YOUR_API_KEY"{
"status_id": 1,
"message": "Cities fetched successfully.",
"data": { "cities": [ { "id": "122", "name": "Delhi" }, { "id": "124", "name": "Dehradun" } ] }
}2. Bus Search
| Field | Type | Description |
|---|---|---|
source_id required | string | Origin city id (from city autocomplete). |
destination_id required | string | Destination city id. |
date required | string | Date of journey, YYYY-MM-DD. |
mode | string | UAT for simulated trips, or LIVE for real supplier schedules. |
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"
}'{
"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
| Field | Type | Description |
|---|---|---|
id required | string | Trip ID returned by /buses/search. |
mode | string | UAT for mock 40-seat layout, or LIVE. |
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"
}'{
"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
| Field | Type | Description |
|---|---|---|
trip_id required | string | Selected trip ID. |
boarding_id / dropping_id | string | Chosen boarding & dropping point IDs. |
email / mobile required | string | Passenger contact details. |
passengers required | array | Each: seat, name, age, gender, fare. |
mode | string | UAT for mock confirmation, or LIVE. |
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"
}'{
"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
{
"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.
| Provider | Code | provider_id |
|---|---|---|
| Airtel | AIRTEL | 1 |
| Jio | JIO | 2 |
| Vi (Vodafone Idea) | VI | 3 |
| BSNL | BSNL | 4 |
| Provider | Code | provider_id |
|---|---|---|
| Tata Play | TATAPLAY | 5 |
| Airtel Digital TV | AIRTEL_DTH | 6 |
| Dish TV | DISHTV | 7 |
| d2h | D2H | 8 |
| Sun Direct | SUNDIRECT | 9 |
| Provider | Code | provider_id |
|---|---|---|
| Cash Withdrawal | ACW | 22 |
| Balance Enquiry | ABE | 23 |
| Mini Statement | AMS | 24 |
| Cash Deposit | ACD | 25 |
| Provider | Code | provider_id |
|---|---|---|
| DMT | DMT | 15 |
| Provider | Code | provider_id |
|---|
| Provider | Code | provider_id |
|---|---|---|
| Bank Account Verify | VERIFY_BANK | 10 |
| UPI Verify | VERIFY_UPI | 11 |
| Provider | Code | provider_id |
|---|---|---|
| Flight Booking | FLIGHT_BOOKING | 14 |
| Hotel Booking | HOTEL_BOOKING | 19 |
| Bus Booking | BUS_BOOKING | 20 |
| Tour Packages | TOUR_PACKAGES | 21 |
| Provider | Code | provider_id |
|---|---|---|
| Bill Payment | BILL_PAYMENT | 13 |
| Provider | Code | provider_id |
|---|
| Provider | Code | provider_id |
|---|
| Provider | Code | provider_id |
|---|---|---|
| eChallan Lookup | ECHALLAN LOOKUP | 16 |
| Provider | Code | provider_id |
|---|---|---|
| CRM | CRM | 17 |
| Provider | Code | provider_id |
|---|---|---|
| VIEWPLAN | VIEWPLAN | 18 |
| Provider | Code | provider_id |
|---|
| Provider | Code | provider_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.
curl https://pay2all.in/api/v1/providers \
-H "Authorization: Bearer YOUR_API_KEY"{
"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.
| Field | Type | Description |
|---|---|---|
number required | string | 10-digit mobile number (+91 / 0 prefix is fine), or DTH subscriber / VC number (6β16 digits). |
type | string | mobile (default) or dth. You can send service_id 1 (mobile) or 2 (DTH) instead. |
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" }'{
"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
| Field | Description |
|---|---|
provider_id | Our 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_name | Operator name, e.g. Jio, Airtel, Vi, BSNL, Tata Play. |
circle_id | Numeric 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_name | Circle / state name, e.g. Delhi NCR, Tamil Nadu. |
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.
{
"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.
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
| Query param | Type | Description |
|---|---|---|
provider_id required | number | The same provider id you send to /recharge β from POST /lookup or GET /providers (e.g. Jio = 2). |
circle_id mobile | number | Telecom circle id from POST /lookup or GET /plans/circles (e.g. Delhi NCR = 5). Not needed for DTH providers. |
plan_type | number | Optional category filter, where the plan vendor supports it. |
curl "https://pay2all.in/api/v1/plans?provider_id=2&circle_id=5" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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
| Field | Description |
|---|---|
provider_id / provider_name | The operator the plans belong to β the same provider_id to send to /recharge. |
service_id / type | 1 / mobile or 2 / dth. |
circle_id / circle_name | The 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. |
categories | Category names, in display order β group plans by category to build tabs. |
groups / records | The 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).
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.
curl https://pay2all.in/api/v1/plans/circles \
-H "Authorization: Bearer YOUR_API_KEY"{
"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.
| Field | Type | Description |
|---|---|---|
client_id required | string | Your own unique transaction id (β€64 chars). Reusing one returns the original result (idempotent). |
provider_id required | number | Provider id from POST /lookup, the live directory above or GET /providers (e.g. Jio = 2). |
number required | string | 10-digit mobile, or DTH subscriber / VC number. |
amount required | number | Recharge amount in βΉ β e.g. a plan's amount from /plans. |
type | string | MOBILE or DTH. Auto-detected from the provider if omitted. |
customer_mobile | string | Contact number for DTH / receipts. |
mode | string | UAT for a simulated recharge (no operator call, no wallet debit), or LIVE (default). Also accepted as ?mode=UAT or an X-Mode: UAT header. |
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"
}'{
"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
| Field | Description |
|---|---|
status_id | 1 success, 2 failed (wallet refunded), 3 pending β wait for the webhook. |
txn_id / order_id | Our transaction and order references. |
utr / report_id | Operator reference numbers (on success). |
provider_id / provider_name / service_id | The operator the recharge was placed with β the same ids as /providers, /lookup and /plans. |
wallet_balance | Your wallet balance after the recharge. Unchanged in UAT. |
mode | UAT 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 in | Result | Example |
|---|---|---|
1 | status_id 2 β failed | 9876543211 |
2 | status_id 3 β pending | 9876543212 |
| any other digit | status_id 1 β success | 9876543210 |
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
No query parameters or request body required.
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.
{
"status_id": 1,
"message": "Request successful.",
"data": [
{
"name": "Electricity",
"billerSlug": "electricity"
}
]
}2. Get billers
| Query parameter | Type | Description |
|---|---|---|
category required | string | The billerSlug returned by categories. URL-encode this value. |
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.
{
"status_id": 1,
"message": "Request successful.",
"data": {
"title": "Electricity",
"billers": [
{
"billerId": "BILLER_ID",
"billerName": "Example Electricity Biller"
}
]
}
}3. Get biller details
| Path parameter | Type | Description |
|---|---|---|
billerId required | string | The billerId from the biller directory, not a recharge provider ID. |
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.
{
"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
| Body field | Type | Description |
|---|---|---|
biller_id required | string | Biller ID from the directory. |
params required | object | Exact customer field names mapped to string values. Preserve leading zeros. |
mobile_number | string | Customer contact mobile, exactly 10 digits. Forwarded to the provider; does not replace registered-mobile fields required inside params. |
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.
{
"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
| Body field | Type | Description |
|---|---|---|
client_id required | string | Your unique transaction ID, maximum 64 characters. Reuse for retries. |
biller_id required | string | Same biller ID used for fetch. |
reference_id required | string | data.referenceId from the successful fetch response. |
params required | object | Same customer field names and string values sent for fetch. |
amount required | number | Positive INR amount, maximum two decimal places. Follow the biller's amount rules. |
mobile required | string | Customer mobile number containing exactly 10 digits. |
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.
{
"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
| Path parameter | Type | Description |
|---|---|---|
clientId required | string | The client_id submitted with payment, maximum 64 characters. URL-encode this value. |
curl 'https://pay2all.in/api/v1/bbps/transactions/BILL-20261003-001' -H 'Authorization: Bearer YOUR_API_KEY'{
"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_id | Meaning | Action |
|---|---|---|
| 1 | Successful | Payment confirmed. Save the transaction and biller references. |
| 2 | Failed | Confirmed provider failure; wallet debit is refunded. |
| 3 | Pending | Await 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
| Field | Type | Description |
|---|---|---|
client_id required | string | Your unique tracking ID (β€64 chars). |
provider_id required | number | Verification provider id (e.g. 127). |
number required | string | Bank account number. |
ifsc required | string | 11-character IFSC code. |
mobile_number | string | Account holder's mobile (optional). |
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"
}'{
"status_id": 1,
"message": "Account verified.",
"data": {
"client_id": "AT0018aa1",
"name": "RAHUL KUMAR",
"bank_name": "AIRTEL PAYMENTS BANK",
"number": "8802034056",
"ifsc": "AIRP0000001"
}
}UPI verification
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"
}'{
"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.
Payout
Send instant single or bulk payouts to any bank account or UPI ID via IMPS, NEFT, RTGS or UPI.
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.
curl "https://pay2all.in/api/v1/holidays/packages?destination=Bali&theme=honeymoon" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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
}
}curl "https://pay2all.in/api/v1/holidays/packages/magical-bali-5n6d" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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"]
}
}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."
}'{
"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.
curl "https://pay2all.in/api/v1/gift-cards" \
-H "Authorization: Bearer YOUR_API_KEY"{
"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
}
]
}
}| Field | Type | Description |
|---|---|---|
client_id | string | Required unique reference. Reusing it returns the original order and prevents duplicate purchases. |
product_id | string | Required external product ID returned by the catalogue endpoint. |
amount | number | Required denomination or an amount within the card's allowed range. |
quantity | number | Optional, 1β10. Defaults to 1. |
recipient | string | Optional customer email address or mobile number. |
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"
}'{
"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.
| Field | Type | Description |
|---|---|---|
rc required | string | Vehicle registration number, e.g. DL01AB1234. |
refresh | boolean | Optional. true runs a paid live lookup (wallet-debited); default returns the latest cached result. |
request_id | string | Optional. A unique key so a retried live refresh is never charged twice. |
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
}'{
"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
}
}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.
{
"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_id | Meaning |
|---|---|
1 | Success β the request completed and data is returned. |
2 | Failed β see message (invalid token, missing field, insufficient balance, inactive provider, or operator decline). Any debited amount is refunded. |
3 | Pending β 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.