Frontend integration contract for itinerary pricing flows.
PUT /v1/itinerary/:id/pricing-selection (admin) is deprecated/removed from admin flow.PUT /v1/itinerary/:id/pricing-table for pricing updates.PUT /v1/itinerary/:id/customer-pricing-selection./v1/itineraryPricing categories use HotelCategoryEnum numeric values:
1 = LUXURY2 = PREMIUM3 = SUPER_DELUXE4 = DELUXE5 = STANDARDDiscount type values (when present in summary):
1 = FLAT2 = PERCENTAGE/v1/itinerary/:id/price-detailsSource of truth for pricing table mode, defaults, and summary.
selectedCategory (number enum value)selectedVehicleName (string)selectedCapacityMin (number)selectedCapacityMax (number)includeDinnerSupplement (true/false)channel (b2b or b2c){
"message": "SUC_PRICE_DETAILS_FETCHED",
"data": {
"itineraryId": 958,
"pricingTableType": "hotel_transfer",
"mappingSnapshot": {
"hasActivities": true,
"hasHotels": true,
"hasTransfers": true
},
"defaultCategory": 5,
"availableCategories": [5, 2, 1],
"selection": {
"selectedCategory": 5,
"selectedVehicleSlab": {
"vehicleName": "Innova / Xylo / Similar",
"capacityMin": 1,
"capacityMax": 3
},
"travelerDetails": {
"adults": 2,
"children": 1,
"infants": 0,
"childrenWithBed": 0,
"childrenWithoutBed": 1
},
"includeDinnerSupplement": false,
"displayMode": 1
},
"pricingTable": {},
"summary": {
"channel": "b2b",
"currency": "INR",
"baseCost": 0,
"markupPercent": 5,
"markupAmount": 0,
"gstPercent": 5,
"gstAmount": 0,
"tcsPercent": 0,
"tcsAmount": 0,
"discountType": 1,
"discountValue": 0,
"discountAmount": 0,
"grandTotal": 0,
"tcsApplicable": false
}
}
}
pricingTable by scenarioactivities_only{
"pricingTableType": "activities_only",
"pricingTable": {
"activitiesOnly": {
"adultPrice": 5000,
"childPrice": 2000
}
}
}
hotel_only{
"pricingTableType": "hotel_only",
"pricingTable": {
"hotelRows": [
{
"category": 5,
"plan": "CP",
"extraBedPrice": 4050,
"childWithoutBedPrice": 2100,
"dinnerSupplementPrice": 1950
},
{
"category": 2,
"plan": "CP",
"extraBedPrice": 5500,
"childWithoutBedPrice": 3800,
"dinnerSupplementPrice": 2400
}
]
}
}
transfer_only{
"pricingTableType": "transfer_only",
"pricingTable": {
"transferRows": [
{
"vehicleName": "Wagon R / Similar",
"capacityMin": 1,
"capacityMax": 3,
"pricePerPerson": 15100
},
{
"vehicleName": "Innova / Xylo / Similar",
"capacityMin": 1,
"capacityMax": 3,
"pricePerPerson": 18400
},
{
"vehicleName": "Innova / Xylo / Similar",
"capacityMin": 4,
"capacityMax": 6,
"pricePerPerson": 12350
}
]
}
}
hotel_transfer{
"pricingTableType": "hotel_transfer",
"pricingTable": {
"rows": [
{
"category": 5,
"plan": "CP",
"extraBedPrice": 4050,
"childWithoutBedPrice": 2100,
"dinnerSupplementPrice": 1950,
"vehiclePricing": [
{
"vehicleName": "Wagon R / Similar",
"capacityMin": 1,
"capacityMax": 3,
"pricePerPerson": 15100
},
{
"vehicleName": "Innova / Xylo / Similar",
"capacityMin": 1,
"capacityMax": 3,
"pricePerPerson": 18400
},
{
"vehicleName": "Innova / Xylo / Similar",
"capacityMin": 4,
"capacityMax": 6,
"pricePerPerson": 12350
}
]
}
]
}
}
Customer write endpoint:
PUT /v1/itinerary/:id/customer-pricing-selection (booking-jwt)booking.priceDetails){
"channel": "b2b",
"selectedCategory": 5,
"selectedVehicleSlab": {
"vehicleName": "Innova / Xylo / Similar",
"capacityMin": 1,
"capacityMax": 3
},
"travelerDetails": {
"adults": 2,
"children": 1,
"infants": 0,
"childrenWithBed": 0,
"childrenWithoutBed": 1
},
"includeDinnerSupplement": true,
"displayMode": 1,
"activitiesOnly": {
"adultPrice": 5000,
"childPrice": 2000
}
}
Returns same pricing structure as GET /price-details with recalculated summary.
Customer endpoint returns bookingId in data.
Notes:
selectedCategory is meaningful for hotel-involved flows.selectedVehicleSlab is meaningful for transfer-involved flows.activities_only, activitiesOnly.adultPrice is mandatory for publish readiness.pricingTable.rows (or any rows) in PUT payload; this endpoint accepts selection inputs only./v1/itinerary/:id/pricing-table (admin only)Upsert pricing master rows (rate card) for each scenario.
TRIP permissionhotel_transfer payload{
"scenario": "hotel_transfer",
"rows": [
{
"category": 5,
"plan": "CP",
"extraBedPrice": 4050,
"childWithoutBedPrice": 2100,
"dinnerSupplementPrice": 1950,
"vehiclePricing": [
{
"vehicleName": "test02",
"capacityMin": 1,
"capacityMax": 3,
"pricePerPerson": 15100
}
]
}
]
}
hotel_only payload{
"scenario": "hotel_only",
"hotelRows": [
{
"category": 5,
"plan": "CP",
"extraBedPrice": 4050,
"childWithoutBedPrice": 2100,
"dinnerSupplementPrice": 1950
}
]
}
transfer_only payload{
"scenario": "transfer_only",
"category": 5,
"transferRows": [
{
"vehicleName": "Maruti Suzuki",
"capacityMin": 1,
"capacityMax": 3,
"pricePerPerson": 12000
}
]
}
category is optional for transfer_only; if omitted, backend uses itinerary default category (fallback standard).
activities_only payload{
"scenario": "activities_only",
"displayMode": 1,
"activitiesOnly": {
"adultPrice": 5000,
"childPrice": 2000
}
}
{
"message": "SUC_PRICING_TABLE_SAVED",
"data": {
"itineraryId": 958,
"pricingTableType": "hotel_transfer",
"pricingTable": {},
"selection": {},
"summary": {}
}
}
Notes:
PUT /customer-pricing-selection updates only customer selection inputs and recalculates totals.channel = "b2b"summary shows markupAmount, gstAmount, tcsAmount, discountAmount separately.channel = "b2c"gstAmount, tcsAmount, discountAmount separately./v1/itinerary/price-details/:leadId/:tripIdPublic lead pricing endpoint.
/v1/itinerary/:id/customer-price-detailsCustomer-token variant of itinerary price-details endpoint.
/v1/itinerary/:id/customer-pricing-selectionCustomer write endpoint for pricing selection (booking persistence).
/v1/itinerary/:id/travelersLegacy compatibility endpoint.
New UI should use PUT /customer-pricing-selection.
tripType is the canonical category source.adults + children count (infants excluded from slab banding).<= 3 selects 1-3 slab> 3 selects 4-6 slab (or matching higher slab)hotel + transfer: selected/default category hotel bundle + primary transfer pricing.transfer-only: primary transfer pricing.activities-only: adultPrice default.hotel + transfer (+activities):hotel-only:transfer-only:activities-only:adultPrice is mandatory