Travel & Hospitality
Travel Itinerary Generation API
Trip planning is the part of travel your customers do somewhere else — usually across eleven browser tabs and a note on their phone.
- OTAs and booking platforms
- Destination marketing organisations
- Tour operators
- Hotel groups
- Travel apps
What your customers would see
example interfaceMockupIllustrative mockup of the interface we would build. Figures shown are examples, not results from a live deployment.
The problem this solves
A booking platform sees the end of the planning process and almost none of the middle. The customer has already decided where to go, roughly when, and what kind of trip it is, by the time they arrive to buy a flight. All of the decisions that shape the trip — and most of the ancillary spend — happened before that, outside your product.
The hard part of generating an itinerary is not writing pleasant prose about a city. It is the constraint satisfaction underneath. The museum closes on Tuesdays. The hike needs four hours and a car. Two of the chosen activities are forty minutes apart in opposite directions. The restaurant requires a booking three weeks ahead. An itinerary that ignores any of that reads well and falls apart on arrival.
Generation also has a verification problem. A language model will happily produce a plausible museum that closed in 2019, or put a landmark in the wrong district. Every place, opening time and travel duration in the output has to be checked against a structured source before the itinerary is returned, which means the model is doing the arrangement and the data is doing the asserting.
Who buys this
OTAs and booking platforms, Destination marketing organisations, Tour operators, Hotel groups, Travel apps
What the API returns
What comes back
- Day-by-day itineraries with sequenced stops and realistic timings
- Travel time and mode between consecutive stops
- Opening hours, closure days and seasonal availability per place
- Interest-weighted activity selection with reasons attached
- Pace control so a day is not packed beyond what a traveller will do
- Alternatives per slot, for substitution when something is unavailable
- Booking-required flags with typical lead times
- Verification status on every place and time asserted in the plan
Endpoints
| Method | Path | Returns |
|---|---|---|
| POST | /v1/itineraries | Generate an itinerary from preferences and constraints |
| POST | /v1/itineraries/{id}/revise | Revise a generated itinerary against new constraints |
| GET | /v1/itineraries/{id} | Retrieve a stored itinerary with current verification state |
| POST | /v1/sequence | Optimise the order of a fixed set of stops |
| GET | /v1/places/{id}/availability | Opening hours and seasonal availability for one place |
| POST | /v1/alternatives | Substitutes for a slot that has become unavailable |
Request and response
illustrativeRequest
{
"destination": "Lisbon",
"dates": { "from": "2027-04-12", "to": "2027-04-15" },
"party": { "adults": 2, "children": [9] },
"interests": ["food", "architecture", "coastal_walks"],
"pace": "relaxed",
"mobility": { "max_walk_km_per_day": 6 },
"base": { "property_id": "prp_9120", "area": "Alfama" }
}Response
{
"itinerary_id": "itn_77213",
"destination": "Lisbon",
"days": [
{
"date": "2027-04-12",
"theme": "Alfama and the river",
"stops": [
{ "place_id": "plc_201", "name": "Miradouro da Senhora do Monte",
"arrive": "09:30", "duration_minutes": 40,
"reason": "Short uphill walk from your hotel, quiet before 10:00",
"verified": { "hours": true, "location": true } },
{ "place_id": "plc_418", "name": "Museu Nacional do Azulejo",
"arrive": "11:00", "duration_minutes": 90,
"travel_from_previous": { "mode": "tram", "minutes": 22 },
"booking": { "required": false },
"verified": { "hours": true, "location": true } },
{ "place_id": "plc_622", "name": "Tasca in Graca",
"arrive": "13:15", "duration_minutes": 75,
"booking": { "required": true, "typical_lead_days": 7 },
"verified": { "hours": true, "location": true } }
],
"walking_km": 4.2,
"alternatives": [{ "replaces": "plc_418", "place_id": "plc_433", "name": "Casa dos Bicos" }]
}
],
"warnings": [
{ "code": "closed_day", "detail": "Museu Nacional do Azulejo closed Mondays; day 3 reordered" }
],
"verification": { "places_checked": 14, "unverified": 0 }
}Where the data comes from
| Place and point-of-interest data | Licensed POI data with categories, locations and opening hours — the structured spine the generator is constrained by |
| Routing and travel time services | Walking, transit and driving durations, which is what makes a sequence feasible rather than decorative |
| Public transport schedules | GTFS feeds where the city publishes them, so transit legs reflect actual service |
| Event and exhibition calendars | Temporary exhibitions and festivals, which are the main reason a static itinerary dates badly |
| Your own inventory | Tours, tickets and properties you sell, so the itinerary can include what you can actually book |
| Review and sentiment signals | Used for ranking within a category, not for asserting facts about a place |
The intelligence layer
The difference between a demo and a service is mostly in this section. These are the parts that keep the answer trustworthy once real traffic is hitting it.
- A constraint solver handling opening hours, travel time, pace limits and day boundaries, with the language model restricted to selection and explanation
- Interest modelling that maps declared preferences onto place categories with learned weights, rather than keyword matching
- Sequencing as a time-windowed routing problem, since nearest-neighbour ordering produces itineraries that waste an hour a day
- Mandatory verification of every place, opening time and travel duration against structured sources before the response is returned
- Suppression of any stop that fails verification, with a warning in the response instead of a silent substitution
- Pace calibration from party composition — a nine-year-old changes the realistic stop count more than the walking distance does
- Seasonality handling for places with reduced winter hours or weather-dependent access
- Offline evaluation against human-rated itineraries, plus monitoring of post-generation revision rates as a quality signal
What it changes for the business
Planning stays in your product
The customer builds the trip where they will book it, rather than arriving with a plan made elsewhere.
Ancillary attachment
Tours, tickets and transfers appear in context, at the point in the day they would be used.
Content at scale
Destination pages can carry genuine itineraries for hundreds of cities without a content team writing each one.
Lower abandonment
A traveller with a plausible plan is measurably closer to committing than one still comparing destinations.
How it fits into your product
How it embeds
- REST generation with stored itinerary IDs so a plan can be revised rather than regenerated
- Your own bookable inventory injected into candidate selection with configurable priority
- Itinerary and day-card components you can embed, or structured JSON for your own layout
- Webhooks on verification changes, so a stored itinerary flags a place that has since closed
- Localisation of reasons and themes across your supported languages
- Entitlement controls so longer trips or richer personalisation can sit behind a paid tier
Included in every build
- Authentication, scoped API keys and per-customer rate limiting
- Input validation with predictable, documented error responses
- Versioned endpoints so your integration never breaks without notice
- Request and response logging for audit and dispute resolution
- Latency, error-rate and usage monitoring with alerting
- OpenAPI specification, sandbox environment and client examples
- Backups, failover design and a documented recovery procedure
- An agreed support arrangement once the service is live
How we would build it
about 20 weeksDiscovery and feasibility
Weeks 1–3
This one depends heavily on data access, so we start by proving the sources exist, can be licensed for your use, and actually carry the signal the model needs. If they do not, you find out here.
Architecture and baseline model
Weeks 4–6
A written architecture and a baseline model measured against a holdout period, so you know what accuracy you are buying before the full build starts.
Production build
Weeks 7–16
Data pipelines, model training and serving, historical archive, validation harness, API, security, monitoring and documentation.
Validation and integration
Weeks 17–20
Backtesting against held-out history, accuracy reporting your team can audit, integration support and an agreed retraining cadence.
Commercial models
There is no fixed price list, because the cost is driven by data complexity, integration count, model requirements, request volume and the support level you need. Scope is agreed in writing before development starts.
Fixed-scope prototype
A defined slice of the service, built and priced as one piece of work. The usual first step when the business case needs proving internally.
Fixed-price build
An agreed scope against a written architecture, delivered for an agreed price. Best when the requirements are already clear.
Build then retainer
We build the service, then operate and improve it under a monthly agreement covering monitoring, updates and model maintenance.
White-label product
The service runs under your brand, your domain and your pricing, with MLPivot invisible to your customers.
Questions buyers ask
Is this just a language model with a prompt?
No, and the distinction matters. The model chooses and explains; it is not allowed to assert a fact. Places, hours, locations and travel times come from structured sources, and anything the generator proposes that cannot be verified is dropped before the response leaves the API. A pure prompt-based approach produces itineraries that read beautifully and contain closed restaurants.
Will it know about a small local place that has no data?
Usually not, and we would rather admit that. Coverage follows the POI data you licence. In well-mapped cities the long tail is good; in smaller destinations the generator will lean on the places that exist in the data, which skews towards the better known. Supplying your own curated place lists is the practical fix.
Can it book anything?
It flags what requires booking and the typical lead time. Actual reservations go through your existing inventory and payment flow. We would not build a booking path inside this service.
How do you stop every itinerary looking the same?
Candidate selection is stochastic within interest weights, and themes are assigned per day rather than drawn from a fixed template. That said, two travellers with identical preferences in a small city will see overlap, because the set of genuinely good options is finite.
What happens when something closes permanently?
Verification runs against stored itineraries on a schedule, not only at generation. When a place fails, the itinerary is marked and a webhook fires with a suggested alternative, so a trip booked in January does not quietly rot before April.
Related blueprints
Destination Intelligence API
Seasonality, traveller-interest signals, event calendars and comparable destination scores, as a data layer for travel products and marketing teams.
Accessibility Information API
Verified accessibility features for hotels, attractions and routes, with the verification method attached to every claim.
Hotel Price Intelligence API
Comparative hotel rates, availability movement and rate-change alerts, delivered as a data layer inside your booking or revenue product.
Want this built for your platform?
Tell us what your product does today and what you want another system to be able to ask it. We will come back with an approach, a scope and a price.