Skip to main content
POST
Suggest best insertions for the tasks outside the plan
V3 is in beta. General availability (GA) is planned for January 2027.

Authorizations

Authorization
string
header
required

Query Parameters

validate_only
boolean

Check the request without fetching a matrix or searching. 200 {"valid": true, "warnings": []}, or a 400 for the problem, options and caps; plan is matched against the problem only by the real call, after the fetch (suggest's check that plan leaves a task to place does run here). Any other query parameter is rejected with a 400 unknown_field, as in the body: a misspelt validateOnly must not fall through to a billed solve.

Body

application/json

Request body for POST /v3/routing/suggest.

The same body as POST /v3/routing/evaluate, plus optional options. Given the committed plan over problem, ranks the feasible insertion positions for every task of problem that is not in plan — the tasks a solve would place and an evaluate would report as unassigned. Each task (or unit — a shipment, or tasks tied by one sequence/same_vehicle/ same_day/same_route relation) is ranked independently against the same committed plan; the plan is never modified.

plan
object
required

The committed plan. Never modified, never reordered. On suggest, locked_count keeps insertions after a route's dispatched prefix.

problem
object
required

Problem definition — identical to POST /v3/routing/solve. Every task of it that is not in plan is a task to place.

Example:
options
null | object

Suggest options. Absent: the defaults.

Example:

Response

Suggestions computed. With ?validate_only=true: a ValidateOnlyResponse, {"valid": true, "warnings": []}, without a matrix fetch or a search, not billed.

The 200 body of solve, evaluate and suggest: the call's result, or with ?validate_only=true the validation verdict (ValidateOnlyResponse).

elapsed_ms
integer<int64>
required

Wall-clock time taken by the request, in milliseconds.

Required range: x >= 0
Example:

8

suggestions
object[]
required

One entry per unit of tasks outside plan, in problem order (jobs, then shipments; a relation group sorts at its first-listed member).

truncated
boolean

true when options.time_limit_s cut the search short, or a multi-member unit came back empty after the search had discarded candidates (an inconclusive "not found"; its reason_code is candidates_exhausted). Lists may then be incomplete or missing the best insertion. A single visit's only level is never pruned, so its empty list is proof of infeasibility unless the budget cut it, and its reason_code is then time_limit.