Overview
The V3 Routing API is a ground-up rewrite with a new, faster solver engine replacing Timefold. The V2 endpoint (/v2/vrp/sync/solve) remains available for backwards compatibility — internally it maps to V3 and back.
Endpoint change
| V2 (OnRoute) | V3 (Routing) | |
|---|---|---|
| URL | POST /v2/vrp/sync/solve | POST /v3/routing/solve |
| Auth | Authorization: API_KEY | Authorization: API_KEY |
| Coordinate format | {"latitude": 50.85, "longitude": 4.35} | { "coordinate": [4.35, 50.85] } (GeoJSON: lon, lat) |
| Time format | ISO 8601 strings | ISO 8601 strings |
| Field naming | camelCase | snake_case |
Request mapping
Vehicles (Resources → Vehicles)
name→idshifts[].start/endmove to insideshifts[]as aPlace({ "coordinate": [lon, lat] }) — this is still inside the shift in both V2 and V3, but the coordinate format changes- Coordinates:
{ "latitude", "longitude" }object →{ "coordinate": [longitude, latitude] }Place (GeoJSON order, wrapped in object) capacity: array[100]→ named map{ "weight": 100 }(dimension names must match jobdemandkeys)tags→skills(note: V2 tags are not automatically mapped when using the V2 compat endpoint)- New:
limits.max_distance_m,limits.max_drive_time_sfor vehicle range constraints
Jobs
name→idlocation:{ "latitude", "longitude" }→ Place object{ "coordinate": [longitude, latitude] }duration→service_duration_s(still in seconds)loadarray →demandnamed map (e.g.[10]→{ "weight": 10 })windows→time_windows(nohardflag — all time windows are hard in V3 Phase 1)- Skills and committed vehicle:
skills: [{ "name": "refrigerated" }],eligible_vehicles: { "allowed": ["truck-1"] }— Coming soon (Phase 2)
Relations
V3 uses a tagged-union format withjob_ids (not jobs). V2 relation types map as follows:
V2 type | V3 type | Notes |
|---|---|---|
SEQUENCE | ordered | job_ids instead of jobs; resource pin not yet supported |
FIRST_JOB | ordered with a single entry in job_ids | Pin job to position 1 in route |
resource field (pin relation to a specific vehicle) is not yet supported in V3. Use eligible_vehicles on individual jobs as a workaround — Coming soon.
Options
solvingTime(seconds) →options.runtime.time_limit_ms(milliseconds)- New:
options.runtime.seedfor reproducible results - New:
options.runtime.matrix— supply custom distance/duration matrices (bypasses Solvice Maps) - Objective tuning (minimize time vs. distance) is configured via the
objectivefield — Coming soon
Response mapping
trips→routes;resource→vehicleobject{ "type": "truck-1", "instance": 1 }visits→stops(typed:start,job,end, etc.)- V3 stops carry
type,id,arrival,departure,wait_s,service_s,travel_time_s,load_after(named map) - V3 routes use
distance_m/duration_s(not baredistance/duration) unserved(string list) →unassigned(objects withjob_idandreasons[])- New
summaryblock withjobs_assigned/jobs_unassigned,total_distance_m,total_duration_s,estimated_cost,elapsed_ms,iterations - Coordinates in response are bare
[longitude, latitude]arrays
V2 features not mapped via compat endpoint
When using the V2 endpoint (/v2/vrp/sync/solve), the following V2 fields are silently dropped during conversion:
resources[].tags— V2 skill tags are not forwarded to the V3 solverrelations[].resource— pinning a relation to a specific vehicle is ignoredwindows[].hard— soft time window flag has no V3 equivalent yet- Per-visit
serviceTime,travelTime,distance— not populated in the V2 response
Feature parity
V3 currently implements a subset of V2’s features. The rest are on the roadmap.| Feature | V2 | V3 | Notes |
|---|---|---|---|
| Capacity (single dimension) | ✅ | ✅ | Named map e.g. { "weight": 100 } |
| Time windows (hard, single) | ✅ | ✅ | |
| Skills / tags | ✅ | ✅ | |
| Sequence / precedence | ✅ | ✅ | V3 type: ordered with job_ids |
| First-job constraint | ✅ | ✅ | V3: ordered with a single job_ids entry |
| Vehicle range (max distance/duration) | ✅ | ✅ | limits.max_distance_m, limits.max_drive_time_s |
| Committed vehicle | ✅ | ✅ | eligible_vehicles.allowed |
| Custom distance matrix | ✅ | ✅ | options.runtime.matrix |
| Auto distance matrix (Solvice Maps) | ✅ | ✅ | |
| Multi-dimensional capacity | ✅ | 🔜 | Coming soon |
| Multiple time windows per job | ✅ | 🔜 | Coming soon |
| Driver breaks | ✅ | 🔜 | Coming soon |
| Job priority | ✅ | 🔜 | Coming soon |
| Soft time windows | ✅ | 🔜 | Coming soon |
| Skill levels / proficiency | ✅ | 🔜 | Coming soon |
| Job relations (same route, etc.) | ✅ | 🔜 | Coming soon |
| Break management | ✅ | 🔜 | Coming soon |
| Tag ranking | ✅ | 🔜 | Coming soon |
| Inherited location | ✅ | 🔜 | Coming soon |
| Pickup & delivery (shipments) | ✅ | 🔜 | Coming soon |
| Workload balancing / fairness | ✅ | 🔜 | Coming soon |
| Rules engine | ✅ | 🔜 | Coming soon |
| Multi-day planning | ✅ | 🔜 | Coming soon |
| Real-time re-optimization | — | 🔜 | Coming soon |
| SSE streaming progress | — | ✅ | New in V3 |
| Job proximity constraint | — | ✅ | New in V3 |
V3 is under active development. The V2 endpoint (
/v2/vrp/sync/solve) remains available and internally maps to the V3 solver — you get V3’s performance with the V2 API contract.