This guide summarizes what frontend consumers need to change after recent pricing/import updates.
PUT /v1/itinerary/:id/pricing-selection should no longer be called.PUT /v1/itinerary/:id/pricing-table.POST /v1/bookings with required pricingSelection block.Applies to:
Use separated admin/customer write paths:
PUT /v1/itinerary/:id/pricing-table (JWT + TRIP permission)POST /v1/bookings with required pricingSelection (booking-jwt)Booking create integration:
POST /v1/bookings now requires pricingSelection payload (b2c) and computes booking.priceDetails from it.pricingSelection is missing, booking create fails validation.Both return pricing response in the same shape as GET /v1/itinerary/:id/price-details.
Usage split:
PUT /pricing-table: update base pricing rows/slabs (rate card)POST /bookings pricingSelection: update customer selection only (category/slab/travelers/channel)activities_only, customer selection request must send only traveler counts; activity prices are admin-managed via /pricing-table.Category fields are numeric enum values (not string labels):
1 = LUXURY2 = PREMIUM3 = SUPER_DELUXE4 = DELUXE5 = STANDARDVehicle slab auto-selection uses adults + children (infants excluded):
<= 3 => 1-3 slab> 3 => 4-6 slab (or higher matching slab)tripType.defaultHotelCategory removeddefaultHotelCategory.tripType as canonical category source.Endpoint: POST /v1/itinerary/import-itinerary-full
Use IDs only:
hotelIds: number[]transferIds: number[]Do not send old hotels[] / transfers[] create-resolve payloads.
activities[] are created and mapped day-wise.
Required fields per item:
dayOrder (number)title (string)startTime (string, mandatory)Optional fields:
duration (minutes)description, catgType, subCatgType, activityType, latitude, longitudeExplicit mapping supported via:
hotelDayMappings: [{ hotelId, dayOrder }]Validation:
Backward compatibility:
hotelDayMappings is omitted, backend maps hotel to all itinerary days with matching location.For check-inventory, search-inventory, and inventory responses, hotel objects now include:
id, name, cityId, categoryaddress, description, starRating, checkInTime, checkOutTime, roomTypePOST /v1/hotel/check-inventory also returns:
hotels: [] (all matched priority-name hotels)hotel (first match for backward compatibility)For check-by-name, search, and inventory responses, transfer objects now include:
id, vehicleName, vehicleType, seaterdescription, notes, isActive, createdAt, updatedAtPOST /v1/transfer/check-by-name request is bulk:
{ "items": [{ "name": "Wagon R / Similar" }, { "name": "Innova / Similar" }] }
Response includes requestedName per item.
The following endpoints are not route-changed by these updates:
GET /v1/itinerary/agentGET /v1/itineraryGET /v1/itinerary/:idGET /v1/hotel/itinerary/:idGET /v1/transfer/itinerary/:id/transfersGET /v1/days/itinerary-details/:idPotential response/data adjustments frontend should tolerate:
defaultHotelCategory field removaltripType category interpretationBase: /v1/markup
POST /v1/markup create markupPUT /v1/markup/:id update markupDELETE /v1/markup/:id soft delete markupGET /v1/markup list markupsGET /v1/markup/:id get markup detailsGET /v1/markup/unmapped-itineraries list trips not mapped in any specific markupBehavior rules:
appliesTo structure:ALL_TRIPSSPECIFIC_TRIPS with tripIds and trips[]POST /v1/markup
{
"name": "Summer promo - selected trips",
"isGlobal": false,
"itineraryIds": [948, 950, 958],
"type": 2,
"amount": 7.5,
"notes": "Percentage markup for selected trips",
"isActive": true
}
POST /v1/markup
{
"name": "Default all-trips fallback",
"isGlobal": true,
"type": 1,
"amount": 1200,
"notes": "Flat fallback markup for all trips",
"isActive": true
}
PUT /v1/markup/:id
{
"name": "Summer promo - revised",
"isActive": true,
"type": 2,
"amount": 8.25,
"notes": "Revised percentage",
"addItineraryIds": [970],
"removeItineraryIds": [950]
}
appliesTo){
"id": 12,
"name": "Summer promo - revised",
"isGlobal": false,
"type": 2,
"amount": "8.25",
"isActive": true,
"appliesTo": {
"type": "SPECIFIC_TRIPS",
"tripIds": [948, 958, 970],
"trips": [
{ "id": 948, "name": "Sikkim Delight" },
{ "id": 958, "name": "North East Premium" },
{ "id": 970, "name": "Bhutan Escape" }
]
}
}
For all-trips markup:
{
"appliesTo": {
"type": "ALL_TRIPS",
"tripIds": [],
"trips": []
}
}
POST /v1/bookings under pricingSelectionPUT /v1/itinerary/:id/pricing-tablehotelIds, transferIds, activities, optional hotelDayMappingsstartTime for each imported activitydefaultHotelCategory