Skip to main content
POST
Solve a vehicle routing problem
V3 is in beta. General availability (GA) is planned for January 2027.

Authorizations

Authorization
string
header
required

Body

application/json

Request body for POST /v3/routing/solve.

problem
object
required

The problem: tasks, fleet, depots, relations, objective, travel.

Example:
options
null | object

Solve options.

Example:
plan
null | object

Warm start: the plan the search starts from instead of constructing from scratch (re-optimization). A result's plan goes in as it stands. See plan.routes[].locked_count for freezing a dispatched prefix.

A hint, not a guarantee: an unlocked stop that violates a hard constraint (e.g. capacity, skills, eligibility, limits.*, or a time window with no per_late_hour set) is left unassigned and the search reinserts it wherever it legitimately fits, or it surfaces in unassigned[] with a typed reason. On synchronous solve and stream, an infeasible locked or pinned stop is a 400. POST /v3/routing/runs checks the problem at submission, not the plan, so there the run ends failed with BAD_REQUEST instead.

Response

Solution found.

The result of POST /v3/routing/solve and POST /v3/routing/evaluate: one shape for a plan the solver built and a plan it was given to score.

plan
object
required

The plan these routes follow, in the request's vocabulary: valid input to evaluate, suggest or a warm-started solve as it stands.

routes
object[]
required

One entry per non-empty route.

summary
object
required

Aggregate statistics for the solve run.

Example:
unassigned
object[]
required

Tasks that could not be feasibly assigned.

warnings
object[]
required

Inputs the request carried that changed nothing. Always present, empty when there are none (no input produces one today); at most 100 are returned. Each item has a code, a pointer to the field and a message. Accept codes you do not know.

search_progress
object[] | null

How the best plan improved during the search, oldest first: the starting plan, every improvement (thinned to at most 500 entries), and the final plan, which equals summary.score (it can equal, or be slightly worse than, the entry before it). Present on every solve; absent on evaluate, which does not search. A large request that is solved in parts has the final entry alone.