Home/Offers/Travel & Hospitality/Travel Itinerary Generation API

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 interface
Mockup of the Trip Builder interfaceplan.yourtravelapp.com/lisbonPlatformOverviewExploreAlertsAPI keysUsageSettingsTrip BuilderAccountITINERARIES BUILT48.2k▲ +3.1kPLACES VERIFIED99.1%▲ +0.4AVG STOPS / DAY4.2REVISION RATE11%▼ −3ptsMatch reviewconfidence rankedTRAVELLER INTERESTSELECTED STOPCONFIDENCEFood — local, informal, lunchTasca in Graca, 13:1594%Architecture — tileworkMuseu Nacional do Azulejo91%Coastal walk — with a childCascais to Guincho boardwalk86%Viewpoint — early, quietSenhora do Monte, 09:3082%

MockupIllustrative 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

MethodPathReturns
POST/v1/itinerariesGenerate an itinerary from preferences and constraints
POST/v1/itineraries/{id}/reviseRevise a generated itinerary against new constraints
GET/v1/itineraries/{id}Retrieve a stored itinerary with current verification state
POST/v1/sequenceOptimise the order of a fixed set of stops
GET/v1/places/{id}/availabilityOpening hours and seasonal availability for one place
POST/v1/alternativesSubstitutes for a slot that has become unavailable

Request and response

illustrative

Request

{
  "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 dataLicensed POI data with categories, locations and opening hours — the structured spine the generator is constrained by
Routing and travel time servicesWalking, transit and driving durations, which is what makes a sequence feasible rather than decorative
Public transport schedulesGTFS feeds where the city publishes them, so transit legs reflect actual service
Event and exhibition calendarsTemporary exhibitions and festivals, which are the main reason a static itinerary dates badly
Your own inventoryTours, tickets and properties you sell, so the itinerary can include what you can actually book
Review and sentiment signalsUsed for ranking within a category, not for asserting facts about a place
On data licensing. Being allowed to read a dataset does not automatically mean you may redistribute it, resell it through an API, or train a model on it. Before any build starts we check the licence, terms and derived-data rules of every source, and we design around the ones that do not permit your intended use. Where a commercial licence is required, that cost is identified during discovery rather than discovered later.

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 weeks
1

Discovery 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.

2

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.

3

Production build

Weeks 7–16

Data pipelines, model training and serving, historical archive, validation harness, API, security, monitoring and documentation.

4

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.

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.