An AI trip planner that says when a fare is a guess

Every travel site shows its prices in the same confident typeface. A fare scraped from a week-old page and a fare returned by a live inventory search look identical on screen, and only one of them will still exist when you try to pay for it. Grafy's Trip Planner is built around the difference: the server labels every set of results confirmed or estimated, the page prints that label before it prints a single price, and nothing anywhere in the surface is allowed to dress a guess up as a fare. A silent estimate is the one bug this tool must not have — everything else follows from that rule.
The label comes before the price
Search flights for a route and the first thing rendered is not an offer — it is the note saying what kind of answer this is. Results from live inventory are marked confirmed. Results assembled any other way are marked estimated, with the sources they came from cited underneath. The page never makes this judgement itself; the server labels every result set, and the page's one job is to say the label out loud before any number can be misread as bookable.
Where a confirmed fare comes from
Confirmed offers come from a live flight-inventory API: real seats, real fares, real connection times, and a country code on every airport in the itinerary — a detail that sounds bureaucratic and is actually the foundation of the visa check below, because no amount of parsing prose reliably tells you which country a three-letter airport code sits in.
The same pipeline shows how seriously the labels are taken: the inventory provider's own test sandbox returns structurally perfect offers — a fictional airline, plausible times, invented prices. Those are wired through as their own source, deliberately excluded from the confirmed set, so a sandbox fare wears the same “not bookable prices” banner a web estimate does. A test fare presented as a real one is exactly the failure this surface exists to prevent, and it would be an easy one to ship by accident.
An estimate that admits it
With no inventory token configured, the planner falls back to ordinary web search plus a model: page titles, URLs and short snippets. That is genuinely useful for “what routes exist and roughly what do they cost”, and genuinely useless as a booking system — a fare in a snippet is stale, partial, and often for a different date than the one you asked about. So those offers arrive marked estimated, carry their citations, and sit under the banner that says what they are. The posture is the same one grounded text generation takes with documents: an answer states where it came from, or it does not get to sound certain.
The month in one request
“Which day is cheapest?” is a different question from “find me a seat”, and answering it honestly with live searches would cost thirty metered calls to draw one chart. The price graph instead reads a cached dataset built from what other travellers were quoted on the route in the last 48 hours — one request for the whole month. Those numbers are genuinely good at the 3rd is cheaper than the 4th and genuinely unfit to book against, so they are never allowed to become offers: the columns are buttons, clicking one sets the date and runs a real search for that day, and the chart's caption says “estimate” even when the bars look precise. The flexible-date search works the same way — the cache proposes, and only a real search disposes.
Visa rules read the routing, not the brochure
Tell the planner what passport you carry and the visa check reads your actual itinerary — every airport on it, not just the destination. A one-stop routing through a third country is a transit question as well as a destination question, and the check can answer both because confirmed offers name the country of every airport they touch. That is the quiet reason live inventory matters here beyond price: the visa answer is only as good as knowing where you will physically stand between planes.
Filters that cannot drift
Your browser holds the offers after a search, but filtering them is still the server's job. That looks wasteful until you ask what the filter decides: whether a flight the traveller cannot legally board stays on screen. A second copy of those rules in the page would drift from the server's — and the copy that drifts is always the one making the safety-relevant call. The round trips cost less than they look, too: a provider-level cache means a filter change, a back button, or a second traveller asking about the same route within the hour reaches upstream exactly zero times.
Book is a hand-off, and it says so
A live-inventory offer is not bookable by URL — actually booking it is a payments integration, not a link. So the Book button hands off to a flight-search partner, and the surface tells you precisely what that hand-off can carry: a route, a date, a cabin. It cannot carry “the 09:15 departure at $612”. You land on a fresh search for the same route and may well see a different fare from a different agency, and the required wording beside the button says so — because every other part of this surface is careful about the difference between a price it can stand behind and a price it cannot, and an overpromising Book button would quietly undo all of it. Hotels are the same kind of hand-off, carrying a destination and dates rather than a room at a price. And none of these third-party links exist at all until an affiliate marker is configured — the right default for a monetisation feature nobody has opted into.
A budget that does arithmetic before the model dreams
The planner's second mode turns a number and a sentence — €2,000 and ten days in Japan — into a whole trip: flights, a bed, food, things to do. Models are good at the last part and hopeless at the first; ask one to plan to a budget and it returns a beautiful itinerary that adds up to about a third more than you have, because nothing in prose is doing arithmetic.
So the arithmetic happens first, in code, before the model is asked for anything. A contingency share comes off the top — a trip planned to the last euro is a trip one delayed train ruins. Nights are counted apart from days, because a ten-day trip has nine nights and the number of dinners is not the number of lunches; conflating them overstates lodging by a full night and is the single most common off-by-one in trip budgeting. And the category allocations sum to the envelope exactly, with the rounding remainder assigned rather than lost. The model is then handed an envelope per category instead of a total, and its answer is checked against the same envelopes on the way out.
A worked example
Lisbon to Tokyo, one adult, a Portuguese passport, flexible about the week. The price graph draws the month from cache and the 14th looks cheapest — the bar is a button, so clicking it runs the real search for that day. The results come back confirmed, the banner stays away, and each routing shows its connection; the one through the Gulf carries a transit note for the layover airport alongside the destination's visa answer. Filters for “one stop at most” re-rank on the server without a second search being charged. Book hands off to the partner search with the route and the date — and the note beside it has already said the fare on the far side may differ. Total live searches paid for: one.
Where it sits among the alternatives
A chatbot will write you a lovely itinerary with invented prices and no idea what your passport is. A fare aggregator has real prices and no opinion about visas, budgets, or whether its cached teaser number still exists. The Trip Planner's claim is narrower and more useful: it plans the trip, and it tells you which of its numbers it can stand behind. And if what you actually want is to keep an eye on a fare over weeks, that is a standing question rather than a search — Watch re-asks it on a schedule and only speaks when the answer moves. The AI actions here settle their credits up front, the same discipline Reader applies to documents, so a long planning session cannot quietly run a tab.
Frequently asked questions
Are the prices in the Trip Planner real?
The confirmed ones are: they come from a live flight-inventory search, with real fares and connection times, and they are labelled as such. Anything assembled from web search, cached route data or a provider sandbox is labelled estimated and shown under a banner saying the prices are not bookable. The label is decided by the server and printed before any price, so you always know which kind of number you are reading.
Can it check whether I need a visa for a layover?
Yes — that is the point of reading visa rules off the routing rather than the destination. Confirmed offers carry the country of every airport in the itinerary, so a one-stop flight produces a transit answer for the connection as well as an entry answer for where you land. Set your passport once and the check applies to every routing in the results.
Why does the price chart say “estimate” when it looks so exact?
Because its numbers are cached quotes other travellers saw on that route in the last 48 hours — excellent for comparing days, unfit for booking. Drawing the month with real searches would cost a metered call per day for a question one cached request answers. The bars are buttons on purpose: clicking one runs a genuine search for that date, and only that result can carry a confirmed label.
Can I book my flight inside Grafy?
No, and the surface says so rather than pretending. Booking live inventory is a payments integration, so the Book button hands off to a partner flight search that can carry your route, date and cabin — but not a specific departure at a specific price. The wording beside the button tells you the far side is a fresh search that may show different fares. Hotels work the same way: a destination and dates, not a room at a price.
How does budget mode keep the plan inside my budget?
By doing the arithmetic before the model is involved. A contingency share is reserved off the top, the day and night counts are derived once — nine nights in a ten-day trip — and the remainder is split into per-category envelopes that sum exactly, with rounding assigned rather than evaporating. The model plans inside each envelope and its answer is checked against them on the way out, so the total cannot creep a third over the way a prose-planned budget does.
Plan a trip with a route you have been putting off — the first thing you will see is whether the answer is one you can book.


