V3 is in beta. General availability (GA) is planned for January 2027.
1. Context and scope
- What is being planned: deliveries, collections, service visits, or goods
moved between two addresses on one vehicle? Sets:
jobs[]for work at one address,shipments[]for a pickup and delivery pair. - What is the planning horizon: one day, several days, a week? Sets: one
shifts[]entry per vehicle per working day, with its ownfromandto. - How many tasks and vehicles on a normal day, and on the busiest? Sets: the
endpoint.
POST /v3/routing/solvetakes up to 400 tasks and 60 seconds;POST /v3/routing/runsup to 10,000 tasks and 3,600 seconds. See Async runs. - Who waits for the plan, and how long: a dispatcher at a screen or a nightly
batch? Sets:
options.time_limit_s, and sync against async. - Is each plan built from scratch, or does it change a day already under way?
Sets:
plan.routes[]withlocked_countfor stops that must not move andpinnedfor stops that must stay on their vehicle.
2. Tasks
- How long does a visit take, and is it the same for every worker? Is part of
it paid once per address rather than per task? Sets:
service_duration_s,setup_duration_s,vehicles[].service_factorand per-taskservice_factors[]. - When a customer is told “between 9 and 12” and the driver arrives at 12:20,
is the visit refused, or accepted with a complaint? Sets: a hard window with
time_windows[].fromandto; a priced late side withtime_windows[].per_late_hour, orobjective.per_late_hourfleet-wide. - Does a customer get several acceptable slots, with one preferred? Sets:
several
time_windows[]on the task,time_windows[].choice_coston the less welcome ones. - Is there a promised time that is a goal rather than a cutoff (“we aim for
10:00”)? Sets:
target.at,target.onandtarget.per_late_hour. - Must every task be served? If some may be left out, what does leaving one
out cost in money? Sets:
drop_coston the optional tasks; a task without it is never dropped. - Among the must-serve tasks, which outrank which when the fleet is short?
Sets:
priority, a rank rather than a price; not combinable withdrop_cost.
3. Vehicles and shifts
- Where does each vehicle start and end the day: a depot, the driver’s home,
or wherever its last stop is? Sets:
shifts[].startandshifts[].end, each adepotid or alocation; omit one for an open route. - Does the drive to the first stop, or home from the last, count as working
time? Sets:
shifts[].free_start_travel,shifts[].free_end_travelorshifts[].start_at_first_task. - When may a route start, and by when must the vehicle be back with unloading
done? Sets:
shifts[].fromandshifts[].to, plusdepots[].service_duration_sfor the handling at either end. - Is overtime allowed? How much, and what does an hour of it cost? Sets:
shifts[].max_overtime_sandcosts.per_overtime_houron the shift, the vehicle orobjective. - Which days does each vehicle work, and does anything change by day: another
crew, a trailer, a shorter day? Sets: one
shifts[]entry per day, withshifts[].skills,shifts[].capacityorshifts[].limitswhere the day differs.
4. Breaks
- Are breaks owed, and by which rule: a clock window (lunch between 12:00 and
14:00), driving time (45 minutes after 4 h 30, EU 561/2006), or working
time? Sets:
shifts[].breaks[]withtypewindowed, ortriggeredwithafterset todriveorduty. - How long is each break, and after how much driving or work is it due? Sets:
duration_sand, for a triggered break,threshold_s. - Is the break taken wherever the driver is when it is due, or is it an
interval in which nobody works? Sets:
windowedortriggeredfor a floating break,fixedwithfromandtofor an interval. - May a long job be interrupted by a break, or must the break fall between
jobs? Sets:
jobs[].break_interruptible. - Must the break be taken at a particular place, such as the depot? Sets:
nothing: a
locationon a windowed break is a400 not_supported. Note the place in the modelling report.
5. Capacity and load
- What limits a vehicle’s load: weight, volume, pallets, parcels? Which of
these ever binds? Sets:
vehicles[].capacityand the matchingjobs[].pickup_load,jobs[].delivery_loadorshipments[].load, up to four named dimensions. - What is the real figure for each vehicle type, and in which unit? Values
are integers, so pick a unit where rounding is harmless. Sets: the values in
capacityand the load maps. - Do goods go out from the depot, come back in, or both at one visit? Sets:
delivery_loadfor drop-offs,pickup_loadfor collections, both on one job for a swap. - Can a vehicle return to a depot mid-shift to reload or empty? Which depots,
how long does it take, how many trips a day? Sets:
depots[],shifts[].reloads,shifts[].max_trips,depots[].service_duration_sanddepots[].per_reload. - Must the vehicle end the day empty, as a waste truck tips before the yard?
Is anything on board at shift start? Sets:
shifts[].unload_before_endandshifts[].initial_load.
6. Skills, tags and eligibility
- Which tasks need a qualification, tool or licence that only some vehicles
carry? Is it yes-or-no, or graded? Sets:
jobs[].required_skillswithnameandmin_level;vehicles[].skillswithnameandlevel. - Is that requirement absolute, or a preference (“this customer likes Ann”)?
What happens when the preferred vehicle is full? Sets: hard,
eligible_vehicles.allowed; soft,preferences[].vehiclewithviolation_cost. - Are there vehicles that must never visit certain customers? Sets:
eligible_vehicles.excluded. - Are there territories? Must a vehicle stay in its zone, or does it just
prefer it? Sets:
jobs[].tagswithshifts[].serves_tagsfor a hard zone, orvehicles[].preferred_tags[].violation_costfor a soft one. - Does it cost more to send one vehicle than another, as with a subcontractor
rate? Sets:
assignment_costs[].vehicleandcost.
7. Relations and crews
- Must some tasks be done in a fixed order, such as a survey before an
install? On the same route, or on any? Sets:
relations[]of typesequence, orconsecutivefor back-to-back, plussame_routeto keep them on one route. - Must a set of tasks go to one vehicle, or happen on the same day? Sets:
same_vehicleorsame_day, bystopsor bytag. - Do two vehicles have to be at one job at the same time, as in a two-person
lift? Which pairs may work together? Sets:
synchronizedwithmax_spread_s;compatible_vehicleswithvehicles[].compatible_with. - Is there a required gap between two tasks: deliver a machine and collect it
two hours later, or a cure time? Sets:
time_lagwithmin_s,max_sandon. - If one task of a group cannot be done, should the others be left out too?
Sets:
all_or_none.
8. Limits and fairness
- Is there a maximum per route in distance, hours or stops? A rule the
operation enforces, or a habit? Sets:
vehicles[].limitswithmax_distance_m,max_route_duration_sandmax_stops;shifts[].limitsfor one day. - Are there caps across days: a weekly driving limit, a blocked date? Sets:
limits.periods[]witheveryset todayorweek, or an explicitfromandto. - Does a pool of vehicles share one quota, such as contractors who together
install at most twenty units a day? Sets:
quotas[]withvehicles,tasksandmax_stops. - Should work be spread evenly across drivers, and how much imbalance is
acceptable? Sets:
objective.workload_sharewithper_imbalance_hourandtolerance, andvehicles[].workload_weight. - Over several days, should work be done as early as possible? Sets:
objective.per_delay_workday.
9. Costs, objective and data quality
- What currency, and what does an hour of a route and a kilometre cost? Do
vehicles differ? Sets:
objective.currency,objective.costs.per_route_hourandper_travel_km(defaults 35 and 0.20), withvehicles[].costsorshifts[].costswhere one differs. See Objective function. - Is using fewer vehicles a goal, and what does one vehicle cost for a day?
Sets:
costs.per_routeper used shift, orcosts.per_used_vehicleonce per vehicle. Both default to0: until you set one, the vehicle count is free. - Is waiting paid, and is driving paid differently from time on the route?
Sets:
costs.per_wait_hourandcosts.per_drive_hour. - Where do the coordinates come from, and which addresses are known to be
unreliable: farms, industrial estates, PO boxes, site codes? Sets: every
location, as[longitude, latitude]. The API does not geocode; list the doubtful addresses in the modelling report. - Which time zone does the operation run in, and does the horizon cross a
clock change? Sets: the UTC offset on every timestamp,
shifts[].fromandtime_windows[].fromincluded. A timestamp without one is a400, and the offset of a shift’sfromdecides its calendar day; see How days are counted. - Should travel times reflect typical traffic at the departure hour, or
free-flow? Any truck restrictions? Sets:
travel.engine,travel.departure_timeandvehicles[].profile.
After the briefing
The answers and open points are the modelling report: what you check the request against as you build it, and the first thing to reread when a plan looks wrong. An AI agent building the request needs the same answers; AI agents says how it uses them.Constraints
Which rules are hard, which are priced, and how a broken rule shows up.
AI agents
Turning these answers and a data export into a request.