The route was the easy part: building a private-jet charter search

The route was the easy part: building a private-jet charter search

Where each jet is, where it may fly, when its crew runs out, and what the trip really costs.


"How much to fly six people from Dubai to London on Tuesday?"

It sounds like a lookup. Dubai to London is about 5,500 km in a straight line over the globe, a long-range business jet cruises at around 900 km/h, so call it six hours. Any developer could sketch that on a napkin in five minutes.

The napkin is already an hour short: flying west, into the prevailing winds and along real airways, the trip takes closer to seven. And the harder questions are where the money is. Where is the jet on Tuesday morning? Is it allowed to cross the airspace on the way? Will its crew still be legal when it lands? What does the trip cost once the empty flights are counted?

We built the search that answers all of that, in 2024, for a Dubai-based private-jet charter marketplace. The route itself turned out to be one call to a vendor. The rest of the problem sat in what the route doesn't know, and none of it fits into a single "best route". You cannot trade a crew-duty violation against a fuel saving at any exchange rate. So the engine does not optimise one answer. It applies the hard limits, prices what survives, and hands a broker a set of costed options with their warnings attached.


A hundred aircraft, a hundred rulebooks

The client is a marketplace. Customers and brokers search it; the aircraft belong to third-party operators, the licensed airlines of the private-jet world. The customers are private travellers, corporate flight departments, family offices and the assistants who book for them. They pay five or six figures a trip and want an answer while still on the phone.

For an operator, an idle jet earns nothing, but every extra hour of flying uses up maintenance reserves, engine cycles and the owner's own access to the aircraft. The trip worth having fits the schedule and still pays once the empty flights to and from the job are counted.

The marketplace lists more than a hundred aircraft from vetted operators and lets a broker search all of them at once. That is not a fleet in any uniform sense. Every aircraft has its own performance, bases, availability, pricing and restrictions. Some rules belong to the aircraft; others to the operator and its air operator certificate (AOC, the licence to fly paying passengers), to the crew, the customer or the mission. Almost nothing important could be a global setting, and nearly every hard problem below comes back to that.

One boundary held throughout: only the operator can approve a flight and confirm a firm price. The engine screens and estimates; the operator's own dispatch and crew control have the last word.

The client came to us with the idea, mockups of a broker searching a fleet and getting back priced options, and the external services it had chosen: AviaPages for route calculation, RDC Aviation for overflight and airport charges, AirportData for airports and ground handlers, and the two scheduling systems its operators use, FL3XX and Leon. None of the mockups showed a crew-duty table, a restricted-country list or a jet's last known airport.


The route is a vendor call

The shortest line between two airports is not the route anyone flies. Aircraft follow airways and air traffic rules, and route around weather, military activity and, increasingly since 2022, conflict zones and airspace they may not enter. The flown route is longer, and what that costs in time and fuel depends on the wind as much as the distance.

Specialist vendors maintain the data behind all of that. Building it in-house would have meant becoming a data company on the way to becoming a charter marketplace, so the client bought it, and I would advise the same. What we built is everything the route does not know.


Following one enquiry

Take one enquiry through the engine. The aircraft and numbers here are illustrative, chosen to show the mechanics, not taken from a real booking.

The broker asks for six seats, Dubai to London, Tuesday morning. The nearest suitable jet last landed in Geneva. To sell the trip, it must first fly empty to Dubai, about 4,800 km. Then it flies the passengers to London. Then, unless someone books it onward, it flies empty home to Geneva.

That is three kinds of flight, and the engine models all three: a positioning flight to the departure airport, one or more live flights with passengers, and a repositioning flight back to base. Every calculation (time, crew duty and cost) runs over the whole chain. Here the empty flying is nearly as long as the trip being sold, which is normal in charter and is exactly what the napkin leaves out.

Next, crew duty. Positioning plus the London flight is around thirteen hours in the air before anyone counts pre-flight checks or the turnaround in Dubai. That is beyond what a standard two-pilot crew may work in one duty period. A naive system would reject the jet. Ours tries again without the repositioning flight: still too long. Then without the positioning flight, which means flying it the day before. Tuesday's duty is now just London and the short hop home, and it fits. The broker sees an option that says "yes, if the jet comes to Dubai on Monday".

Then the money. The route comes back with the countries it crosses, and each one bills for its airspace. The operator's daily minimum, the airport and handling fees, catering and crew costs are added per flight. The broker gets a priced option with its warnings, next to the other jets that survived the same checks.


Where is the jet?

"Where will this aircraft be on Tuesday morning?" sounds like a calendar question. It is a pricing question, because the answer decides how long the empty flights are.

We answered it from two sources that routinely disagree. One is the marketplace's own quote history. The other is the operator's scheduling system, FL3XX or Leon, which each operator connects with its own credentials, and which knows about flights the marketplace never sold. The engine takes the later of the two last arrivals before the requested departure. If that arrival is more than three months old, the engine discards the position rather than trust stale data. When neither source knows, it falls back to the nearest temporary base recorded for the aircraft, or to its main base.

When the positioning flight works out longer than the flight being sold, the engine attaches a warning. It is a prompt for the broker to confirm where the aircraft really is, ask the operator for a better one-way arrangement, or look for a closer jet. The cheapest option is often the jet already parked near the departure airport, or one that was nearly making the trip anyway.

The engine also plugs into the operators' own systems both ways. FL3XX and Leon schedules sync every fifteen minutes, a booked quote appears as a trip in the operator's system, and a cancelled one disappears from it. An operator can sell through the marketplace without changing how it runs its aircraft.


Where may it fly?

Two aircraft parked side by side, same model, same cabin, can face different limits on where they may go. Registration, the operator's nationality and licence, insurance, sanctions exposure and the owner's own policy can each close off part of the map, differently for every aircraft.

So we modelled restriction in two layers: a flag on the country record for airspace closed to everyone, and a list of restricted countries on each aircraft, kept alongside its specifications and pricing. At search time the engine combines the two and passes them to the routing service, so the route that comes back avoids what that aircraft must avoid. Modelling it per aircraft was the decision that mattered. One shared list would have been wrong for every aircraft whose limits differ from the rest.

The point is to stop a broker quoting a jet that cannot make the trip as routed. That mistake costs twice: once in wasted time, and again in credibility with a client who finds out later.

The model works at country level. Real restrictions can be narrower, confined to one air-traffic region, an altitude band or a period of time. The routing vendor supports those finer cuts, so the design leaves room to adopt them.


When does the crew run out?

Crew duty was the hardest part of the system to get right, and the only real search the engine does itself.

Pilots may only work so long. How long depends on when they reported for duty, how many flights they fly, and their recent history of duty and rest. Different authorities set the limits differently, and the operator's approved scheme decides which apply. The engine picks a rule set from the aircraft's country of registration as a working proxy for that scheme, and implements two, European and American.

The European model is a table: five bands of local report time crossed with the number of flights in the duty. Reporting late at night or adding flights both lower the ceiling. The American model, as the engine simplifies it, has a single limit that depends only on the local time duty began. Both are screening models: the operator's crew-control system remains the authority on what a crew may fly.

Applying either means first building the duty period, and a duty period is mostly not flying. We modelled eight kinds of non-flying time, from pre-flight checks to the two ends of a crew rest. Gaps between flights count as turnaround, ground time, layover or rest depending on their length and the rule set, and each classification changes the arithmetic. One wrong classification can make an illegal trip look legal, and a broker would quote it.

An itinerary over the limit cannot be flown as planned, but it may still be sellable. A different crew, an extra pilot, an overnight stop or a different aircraft might fix it. Rejecting it is the obvious engineering response and the wrong commercial one, because the part pushing a trip over the limit is usually not the part the customer cares about.

So, as in the Geneva example, when a duty period breaks its limit the engine rebuilds it without the repositioning flight and tests again. Then without the positioning flight. Then without both. Each rebuild recomputes the ceiling as well as the duty time, because removing a flight changes the number of flights, and the number of flights moves the ceiling. The order is a commercial rule written as code: the empty flights can move, the customer's cannot. If a version fits, it is priced and returned. If none does, the option comes back flagged instead of silently dropped, and the broker decides what to ask the operator.


Searching a hundred jets without paying for a hundred routes

The routing vendor bills per call. Pricing every aircraft against it on every enquiry looks fine in a demo and turns every search into a bill, so the search runs in two passes.

A database query first removes aircraft that are inactive, too small or in the air at the departure time. The first pass then estimates every remaining candidate in-house, with no vendor call: straight line distance, the aircraft's own cruise speed, its taxi times. It runs the same itinerary and duty logic as the full calculation, but it may reject an aircraft for one reason only: its schedule already clashes with the trip. Crew-duty and positioning problems are flagged, not filtered, because a straight line estimate is too rough to rule on them. It is good enough to rule on a clash, because it errs short: real routes are longer than the straight line, so the estimate tends to find the aircraft free rather than busy, and a clash it does find is likely real.

Only the survivors go to the paid service, for airway routing, a wind-adjusted time and advice on refuelling stops. Both passes run across the candidates in parallel and finish independently, so one failed calculation or vendor timeout removes one option, not the whole search.

Surviving the cheap pass does not guarantee surviving the expensive one. The real route may need a refuelling stop, which adds time, cost and another flight, and another flight lowers the crew's ceiling. Where the routing service says a stop is needed, the engine returns the proposed stop instead of discarding the aircraft: "not non-stop with this jet, but here is where it would land."


What the trip really costs

Countries charge aircraft for crossing their airspace, by weight and by distance flown across it. A detour around a closed region costs fuel, and the airspace it crosses can bill more than the airspace it avoided.

The engine sends each flight's routed waypoints and the aircraft's maximum take-off weight to RDC Aviation's charges service and gets back an estimate per country, with the distance charged in each. It reports those charges; it does not pick routes by them. The route is still the vendor's, shaped by the aircraft's restrictions. What the broker gains is seeing restrictions and charges on the same screen, before a quote goes out.

The bigger cost is often not in the air at all. Many operators charge a daily minimum, though they define it differently: hours from engine start to stop, hours in the air, days the aircraft is booked, or an average across the itinerary. A short hop that ties up a jet for three days can cost far more than its time in the air. The engine implements one of those definitions. It tracks use per calendar day across the whole itinerary, empty flights included, compares the daily average with the operator's minimum, and applies the minimum where the trip falls short. Airport and handling fees, catering banded by flight length, layover and crew costs are added per flight and totalled per currency. Everything the engine cannot know, from war-risk insurance to de-icing and rerouting, the quote names and excludes.

So the twenty minutes a cleverer routing algorithm might save is often worth nothing. What moves the invoice is the shape of the schedule: how far the jet flies empty, and how many days it is tied up.


What carries over beyond aviation

None of the technology is exotic: TypeScript, a relational database, serverless functions on AWS. What made the engine work were a few decisions that apply to any business where rules differ per asset and the expensive answer comes from someone else.

Put the rules on the thing they belong to: restrictions per aircraft, duty rules per registration, minimums per operator. A global setting would have been wrong for most of the fleet.

Flag, don't reject, when a human can fix it. An over-limit trip, a long positioning flight, a needed refuelling stop: each comes back as an option with a warning, because the broker and the operator can often solve what the software cannot.

Make the free check conservative and the paid check rare. The cheap pass rejects only what it can judge safely, and flags everything else for the paid pass or the broker.

Keep vendor data and your own rules apart. The vendors supply geometry and charges. Position, restrictions, crew rules and cost assembly live in our model, and each vendor call receives only what the model has already decided.

Back to Tuesday. Six people want to fly Dubai to London, and the napkin said six hours. The engine knows the jet is in Geneva, that it has to fly to Dubai on Monday, and which countries it may cross on the way. That comes back as a priced option the operator can approve.

← Blog