India's Smartest Online BUS Booking Portal
www.etravelsmart.comWeb Service Integration Document
Support Email: customersupport@etravelsmart.com
1. Introduction
ETS (eTravelSmart) API is implemented using RESTful web services. ETS API clients are authenticated using the Digest Authentication mechanism. ETS API requests are authenticated using the client's username/email and password.
2. Getting Started
To start integrating with the ETS API, you need authentication details (username and password) and the API URL for all supported operations. You need to provide the list of IP addresses being used to access the ETS API. Only these IP addresses are allowed to access the API.
You can follow the rest of the documentation to learn how to use the different API calls. You can use simple HTTP GET and POST requests to perform all your operations. The integration is straightforward, and no SOAP requests/knowledge are required.
YK Software Solutions Pvt. Ltd. has a strict policy regarding unwanted load from API users and screen scrapers. To protect your IP address from being blacklisted, please follow the Best Practices section for your integration.
For more details, please contact customersupport@etravelsmart.com.
3. Stations / City Info
This API provides the list of all available stations.
Note: Please refresh this API daily around 3:00 AM during low-traffic hours to fetch the latest city and route updates. Station and city data may change frequently as bus operators add or discontinue services on various routes.
Request URL: http://localhost:8080/etsAPI/api/getStations
Sample Response: The response format of the Stations JSON is shown below.
{
"apiStatus": {
"message": "SUCCESS",
"success": true
},
"stationList": [
{
"stationId": -1,
"stationName": "10 dol"
},
{
"stationId": 10086,
"stationName": "10dol"
},
{
"stationId": 13286,
"stationName": "365 head"
},
{
"stationId": 3012,
"stationName": "Achanta"
},
{
"stationId": 2886,
"stationName": "Addanki"
}
]
}
Response Parameters:
PARAMETER NAME |
TYPE |
DESCRIPTION |
apiStations |
Object |
List of Stations. It contains the following member variables apiStatus,list of apiStation |
apiStation |
Object |
It contains stationId,stationName |
stationId |
int |
Id of the station |
stationName |
String |
Name of the station |
apiStatus |
Object |
Contains the status and message. It contains the following member variables message, isSuccess |
Message |
String |
Contains the message, mostly used when the response fails. |
isSuccess |
Boolean |
True if the response is success else false |
4. AvailableBuses
This API provides the list of available routes between the given source and destination stations for the journey date.
Request URL: http://localhost:8080/etsAPI/api/getAvailableBuses?sourceCity=Hyderabad&destinationCity=Bangalore&doj=2014-02-28
Required Details for the Available Buses Information:
-
PARAMETER NAME
TYPE
REQUIRED
DESCRIPTION
sourceCity
String
Yes
sourceCity Name
destinationCity
String
Yes
Destination city name
doj
String
Yes
DOJ,yyyy-MM-dd
The sample response format of the AvailableBuses JSON is:
{
"apiStatus": {
"message": "SUCCESS",
"success": true
}
"apiAvailableBuses": [
{
"inventoryType": 1,
"routeScheduleId": "1000011422440947912",
"serviceId": "1000011400000947912",
"fare": "1509.00",
"departureTime": "10:16 PM",
"arrivalTime": "08:00 AM",
"availableSeats": 42,
"operatorName": "Uttar Pradesh State Road Transport Corporation(UPSRTC)",
"cancellationPolicy": "[{\"cutoffTime\":\"0-1\",\"refundInPercentage\":\"75\"},
{\"cutoffTime\":\"1-2\",\"refundInPercentage\":\"85\"},{\"cutoffTime\":\"2-24\",\"refundInPercentage\":\"90\"},
{\"cutoffTime\":\"24\",\"refundInPercentage\":\"100\"}]",
"boardingPoints": [
{
"id": "1360101",
"location": "ANAND VIHAR",
"time": "10:16 PM",
"pointName": "KASHMIRIGATE",
"landmark": "KASHMIRIGATE",
"address" "204 KASHMIRIGATE",
"boardingDate": "2026-9-10"
}
],
"droppingPoints": [
{
"id": "1360091",
"location": "CHARBAGH",
"droppingDate": "2026-9-11"
"pointName": "Alambagh ",
"landmark": "CHARBAGH",
"address" "204 CHARBAGH"
"time": "08:00 AM",
}
],
"busType": "Scania A/C Multi Axle Seater (2+2)",
"partialCancellationAllowed": false,
"idProofRequired": false,
"operatorId": 11044,
"commPCT": 0.0,
"mTicketAllowed": false,
"isRTC": true,
"isOpTicketTemplateRequired": false,
"isOpLogoRequired": false,
"isFareUpdateRequired": true,
"is_child_concession": true,
"isGetLayoutByBPDP": false,
"socialDistancing": false,
"durationInMins": 584,
"busAmenities": [
"Blanket",
"Water Bottle",
"WiFi"
]
"dpTimeDate":"04:00 AM (11-Sep)",
"nextDay":false,
"rtc":true,
],
},
}
Response Parameters:
PARAMETER NAME |
TYPE |
DESCRIPTION |
apiAvailableBuses |
Object |
Contain APIStatus and list of apiAvailablebuses |
apiStatus |
Object |
Contains the status and message. It contains the following member variables message, isSuccess |
message |
String |
Contains the message, mostly used when the response fails. |
success |
Boolean |
True if the response is success else false |
apiAvailableBuses |
Object |
Contains the following member variables inventoryType, routeScheduleId, serviceId, fare, departureTime, arrivalTime, availableSeats, operatorName, cancellationPolicy, boardingPoints, droppingPoints, busType, partialCancellationAllowed, idProofRequired, operatorId, commPCT, mTicketAllowed |
inventoryType |
String |
Inventory type value. |
routeScheduleId |
String |
Route schedule Id |
serviceId |
String |
Service id or operator route Id |
fare |
String |
Ticket fare. Coma separated in case of multiple fares. |
departureTime |
String |
Bus departure time (AM/PM format) |
arrivalTime |
String |
Destination arrival time |
availableSeats |
Int |
Available seats in a particular bus |
operatorName |
String |
Name of the Operator |
cancellationPolicy |
String |
List of Cancellation Policy Objects(cutoffTime, refundInPercentage) |
cutoffTime |
String |
Cut off time in hours before journey |
refundInPercentage |
String |
Refund Percentage if cancelled before cutOffTime. |
boardingPoints |
Object |
List of boarding points. Contains id, location, time, pointName, lankmark, address, boardingDate |
id |
String |
Boarding point id |
location |
String |
Location of the boarding point |
time |
String |
Leaving time from boarding point |
lankmark |
String |
Landmark or location details of the dropping point |
pointName |
String |
Name of the boarding or dropping point. |
address |
String |
Complete address of the boarding or dropping point. |
boardingDate |
String |
Date of boarding |
droppingPoints |
Object |
List of dropping points. Contains id, pointName, lankmark, address, location, time |
id |
String |
Dropping point id |
location |
String |
Dropping point location |
time |
String |
Arrival time of dropping point (AM/PM) |
lankmark |
String |
Landmark or location details of the dropping point |
pointName |
String |
Name of the boarding or dropping point. |
address |
String |
Complete address of the boarding or dropping point. |
droppingDate |
String |
Date of Dropping |
busType |
String |
Type of bus(Volvo, semi sleeper) |
partialCancellationAllowed |
Boolean |
True or false |
idProofRequired |
Boolean |
True or false |
operatorId |
Int |
Operator Id |
commPCT |
Double |
Offered commission percentage |
isMTicketAllowed |
Boolean |
True/False, Bus can be boarded by showing the SMS if the value is True. |
isRTC |
Boolean |
Given operator is RTC operator If the value is True |
isOpTicketTemplateRequired |
Boolean |
Recommend to use the ticket template suggested by Bus Operator (Mostly for RTCs) If the value is True |
isOpLogoRequired |
Boolean |
Recommend to use the Logo of Bus Operator (Mostly for RTCs) in ticket template If the value is True |
isFareUpdateRequired |
Boolean |
Fare changes based on the boarding and dropping point selected if the value if True. Then call getRtcUpdatedFare() after blockTicket() to get Updated Fare If the value is True. |
is_child_concession |
Boolean |
Value True indicates that the child concession is applicable for this bus operator (Mostly RTCs). Rules like less than 11 years is child,Adult should accompany child,etc is defined by bus operator. Decreased fare is returned in getRtcUpdatedFare() method after successful block method. Note: when primary along with child this will work and here fare is reduced. |
isGetLayoutByBPDP |
Boolean |
If the value is True, Have to pass Boarding & Dropping point in busLayout request to get Updated Fare in busLayout response. Note:It may applicable for RTC services only. |
socialDistancing |
Boolean |
Bus Operator follows the socialDistancing rules in booking process If the value is True. |
durationInMins |
Long |
Journey duration time in minutes (total journey time from departureTime to arrivalTime). |
busAmenities |
List<String> |
List of Amenities that provided by the Bus Operator (Blanket,Water Bottle,WiFi,Charging Point,AI Assist,First Aid Box,Water Bottle Holder,CCTV,Vomiting Bag,Pillow,Reading Light,Hammer,Fire Extinguisher,Emergency Exit,GPS,etc...). |
dpTimeDate |
String |
Dropping point departure/arrival time and date. |
nextDay |
Boolean |
Indicates whether the bus reaches the dropping point on the next day. True if it is the next day, otherwise false. |
NOTE : While sending source and destination in the availableBuses and busLayout request you should encode and send to etsAPI.
5. BusLayout
This API provides the bus seat information.
Request URL :
Required Details for viewing the Seat Information:
PARAMETER NAME |
TYPE |
REQUIRED |
DESCRIPTION |
sourceCity |
String |
Yes |
sourceCity Name |
destinationCity |
String |
Yes |
Destination city name |
doj |
String |
Yes |
DOJ, yyyy-MM-dd |
inventoryType |
Int |
Yes |
InventoryType value |
routeScheduleId |
String |
Yes |
routeScheduleId value |
The sample response format of the BusLayout JSON is:
{
"apiStatus": {
"message": "SUCCESS",
"success": true
},
"inventoryType": 5,
"boardingPoints": [
{
"id": "STP288D2959H",
"location": "Kashmir GateKashmir Gate Metro gate no.5Near Metro gate no.5",
"time": "07:45 PM",
"pointName": "Kashmir Gate",
"landmark": "Near Metro gate no.5",
"address": "Kashmir Gate Metro gate no.5",
"boardingDate": "2026-09-10"
},
],
"droppingPoints": [
{
"id": "STP5A8F38H",
"location": "LucknowNear Alambagh Neharia ChowkAlambagh Neharia Chowk",
"droppingDate": "2026-09-11",
"pointName": "Lucknow",
"landmark": "Alambagh Neharia Chowk",
"address": "Near Alambagh Neharia Chowk",
"time": "04:00 AM"
}
],
"seats": [
{
"id": "1",
"row": 1,
"column": 2,
"zIndex": 0,
"length": 1,
"width": 1,
"fare": 1199,
"commission": null,
"available": false,
"ladiesSeat": false,
"malesSeat": false,
"bookedBy": "BLP99F12",
"ac": true,
"sleeper": false,
"totalFareWithTaxes": 1258.95,
"serviceTaxAmount": 59.95,
"serviceTaxPer": 0.0,
"childFare": 0.0,
"operatorServiceChargeAbsolute": 0.0,
"operatorServiceChargePercent": 0.0,
"reservedForSocialDistancing": false
},
{
"id": "EME",
"row": 3,
"column": 10,
"zIndex": 0,
"length": 1,
"width": 1,
"fare": 0,
"commission": null,
"available": false,
"ladiesSeat": false,
"malesSeat": false,
"bookedBy": "BLQ6KG933",
"ac": true,
"sleeper": false,
"totalFareWithTaxes": 0,
"serviceTaxAmount": 0,
"serviceTaxPer": 0.0,
"childFare": 0.0,
"operatorServiceChargeAbsolute": 0.0,
"operatorServiceChargePercent": 0.0,
"reservedForSocialDistancing": false
}
],
"serviceTaxApplicable": false,
"etsServiceChargePer": 0.0
}
Response Parameters:
PARAMETER NAME |
TYPE |
DESCRIPTION |
apiBusLayout |
Object |
Contains apiStatus,list of boardingPoints, list of seatInfo, serviceTaxApplicable, inventoryType |
apiStatus |
Object |
Contains the status and message. It contains the following member variables message, isSuccess |
Message |
String |
Contains the message, mostly used when the response fails. |
success |
Boolean |
True if the response is success else false |
inventoryType |
Int |
Inventory type |
boardingPoints |
Object |
Contains id, location, time |
droppingPoints |
Object |
Contains id, location, time |
id |
String |
Boarding point id |
location |
String |
Location of the boarding point |
pointName |
String |
Name of the boarding or dropping point. |
landmark |
String |
Landmark or location details of the boarding or dropping point. |
address |
String |
Complete address of the boarding or dropping point. |
time |
String |
Leaving time from boarding point |
seatInfo |
Object |
Contains id, row, column, zIndex, length, width, fare, commission, available, ladiesSeat, malesSeat, bookedBy, ac, sleeper, totalFareWithTaxes, serviceTaxAmount, serviceTaxPer, childFare, operatorServiceChargeAbsolute, operatorServiceChargePercent, reservedForSocialDistancing |
id |
String |
Seat Id/Name
|
row |
Int |
Row number |
column |
Int |
Column number |
zIndex |
Int |
Index(0-lower,1-upper) |
length |
Int |
Length of a seat, possible values are 1 or 2 |
width |
Int |
Width of a seat, possible values are 1 or 2 |
fare |
BigDecimal |
Ticket fare |
commission |
BigDecimal |
Commission on this seat if applicable |
available |
Boolean |
Is seat available or not(true/false) |
ladiesSeat |
Boolean |
Is ladies seat or not(true/false) if available |
malesSeat |
Boolean |
Is male seat or not(true/false) if available |
bookedBy |
String |
Who book the ticket (Male/Female) if not available |
ac |
Boolean |
Is ac seat or not(true/false) |
sleeper |
Boolean |
Is sleeper seat or not(true/false) |
totalFareWithTaxes |
BigDecimal |
Ticket fare with taxes and operator service charges |
serviceTaxAmount |
BigDecimal |
GST Amount |
serviceTaxPer |
double |
GST in percentages |
childFare |
BigDecimal |
Child fare |
operatorServiceChargeAbsolute |
double |
operator serviceChargeAmount |
operatorServiceChargePercent |
double |
operator serviceChargeAmount in percentages |
reservedForSocialDistancing |
Boolean |
Indicates whether the seat is reserved for social distancing. |
serviceTaxApplicable |
boolean |
If the service tax is applicable, it is true; otherwise, it is false. |
etsServiceChargePer |
double |
ETS service charge in percentage |
Bus Layout Example
Seater/Semi Sleeper
zIndex=0, Length=1 and Width=1

Vertical Sleeper
zIndex=0/1, Length=1 and Width=2 with lower and upper berths

Horizontal Sleeper
zIndex=0, Length=2 and Width=1 with all lower berths

Horizontal Sleeper cum semi sleeper
zIndex=0/1, Length=1/2 and Width=1 with lower seats/berths and upper berths

6. BlockTicket
This API is used to block the ticket for a period of 10 minutes.
Request URL:http://localhost:8080/etsAPI/api/blockTicket
Required Passenger Ticket Details:
PARAMETER NAME |
TYPE |
REQUIRED |
DESCRIPTION |
APIBlockTicketRequest |
Object |
Yes |
Elements of APIBlockTicketRequest array. It contains the following member variables. sourceCity, destinationCity, customerEmail,customerName,customerLastName,DOJ, boardingPoint, routeScheduleId, customerPhone, emergencyPhNumber, CustomerAddress, inventoryType, blockSeatPaxDetails |
sourceCity |
String |
Yes |
Name of the source city |
destinationCity |
String |
Yes |
Name of the destination city |
inventoryType |
Int |
Yes |
InventoryType value |
routeScheduleId |
String |
Yes |
routeScheduleId value |
customerName |
String |
Yes |
Name of the person whobook the ticket |
customerLastName |
String |
Yes |
Last Name of the person who book the ticket |
customerEmail |
String |
Yes |
Email id of the person who book the ticket |
DOJ |
String |
Yes |
Date of Journey in the yyyy//mm/dd format |
boardingPoint |
Object |
Yes |
It consists of id, location, time |
droppingPoint |
Object |
Yes |
It consists of id, location, time |
Id |
String |
Yes |
Boarding point id |
location |
String |
Yes |
Boarding point location |
Time |
String |
Yes |
Boarding point dispatcher time |
customerPhone |
String |
Yes |
Mobile number of the person who book the ticket |
emergencyPhNumber |
String |
Yes |
Emergency mobile number |
CustomerAddress |
String |
Yes |
Address of the person who book the ticket |
blockSeatPaxDetails |
Object |
Yes |
List of BlockSeatPaxDetails member variables. It Consists of age, name, seatNbr, sex, fare, totalFareWithTaxes, ladiesSeat, lastName, mobile, title, email, idType, idNumber, nameOnId, primary, ac, sleeper. |
Age |
String |
Yes |
Passenger Age |
name |
String |
Yes |
Passenger Name |
seatNbr |
String |
Yes |
Passenger Seat Number |
Sex |
String |
Yes |
Sex(M/F) |
Fare |
BigDecimal |
Yes |
Seat Fare |
serviceTaxAmount |
BigDecimal |
Yes |
serviceTaxAmount in Seat Level |
operatorServiceChargeAbsolute |
double |
Yes |
operatorServiceChargeAbsolute in Seat Level |
totalFareWithTaxes |
BigDecimal |
Yes |
Seat Fare with service tax amount |
ladiesSeat |
Boolean |
Yes |
LadiesSeat(true/false) |
lastName |
String |
Yes |
Last name of the Passenger |
mobile |
String |
Yes |
Mobile number of the person who travel |
Title |
String |
Yes |
Mr/Ms/Mrs |
String |
Yes |
Email id of the person who travel |
|
idType |
String |
Yes |
Id Card Type(pan,passport,.....) |
idNumber |
String |
Yes |
Id Card Number of given Card |
nameOnId |
String |
Yes |
Name on the Id Card |
primary |
Boolean |
Yes |
Is primary passenger (true/false) |
Ac |
Boolean |
Yes |
Is AC bus(true/false) |
sleeper |
Boolean |
Yes |
Is Sleeper(true/false) |
The sample request format of the BlockTicket JSON is:
{
"sourceCity": "Hyderabad",
"destinationCity": "Bangalore",
"doj": "2026-09-11",
"routeScheduleId": "6310",
"inventoryType": 0,
"boardingPoint": {
"id": "6",
"location": "Ameerpet,|Jeans Corner",
"time": "09:00PM"
},
"droppingPoint": {
"id": "4",
"location": "Anand Rao Circle,|Bangalore",
"time": "10:40 PM"
},
"customerName": "test",
"customerLastName": "testing",
"customerEmail": "test@gmail.com",
"customerPhone": "9999999999",
"emergencyPhNumber": "8888888888",
"customerAddress": "kphp",
"blockSeatPaxDetails": [
{
"age": "26",
"name": "test123",
"seatNbr": "R9",
"sex": "M",
"fare": 425,
"serviceTaxAmount": 21.00,
"operatorServiceChargeAbsolute": 30.00,
"totalFareWithTaxes": 476.00,
"ladiesSeat": false,
"lastName": "test456",
"mobile": "7777777777",
"title": "Mr",
"email": "testing@gmail.com",
"idType": "PAN",
"idNumber": "AWk123232",
"nameOnId": "test",
"primary": true,
"ac": false,
"sleeper": false
}
],
}
Response Parameters:
MESSAGE |
TYPE |
DESCRIPTION |
APIBlockTicketResponse |
Object |
Contains apiStatus, inventoryType, blockTicketKey, and updatedFareBreakup. |
apiStatus |
Object |
Contains the response status, success indicator, and message. |
message |
String |
Contains the response message. For example, "SUCCESS". |
success |
Boolean |
Indicates whether the API request was successful. Returns true for a successful response and false otherwise. |
inventoryType |
Integer |
Indicates the inventory type number. |
blockTicketKey |
String |
Unique key generated for the blocked ticket. |
updatedFareBreakup |
Object |
Contains the updated fare details, including the total fare, operator service charge, service tax, and seat-wise fare breakup. This applies to certain private bus operators, such as FlixBus, Intercity SmartBus, and other private operators, as well as RTC operators, such as UPSRTC, HRTC, and other RTC operators. If the fare is updated during the booking process, ensure that the updated fare amount is collected from the customer before proceeding with the booking. It can be null for some bus operators if there is no fare update. |
previousTotalFareWithTaxes |
BigDecimal |
Previous total fare including applicable taxes before the fare update during the block ticket process. |
updatedTotalFareWithTaxes |
BigDecimal |
Updated total fare including applicable taxes for all selected seats. |
updatedTotalOperatorServiceCharge |
BigDecimal |
Updated total operator service charge including applicable taxes for all selected seats. This amount is calculated based on the sum of all applicable fare components, such as LEVIES_CHARGES, TOLL_FEE, SERVICE_FEE, RESERVATION_FEE, CONCESSIONS_FEE, etc., provided in the seat fare breakup, excluding BASIC_FARE, SERVICE_TAX, and TOTAL_FARE. |
updatedTotalServiceTax |
BigDecimal |
Updated total service tax for all selected seats. |
seatFareBreakUp |
Object |
Contains seat-wise fare breakup details. The seat number is used as the key and the value contains the list of fare component for that seat. |
fareType |
String |
Specifies the fare type, such as BASIC_FARE, LEVIES_CHARGES, TOLL_FEE, SERVICE_FEE, RESERVATION_FEE, CONCESSIONS_FEE, SERVICE_TAX, or TOTAL_FARE. BASIC_FARE,SERVICE_TAX and TOTAL_FARE are applicable to all the bus operators and other fare types are applicable to some bus operators only. |
cancellationType |
String |
Specifies how the fare typr is handled during cancellation, such as CANCELLATION_POLICY, FULLY_REFUNDED, or NOT_REFUNDED. |
amount |
BigDecimal |
Amount associated with the corresponding fare type. |
refundableAmount |
BigDecimal |
Amount that is eligible for refund for the corresponding fare type. |
discountType |
String |
Specifies the discount type applied to the fare type, such as NON_DISCOUNT. |
The sample response format of the BlockTicket JSON is:
{
"apiStatus": {
"message": "SUCCESS",
"success": true
},
"inventoryType": 1,
"blockTicketKey": "uKQbijjonm",
"updatedFareBreakup": {
"previousTotalFareWithTaxes": 675,
"updatedTotalFareWithTaxes": 718.20,
"updatedTotalOperatorServiceCharge": 41,
"updatedTotalServiceTax": 34.20,
"seatFareBreakUp": {
"39": [
{
"fareType": "BASIC_FARE",
"cancellationType": "CANCELLATION_POLICY",
"amount": 643.00,
"refundableAmount": 643.0,
"discountType": "NON_DISCOUNT"
},
{
"fareType": "LEVIES_CHARGES",
"cancellationType": "CANCELLATION_POLICY",
"amount": 7.00,
"refundableAmount": 7.0,
"discountType": "NON_DISCOUNT"
},
{
"fareType": "TOLL_FEE",
"cancellationType": "CANCELLATION_POLICY",
"amount": 23.00,
"refundableAmount": 23.0,
"discountType": "NON_DISCOUNT"
},
{
"fareType": "SERVICE_FEE",
"cancellationType": "NOT_REFUNDED",
"amount": 11.00,
"refundableAmount": 0.0,
"discountType": "NON_DISCOUNT"
},
{
"fareType": "RESERVATION_FEE",
"cancellationType": "NOT_REFUNDED",
"amount": 0.00,
"refundableAmount": 0.0,
"discountType": "NON_DISCOUNT"
},
{
"fareType": "CONCESSIONS_FEE",
"cancellationType": "NOT_REFUNDED",
"amount": 0.00,
"refundableAmount": 0.0,
"discountType": "NON_DISCOUNT"
},
{
"fareType": "SERVICE_TAX",
"cancellationType": "FULLY_REFUNDED",
"amount": 34.20,
"refundableAmount": 34.20,
"discountType": "NON_DISCOUNT"
},
{
"fareType": "TOTAL_FARE",
"cancellationType": "CANCELLATION_POLICY",
"amount": 718.20,
"refundableAmount": 707.20,
"discountType": "NON_DISCOUNT"
}
]
}
}
}
}
7. Seat Booking
This API is used to book the blocked ticket from BlockTicket API.
Request URL : http://localhost:8080/etsAPI/api/seatBooking?blockTicketKey=blockTicketKey
Request Parameters:
PARAMETER NAME |
TYPE |
REQUIRED |
DESCRIPTION |
blockTicketKey |
String |
Yes |
We need to provideblockTicketKey |
The sample response format of the seatBooking JSON is:
{
"apiStatus": {
"message": "SUCCESS",
"success": true
},
"inventoryType": 0,
"opPNR": "ABRS947604",
"commPCT": 7.2,
"totalFare": 800.0,
"cancellationPolicy": "[{\"cutoffTime\":\"0-10 minutes\",\"refundInPercentage\":\"100\"},
{\"cutoffTime\":\"0-24\",\"refundInPercentage\":\"5\"},{\"cutoffTime\":\"24-48\",\"refundInPercentage\":\"20\"},
{\"cutoffTime\":\"48-120\",\"refundInPercentage\":\"30\"},{\"cutoffTime\":\"120-720\",\"refundInPercentage\":\"70\"}]",
"tripCode": "15437",
"etstnumber": "ETS962B0PT82"
}
Response Parameters:
MESSAGE |
TYPE |
DESCRIPTION |
APIBookSeatResp |
Object |
Contains apiStatus, inventoryType, etstnumber, opPNR, commPCT, totalFare, cancellationPolicy |
APIStatus |
Object |
Contains the status and message |
success |
Boolean |
True if the response is success else false |
message |
String |
Contains the message, mostly used when the response fails. |
inventoryType |
Int |
Inventory type number |
opPNR |
String |
Operator PNR number |
commPCT |
Double |
Commission |
totalFare |
Double |
Total fare |
cancellationPolicy |
String |
Cancellation Policy |
tripCode |
String |
As of now Tripcode is used in GSRTC ticket booking to show in ticket template. |
etstnumber |
String |
ETS Ticket Number |
Note: 1. If you get sleeper seats which is having one row in Upper, Lower deck and zIndex=0/1, Length=2 and Width=1 then you have to show as zIndex=0/1, Length=1 and Width=2.
8. Get Booked Ticket
This method is used to get the booked ticket information by passing the ETS ticket number.
Request URL: http://localhost:8080/etsAPI/api/getTicketByETSTNumber?ETSTNumber=ETSTNumber
Request Parameters:
-
PARAMETER NAME
TYPE
REQUIRED
DESCRIPTION
ETSTNumber
String
Yes
ETS Ticket number generated after successful booking.
The sample response format of the seatBooking JSON is:
{
"apiStatus": {
"message": "SUCCESS",
"success": true
},
"ticketStatus": "CONFIRMED",
"inventoryType": "7",
"sourceCity": "Delhi",
"destinationCity": "Lucknow",
"journeyDate": "Sat,05-Sep-2026",
"departureTime": "13:00",
"routeScheduleId": "20260905",
"serviceProvider": "TO-FRO.AQI",
"service_type": "2+1 AC Sleeper 13.5 M Washroom",
"serviceId": "100",
"serviceProviderContact": "Akshardham Metro Station",
"boardingPoint": "Akshardham Metro Station",
"droppingPoint": "Alambagh - Alambagh Chauraha",
"travelerDetails": [
{
"title": null,
"firstName": null,
"middleName": null,
"lastName": "User",
"gender": "M",
"dob": null,
"passportNumber": null,
"passportIssuedCountry": null,
"passportExpDate": null,
"seatingPref": null,
"mealPref": null,
"specialService": null,
"bassinetRequired": false,
"name": "Test",
"seatNo": "LHSL2",
"age": 28,
"fare": 5000,
"freqFlyNumber": null
}
],
"opPNR": "IC853659729",
"commPCT": 9,
"cancellationPolicy": "[{\"cutoffTime\":\"0-10 minutes\",\"refundInPercentage\":\"100\"},{\"cutoffTime\":\"0-24\",\"refundInPercentage\":\"5\"},
{\"cutoffTime\":\"24-48\",\"refundInPercentage\":\"20\"},{\"cutoffTime\":\"48-120\",\"refundInPercentage\":\"30\"},
{\"cutoffTime\":\"120-720\",\"refundInPercentage\":\"70\"}]",
"bookingDate": "2026-09-03T08:50:48.000+0000",
"cancelDate": null,
"refundAmount": 0,
"totalFareWithTaxes": 5250,
"serviceTaxAmount": 250,
"tdsCharge": 38.13,
"insuranceAmount": 0,
"totalDiscountAmount": 450,
"paidAmount": 4838.13,
"actualAmount": 5000,
"tripCode": null,
"etstnumber": "ETS44522"
}
Response Parameters:
MESSAGE |
TYPE |
DESCRIPTION |
APIStatus |
Object |
Contains the message and isSuccess |
message |
String |
Contains the message, mostly used when the response fails. |
success |
Boolean |
True if the response is success else false |
ticketStatus |
String |
Ticket Status CONFIRMED,CANCELLED,TRAVELLED, SERVICE_CANCELLED |
inventoryType |
String |
Inventory type value. |
sourceCity |
String |
sourceCity Name |
destinationCity |
String |
Destination city name |
journeyDate |
String |
DOJ, yyyy-MM-dd |
departureTime |
String |
Bus departure time (AM/PM format) |
routeScheduleId |
String |
Route schedule Id |
serviceProvider |
String |
Name of the Operator |
service_type |
String |
Type of bus(Volvo, semi sleeper) |
serviceId |
String |
Service id or operator route Id |
serviceProviderContact |
String |
Service Provider contact address at boarding point. |
boardingPoint |
String |
Boarding point Name. |
droppingPoint |
String |
Droppoing point |
travelerDetails |
Object |
Passenger details object. It contains Name, lastName, seatNo, Age, Gender and Fare. |
title |
String |
title of passenger. |
firstName |
String |
Frist Name of Passenger. |
middleName |
String |
Middle Name of Passenger. |
lastName |
String |
Last Name of Passenger. |
gender |
String |
Passenger Gender (M/F) |
dob |
String |
Date of birth of passenger. |
passportNumber |
String |
Passport number of passenger. |
passportIssuedCountry |
String |
Country where the passport was issued. |
passportExpDate |
String |
Passport expiry date. |
seatingPref |
String |
Passenger seating preference. |
mealPref |
String |
Passenger meal preference. |
specialService |
String |
Special service requested by the passenger. |
bassinetRequired |
Boolean |
Indicates whether a bassinet is required for the passenger. |
name |
String |
Name of passenger. |
seatNo |
String |
Seat number |
age |
Long |
Passenger Age |
fare |
double |
Seat fare. |
freqFlyNumber |
String |
Frequent flyer number of the passenger. |
opPNR |
String |
Operator PNR |
commPCT |
Double |
Commission Value |
cancellationPolicy |
String |
Cancellation Policy. Contains cutoffTime and refundInPercentage |
bookingDate |
Date |
Ticket booked date. |
cancelDate |
Date |
Ticket cancelled date if ticket is cancelled |
refundAmount |
Double |
Refund Amount if ticket is cancelled. |
totalFareWithTaxes |
Double |
Total fare including taxes. |
serviceTaxAmount |
Double |
Service tax amount. |
tdsCharge |
Double |
TDS charge amount. |
insuranceAmount |
Double |
Insurance amount. |
totalDiscountAmount |
Double |
Total discount amount. |
paidAmount |
Double |
Amount paid for the ticket. |
actualAmount |
Double |
Actual ticket amount before discounts and applicable charges. |
tripCode |
String |
As of now Tripcode is used in GSRTC ticket booking to show in ticket template. |
ETSTNumber |
String |
ETS Ticket number |
9. Cancel Ticket Confirmation
This API is used to confirm the ticket cancellation details before actually cancelling the ticket.
Request URL : http://localhost:8080/etsAPI/api/cancelTicketConfirmation
Request Parameters:
PARAMETER NAME |
TYPE |
REQUIRED |
DESCRIPTION |
APICancelRequest |
Object |
Yes |
Consists of etsTicketNo, List of seatNbrsToCancel |
etsTicketNo |
String |
Yes |
We need to provide etsTicketNo |
seatNbrsToCancel |
List<String> |
Yes |
List seat numbers to cancel |
The sample request format of the cancelTicketConfirmation JSON is:
{
"etsTicketNo": "ETS978B7LCT57",
"seatNbrsToCancel": [
"A",
"B"
]
}
Response Parameters:
MESSAGE |
TYPE |
DESCRIPTION |
APICancelResp |
Object |
Contains apiStatus, cancellable, partiallyCancellable, totalTicketFare, totalRefundAmount, cancelChargesPercentage, cancellationCharges |
APIStatus |
Object |
Contains the isSuccess and message |
success |
Boolean |
True if the response is success else false |
message |
String |
Contains the message, mostly used when the response fails. |
cancellable |
Boolean |
Is cancellable(true/false) |
partiallyCancellable |
Boolean |
Is partiallyCancellable |
totalTicketFare |
String |
Total ticket fare |
totalRefundAmount |
String |
Total refund amount |
cancelChargesPercentage |
String |
Cancellation Charges Percentage |
cancellationCharges |
double |
Cancellation Charges in rupees |
serviceTaxOnCancellationCharge |
Double |
Service tax amount applicable on cancellation charges. |
refundGSTAmount |
Double |
GST amount refunded on cancellation. |
The sample response format of the cancelTicketConfirmation JSON is:
{
"apiStatus": {
"message": "SUCCESS",
"success": true
},
"cancellable": true,
"partiallyCancellable": false,
"totalTicketFare": "5000.0",
"totalRefundAmount": "262.0",
"cancelChargesPercentage": "95%",
"cancellationCharges": 4750.0,
"serviceTaxOnCancellationCharge": 238.0,
"refundGSTAmount": 0.0
}
10. Cancel Ticket
This API is used to cancel the ticket after confirmation from the cancelTicketConfirmation API.
Request URL : http://localhost:8080/etsAPI/api/cancelTicket
Request Parameters:
PARAMETER NAME |
TYPE |
REQUIRED |
DESCRIPTION |
APICancelRequest |
Object |
Yes |
Consists of etsTicketNo, List of seatNbrsToCancel |
etsTicketNo |
String |
Yes |
We need to provide etsTicketNo |
seatNbrsToCancel |
List<String> |
Yes |
List seat numbers to cancel |
The sample request format of the cancelTicket JSON is:
{
"etsTicketNo": "ETS289B0PT77",
"seatNbrsToCancel": [
"L4",
"L5"
]
}
Response Parameters:
MESSAGE |
TYPE |
DESCRIPTION |
APICancelResp |
Object |
Contains apiStatus, cancellable, partiallyCancellable, totalTicketFare, totalRefundAmount, cancelChargesPercentage, cancellationCharges |
APIStatus |
Object |
Contains the isSuccess and message |
isSuccess |
Boolean |
True if the response is success else false |
Message |
String |
Contains the message, mostly used when the response fails. |
Cancellable |
Boolean |
Is cancellable(true/false) |
partiallyCancellable |
Boolean |
Is partiallyCancellable |
totalTicketFare |
String |
Total ticket fare |
totalRefundAmount |
String |
Total refund amount |
cancelChargesPercentage |
String |
Cancellation Charges Percentage |
cancellationCharges |
double |
Cancellation Charges in rupees |
serviceTaxOnCancellationCharge |
Double |
Service tax amount applicable on cancellation charges. |
refundGSTAmount |
Double |
GST amount refunded on cancellation. |
The sample response format of the cancelTicket JSON is:
{
"apiStatus": {
"message": "SUCCESS",
"success": true
},
"cancellable": true,
"partiallyCancellable": false,
"totalTicketFare": "5000.0",
"totalRefundAmount": "262.0",
"cancelChargesPercentage": "95%",
"cancellationCharges": 4750.0,
"serviceTaxOnCancellationCharge": 238.0,
"refundGSTAmount": 0.0
}
11. Cancelled Buses Information API
This API returns the list of cancelled bus services within the given date range.
Request URL:http://localhost:8080/etsAPI/api/cancelledBusesInfo?fromDate=2025-05-18&toDate=2025-05-31
Request Parameters:
PARAMETER NAME |
TYPE |
REQUIRED |
DESCRIPTION |
fromDate |
String |
Optional |
Start date to fetch cancelled buses. |
toDate |
String |
Optional |
End date to fetch cancelled buses. |
Response Parameters:
PARAMETER NAME |
TYPE |
DESCRIPTION |
tripRefNumber |
String |
ETS Ticket Number. |
pnr |
String |
Bus Operator PNR. |
blockKey |
String |
Unique key for the trip. |
journeyDate |
String |
Journey date in dd-MMM-yyyy format. |
The sample response format of the cancelledBusesInfo JSON is:
[
{
"tripRefNumber": "ETS135B1PT295724",
"pnr": "TS250518005239529555LHSV/GCR10302/CBE TO BLR NIGHT",
"blockKey": "6AGPSYP4",
"journeyDate": "18-May-2025"
},
{
"tripRefNumber": "ETS319B1PT294886",
"pnr": "TS250511102158682355ESOQ/88521/MDU_CHE_BYPASS_NEW",
"blockKey": "6AH44ATM",
"journeyDate": "18-May-2025"
}
]
12. getLiveTracking API
This API is used to get the bus number, driver details and live tracking details (GPS) of a confirmed bus booking before 2 hours of the journey only. This is only applicable and supported by the operators who have the GPS access.
Request URL : http://localhost:8080/etsAPI/api/getLiveTracking?ticketNo=ETS275B1PT330000
Request Parameters:
PARAMETER NAME |
TYPE |
MANDATORY |
DESCRIPTION |
ticketNo |
String |
Yes |
eTravelSmart ticket number. |
The sample response format of the getLiveTracking JSON is:
{
"success": true,
"message": "success",
"errorCode": null,
"vehicleNumber": "TG01AB1234",
"driverDetails": [
{
"name": "Ram",
"mobile": "9000000000"
}
],
"trackingUrl": "http://s.yourbus.in/?2aBj"
}
Response Parameters:
PARAMETER NAME |
TYPE |
DESCRIPTION |
success |
Boolean |
Indicates whether the API request was successful. |
message |
String |
Response message. |
errorCode |
String |
Error code returned when the API request is unsuccessful. |
vehicleNumber |
String |
Vehicle number of the bus. |
driverDetails |
Array |
Contains the driver details. |
name |
String |
Name of the bus driver. |
mobile |
String |
Mobile number of the bus driver. |
trackingUrl |
String |
URL used to track the bus location. |
13. MyPlan and Current Balance
This API is used to get the plan and balance information of an API partner.
Request URL:http://localhost:8080/etsAPI/api/getMyPlanAndBalance
The sample response format of the getMyPlanAndBalance JSON is:
{
"apiStatus": {
"message": "SUCCESS",
"success": true
},
"apiUserLogin": "abc",
"allowedIPs": "ALL",
"inventoryTypes": "-1",
"referredBy": null,
"rmName": "Balu",
"rmEmail": "abc@gmail.com",
"rmContactNumber": "9000000000",
"lowBalanceAmount": 1000,
"domainName": "abc",
"registrationDate": "2015-06-19T00:00:00.000+0000",
"renewalDate": "2016-06-19T00:00:00.000+0000",
"registrationAmount": 0.0,
"balanceAmount": 27.53,
"planName": "IH9",
"product": "BUS",
"planNature": "HYBRID",
"userType": "API_USER",
"planDescription": "Fhybrid 9",
"fixedCommission": 9.0,
"dynamicCommission": 90.0,
"serviceCharges": 0.0,
"paidRegistrationAmount": true,
"notificationEnabled": true
}
For more details, please contact customersupport@etravelsmart.com.
MESSAGE |
TYPE |
DESCRIPTION |
APIMyPlanAndBalanceResponse |
Object |
Contains apiStatus, apiUserLogin, allowedIPs, inventoryTypes, referredBy, rmName, rmEmail, rmContactNumber, lowBalanceAmount, domainName, registrationDate, renewalDate, registrationAmount, balanceAmount, planName, product, planNature, userType, planDescription, fixedCommission, dynamicCommission, serviceCharges, paidRegistrationAmount, notificationEnabled |
APIStatus |
Object |
Contains the message and isSuccess |
isSuccess |
Boolean |
True if the response is success else false |
message |
String |
Contains the message, mostly used when the response fails. |
apiUserLogin |
String |
API UserName |
allowedIPs |
String |
IP Addresses allowed to access ETS inventory. |
inventoryTypes |
String |
Inventory type |
referredBy |
String |
Who referred by |
rmName |
String |
Relationship Manager Name |
rmEmail |
String |
Relationship Manager Email |
rmContactNumber |
String |
Relationship Manager ContactNumber |
lowBalanceAmount |
int |
lowBalanceAmount used for email notification. |
domainName |
String |
domainName |
registrationDate |
Timestamp |
registrationDate |
renewalDate |
Timestamp |
renewalDate |
registrationAmount |
Double |
registrationAmount |
balanceAmount |
Double |
balanceAmount |
planName |
String |
planName |
product |
String |
Product |
planNature |
String |
planNature (Dynamic, Fixed and Hybrid) |
userType |
String |
userType |
planDescription |
String |
planDescription |
fixedCommission |
Double |
fixedCommission |
dynamicCommission |
Double |
dynamicCommission |
serviceCharges |
Double |
serviceCharge amount if any |
paidRegistrationAmount |
Boolean |
Indicates whether the registration amount has been paid. |
notificationEnabled |
Boolean |
Indicates whether notifications are enabled. |
14. Sample Code
Sample Code |
SeatLayout
|
15. FAQs
1. Is stationId used to get the bus operator data?
No. Only the station name is used; you can leave stationId as it is for now.
If there are any changes, we will communicate them by email in advance.2. Are there many junk/invalid station names or similar names?
Yes. We aggregate operators across India from different API sources, so we may receive invalid station names or minor variations (Tirupathi/Tirupati, Amballoor/Amballur, etc.). We have identified these stations and removed or changed the names to provide you with the best and valid station names. Our team is continuously working to eliminate these types of station names. This is a daily automated and manual activity performed by our system and team to validate and provide the best stations to you.
3. What data should be posted if no dropping points are available or the value is null?
In some cases, operators may not provide the dropping point(s). In those cases, you can show the destination city as the dropping point on your website or app.In that case, while blocking the ticket, you need not send the dropping point in the API request.If you receive dropping points, you must send them in the API request.
4. When do you get Tentative Failed Booking OR Oops, ticket blocking/booking failed ?
There can be external dependencies, such as changes at the operator's end. In such cases, 'TENTATIVE BOOKING FAILED ERROR' may occur.
a.Whenever the selected seat is a 'LADIES SEAT', but the passenger's title is 'Mr' or the gender is 'MALE', 'TENTATIVE BOOKING FAILED ERROR' occurs.
b.Whenever the data accessed by partners is stale, 'TENTATIVE BOOKING FAILED ERROR' occurs.
c.ID proof is mandatory in some cases , but idtype and idnumber is mandatory in all cases , so even if there is no value to be entered the fields must be entered in the JSON request. Make sure that the ID type must be written as PAN_CARD, VOTER_CARD, PASSPORT,DRIVING_LICENCE, RATION_CARD, AADHAR.
Note:As we receive only one error message'TENTATIVE BOOKING FAILED ERROR' for all above errors(a,b,c) from the operator end for all of the above errors (a, b, and c), we cannot show the specific error message for each case.5. What value should be set for primary for all passengers in the blockSeat request?
There should be one customer/passenger with primary set to true, and all other passengers should have primary set to false.
6. What should be done if a bus service is cancelled and the customer informs you before eTravelSmart?
If you receive any information about the service cancellation,
please do not cancel the ticket. Send an email to the eTravelSmart customer support team customersupport@etravelsmart.com , so that we will check with bus operator and refund the full amount if confirmed.