GraphQL reference
The same capabilities, the same billing, the same authentication.
This schema shares no operation with the one at api.superroute.ca. They are separate contracts and are versioned separately, so nothing you know from the tenant API carries over by name.
Route optimization
openRoutingInsert
query
node
Beta
Place new jobs in a plan you hold at the positions that cost least, without resequencing the rest.
query Run($input: Json!) {
openRoutingInsert(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"departed_at": "2026-11-02T08:00:00-05:00",
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
},
"time_window": [
"2026-11-02T08:00:00-05:00",
"2026-11-02T17:00:00-05:00"
]
},
{
"id": "van-2",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": {
"parcels": 2
}
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": {
"parcels": 3
},
"time_windows": [
[
"2026-11-02T09:00:00-05:00",
"2026-11-02T12:00:00-05:00"
]
]
},
{
"id": "order-1003",
"location": {
"lat": 45.5231,
"lng": -73.5817
},
"service_seconds": 240,
"amount": {
"parcels": 1
}
}
],
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1002"
]
},
{
"vehicle_id": "van-2",
"stops": [
"order-1003"
]
}
],
"insert": [
{
"id": "order-1004",
"location": {
"lat": 45.5155,
"lng": -73.5605
},
"service_seconds": 300,
"amount": {
"parcels": 2
}
},
{
"id": "order-1005",
"location": {
"lat": 45.492,
"lng": -73.583
},
"service_seconds": 180,
"amount": {
"parcels": 9
}
}
]
}
}
Response example
{
"data": {
"openRoutingInsert": {
"mode": "sync",
"job": null,
"data": {
"placements": [
{
"job": "order-1004",
"vehicle_id": "van-1",
"position": 2,
"after": "order-1001",
"added_distance_meters": 1505,
"added_duration_seconds": 213,
"added_waiting_seconds": -513,
"arrival": "2026-11-02T08:11:57-05:00",
"waiting_seconds": 0,
"service_start": "2026-11-02T08:11:57-05:00",
"alternatives": [
{
"vehicle_id": "van-1",
"position": 1,
"after": null,
"added_distance_meters": 2345,
"added_duration_seconds": 309,
"added_waiting_seconds": -609,
"arrival": "2026-11-02T08:04:31-05:00",
"waiting_seconds": 0,
"service_start": "2026-11-02T08:04:31-05:00"
},
{
"vehicle_id": "van-2",
"position": 1,
"after": null,
"added_distance_meters": 849,
"added_duration_seconds": 127,
"added_waiting_seconds": 0,
"arrival": "2026-11-02T08:04:31-05:00",
"waiting_seconds": 0,
"service_start": "2026-11-02T08:04:31-05:00"
},
{
"vehicle_id": "van-2",
"position": 2,
"after": "order-1003",
"added_distance_meters": 1402,
"added_duration_seconds": 211,
"added_waiting_seconds": 0,
"arrival": "2026-11-02T08:17:27-05:00",
"waiting_seconds": 0,
"service_start": "2026-11-02T08:17:27-05:00"
}
]
},
{
"job": "order-1005",
"vehicle_id": "van-2",
"position": 2,
"after": "order-1003",
"added_distance_meters": 3080,
"added_duration_seconds": 357,
"added_waiting_seconds": 0,
"arrival": "2026-11-02T08:21:12-05:00",
"waiting_seconds": 0,
"service_start": "2026-11-02T08:21:12-05:00",
"alternatives": [
{
"vehicle_id": "van-2",
"position": 1,
"after": null,
"added_distance_meters": 3495,
"added_duration_seconds": 431,
"added_waiting_seconds": 0,
"arrival": "2026-11-02T08:05:14-05:00",
"waiting_seconds": 0,
"service_start": "2026-11-02T08:05:14-05:00"
}
]
}
],
"unplaced": [],
"routes": [
{
"vehicle_id": "van-1",
"stop_count": 5,
"task_count": 3,
"distance_meters": 7921,
"duration_seconds": 1045,
"service_seconds": 900,
"waiting_seconds": 2152,
"departure": "2026-11-02T08:00:00-05:00",
"completion": "2026-11-02T09:08:17-05:00",
"unreachable_legs": 0,
"violations": [],
"violation_count": 0,
"stops": [
{
"type": "start",
"departure": "2026-11-02T08:00:00-05:00"
},
{
"type": "job",
"id": "order-1001",
"sequence": 1,
"reachable": true,
"leg_distance_meters": 1840,
"leg_duration_seconds": 245,
"leg_geometry": null,
"arrival": "2026-11-02T08:04:05-05:00",
"arrival_epoch": 1793624645,
"distance_meters": 1840,
"duration_seconds": 245
},
{
"type": "job",
"id": "order-1004",
"sequence": 2,
"reachable": true,
"leg_distance_meters": 1233,
"leg_duration_seconds": 172,
"leg_geometry": null,
"arrival": "2026-11-02T08:11:57-05:00",
"arrival_epoch": 1793625117,
"distance_meters": 3073,
"duration_seconds": 417
},
{
"type": "job",
"id": "order-1002",
"sequence": 3,
"reachable": true,
"leg_distance_meters": 3380,
"leg_duration_seconds": 431,
"leg_geometry": null,
"arrival": "2026-11-02T08:24:08-05:00",
"arrival_epoch": 1793625848,
"distance_meters": 6453,
"duration_seconds": 848,
"waiting_seconds": 2152
},
{
"type": "end",
"reachable": true,
"leg_distance_meters": 1468,
"leg_duration_seconds": 197,
"leg_geometry": null,
"arrival": "2026-11-02T09:08:17-05:00",
"arrival_epoch": 1793628497,
"distance_meters": 7921,
"duration_seconds": 1045
}
]
},
{
"vehicle_id": "van-2",
"stop_count": 4,
"task_count": 2,
"distance_meters": 10224,
"duration_seconds": 1273,
"service_seconds": 420,
"waiting_seconds": 0,
"departure": "2026-11-02T08:00:00-05:00",
"completion": "2026-11-02T08:28:13-05:00",
"unreachable_legs": 0,
"violations": [],
"violation_count": 0,
"stops": [
{
"type": "start",
"departure": "2026-11-02T08:00:00-05:00"
},
{
"type": "job",
"id": "order-1003",
"sequence": 1,
"reachable": true,
"leg_distance_meters": 3635,
"leg_duration_seconds": 482,
"leg_geometry": null,
"arrival": "2026-11-02T08:08:02-05:00",
"arrival_epoch": 1793624882,
"distance_meters": 3635,
"duration_seconds": 482
},
{
"type": "job",
"id": "order-1005",
"sequence": 2,
"reachable": true,
"leg_distance_meters": 4567,
"leg_duration_seconds": 550,
"leg_geometry": null,
"arrival": "2026-11-02T08:21:12-05:00",
"arrival_epoch": 1793625672,
"distance_meters": 8202,
"duration_seconds": 1032
},
{
"type": "end",
"reachable": true,
"leg_distance_meters": 2022,
"leg_duration_seconds": 241,
"leg_geometry": null,
"arrival": "2026-11-02T08:28:13-05:00",
"arrival_epoch": 1793626093,
"distance_meters": 10224,
"duration_seconds": 1273
}
]
}
],
"summary": {
"inserted": 2,
"unplaced": 0,
"added_distance_meters": 4585,
"added_duration_seconds": 570,
"violations": 0
}
},
"warnings": [],
"meta": {
"region": "NA",
"profile": "car",
"objective": "duration",
"nearest": 25,
"legs_measured": 23
},
"billing": {
"unit": "node",
"quantity": 5,
"counted": true,
"breakdown": {
"planned_stops": 3,
"new_jobs": 2
}
}
}
}
}
openRoutingOptimize
mutation
node
Stable
Plan routes across a fleet from jobs, vehicles and constraints you supply.
mutation Optimize($input: Json!) {
openRoutingOptimize(input: $input) {
mode
job
routes
unassigned
summary
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": [
10
],
"time_window": [
"2026-11-02T08:00:00-05:00",
"2026-11-02T17:00:00-05:00"
]
},
{
"id": "van-2",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": [
10
]
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": [
2
]
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": [
3
],
"time_windows": [
[
"2026-11-02T09:00:00-05:00",
"2026-11-02T12:00:00-05:00"
]
]
},
{
"id": "order-1003",
"location": {
"lat": 45.5231,
"lng": -73.5817
},
"service_seconds": 240,
"amount": [
1
]
}
]
}
}
Response example
{
"data": {
"openRoutingOptimize": {
"mode": "sync",
"job": null,
"routes": [
{
"vehicle_id": "van-2",
"stops": [
{
"type": "start",
"arrival": "2026-11-02T08:31:07-05:00",
"arrival_epoch": 1793626267,
"distance_meters": 0,
"duration_seconds": 0,
"load": [
6
]
},
{
"type": "job",
"arrival": "2026-11-02T08:35:11-05:00",
"arrival_epoch": 1793626511,
"distance_meters": 1839,
"duration_seconds": 244,
"leg_distance_meters": 1839,
"leg_duration_seconds": 244,
"id": "order-1001",
"load": [
4
]
},
{
"type": "job",
"arrival": "2026-11-02T08:47:56-05:00",
"arrival_epoch": 1793627276,
"distance_meters": 5338,
"duration_seconds": 709,
"leg_distance_meters": 3499,
"leg_duration_seconds": 465,
"id": "order-1003",
"load": [
3
]
},
{
"type": "job",
"arrival": "2026-11-02T09:00:00-05:00",
"arrival_epoch": 1793628000,
"distance_meters": 9220,
"duration_seconds": 1193,
"leg_distance_meters": 3882,
"leg_duration_seconds": 484,
"id": "order-1002",
"load": [
0
]
},
{
"type": "end",
"arrival": "2026-11-02T09:08:17-05:00",
"arrival_epoch": 1793628497,
"distance_meters": 10687,
"duration_seconds": 1390,
"leg_distance_meters": 1467,
"leg_duration_seconds": 197,
"load": [
0
]
}
],
"stop_count": 5,
"task_count": 3,
"distance_meters": 10687,
"duration_seconds": 1390,
"service_seconds": 840,
"waiting_seconds": 0,
"geometry": null
}
],
"unassigned": [],
"summary": {
"routes": 1,
"assigned": 3,
"unassigned": 0,
"distance_meters": 10687,
"duration_seconds": 1390
},
"warnings": [],
"meta": {
"engine": "sroute2",
"engine_version": "1.6.1",
"solve_id": "ab4fdf5d-b172-4d85-b2eb-553d35ed3946",
"capacity_dimensions": [
"0"
]
},
"billing": {
"unit": "node",
"quantity": 5,
"counted": true,
"breakdown": {
"nodes": 5,
"jobs": 3,
"shipments": 0,
"shipment_nodes": 0,
"vehicles": 2,
"vehicle_nodes": 2
}
}
}
}
}
openRoutingRefine
mutation
node
Stable
Re-optimize an existing plan locally or globally, keeping chosen stops frozen.
mutation Run($input: Json!) {
openRoutingRefine(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": [
10
],
"time_window": [
"2026-11-02T08:00:00-05:00",
"2026-11-02T17:00:00-05:00"
]
},
{
"id": "van-2",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": [
10
]
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": [
2
]
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": [
3
],
"time_windows": [
[
"2026-11-02T09:00:00-05:00",
"2026-11-02T12:00:00-05:00"
]
]
},
{
"id": "order-1003",
"location": {
"lat": 45.5231,
"lng": -73.5817
},
"service_seconds": 240,
"amount": [
1
]
}
],
"existing_routes": [
{
"vehicle_id": "van-1",
"stops": [
{
"id": "order-1001"
},
{
"id": "order-1002"
}
]
},
{
"vehicle_id": "van-2",
"stops": [
{
"id": "order-1003"
}
]
}
]
}
}
Response example
{
"data": {
"openRoutingRefine": {
"mode": "sync",
"job": null,
"data": {
"routes": [
{
"vehicle_id": "van-1",
"stops": [
{
"type": "start",
"arrival": "2026-11-02T08:00:00-05:00",
"arrival_epoch": 1793624400,
"distance_meters": 0,
"duration_seconds": 0,
"load": [
3
]
},
{
"type": "job",
"arrival": "2026-11-02T08:08:01-05:00",
"arrival_epoch": 1793624881,
"distance_meters": 3635,
"duration_seconds": 481,
"leg_distance_meters": 3635,
"leg_duration_seconds": 481,
"id": "order-1003",
"load": [
2
]
},
{
"type": "job",
"arrival": "2026-11-02T08:18:34-05:00",
"arrival_epoch": 1793625514,
"distance_meters": 6563,
"duration_seconds": 874,
"leg_distance_meters": 2928,
"leg_duration_seconds": 393,
"id": "order-1001",
"load": [
0
]
},
{
"type": "end",
"arrival": "2026-11-02T08:27:15-05:00",
"arrival_epoch": 1793626035,
"distance_meters": 8356,
"duration_seconds": 1095,
"leg_distance_meters": 1793,
"leg_duration_seconds": 221,
"load": [
0
]
}
],
"stop_count": 4,
"task_count": 2,
"distance_meters": 8356,
"duration_seconds": 1095,
"service_seconds": 540,
"waiting_seconds": 0,
"geometry": null
},
{
"vehicle_id": "van-2",
"stops": [
{
"type": "start",
"arrival": "2026-11-02T08:56:13-05:00",
"arrival_epoch": 1793627773,
"distance_meters": 0,
"duration_seconds": 0,
"load": [
3
]
},
{
"type": "job",
"arrival": "2026-11-02T09:00:00-05:00",
"arrival_epoch": 1793628000,
"distance_meters": 1610,
"duration_seconds": 227,
"leg_distance_meters": 1610,
"leg_duration_seconds": 227,
"id": "order-1002",
"load": [
0
]
},
{
"type": "end",
"arrival": "2026-11-02T09:08:17-05:00",
"arrival_epoch": 1793628497,
"distance_meters": 3077,
"duration_seconds": 424,
"leg_distance_meters": 1467,
"leg_duration_seconds": 197,
"load": [
0
]
}
],
"stop_count": 3,
"task_count": 1,
"distance_meters": 3077,
"duration_seconds": 424,
"service_seconds": 300,
"waiting_seconds": 0,
"geometry": null
}
],
"unassigned": [],
"summary": {
"routes": 2,
"assigned": 3,
"unassigned": 0,
"distance_meters": 11433,
"duration_seconds": 1519
}
},
"warnings": [],
"meta": {
"engine": "sroute2",
"engine_version": "1.6.1",
"capacity_dimensions": [
"0"
]
},
"billing": {
"unit": "node",
"quantity": 5,
"counted": true,
"breakdown": {
"nodes": 5,
"jobs": 3,
"shipments": 0,
"shipment_nodes": 0,
"vehicles": 2,
"vehicle_nodes": 2,
"route_stops": 0
}
}
}
}
}
openRoutingWhatIf
query
call
Beta
Score several alternative plans side by side without committing to any.
query WhatIf($input: Json!) {
openRoutingWhatIf(input: $input)
}
Variables
{
"input": {
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": [
10
],
"time_window": [
"2026-11-02T08:00:00-05:00",
"2026-11-02T17:00:00-05:00"
]
},
{
"id": "van-2",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": [
10
]
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": [
2
]
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": [
3
],
"time_windows": [
[
"2026-11-02T09:00:00-05:00",
"2026-11-02T12:00:00-05:00"
]
]
},
{
"id": "order-1003",
"location": {
"lat": 45.5231,
"lng": -73.5817
},
"service_seconds": 240,
"amount": [
1
]
}
],
"existing_routes": [
{
"vehicle_id": "van-1",
"stops": [
{
"id": "order-1001"
},
{
"id": "order-1002"
}
]
},
{
"vehicle_id": "van-2",
"stops": [
{
"id": "order-1003"
}
]
}
]
}
}
Response example
{
"data": {
"openRoutingWhatIf": {
"plans": [
{
"plan_id": "min_change",
"strategy": "min_change",
"routes": [
{
"vehicle_id": "van-1",
"stops": [
{
"type": "start",
"arrival": "2026-11-02T08:00:00-05:00",
"arrival_epoch": 1793624400,
"distance_meters": 0,
"duration_seconds": 0,
"load": [
3
]
},
{
"type": "job",
"arrival": "2026-11-02T08:08:01-05:00",
"arrival_epoch": 1793624881,
"distance_meters": 3635,
"duration_seconds": 481,
"leg_distance_meters": 3635,
"leg_duration_seconds": 481,
"id": "order-1003",
"load": [
2
]
},
{
"type": "job",
"arrival": "2026-11-02T08:18:34-05:00",
"arrival_epoch": 1793625514,
"distance_meters": 6563,
"duration_seconds": 874,
"leg_distance_meters": 2928,
"leg_duration_seconds": 393,
"id": "order-1001",
"load": [
0
]
},
{
"type": "end",
"arrival": "2026-11-02T08:27:15-05:00",
"arrival_epoch": 1793626035,
"distance_meters": 8356,
"duration_seconds": 1095,
"leg_distance_meters": 1793,
"leg_duration_seconds": 221,
"load": [
0
]
}
],
"stop_count": 4,
"task_count": 2,
"distance_meters": 8356,
"duration_seconds": 1095,
"service_seconds": 540,
"waiting_seconds": 0,
"geometry": null
},
{
"vehicle_id": "van-2",
"stops": [
{
"type": "start",
"arrival": "2026-11-02T08:56:13-05:00",
"arrival_epoch": 1793627773,
"distance_meters": 0,
"duration_seconds": 0,
"load": [
3
]
},
{
"type": "job",
"arrival": "2026-11-02T09:00:00-05:00",
"arrival_epoch": 1793628000,
"distance_meters": 1610,
"duration_seconds": 227,
"leg_distance_meters": 1610,
"leg_duration_seconds": 227,
"id": "order-1002",
"load": [
0
]
},
{
"type": "end",
"arrival": "2026-11-02T09:08:17-05:00",
"arrival_epoch": 1793628497,
"distance_meters": 3077,
"duration_seconds": 424,
"leg_distance_meters": 1467,
"leg_duration_seconds": 197,
"load": [
0
]
}
],
"stop_count": 3,
"task_count": 1,
"distance_meters": 3077,
"duration_seconds": 424,
"service_seconds": 300,
"waiting_seconds": 0,
"geometry": null
}
],
"unassigned": [],
"summary": {
"routes": 2,
"assigned": 3,
"unassigned": 0,
"distance_meters": 11433,
"duration_seconds": 1519
}
},
{
"plan_id": "rebalance",
"strategy": "rebalance",
"routes": [
{
"vehicle_id": "van-2",
"stops": [
{
"type": "start",
"arrival": "2026-11-02T08:31:07-05:00",
"arrival_epoch": 1793626267,
"distance_meters": 0,
"duration_seconds": 0,
"load": [
6
]
},
{
"type": "job",
"arrival": "2026-11-02T08:35:11-05:00",
"arrival_epoch": 1793626511,
"distance_meters": 1839,
"duration_seconds": 244,
"leg_distance_meters": 1839,
"leg_duration_seconds": 244,
"id": "order-1001",
"load": [
4
]
},
{
"type": "job",
"arrival": "2026-11-02T08:47:56-05:00",
"arrival_epoch": 1793627276,
"distance_meters": 5338,
"duration_seconds": 709,
"leg_distance_meters": 3499,
"leg_duration_seconds": 465,
"id": "order-1003",
"load": [
3
]
},
{
"type": "job",
"arrival": "2026-11-02T09:00:00-05:00",
"arrival_epoch": 1793628000,
"distance_meters": 9220,
"duration_seconds": 1193,
"leg_distance_meters": 3882,
"leg_duration_seconds": 484,
"id": "order-1002",
"load": [
0
]
},
{
"type": "end",
"arrival": "2026-11-02T09:08:17-05:00",
"arrival_epoch": 1793628497,
"distance_meters": 10687,
"duration_seconds": 1390,
"leg_distance_meters": 1467,
"leg_duration_seconds": 197,
"load": [
0
]
}
],
"stop_count": 5,
"task_count": 3,
"distance_meters": 10687,
"duration_seconds": 1390,
"service_seconds": 840,
"waiting_seconds": 0,
"geometry": null
}
],
"unassigned": [
{
"id": "order-1004",
"reason": "unspecified"
}
],
"summary": {
"routes": 1,
"assigned": 3,
"unassigned": 1,
"distance_meters": 10687,
"duration_seconds": 1390
}
}
]
}
}
}
Dispatch
openPlanInsert
query
node
Beta
Place new jobs in a plan you hold at their cheapest positions, without re-planning the rest, and receive the plan priced with the positions to choose from.
query Run($input: Json!) {
openPlanInsert(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"departed_at": "2026-10-23T09:30:00-04:00",
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
},
{
"id": "van-2",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": {
"parcels": 2
}
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": {
"parcels": 3
}
},
{
"id": "order-1003",
"location": {
"lat": 45.5231,
"lng": -73.5817
},
"service_seconds": 300,
"amount": {
"parcels": 1
}
},
{
"id": "order-1004",
"location": {
"lat": 45.5302,
"lng": -73.6125
},
"service_seconds": 300,
"amount": {
"parcels": 2
}
}
],
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1002",
"order-1003"
]
}
],
"options": {
"geometry": false
},
"matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
"insert": [
{
"id": "order-1005",
"location": {
"lat": 45.5149,
"lng": -73.5734
},
"service_seconds": 300,
"amount": {
"parcels": 1
}
}
],
"limit": 2
}
}
Response example
{
"data": {
"openPlanInsert": {
"mode": "sync",
"job": null,
"data": {
"routes": [
{
"vehicle_id": "van-1",
"stop_count": 6,
"task_count": 4,
"distance_meters": 12865,
"duration_seconds": 1664,
"service_seconds": 1200,
"waiting_seconds": 0,
"departure": "2026-10-23T09:30:00-04:00",
"completion": "2026-10-23T10:17:44-04:00",
"unreachable_legs": 0,
"violations": [],
"violation_count": 0,
"stops": [
{
"type": "start",
"departure": "2026-10-23T09:30:00-04:00"
},
{
"type": "job",
"id": "order-1001",
"sequence": 1,
"reachable": true,
"leg_distance_meters": 1840,
"leg_duration_seconds": 245,
"leg_geometry": null,
"arrival": "2026-10-23T09:34:05-04:00",
"arrival_epoch": 1792762445,
"distance_meters": 1840,
"duration_seconds": 245
},
{
"type": "job",
"id": "order-1002",
"sequence": 2,
"reachable": true,
"leg_distance_meters": 3108,
"leg_duration_seconds": 390,
"leg_geometry": null,
"arrival": "2026-10-23T09:45:35-04:00",
"arrival_epoch": 1792763135,
"distance_meters": 4948,
"duration_seconds": 635
},
{
"type": "job",
"id": "order-1003",
"sequence": 3,
"reachable": true,
"leg_distance_meters": 4326,
"leg_duration_seconds": 551,
"leg_geometry": null,
"arrival": "2026-10-23T09:59:46-04:00",
"arrival_epoch": 1792763986,
"distance_meters": 9274,
"duration_seconds": 1186
},
{
"type": "job",
"id": "order-1005",
"sequence": 4,
"reachable": true,
"leg_distance_meters": 1512,
"leg_duration_seconds": 218,
"leg_geometry": null,
"arrival": "2026-10-23T10:08:24-04:00",
"arrival_epoch": 1792764504,
"distance_meters": 10786,
"duration_seconds": 1404
},
{
"type": "end",
"reachable": true,
"leg_distance_meters": 2079,
"leg_duration_seconds": 260,
"leg_geometry": null,
"arrival": "2026-10-23T10:17:44-04:00",
"arrival_epoch": 1792765064,
"distance_meters": 12865,
"duration_seconds": 1664
}
]
}
],
"summary": {
"routes": 1,
"tasks": 4,
"distance_meters": 12865,
"duration_seconds": 1664,
"unreachable_legs": 0,
"violations": 0
},
"plan": {
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1002",
"order-1003",
"order-1005"
]
}
],
"unassigned": [
"order-1004"
]
},
"insert": [
{
"job": "order-1005",
"placed": true,
"choices": [
{
"feasible": true,
"vehicle_id": "van-1",
"position": 4,
"after": "order-1003",
"added_distance_meters": 82,
"added_duration_seconds": 44,
"added_waiting_seconds": 0,
"arrival": "2026-10-23T10:08:24-04:00",
"waiting_seconds": 0,
"service_start": "2026-10-23T10:08:24-04:00"
},
{
"feasible": true,
"vehicle_id": "van-1",
"position": 3,
"after": "order-1002",
"added_distance_meters": 766,
"added_duration_seconds": 118,
"added_waiting_seconds": 0,
"arrival": "2026-10-23T09:56:57-04:00",
"waiting_seconds": 0,
"service_start": "2026-10-23T09:56:57-04:00"
}
]
}
]
},
"warnings": [],
"meta": {
"region": "NA",
"profile": "car",
"geometry": false,
"geometry_format": null,
"departed_at": "2026-10-23T09:30:00-04:00",
"objective": "duration",
"limit": 2
},
"billing": {
"unit": "node",
"quantity": 4,
"counted": true,
"breakdown": {
"planned_stops": 3,
"new_jobs": 1
}
}
}
}
}
openPlanMove
query
node
Beta
Move stops of a plan you hold to a route at a chosen position and receive the edited plan priced, with whether the routes it touched keep their rules.
query Run($input: Json!) {
openPlanMove(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"departed_at": "2026-10-23T09:30:00-04:00",
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
},
{
"id": "van-2",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": {
"parcels": 2
}
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": {
"parcels": 3
}
},
{
"id": "order-1003",
"location": {
"lat": 45.5231,
"lng": -73.5817
},
"service_seconds": 300,
"amount": {
"parcels": 1
}
}
],
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1002",
"order-1003"
]
}
],
"options": {
"geometry": false
},
"matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
"stops": [
"order-1003"
],
"vehicle_id": "van-2",
"position": 1
}
}
Response example
{
"data": {
"openPlanMove": {
"mode": "sync",
"job": null,
"data": {
"routes": [
{
"vehicle_id": "van-1",
"stop_count": 4,
"task_count": 2,
"distance_meters": 6246,
"duration_seconds": 822,
"service_seconds": 600,
"waiting_seconds": 0,
"departure": "2026-10-23T09:30:00-04:00",
"completion": "2026-10-23T09:53:42-04:00",
"unreachable_legs": 0,
"violations": [],
"violation_count": 0,
"stops": [
{
"type": "start",
"departure": "2026-10-23T09:30:00-04:00"
},
{
"type": "job",
"id": "order-1001",
"sequence": 1,
"reachable": true,
"leg_distance_meters": 1759,
"leg_duration_seconds": 231,
"leg_geometry": null,
"arrival": "2026-10-23T09:33:51-04:00",
"arrival_epoch": 1792762431,
"distance_meters": 1759,
"duration_seconds": 231
},
{
"type": "job",
"id": "order-1002",
"sequence": 2,
"reachable": true,
"leg_distance_meters": 3120,
"leg_duration_seconds": 411,
"leg_geometry": null,
"arrival": "2026-10-23T09:45:42-04:00",
"arrival_epoch": 1792763142,
"distance_meters": 4879,
"duration_seconds": 642
},
{
"type": "end",
"reachable": true,
"leg_distance_meters": 1367,
"leg_duration_seconds": 180,
"leg_geometry": null,
"arrival": "2026-10-23T09:53:42-04:00",
"arrival_epoch": 1792763622,
"distance_meters": 6246,
"duration_seconds": 822
}
]
},
{
"vehicle_id": "van-2",
"stop_count": 3,
"task_count": 1,
"distance_meters": 7104,
"duration_seconds": 934,
"service_seconds": 300,
"waiting_seconds": 0,
"departure": "2026-10-23T09:30:00-04:00",
"completion": "2026-10-23T09:50:34-04:00",
"unreachable_legs": 0,
"violations": [],
"violation_count": 0,
"stops": [
{
"type": "start",
"departure": "2026-10-23T09:30:00-04:00"
},
{
"type": "job",
"id": "order-1003",
"sequence": 1,
"reachable": true,
"leg_distance_meters": 3552,
"leg_duration_seconds": 467,
"leg_geometry": null,
"arrival": "2026-10-23T09:37:47-04:00",
"arrival_epoch": 1792762667,
"distance_meters": 3552,
"duration_seconds": 467
},
{
"type": "end",
"reachable": true,
"leg_distance_meters": 3552,
"leg_duration_seconds": 467,
"leg_geometry": null,
"arrival": "2026-10-23T09:50:34-04:00",
"arrival_epoch": 1792763434,
"distance_meters": 7104,
"duration_seconds": 934
}
]
}
],
"summary": {
"routes": 2,
"tasks": 3,
"distance_meters": 13350,
"duration_seconds": 1756,
"unreachable_legs": 0,
"violations": 0
},
"plan": {
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1002"
]
},
{
"vehicle_id": "van-2",
"stops": [
"order-1003"
]
}
],
"unassigned": []
},
"move": {
"vehicle_id": "van-2",
"position": 1,
"stops": [
"order-1003"
],
"from": [
{
"id": "order-1003",
"vehicle_id": "van-1",
"position": 3
}
],
"feasible": true,
"violations": 0
}
},
"warnings": [],
"meta": {
"region": "NA",
"profile": "car",
"geometry": false,
"geometry_format": null,
"departed_at": "2026-10-23T09:30:00-04:00"
},
"billing": {
"unit": "node",
"quantity": 3,
"counted": true,
"breakdown": {
"tasks": 3,
"routes": 2
}
}
}
}
}
openPlanRecost
query
node
Stable
Price an edited plan exactly as given — per-leg distance, duration and road geometry, with arrival times — without resequencing it. Stated constraints (time windows, capacity, skills, vehicle ceilings) are judged and reported as violations, never refused.
query Run($input: Json!) {
openPlanRecost(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": [
10
]
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": [
2
]
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": [
3
]
}
],
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1002"
]
}
]
}
}
Response example
{
"data": {
"openPlanRecost": {
"mode": "sync",
"job": null,
"data": {
"routes": [
{
"vehicle_id": "van-1",
"stop_count": 4,
"task_count": 2,
"distance_meters": 6416,
"duration_seconds": 832,
"service_seconds": 600,
"waiting_seconds": 0,
"departure": "2026-10-23T09:27:56-04:00",
"completion": "2026-10-23T09:51:48-04:00",
"unreachable_legs": 0,
"violations": [],
"violation_count": 0,
"stops": [
{
"type": "start",
"departure": "2026-10-23T09:27:56-04:00"
},
{
"type": "job",
"id": "order-1001",
"sequence": 1,
"reachable": true,
"leg_distance_meters": 1840,
"leg_duration_seconds": 245,
"leg_geometry": "y`vtGjr_`MJUNYL[h@gAHOFQBIHOc@g@MOa@]s@q@EGEEk@g@k@k@CCMMDO@EDMBMBOBQBO@KBM?G@OBQ?G@MBQ@MBMBMBOBOBMFSDSBGBIBGHOvAkE@EHQGEECa@_@ECMKKIwAiA_CmBq@m@ECIIOKoAcAs@i@KIIIOMgA{@QMCCGGGE_@[m@g@a@[kA_ACCECKGKGWSQOwAkAGEGEu@o@CCMIMKGEYSeAq@OKa@WGG[Sy@g@w@k@s@e@GEGE??YQgAu@c@[QKc@YMKKG@EBK@EVo@@EDKDM@Cb@cAFOBIt@oBBEDUJFBBFDx@l@??",
"arrival": "2026-10-23T09:32:01-04:00",
"arrival_epoch": 1792762321,
"distance_meters": 1840,
"duration_seconds": 245
},
{
"type": "job",
"id": "order-1002",
"sequence": 2,
"reachable": true,
"leg_distance_meters": 3108,
"leg_duration_seconds": 390,
"leg_geometry": "elwtGl}|_Mx@n@BBFD\\ZDDDBz@l@`@\\~BdB~AjAf@\\DDBBLDEPEJe@zAADENGNCFW|@Y|@CFA@ELCHGRq@jBABu@tBCHAFEJGNADg@vAKXq@lBABEHAHgA|C_@fASf@ADGPO^JHbAt@`CrBBBJHLJhCzBJL~BvBFDJJHF~@r@zAdABBHFLHdDfCBBFFFDJHvDlCRJDBRHXPx@f@D@HHJFVV|@x@BBLJTRJJTTlBdBLL`@\\h@f@ZXNLr@p@BBB@JJJHv@r@j@h@DDNLJJp@l@HHj@j@DBLLRRfB`BBBJJHFv@r@x@t@B@HHJJz@v@RRl@j@BBHHJHhAfAj@j@BBNLHHLLVT|@z@HFIPw@tBmAbDy@vBe@pACDIPIRg@pAO\\{A`ECDAFEJHHp@p@??",
"arrival": "2026-10-23T09:43:31-04:00",
"arrival_epoch": 1792763011,
"distance_meters": 4948,
"duration_seconds": 635
},
{
"type": "end",
"reachable": true,
"leg_distance_meters": 1468,
"leg_duration_seconds": 197,
"leg_geometry": "{cutG|wa`Md@f@LJFDDDFBBBFBDKBGrAkDFQBGp@eB@EFSFSBCb@mAl@}AjA{Cb@iAd@mABEFQJ[IG{ByBIGGIMKIKo@m@OMGI[Yc@a@e@c@m@m@ECIIKKaA}@EEu@q@CCIIKIq@o@{@y@ECIIII_@[[Y_@_@ECWWQOIIGE]]QO_@]CCKKYWKIu@q@MMYWCCKKKIACoAiAuAoAKIs@q@eA_AKKCCOOJO@A??",
"arrival": "2026-10-23T09:51:48-04:00",
"arrival_epoch": 1792763508,
"distance_meters": 6416,
"duration_seconds": 832
}
]
}
],
"summary": {
"routes": 1,
"tasks": 2,
"distance_meters": 6416,
"duration_seconds": 832,
"unreachable_legs": 0,
"violations": 0
}
},
"warnings": [],
"meta": {
"region": "NA",
"profile": "car",
"geometry": true,
"geometry_format": "polyline",
"departed_at": "2026-10-23T09:27:56-04:00"
},
"billing": {
"unit": "node",
"quantity": 2,
"counted": true,
"breakdown": {
"tasks": 2,
"routes": 1
}
}
}
}
}
openPlanRefine
query
node
Beta
Re-order the stops of chosen routes of a plan you hold around stops you lock, and receive the plan priced; a new order is kept only when it is better.
query Run($input: Json!) {
openPlanRefine(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"departed_at": "2026-10-23T09:30:00-04:00",
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
},
{
"id": "van-2",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": {
"parcels": 2
}
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": {
"parcels": 3
}
},
{
"id": "order-1003",
"location": {
"lat": 45.5231,
"lng": -73.5817
},
"service_seconds": 300,
"amount": {
"parcels": 1
}
},
{
"id": "order-1004",
"location": {
"lat": 45.5302,
"lng": -73.6125
},
"service_seconds": 300,
"amount": {
"parcels": 2
}
}
],
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1002",
"order-1004",
"order-1001",
"order-1003"
]
}
],
"options": {
"geometry": false
},
"matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
"freeze": [
"order-1002"
]
}
}
Response example
{
"data": {
"openPlanRefine": {
"mode": "sync",
"job": null,
"data": {
"routes": [
{
"vehicle_id": "van-1",
"stop_count": 6,
"task_count": 4,
"distance_meters": 17473,
"duration_seconds": 2286,
"service_seconds": 1200,
"waiting_seconds": 0,
"departure": "2026-10-23T09:30:00-04:00",
"completion": "2026-10-23T10:28:06-04:00",
"unreachable_legs": 0,
"violations": [],
"violation_count": 0,
"stops": [
{
"type": "start",
"departure": "2026-10-23T09:30:00-04:00"
},
{
"type": "job",
"id": "order-1002",
"sequence": 1,
"reachable": true,
"leg_distance_meters": 1611,
"leg_duration_seconds": 227,
"leg_geometry": null,
"arrival": "2026-10-23T09:33:47-04:00",
"arrival_epoch": 1792762427,
"distance_meters": 1611,
"duration_seconds": 227
},
{
"type": "job",
"id": "order-1001",
"sequence": 2,
"reachable": true,
"leg_distance_meters": 3355,
"leg_duration_seconds": 421,
"leg_geometry": null,
"arrival": "2026-10-23T09:45:48-04:00",
"arrival_epoch": 1792763148,
"distance_meters": 4966,
"duration_seconds": 648
},
{
"type": "job",
"id": "order-1003",
"sequence": 3,
"reachable": true,
"leg_distance_meters": 3500,
"leg_duration_seconds": 466,
"leg_geometry": null,
"arrival": "2026-10-23T09:58:34-04:00",
"arrival_epoch": 1792763914,
"distance_meters": 8466,
"duration_seconds": 1114
},
{
"type": "job",
"id": "order-1004",
"sequence": 4,
"reachable": true,
"leg_distance_meters": 3487,
"leg_duration_seconds": 492,
"leg_geometry": null,
"arrival": "2026-10-23T10:11:46-04:00",
"arrival_epoch": 1792764706,
"distance_meters": 11953,
"duration_seconds": 1606
},
{
"type": "end",
"reachable": true,
"leg_distance_meters": 5520,
"leg_duration_seconds": 680,
"leg_geometry": null,
"arrival": "2026-10-23T10:28:06-04:00",
"arrival_epoch": 1792765686,
"distance_meters": 17473,
"duration_seconds": 2286
}
]
}
],
"summary": {
"routes": 1,
"tasks": 4,
"distance_meters": 17473,
"duration_seconds": 2286,
"unreachable_legs": 0,
"violations": 0
},
"plan": {
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1002",
"order-1001",
"order-1003",
"order-1004"
]
}
],
"unassigned": []
},
"refine": {
"vehicle_ids": [
"van-1"
],
"freeze": [
"order-1002"
],
"changed": true,
"moved": 3,
"before": {
"distance_meters": 21187,
"duration_seconds": 2717,
"waiting_seconds": 0,
"violations": 0,
"unreachable_legs": 0
}
}
},
"warnings": [],
"meta": {
"region": "NA",
"profile": "car",
"geometry": false,
"geometry_format": null,
"departed_at": "2026-10-23T09:30:00-04:00"
},
"billing": {
"unit": "node",
"quantity": 4,
"counted": true,
"breakdown": {
"tasks": 4,
"routes": 1
}
}
}
}
}
openPlanRemove
query
node
Beta
Take stops of a plan you hold off their routes into the unassigned pool and receive the edited plan priced.
query Run($input: Json!) {
openPlanRemove(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"departed_at": "2026-10-23T09:30:00-04:00",
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
},
{
"id": "van-2",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": {
"parcels": 2
}
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": {
"parcels": 3
}
},
{
"id": "order-1003",
"location": {
"lat": 45.5231,
"lng": -73.5817
},
"service_seconds": 300,
"amount": {
"parcels": 1
}
}
],
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1002",
"order-1003"
]
}
],
"options": {
"geometry": false
},
"matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
"stops": [
"order-1002"
]
}
}
Response example
{
"data": {
"openPlanRemove": {
"mode": "sync",
"job": null,
"data": {
"routes": [
{
"vehicle_id": "van-1",
"stop_count": 4,
"task_count": 2,
"distance_meters": 8931,
"duration_seconds": 1174,
"service_seconds": 600,
"waiting_seconds": 0,
"departure": "2026-10-23T09:30:00-04:00",
"completion": "2026-10-23T09:59:34-04:00",
"unreachable_legs": 0,
"violations": [],
"violation_count": 0,
"stops": [
{
"type": "start",
"departure": "2026-10-23T09:30:00-04:00"
},
{
"type": "job",
"id": "order-1001",
"sequence": 1,
"reachable": true,
"leg_distance_meters": 1759,
"leg_duration_seconds": 231,
"leg_geometry": null,
"arrival": "2026-10-23T09:33:51-04:00",
"arrival_epoch": 1792762431,
"distance_meters": 1759,
"duration_seconds": 231
},
{
"type": "job",
"id": "order-1003",
"sequence": 2,
"reachable": true,
"leg_distance_meters": 3620,
"leg_duration_seconds": 476,
"leg_geometry": null,
"arrival": "2026-10-23T09:46:47-04:00",
"arrival_epoch": 1792763207,
"distance_meters": 5379,
"duration_seconds": 707
},
{
"type": "end",
"reachable": true,
"leg_distance_meters": 3552,
"leg_duration_seconds": 467,
"leg_geometry": null,
"arrival": "2026-10-23T09:59:34-04:00",
"arrival_epoch": 1792763974,
"distance_meters": 8931,
"duration_seconds": 1174
}
]
}
],
"summary": {
"routes": 1,
"tasks": 2,
"distance_meters": 8931,
"duration_seconds": 1174,
"unreachable_legs": 0,
"violations": 0
},
"plan": {
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1003"
]
}
],
"unassigned": [
"order-1002"
]
},
"removed": [
{
"id": "order-1002",
"vehicle_id": "van-1",
"position": 2
}
]
},
"warnings": [],
"meta": {
"region": "NA",
"profile": "car",
"geometry": false,
"geometry_format": null,
"departed_at": "2026-10-23T09:30:00-04:00"
},
"billing": {
"unit": "node",
"quantity": 2,
"counted": true,
"breakdown": {
"tasks": 2,
"routes": 1
}
}
}
}
}
openPlanResequence
query
node
Beta
Give one route of a plan you hold a new stop order and receive the edited plan priced, with every violation named.
query Run($input: Json!) {
openPlanResequence(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"departed_at": "2026-10-23T09:30:00-04:00",
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
},
{
"id": "van-2",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": {
"parcels": 2
}
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": {
"parcels": 3
}
},
{
"id": "order-1003",
"location": {
"lat": 45.5231,
"lng": -73.5817
},
"service_seconds": 300,
"amount": {
"parcels": 1
}
}
],
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1002",
"order-1003"
]
}
],
"options": {
"geometry": false
},
"matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
"vehicle_id": "van-1",
"stops": [
"order-1002",
"order-1001",
"order-1003"
]
}
}
Response example
{
"data": {
"openPlanResequence": {
"mode": "sync",
"job": null,
"data": {
"routes": [
{
"vehicle_id": "van-1",
"stop_count": 5,
"task_count": 3,
"distance_meters": 11659,
"duration_seconds": 1534,
"service_seconds": 900,
"waiting_seconds": 0,
"departure": "2026-10-23T09:30:00-04:00",
"completion": "2026-10-23T10:10:34-04:00",
"unreachable_legs": 0,
"violations": [],
"violation_count": 0,
"stops": [
{
"type": "start",
"departure": "2026-10-23T09:30:00-04:00"
},
{
"type": "job",
"id": "order-1002",
"sequence": 1,
"reachable": true,
"leg_distance_meters": 1367,
"leg_duration_seconds": 180,
"leg_geometry": null,
"arrival": "2026-10-23T09:33:00-04:00",
"arrival_epoch": 1792762380,
"distance_meters": 1367,
"duration_seconds": 180
},
{
"type": "job",
"id": "order-1001",
"sequence": 2,
"reachable": true,
"leg_distance_meters": 3120,
"leg_duration_seconds": 411,
"leg_geometry": null,
"arrival": "2026-10-23T09:44:51-04:00",
"arrival_epoch": 1792763091,
"distance_meters": 4487,
"duration_seconds": 591
},
{
"type": "job",
"id": "order-1003",
"sequence": 3,
"reachable": true,
"leg_distance_meters": 3620,
"leg_duration_seconds": 476,
"leg_geometry": null,
"arrival": "2026-10-23T09:57:47-04:00",
"arrival_epoch": 1792763867,
"distance_meters": 8107,
"duration_seconds": 1067
},
{
"type": "end",
"reachable": true,
"leg_distance_meters": 3552,
"leg_duration_seconds": 467,
"leg_geometry": null,
"arrival": "2026-10-23T10:10:34-04:00",
"arrival_epoch": 1792764634,
"distance_meters": 11659,
"duration_seconds": 1534
}
]
}
],
"summary": {
"routes": 1,
"tasks": 3,
"distance_meters": 11659,
"duration_seconds": 1534,
"unreachable_legs": 0,
"violations": 0
},
"plan": {
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1002",
"order-1001",
"order-1003"
]
}
],
"unassigned": []
},
"resequence": {
"vehicle_id": "van-1",
"changed": true
}
},
"warnings": [],
"meta": {
"region": "NA",
"profile": "car",
"geometry": false,
"geometry_format": null,
"departed_at": "2026-10-23T09:30:00-04:00"
},
"billing": {
"unit": "node",
"quantity": 3,
"counted": true,
"breakdown": {
"tasks": 3,
"routes": 1
}
}
}
}
}
openPlanValidate
query
node
Stable
Judge a plan against its stated constraints — time windows, capacity, skills, vehicle ceilings — with every violation named. The same evaluator as re-costing, without the map payload.
query Run($input: Json!) {
openPlanValidate(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": [
10
]
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": [
2
]
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": [
3
]
}
],
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1002"
]
}
]
}
}
Response example
{
"data": {
"openPlanValidate": {
"mode": "sync",
"job": null,
"data": {
"valid": true,
"routes": [
{
"vehicle_id": "van-1",
"valid": true,
"violation_count": 0,
"violations": [],
"waiting_seconds": 0,
"completion": "2026-10-23T09:51:48-04:00",
"unreachable_legs": 0,
"stops": [
{
"type": "start",
"departure": "2026-10-23T09:27:56-04:00"
},
{
"type": "job",
"id": "order-1001",
"sequence": 1,
"reachable": true,
"arrival": "2026-10-23T09:32:01-04:00",
"arrival_epoch": 1792762321
},
{
"type": "job",
"id": "order-1002",
"sequence": 2,
"reachable": true,
"arrival": "2026-10-23T09:43:31-04:00",
"arrival_epoch": 1792763011
},
{
"type": "end",
"reachable": true,
"arrival": "2026-10-23T09:51:48-04:00",
"arrival_epoch": 1792763508
}
]
}
],
"summary": {
"routes": 1,
"tasks": 2,
"distance_meters": 6416,
"duration_seconds": 832,
"unreachable_legs": 0,
"violations": 0
}
},
"warnings": [],
"meta": {
"region": "NA",
"profile": "car",
"departed_at": "2026-10-23T09:27:56-04:00"
},
"billing": {
"unit": "node",
"quantity": 2,
"counted": true,
"breakdown": {
"tasks": 2,
"routes": 1
}
}
}
}
}
openPlanWhatIf
query
node
Beta
Price and judge several alternative plans of the same vehicles and jobs and receive them ranked.
query Run($input: Json!) {
openPlanWhatIf(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"departed_at": "2026-10-23T09:30:00-04:00",
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
},
{
"id": "van-2",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": {
"parcels": 2
}
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": {
"parcels": 3
}
},
{
"id": "order-1003",
"location": {
"lat": 45.5231,
"lng": -73.5817
},
"service_seconds": 300,
"amount": {
"parcels": 1
}
},
{
"id": "order-1004",
"location": {
"lat": 45.5302,
"lng": -73.6125
},
"service_seconds": 300,
"amount": {
"parcels": 2
}
}
],
"options": {
"geometry": false
},
"matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
"plans": [
{
"id": "one-van",
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1002",
"order-1004",
"order-1003"
]
}
]
},
{
"id": "two-vans",
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1002"
]
},
{
"vehicle_id": "van-2",
"stops": [
"order-1003",
"order-1004"
]
}
]
}
],
"objective": "duration"
}
}
Response example
{
"data": {
"openPlanWhatIf": {
"mode": "sync",
"job": null,
"data": {
"scored": true,
"ranking": [
0,
1
],
"best": 0,
"plans": [
{
"index": 0,
"id": "one-van",
"rank": 1,
"objective_value": 2335,
"summary": {
"routes": 1,
"tasks": 4,
"distance_meters": 18088,
"duration_seconds": 2335,
"unreachable_legs": 0,
"violations": 0
},
"routes": [
{
"vehicle_id": "van-1",
"stop_count": 6,
"task_count": 4,
"distance_meters": 18088,
"duration_seconds": 2335,
"service_seconds": 1200,
"waiting_seconds": 0,
"departure": "2026-10-23T09:30:00-04:00",
"completion": "2026-10-23T10:28:55-04:00",
"unreachable_legs": 0,
"violations": [],
"violation_count": 0,
"stops": [
{
"type": "start",
"departure": "2026-10-23T09:30:00-04:00"
},
{
"type": "job",
"id": "order-1001",
"sequence": 1,
"reachable": true,
"leg_distance_meters": 1840,
"leg_duration_seconds": 245,
"leg_geometry": null,
"arrival": "2026-10-23T09:34:05-04:00",
"arrival_epoch": 1792762445,
"distance_meters": 1840,
"duration_seconds": 245
},
{
"type": "job",
"id": "order-1002",
"sequence": 2,
"reachable": true,
"leg_distance_meters": 3108,
"leg_duration_seconds": 390,
"leg_geometry": null,
"arrival": "2026-10-23T09:45:35-04:00",
"arrival_epoch": 1792763135,
"distance_meters": 4948,
"duration_seconds": 635
},
{
"type": "job",
"id": "order-1004",
"sequence": 3,
"reachable": true,
"leg_distance_meters": 6451,
"leg_duration_seconds": 824,
"leg_geometry": null,
"arrival": "2026-10-23T10:04:19-04:00",
"arrival_epoch": 1792764259,
"distance_meters": 11399,
"duration_seconds": 1459
},
{
"type": "job",
"id": "order-1003",
"sequence": 4,
"reachable": true,
"leg_distance_meters": 3180,
"leg_duration_seconds": 442,
"leg_geometry": null,
"arrival": "2026-10-23T10:16:41-04:00",
"arrival_epoch": 1792765001,
"distance_meters": 14579,
"duration_seconds": 1901
},
{
"type": "end",
"reachable": true,
"leg_distance_meters": 3509,
"leg_duration_seconds": 434,
"leg_geometry": null,
"arrival": "2026-10-23T10:28:55-04:00",
"arrival_epoch": 1792765735,
"distance_meters": 18088,
"duration_seconds": 2335
}
]
}
],
"unassigned": [],
"warnings": []
},
{
"index": 1,
"id": "two-vans",
"rank": 2,
"objective_value": 2486,
"summary": {
"routes": 2,
"tasks": 4,
"distance_meters": 19058,
"duration_seconds": 2486,
"unreachable_legs": 0,
"violations": 0
},
"routes": [
{
"vehicle_id": "van-1",
"stop_count": 4,
"task_count": 2,
"distance_meters": 6416,
"duration_seconds": 832,
"service_seconds": 600,
"waiting_seconds": 0,
"departure": "2026-10-23T09:30:00-04:00",
"completion": "2026-10-23T09:53:52-04:00",
"unreachable_legs": 0,
"violations": [],
"violation_count": 0,
"stops": [
{
"type": "start",
"departure": "2026-10-23T09:30:00-04:00"
},
{
"type": "job",
"id": "order-1001",
"sequence": 1,
"reachable": true,
"leg_distance_meters": 1840,
"leg_duration_seconds": 245,
"leg_geometry": null,
"arrival": "2026-10-23T09:34:05-04:00",
"arrival_epoch": 1792762445,
"distance_meters": 1840,
"duration_seconds": 245
},
{
"type": "job",
"id": "order-1002",
"sequence": 2,
"reachable": true,
"leg_distance_meters": 3108,
"leg_duration_seconds": 390,
"leg_geometry": null,
"arrival": "2026-10-23T09:45:35-04:00",
"arrival_epoch": 1792763135,
"distance_meters": 4948,
"duration_seconds": 635
},
{
"type": "end",
"reachable": true,
"leg_distance_meters": 1468,
"leg_duration_seconds": 197,
"leg_geometry": null,
"arrival": "2026-10-23T09:53:52-04:00",
"arrival_epoch": 1792763632,
"distance_meters": 6416,
"duration_seconds": 832
}
]
},
{
"vehicle_id": "van-2",
"stop_count": 4,
"task_count": 2,
"distance_meters": 12642,
"duration_seconds": 1654,
"service_seconds": 600,
"waiting_seconds": 0,
"departure": "2026-10-23T09:30:00-04:00",
"completion": "2026-10-23T10:07:34-04:00",
"unreachable_legs": 0,
"violations": [],
"violation_count": 0,
"stops": [
{
"type": "start",
"departure": "2026-10-23T09:30:00-04:00"
},
{
"type": "job",
"id": "order-1003",
"sequence": 1,
"reachable": true,
"leg_distance_meters": 3635,
"leg_duration_seconds": 482,
"leg_geometry": null,
"arrival": "2026-10-23T09:38:02-04:00",
"arrival_epoch": 1792762682,
"distance_meters": 3635,
"duration_seconds": 482
},
{
"type": "job",
"id": "order-1004",
"sequence": 2,
"reachable": true,
"leg_distance_meters": 3487,
"leg_duration_seconds": 492,
"leg_geometry": null,
"arrival": "2026-10-23T09:51:14-04:00",
"arrival_epoch": 1792763474,
"distance_meters": 7122,
"duration_seconds": 974
},
{
"type": "end",
"reachable": true,
"leg_distance_meters": 5520,
"leg_duration_seconds": 680,
"leg_geometry": null,
"arrival": "2026-10-23T10:07:34-04:00",
"arrival_epoch": 1792764454,
"distance_meters": 12642,
"duration_seconds": 1654
}
]
}
],
"unassigned": [],
"warnings": []
}
]
},
"warnings": [],
"meta": {
"region": "NA",
"profile": "car",
"geometry": false,
"geometry_format": null,
"departed_at": "2026-10-23T09:30:00-04:00",
"objective": "duration"
},
"billing": {
"unit": "node",
"quantity": 8,
"counted": true,
"breakdown": {
"plans": 2,
"stops": 8
}
}
}
}
}
Delivery slots
openSlotsQuote
query
node
Beta
For one new job, find which delivery slots a plan you hold can take and what each costs.
query Run($input: Json!) {
openSlotsQuote(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"departed_at": "2026-11-02T08:00:00-05:00",
"vehicles": [
{
"id": "van-1",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
},
"time_window": [
"2026-11-02T08:00:00-05:00",
"2026-11-02T17:00:00-05:00"
]
},
{
"id": "van-2",
"start": {
"lat": 45.5017,
"lng": -73.5673
},
"return_to_start": true,
"capacity": {
"parcels": 10
}
}
],
"jobs": [
{
"id": "order-1001",
"location": {
"lat": 45.5088,
"lng": -73.554
},
"service_seconds": 300,
"amount": {
"parcels": 2
}
},
{
"id": "order-1002",
"location": {
"lat": 45.4972,
"lng": -73.5786
},
"service_seconds": 300,
"amount": {
"parcels": 3
},
"time_windows": [
[
"2026-11-02T09:00:00-05:00",
"2026-11-02T12:00:00-05:00"
]
]
},
{
"id": "order-1003",
"location": {
"lat": 45.5231,
"lng": -73.5817
},
"service_seconds": 240,
"amount": {
"parcels": 1
}
}
],
"routes": [
{
"vehicle_id": "van-1",
"stops": [
"order-1001",
"order-1002"
]
},
{
"vehicle_id": "van-2",
"stops": [
"order-1003"
]
}
],
"job": {
"id": "order-2001",
"location": {
"lat": 45.5155,
"lng": -73.5605
},
"service_seconds": 300,
"amount": {
"parcels": 1
}
},
"slots": [
{
"id": "08-10",
"from": "2026-11-02T08:00:00-05:00",
"to": "2026-11-02T10:00:00-05:00"
},
{
"id": "10-12",
"from": "2026-11-02T10:00:00-05:00",
"to": "2026-11-02T12:00:00-05:00"
},
{
"id": "12-14",
"from": "2026-11-02T12:00:00-05:00",
"to": "2026-11-02T14:00:00-05:00"
},
{
"id": "17-19",
"from": "2026-11-02T17:00:00-05:00",
"to": "2026-11-02T19:00:00-05:00"
}
]
}
}
Response example
{
"data": {
"openSlotsQuote": {
"mode": "sync",
"job": null,
"data": {
"job": "order-2001",
"slots": [
{
"slot": "08-10",
"from": "2026-11-02T08:00:00-05:00",
"to": "2026-11-02T10:00:00-05:00",
"feasible": true,
"best": {
"vehicle_id": "van-1",
"position": 2,
"after": "order-1001",
"added_distance_meters": 1505,
"added_duration_seconds": 213,
"added_waiting_seconds": -513,
"arrival": "2026-11-02T08:11:57-05:00",
"waiting_seconds": 0,
"service_start": "2026-11-02T08:11:57-05:00"
},
"rank": 1
},
{
"slot": "10-12",
"from": "2026-11-02T10:00:00-05:00",
"to": "2026-11-02T12:00:00-05:00",
"feasible": true,
"best": {
"vehicle_id": "van-1",
"position": 3,
"after": "order-1002",
"added_distance_meters": 4526,
"added_duration_seconds": 544,
"added_waiting_seconds": 2879,
"arrival": "2026-11-02T09:12:01-05:00",
"waiting_seconds": 2879,
"service_start": "2026-11-02T10:00:00-05:00"
},
"rank": 2
},
{
"slot": "12-14",
"from": "2026-11-02T12:00:00-05:00",
"to": "2026-11-02T14:00:00-05:00",
"feasible": true,
"best": {
"vehicle_id": "van-1",
"position": 3,
"after": "order-1002",
"added_distance_meters": 4526,
"added_duration_seconds": 544,
"added_waiting_seconds": 10079,
"arrival": "2026-11-02T09:12:01-05:00",
"waiting_seconds": 10079,
"service_start": "2026-11-02T12:00:00-05:00"
},
"rank": 3
},
{
"slot": "17-19",
"from": "2026-11-02T17:00:00-05:00",
"to": "2026-11-02T19:00:00-05:00",
"feasible": true,
"best": {
"vehicle_id": "van-2",
"position": 2,
"after": "order-1003",
"added_distance_meters": 1402,
"added_duration_seconds": 211,
"added_waiting_seconds": 31353,
"arrival": "2026-11-02T08:17:27-05:00",
"waiting_seconds": 31353,
"service_start": "2026-11-02T17:00:00-05:00"
},
"rank": 4
}
],
"summary": {
"slots": 4,
"feasible": 4,
"cheapest": "08-10"
}
},
"warnings": [],
"meta": {
"region": "NA",
"profile": "car",
"objective": "duration",
"nearest": 25,
"legs_measured": 13
},
"billing": {
"unit": "node",
"quantity": 4,
"counted": true,
"breakdown": {
"planned_stops": 3,
"new_jobs": 1
}
}
}
}
}
Geocoding
openGeoAutocomplete
query
call
Beta
Suggest addresses while they are typed, then give the chosen one as a structured address with coordinates.
query Run($input: Json!) {
openGeoAutocomplete(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"input": "1000 rue de la Gauchetiere",
"countries": [
"ca"
],
"session_token": "6f1c2a8e-4b1d-4a39-9d0e-5b8f3c7a21de"
}
}
Response example
{
"data": {
"openGeoAutocomplete": {
"mode": "sync",
"job": null,
"data": {
"suggestions": [
{
"place_id": "ChIJWeWFxFwayUwRgP5QVJUn5ww",
"description": "1000 Rue De la Gauchetière Ouest, Montreal, QC, Canada",
"main_text": "1000 Rue De la Gauchetière Ouest",
"secondary_text": "Montreal, QC, Canada",
"types": [
"geocode",
"subpremise"
]
},
{
"place_id": "ChIJybX38KwbyUwRuUlJnrlZOAk",
"description": "1000 Rue de la Gauchetière Est, Montreal, QC, Canada",
"main_text": "1000 Rue de la Gauchetière Est",
"secondary_text": "Montreal, QC, Canada",
"types": [
"geocode",
"subpremise"
]
},
{
"place_id": "ChIJq6qqH10ayUwRDKm5QlrmM2g",
"description": "1000 Rue de la Gauchetière E, Montreal, QC, Canada",
"main_text": "1000 Rue de la Gauchetière E",
"secondary_text": "Montreal, QC, Canada",
"types": [
"geocode",
"subpremise"
]
},
{
"place_id": "EjExMDAwIFJ1ZSBkZSBsYSBHYXVjaGV0acOocmUsIE1vbnRyZWFsLCBRQywgQ2FuYWRhIjESLwoUChIJGz5nxFwayUwRxfGQnpCySKkQ6AcqFAoSCZVv0iVdGslMEUpWKOwLwBz0",
"description": "1000 Rue de la Gauchetière, Montreal, QC, Canada",
"main_text": "1000 Rue de la Gauchetière",
"secondary_text": "Montreal, QC, Canada",
"types": [
"geocode",
"street_address"
]
},
{
"place_id": "EjYxMDAwIFJ1ZSBkZSBsYSBHYXVjaGV0acOocmUsIE1vbnRyw6lhbC1Fc3QsIFFDLCBDYW5hZGEiLiosChQKEgk5hd5QFeLITBFVgO8QJcFsCBIUChIJndvyLgHiyEwREdLOpOC4H6k",
"description": "1000 Rue de la Gauchetière, Montréal-Est, QC, Canada",
"main_text": "1000 Rue de la Gauchetière",
"secondary_text": "Montréal-Est, QC, Canada",
"types": [
"geocode",
"route"
]
}
]
},
"warnings": [],
"meta": {
"provider": "google"
},
"billing": {
"unit": "call",
"quantity": 1,
"counted": true
}
}
}
}
openGeoBatch
query
point_1k
Stable
Geocode many addresses in one call, billed per thousand points.
query Batch($direction: String!, $input: Json!) {
openGeoBatch(direction: $direction, input: $input)
}
Variables
{
"direction": "forward",
"input": {
"addresses": [
{
"address1": "1000 Rue De La Gauchetière O",
"city": "Montreal",
"country": "CA"
},
{
"address1": "290 Bremner Blvd",
"city": "Toronto",
"country": "CA"
}
]
}
}
Response example
{
"data": {
"openGeoBatch": {
"results": [
{
"index": 0,
"matched": true,
"location": {
"lat": 45.4981126,
"lng": -73.56598129999999
},
"address": [],
"confidence": null,
"provider": "google"
},
{
"index": 1,
"matched": true,
"location": {
"lat": 43.642596,
"lng": -79.387089
},
"address": {
"number": "290",
"street": "bremner blvd",
"city": "Toronto",
"country": "CA"
},
"confidence": 1,
"provider": "internal"
}
],
"matched": 2,
"total": 2
}
}
}
openGeoForward
query
point
Stable
Turn an address into coordinates through a per-country provider chain.
query Forward($address1: String, $city: String, $province: String, $postcode: String, $country: String) {
openGeoForward(address1: $address1, city: $city, province: $province, postcode: $postcode, country: $country) {
matched
reason
location
address
confidence
provider
billing { unit quantity counted }
}
}
Variables
{
"address1": "1000 Rue De La Gauchetière O",
"city": "Montreal",
"province": "QC",
"country": "CA",
"postcode": "H3B 4W5"
}
Response example
{
"data": {
"openGeoForward": {
"matched": true,
"reason": null,
"location": {
"lat": 45.498174,
"lng": -73.566218
},
"address": {
"number": "1000",
"street": "rue de la gauchetière o",
"city": "Montreal",
"country": "CA",
"postcode": "h3b 4w5"
},
"confidence": 1,
"provider": "internal",
"billing": {
"unit": "point",
"quantity": 1,
"counted": true
}
}
}
}
openGeoPlace
query
call
Beta
Suggest addresses while they are typed, then give the chosen one as a structured address with coordinates.
query Run($input: Json!) {
openGeoPlace(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"place_id": "ChIJWeWFxFwayUwRgP5QVJUn5ww",
"session_token": "6f1c2a8e-4b1d-4a39-9d0e-5b8f3c7a21de"
}
}
Response example
{
"data": {
"openGeoPlace": {
"mode": "sync",
"job": null,
"data": {
"place_id": "ChIJWeWFxFwayUwRgP5QVJUn5ww",
"formatted_address": "1000 Rue De la Gauchetière O, Montréal, QC H3B 4W5, Canada",
"address": {
"number": "1000",
"street": "Rue De la Gauchetière Ouest",
"address_1": "1000 Rue De la Gauchetière Ouest",
"address_2": null,
"city": "Montréal",
"province": "QC",
"country": "CA",
"postcode": "H3B 4W5"
},
"location": {
"lat": 45.4981354,
"lng": -73.5659122
}
},
"warnings": [],
"meta": {
"provider": "google"
},
"billing": {
"unit": "call",
"quantity": 1,
"counted": true
}
}
}
}
openGeoReverse
query
point
Stable
Turn coordinates into a structured address.
query Reverse($lat: Float!, $lng: Float!) {
openGeoReverse(lat: $lat, lng: $lng) {
matched
reason
address
provider
billing { unit quantity counted }
}
}
Variables
{
"lat": 45.4985,
"lng": -73.5664
}
Response example
{
"data": {
"openGeoReverse": {
"matched": true,
"reason": null,
"address": {
"address_1": "1000 Rue de La Gauchetière Ouest",
"address_2": "",
"city": "Montreal",
"province": "Quebec",
"country": "CAN",
"postcode": "H3B 4W5",
"full_address": "1000 Rue de La Gauchetière Ouest, Montreal, QC, Canada",
"country_code": "CA",
"province_code": "QC"
},
"provider": "internal",
"billing": {
"unit": "point",
"quantity": 1,
"counted": true
}
}
}
}
openGeoValidate
query
point
Stable
Normalize an address and check its postcode, PO Box status and phone number.
query Validate($address1: String, $city: String, $province: String, $postcode: String, $country: String!, $phone: String) {
openGeoValidate(address1: $address1, city: $city, province: $province, postcode: $postcode, country: $country, phone: $phone)
}
Variables
{
"address1": "1000 Rue De La Gauchetière O",
"city": "Montreal",
"province": "QC",
"country": "CA",
"postcode": "H3B 4W5",
"phone": "514 555 0134"
}
Response example
{
"data": {
"openGeoValidate": {
"valid": true,
"issues": [],
"normalized": {
"address_1": "1000 Rue De La Gauchetière O",
"city": "Montreal",
"country": "CA",
"postcode": "H3B4W5"
},
"checks": {
"postcode_format": true,
"po_box": false
}
}
}
}
Distance matrix
openMatrix
mutation
element_1k
Beta
Distances and durations between many origins and destinations.
mutation Run($input: Json!) {
openMatrix(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"origins": [
{
"id": "depot",
"lat": 45.5017,
"lng": -73.5673
}
],
"destinations": [
{
"id": "order-1001",
"lat": 45.5088,
"lng": -73.554
},
{
"id": "order-1002",
"lat": 45.4972,
"lng": -73.5786
}
]
}
}
Response example
{
"data": {
"openMatrix": {
"mode": "sync",
"job": null,
"data": {
"origins": [
"depot"
],
"destinations": [
"order-1001",
"order-1002"
],
"distances_meters": [
[
1840,
1611
]
],
"durations_seconds": [
[
245,
227
]
],
"unreachable": []
},
"warnings": [],
"meta": {
"region": "NA",
"profile": "car",
"metrics": [
"distance",
"duration"
],
"origins": 1,
"destinations": 2,
"elements": 2
},
"billing": {
"unit": "element_1k",
"quantity": 0.002,
"counted": true,
"breakdown": {
"origins": 1,
"destinations": 2,
"elements": 2,
"engine_requests": 1
}
}
}
}
}
Directions
openDirections
query
call
Stable
Road geometry, distance and duration between waypoints.
query Run($input: Json!) {
openDirections(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"waypoints": [
{
"id": "depot",
"lat": 45.5017,
"lng": -73.5673
},
{
"id": "order-1001",
"lat": 45.5088,
"lng": -73.554
},
{
"id": "order-1002",
"lat": 45.4972,
"lng": -73.5786
}
],
"options": {
"geometry": true
}
}
}
Response example
{
"data": {
"openDirections": {
"mode": "sync",
"job": null,
"data": {
"legs": [
{
"from": "depot",
"to": "order-1001",
"reachable": true,
"distance_meters": 1840,
"duration_seconds": 245,
"geometry": "y`vtGjr_`MJUNYL[h@gAHOFQBIHOc@g@MOa@]s@q@EGEEk@g@k@k@CCMMDO@EDMBMBOBQBO@KBM?G@OBQ?G@MBQ@MBMBMBOBOBMFSDSBGBIBGHOvAkE@EHQGEECa@_@ECMKKIwAiA_CmBq@m@ECIIOKoAcAs@i@KIIIOMgA{@QMCCGGGE_@[m@g@a@[kA_ACCECKGKGWSQOwAkAGEGEu@o@CCMIMKGEYSeAq@OKa@WGG[Sy@g@w@k@s@e@GEGE??YQgAu@c@[QKc@YMKKG@EBK@EVo@@EDKDM@Cb@cAFOBIt@oBBEDUJFBBFDx@l@??"
},
{
"from": "order-1001",
"to": "order-1002",
"reachable": true,
"distance_meters": 3108,
"duration_seconds": 390,
"geometry": "elwtGl}|_Mx@n@BBFD\\ZDDDBz@l@`@\\~BdB~AjAf@\\DDBBLDEPEJe@zAADENGNCFW|@Y|@CFA@ELCHGRq@jBABu@tBCHAFEJGNADg@vAKXq@lBABEHAHgA|C_@fASf@ADGPO^JHbAt@`CrBBBJHLJhCzBJL~BvBFDJJHF~@r@zAdABBHFLHdDfCBBFFFDJHvDlCRJDBRHXPx@f@D@HHJFVV|@x@BBLJTRJJTTlBdBLL`@\\h@f@ZXNLr@p@BBB@JJJHv@r@j@h@DDNLJJp@l@HHj@j@DBLLRRfB`BBBJJHFv@r@x@t@B@HHJJz@v@RRl@j@BBHHJHhAfAj@j@BBNLHHLLVT|@z@HFIPw@tBmAbDy@vBe@pACDIPIRg@pAO\\{A`ECDAFEJHHp@p@??"
}
],
"totals": {
"distance_meters": 4948,
"duration_seconds": 635,
"legs": 2,
"unreachable_legs": 0
}
},
"warnings": [],
"meta": {
"region": "NA",
"profile": "car",
"geometry": true,
"geometry_format": "polyline"
},
"billing": {
"unit": "call",
"quantity": 1,
"counted": true,
"breakdown": {
"waypoints": 3,
"legs": 2
}
}
}
}
}
Reach areas
openIsochrone
query
call
Beta
Draw the areas reachable from a point within given drive times.
query Run($input: Json!) {
openIsochrone(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"location": {
"lat": 45.5017,
"lng": -73.5673
},
"minutes": [
5,
10
],
"profile": "car"
}
}
Response example
{
"data": {
"openIsochrone": {
"mode": "sync",
"job": null,
"data": {
"location": {
"lat": 45.5017,
"lng": -73.5673
},
"direction": "from",
"areas": [
{
"minutes": 5,
"area_km2": 16.21,
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[
-73.563299,
45.530674
],
[
-73.583949,
45.515349
],
[
-73.584242,
45.513757
],
[
-73.591753,
45.494246
],
[
-73.600596,
45.467403
],
[
-73.575631,
45.482031
],
[
-73.559299,
45.476764
],
[
-73.543299,
45.48029
],
[
-73.542831,
45.475168
],
[
-73.54472,
45.4927
],
[
-73.552638,
45.4967
],
[
-73.550582,
45.507982
],
[
-73.547776,
45.516223
],
[
-73.554652,
45.527052
],
[
-73.563299,
45.530674
]
]
]
]
}
},
{
"minutes": 10,
"area_km2": 85.45,
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[
-73.523299,
45.566736
],
[
-73.56589,
45.5577
],
[
-73.62407,
45.50747
],
[
-73.661785,
45.500214
],
[
-73.640299,
45.471298
],
[
-73.662299,
45.444574
],
[
-73.628651,
45.4447
],
[
-73.610299,
45.458262
],
[
-73.559421,
45.4547
],
[
-73.480299,
45.465887
],
[
-73.509065,
45.488465
],
[
-73.527299,
45.503088
],
[
-73.520532,
45.5297
],
[
-73.523299,
45.566736
]
]
]
]
}
}
]
},
"warnings": [],
"meta": {
"profile": "car",
"geometry_format": "geojson"
},
"billing": {
"unit": "call",
"quantity": 1,
"counted": true
}
}
}
}
Map matching
openTraceMatch
query
point_1k
Beta
Snap a GPS trace to the roads it was driven on and measure the drive.
query Run($input: Json!) {
openTraceMatch(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"points": [
{
"id": "fix-1",
"lat": 45.498348,
"lng": -73.571617,
"time": "2026-11-02T08:00:00-05:00"
},
{
"id": "fix-2",
"lat": 45.499071,
"lng": -73.569882,
"time": "2026-11-02T08:00:21-05:00"
},
{
"id": "fix-3",
"lat": 45.501306,
"lng": -73.567881,
"time": "2026-11-02T08:00:42-05:00"
},
{
"id": "fix-4",
"lat": 45.502841,
"lng": -73.566375,
"time": "2026-11-02T08:01:03-05:00"
},
{
"id": "fix-5",
"lat": 45.502257,
"lng": -73.564575,
"time": "2026-11-02T08:01:24-05:00"
},
{
"id": "fix-6",
"lat": 45.502093,
"lng": -73.563383,
"time": "2026-11-02T08:01:45-05:00"
},
{
"id": "fix-7",
"lat": 45.502914,
"lng": -73.560675,
"time": "2026-11-02T08:02:07-05:00"
},
{
"id": "fix-8",
"lat": 45.504991,
"lng": -73.558915,
"time": "2026-11-02T08:02:28-05:00"
}
],
"profile": "car"
}
}
Response example
{
"data": {
"openTraceMatch": {
"mode": "sync",
"job": null,
"data": {
"points": [
{
"index": 0,
"id": "fix-1",
"type": "matched",
"lat": 45.498367,
"lng": -73.571597,
"moved_meters": 2.6,
"road": "Rue Stanley"
},
{
"index": 1,
"id": "fix-2",
"type": "matched",
"lat": 45.499086,
"lng": -73.569893,
"moved_meters": 2,
"road": "Boulevard René-Lévesque Ouest"
},
{
"index": 2,
"id": "fix-3",
"type": "matched",
"lat": 45.50129,
"lng": -73.567829,
"moved_meters": 4.4,
"road": "Boulevard René-Lévesque Ouest"
},
{
"index": 3,
"id": "fix-4",
"type": "matched",
"lat": 45.502922,
"lng": -73.566398,
"moved_meters": 9.3,
"road": "Boulevard René-Lévesque Ouest"
},
{
"index": 4,
"id": "fix-5",
"type": "matched",
"lat": 45.502289,
"lng": -73.564558,
"moved_meters": 3.8,
"road": "Côte du Beaver Hall"
},
{
"index": 5,
"id": "fix-6",
"type": "matched",
"lat": 45.502045,
"lng": -73.563414,
"moved_meters": 5.8,
"road": "Côte du Beaver Hall"
},
{
"index": 6,
"id": "fix-7",
"type": "matched",
"lat": 45.502874,
"lng": -73.560672,
"moved_meters": 4.4,
"road": "Rue Saint-Antoine Ouest"
},
{
"index": 7,
"id": "fix-8",
"type": "matched",
"lat": 45.504973,
"lng": -73.558873,
"moved_meters": 3.8,
"road": "Rue Saint-Antoine Ouest"
}
],
"roads": [
{
"names": [
"Rue Stanley"
],
"road_class": "residential",
"speed_kmh": 30,
"distance_meters": 67
},
{
"names": [
"Boulevard René-Lévesque Ouest"
],
"road_class": "secondary",
"speed_kmh": 50,
"distance_meters": 662
},
{
"names": [
"Côte du Beaver Hall"
],
"road_class": "tertiary",
"speed_kmh": 40,
"distance_meters": 280
},
{
"names": [
"Rue du Square Victoria"
],
"road_class": "tertiary",
"speed_kmh": 30,
"distance_meters": 113
},
{
"names": [
"Rue Saint-Antoine Ouest"
],
"road_class": "secondary",
"speed_kmh": 49,
"distance_meters": 463
}
],
"summary": {
"points": 8,
"matched": 8,
"interpolated": 0,
"unmatched": 0,
"distance_meters": 1585
},
"geometry": {
"type": "LineString",
"coordinates": [
[
-73.571598,
45.498367
],
[
-73.571479,
45.498308
],
[
-73.571149,
45.498132
],
[
-73.57112,
45.498116
],
[
-73.571049,
45.498079
],
[
-73.570902,
45.498007
],
[
-73.57085,
45.498061
],
[
-73.570706,
45.498216
],
[
-73.570579,
45.498355
],
[
-73.570424,
45.498523
],
[
-73.570397,
45.498553
],
[
-73.570284,
45.498673
],
[
-73.570199,
45.498762
],
[
-73.57015,
45.498813
],
[
-73.570117,
45.498849
],
[
-73.569971,
45.499004
],
[
-73.569894,
45.499087
],
[
-73.56974,
45.49925
],
[
-73.569719,
45.499274
],
[
-73.569664,
45.499334
],
[
-73.569541,
45.499463
],
[
-73.56949,
45.499517
],
[
-73.569244,
45.499785
],
[
-73.56917,
45.49986
],
[
-73.569046,
45.49999
],
[
-73.569027,
45.500011
],
[
-73.568971,
45.500073
],
[
-73.568916,
45.500131
],
[
-73.568903,
45.500144
],
[
-73.568534,
45.500536
],
[
-73.568133,
45.500966
],
[
-73.568076,
45.501026
],
[
-73.567829,
45.501291
],
[
-73.567507,
45.501639
],
[
-73.567451,
45.501698
],
[
-73.567428,
45.50172
],
[
-73.567354,
45.501796
],
[
-73.567236,
45.501928
],
[
-73.567174,
45.501996
],
[
-73.566956,
45.502222
],
[
-73.566784,
45.502408
],
[
-73.566768,
45.502425
],
[
-73.566724,
45.502472
],
[
-73.566681,
45.502519
],
[
-73.566667,
45.502534
],
[
-73.566643,
45.502565
],
[
-73.566585,
45.502648
],
[
-73.566541,
45.502711
],
[
-73.566415,
45.502899
],
[
-73.566399,
45.502923
],
[
-73.566333,
45.503032
],
[
-73.56619,
45.502991
],
[
-73.566159,
45.50298
],
[
-73.565696,
45.502759
],
[
-73.565468,
45.502653
],
[
-73.565065,
45.502461
],
[
-73.565035,
45.502448
],
[
-73.564962,
45.502418
],
[
-73.564879,
45.502387
],
[
-73.564846,
45.502376
],
[
-73.564782,
45.502354
],
[
-73.56471,
45.502331
],
[
-73.564633,
45.502308
],
[
-73.564543,
45.502286
],
[
-73.564463,
45.502269
],
[
-73.564401,
45.502257
],
[
-73.564333,
45.502243
],
[
-73.56429,
45.502236
],
[
-73.564205,
45.502225
],
[
-73.564119,
45.502213
],
[
-73.56408,
45.502208
],
[
-73.564013,
45.502196
],
[
-73.563923,
45.50218
],
[
-73.563849,
45.502165
],
[
-73.563775,
45.502149
],
[
-73.563712,
45.502133
],
[
-73.563632,
45.502112
],
[
-73.563552,
45.502088
],
[
-73.563477,
45.502066
],
[
-73.563379,
45.502034
],
[
-73.563277,
45.502
],
[
-73.563235,
45.501983
],
[
-73.563188,
45.501961
],
[
-73.56315,
45.50194
],
[
-73.563069,
45.501894
],
[
-73.562052,
45.50145
],
[
-73.56202,
45.501435
],
[
-73.561934,
45.501394
],
[
-73.561903,
45.50143
],
[
-73.561881,
45.501457
],
[
-73.561722,
45.501634
],
[
-73.561697,
45.501663
],
[
-73.561641,
45.501726
],
[
-73.561589,
45.501786
],
[
-73.561222,
45.50223
],
[
-73.560672,
45.502874
],
[
-73.560443,
45.503122
],
[
-73.560422,
45.503145
],
[
-73.56037,
45.503204
],
[
-73.560308,
45.503277
],
[
-73.559974,
45.50368
],
[
-73.559757,
45.503939
],
[
-73.559708,
45.503996
],
[
-73.559662,
45.504051
],
[
-73.559594,
45.504126
],
[
-73.559294,
45.504485
],
[
-73.559215,
45.504579
],
[
-73.559195,
45.504603
],
[
-73.559164,
45.50464
],
[
-73.559129,
45.504678
],
[
-73.558989,
45.50484
],
[
-73.558874,
45.504973
]
]
}
},
"warnings": [],
"meta": {
"profile": "car",
"geometry_format": "geojson"
},
"billing": {
"unit": "point_1k",
"quantity": 8,
"counted": true
}
}
}
}
Chargeable weight
openWeightChargeable
query
call
Beta
Work out the weight a carrier bills: the greater of actual and volumetric weight.
query Run($input: Json!) {
openWeightChargeable(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"packages": [
{
"id": "box-1",
"weight": 2.4,
"weight_unit": "kg",
"length": 40,
"width": 30,
"height": 30,
"dimension_unit": "cm"
},
{
"id": "box-2",
"quantity": 2,
"weight": 9,
"weight_unit": "kg",
"length": 30,
"width": 20,
"height": 15,
"dimension_unit": "cm"
}
],
"divisor": 5000,
"divisor_unit": "cm3_kg",
"increment": 0.5
}
}
Response example
{
"data": {
"openWeightChargeable": {
"mode": "sync",
"job": null,
"data": {
"weight_unit": "kg",
"divisor": 5000,
"divisor_unit": "cm3_kg",
"packages": [
{
"id": "box-1",
"quantity": 1,
"actual_weight": 2.4,
"volumetric_weight": 7.2,
"chargeable_weight": 7.5,
"basis": "volumetric"
},
{
"id": "box-2",
"quantity": 2,
"actual_weight": 9,
"volumetric_weight": 1.8,
"chargeable_weight": 9,
"basis": "actual"
}
],
"totals": {
"packages": 3,
"actual_weight": 20.4,
"volumetric_weight": 10.8,
"chargeable_weight": 25.5,
"shipment_chargeable_weight": 20.5
}
},
"warnings": [],
"meta": {
"cm3_per_kg": 5000,
"increment": 0.5
},
"billing": {
"unit": "call",
"quantity": 1,
"counted": true
}
}
}
}
Barcodes
openBarcode
query
call
Beta
Draw a barcode or a QR, Data Matrix or PDF417 code as an image.
query Run($input: Json!) {
openBarcode(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"value": "1Z999AA10123456784",
"symbology": "code128",
"text": true
}
}
Response example
{
"data": {
"openBarcode": {
"mode": "sync",
"job": null,
"data": {
"symbology": "code128",
"value": "1Z999AA10123456784",
"content_type": "image/png",
"width": 440,
"height": 100,
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAbgAAABkCAIAAAB7I7IEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC0klEQVR4nO3d0W6yMACGYfiz+79l/gMS0ljar8icpj7P0Ya1VDbfQTDZum3bAkDbv3cvAODTCSVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAMHPnSev63p8vf/vnX1L+X946i31DPX4UuvRco/1+Hpka78je+zP+TkztH4K9V5Gjsn9GepXVG9vPTryW9T/fbt/tEdeXf8o9ce0ZuvP35ph5DjUq7r6Dhp/z46scOQ1tsaM77e/lxHOKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiBYt2179xoAPpozSoDg590L4IXWdV2W5bho2L8t7Q+V208H/9bGekn3R7ae/jDJ+Gu/dJQ6q2UmLr2ndbyxT3/EDwUpW/CijadLujmy9fT6CJyGrP/053ZUH2om4NJ7Tuva+xP4ltOf/pKeG7ltW2tkfWK4b9yNTDV4lE5nYzIuvef0aZWMe+xf2Hae3rker6+4j1PCssUj54P7VJ3zXLmcm1B+l7qSDwm4urGcdmRja1WDralTVTarnOehev0ILo16ti78OztiSkL5RVpv7Jv3apaiIHHjqfFL8quD/4BzyW8glN8u3uXob/wz40s6vc3yRGTj4NYdeebjrvecTj/j8oqPB129FT6y9/uLP5zeSR98madRHtkR8xFKgMDHgwACoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAYL/0ZAf9Hxdf0cAAAAASUVORK5CYII="
},
"warnings": [],
"meta": {
"format": "png"
},
"billing": {
"unit": "call",
"quantity": 1,
"counted": true
}
}
}
}
Document checks
openDocumentVerify
query
call
Beta
Check whether a PDF was issued by Superroute and is unchanged since.
query Run($input: Json!) {
openDocumentVerify(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"pdf_base64": "JVBERi0xLjcKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZwovT3V0bGluZXMgMiAwIFIKL1BhZ2VzIDMgMCBSID4+CmVuZG9iagoyIDAgb2JqCjw8IC9UeXBlIC9PdXRsaW5lcyAvQ291bnQgMCA+PgplbmRvYmoKMyAwIG9iago8PCAvVHlwZSAvUGFnZXMKL0tpZHMgWzYgMCBSCl0KL0NvdW50IDEKL1Jlc291cmNlcyA8PAovUHJvY1NldCA0IDAgUgovRm9udCA8PCAKL0YxIDggMCBSCi9GMiA5IDAgUgo+Pgo+PgovTWVkaWFCb3ggWzAuMDAwIDAuMDAwIDU5NS4yODAgODQxLjg5MF0KID4+CmVuZG9iago0IDAgb2JqClsvUERGIC9UZXh0IF0KZW5kb2JqCjUgMCBvYmoKPDwKL1Byb2R1Y2VyICj+/wBkAG8AbQBwAGQAZgAgADMALgAxAC4ANgAgACsAIABDAFAARABGKQovQ3JlYXRpb25EYXRlIChEOjIwMjYxMDIzMTY1NDU4LTA0JzAwJykKL01vZERhdGUgKEQ6MjAyNjEwMjMxNjU0NTgtMDQnMDAnKQo+PgplbmRvYmoKNiAwIG9iago8PCAvVHlwZSAvUGFnZQovTWVkaWFCb3ggWzAuMDAwIDAuMDAwIDU5NS4yODAgODQxLjg5MF0KL1BhcmVudCAzIDAgUgovQ29udGVudHMgNyAwIFIKPj4KZW5kb2JqCjcgMCBvYmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUKL0xlbmd0aCAxMDQgPj4Kc3RyZWFtCnic4zLQMzAwUEAmi9K5nEIUjE30DAzNFMzNLPSMTQ0VQlIU9N0MFYyAogohaQoK0RoBicnZmXnpCsU5mQWasQohXgquIcgagbSZhSVEo5GCoRFco39RSmqRQrC/rqGBgSFMJwAMfh99CmVuZHN0cmVhbQplbmRvYmoKOCAwIG9iago8PCAvVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL05hbWUgL0YxCi9CYXNlRm9udCAvSGVsdmV0aWNhLUJvbGQKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKPj4KZW5kb2JqCjkgMCBvYmoKPDwgL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9OYW1lIC9GMgovQmFzZUZvbnQgL0hlbHZldGljYQovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKeHJlZgowIDEwCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAwOSAwMDAwMCBuIAowMDAwMDAwMDc0IDAwMDAwIG4gCjAwMDAwMDAxMjAgMDAwMDAgbiAKMDAwMDAwMDI4NCAwMDAwMCBuIAowMDAwMDAwMzEzIDAwMDAwIG4gCjAwMDAwMDA0NjIgMDAwMDAgbiAKMDAwMDAwMDU2NSAwMDAwMCBuIAowMDAwMDAwNzQxIDAwMDAwIG4gCjAwMDAwMDA4NTMgMDAwMDAgbiAKdHJhaWxlcgo8PAovU2l6ZSAxMAovUm9vdCAxIDAgUgovSW5mbyA1IDAgUgovSURbPDNjZTEyNGMwNjIzMjg1MDYxZDYxMzAxMjZhZmJjZmU4PjwzY2UxMjRjMDYyMzI4NTA2MWQ2MTMwMTI2YWZiY2ZlOD5dCj4+CnN0YXJ0eHJlZgo5NjAKJSVFT0YKMTAgMCBvYmoKPDwgL0ZpbHRlciAvRmxhdGVEZWNvZGUgL0xlbmd0aCAxNjkgPj4Kc3RyZWFtCnicAZ4AYf8A4x/3nkBmRqmXV0RDMMBRFe/SEzSdOBG9uhuZ/s5UtPf0AVy6btZQhdivf2xZDn8ZG6/7JUWH10MgDgpD7tG6T8IRsm9CbWX9+IZUHlaWr2qHhiwvOrwmtizWU+8F4CIaIKFqoNJw0WB9z9ptHaaWc/DeEdaaTWTyBJunkbNAai8jofoq5K4XRvpJ371P2xkEkWiyYabenbwK9ruywG3WTiIKZW5kc3RyZWFtCmVuZG9iagp4cmVmCjEwIDEKMDAwMDAwMTMxMSAwMDAwMCBuIAp0cmFpbGVyCjw8IC9TaXplIDExIC9Sb290IDEgMCBSIC9JbmZvIDUgMCBSIC9JRCBbPDNjZTEyNGMwNjIzMjg1MDYxZDYxMzAxMjZhZmJjZmU4PjwzY2UxMjRjMDYyMzI4NTA2MWQ2MTMwMTI2YWZiY2ZlOD5dIC9QcmV2IDk2MCA+PgpzdGFydHhyZWYKMTU1MwolJUVPRgo="
}
}
Response example
{
"data": {
"openDocumentVerify": {
"mode": "sync",
"job": null,
"data": {
"status": "authentic",
"issued_by_us": true,
"intact": true,
"sha256": "6c709056353a1b5376791c8dd949243dcf9e7327eae864d4fe476ff435e40d76",
"byte_size": 1736
},
"warnings": [],
"meta": [],
"billing": {
"unit": "call",
"quantity": 1,
"counted": true
}
}
}
}
Arrival estimates
openEta
query
call
Stable
Recompute arrival times along a route from progress so far.
query Run($input: Json!) {
openEta(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"departed_at": "2026-11-02T09:00:00-05:00",
"now": "2026-11-02T09:20:00-05:00",
"stops": [
{
"id": "order-1001",
"travel_seconds": 600,
"service_seconds": 300,
"completed_at": "2026-11-02T09:15:00-05:00"
},
{
"id": "order-1002",
"travel_seconds": 720,
"service_seconds": 300,
"time_window": {
"from": "2026-11-02T09:00:00-05:00",
"to": "2026-11-02T09:25:00-05:00"
}
},
{
"id": "order-1003",
"travel_seconds": 540,
"service_seconds": 240
}
]
}
}
Response example
{
"data": {
"openEta": {
"mode": "sync",
"job": null,
"data": {
"status": "in_progress",
"anchor": {
"at": "2026-11-02T14:15:00Z",
"at_epoch": 1793628900,
"source": "completion",
"stop_id": "order-1001",
"age_seconds": 300
},
"finish_eta": "2026-11-02T14:45:00Z",
"finish_eta_epoch": 1793630700,
"remaining": {
"stops": 2,
"travel_seconds": 1260,
"service_seconds": 540
},
"stops": [
{
"id": "order-1002",
"eta": "2026-11-02T14:27:00Z",
"eta_epoch": 1793629620,
"departure_eta": "2026-11-02T14:32:00Z",
"window_status": "late",
"minutes_late": 2
},
{
"id": "order-1003",
"eta": "2026-11-02T14:41:00Z",
"eta_epoch": 1793630460,
"departure_eta": "2026-11-02T14:45:00Z",
"window_status": null,
"minutes_late": null
}
],
"confidence": "medium"
},
"warnings": [],
"meta": {
"model": "anchored_plan_projection",
"pace_correction": false,
"traffic_aware": false,
"stops": 3
},
"billing": {
"unit": "call",
"quantity": 1,
"counted": true,
"breakdown": {
"stops": 3
}
}
}
}
}
Maps
openMapStatic
query
call
Beta
Draw your own lines, points and areas on the street map and receive a PNG image.
query Run($input: Json!) {
openMapStatic(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"width": 400,
"height": 300,
"features": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
-73.5673,
45.5017
]
},
"properties": {
"marker-color": "#1e88e5"
}
},
{
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[
-73.5673,
45.5017
],
[
-73.554,
45.5088
]
]
},
"properties": {
"stroke": "#1e88e5"
}
}
]
}
}
}
Response example
{
"data": {
"openMapStatic": {
"mode": "sync",
"job": null,
"data": {
"content_type": "image/png",
"width": 400,
"height": 300,
"zoom": 14.2,
"image_base64": "iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsCAYAAAA..."
},
"warnings": [],
"meta": {
"bytes": 48213
},
"billing": {
"unit": "call",
"quantity": 1,
"counted": true,
"breakdown": null
}
}
}
}
openMapToken
query
tile_1k
Beta
Map keys and short-lived tokens for your own apps and pages; tiles are billed per thousand.
query Run($input: Json) {
openMapToken(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"ttl_seconds": 3600
}
}
Response example
{
"data": {
"openMapToken": {
"mode": "sync",
"job": null,
"data": {
"token": "sm1.eyJzdWIiOiJvcGVuOjQyMTciLCJleHAiOjE3OTMxMjQ4MDB9.Q2v8m1Xb3dKp7Rz0Yt5Wn9Lc4Hs6Fg2Ja8Ue1Oi3Pk",
"expires_at": "2026-10-27T15:00:00Z",
"base_url": "https://maps.example.com",
"subject": "open:4217"
},
"warnings": [],
"meta": {
"ttl_seconds": 3600
},
"billing": {
"unit": "tile_1k",
"quantity": 0,
"counted": true
}
}
}
}
Carton selection
openPackingSolve
mutation
job
Beta
Choose packaging and produce a 3D packing arrangement for a set of items.
mutation Run($input: Json!) {
openPackingSolve(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"packagings": [
{
"key": "box-m",
"name": "Medium box",
"inner_length_cm": 40,
"inner_width_cm": 30,
"inner_height_cm": 30,
"max_payload_kg": 20,
"unit_cost": 1.2
},
{
"key": "box-s",
"name": "Small box",
"inner_length_cm": 25,
"inner_width_cm": 20,
"inner_height_cm": 15,
"max_payload_kg": 10,
"unit_cost": 0.6
}
],
"items": [
{
"id": "SKU-1",
"name": "Mug",
"quantity": 4,
"length_cm": 12,
"width_cm": 10,
"height_cm": 10,
"weight_kg": 0.4
},
{
"id": "SKU-2",
"name": "Kettle",
"quantity": 1,
"length_cm": 25,
"width_cm": 20,
"height_cm": 25,
"weight_kg": 1.5
}
]
}
}
Response example
{
"data": {
"openPackingSolve": {
"mode": "sync",
"job": null,
"data": {
"target_utilization_percent": 85,
"candidates": [
{
"rank": 1,
"strategy": "single:box-m",
"packages": [
{
"package_index": 1,
"packaging": {
"key": "box-m",
"name": "Medium box",
"source_type": "open",
"source_id": null,
"inner_length_mm": 400,
"inner_width_mm": 300,
"inner_height_mm": 300,
"outer_volume_mm3": 36000000,
"max_payload_g": 20000,
"tare_weight_g": 0,
"unit_cost": 1.2
},
"items": [
{
"item_id": "SKU-2",
"name": "Kettle",
"sku": null,
"quantity": 1
},
{
"item_id": "SKU-1",
"name": "Mug",
"sku": null,
"quantity": 4
}
],
"placements": [
{
"x_mm": 0,
"y_mm": 0,
"z_mm": 0,
"length_mm": 250,
"width_mm": 200,
"height_mm": 250,
"rotation_key": "LWH",
"stack_level": 1,
"container_index": 1,
"unit_sequence": 1,
"unit_key": "item-2-5",
"item_id": "SKU-2",
"name": "Kettle",
"sku": null,
"weight_g": 1500,
"cargo_form": "loose",
"source_item_count": 1,
"pallet_group_key": null,
"metadata": {
"stackable": true,
"max_stack_layers": null,
"bearing_level": null,
"allowed_orientations": [
"LWH",
"WLH",
"LHW"
],
"stack_level": 1
}
},
{
"x_mm": 0,
"y_mm": 200,
"z_mm": 0,
"length_mm": 120,
"width_mm": 100,
"height_mm": 100,
"rotation_key": "LWH",
"stack_level": 1,
"container_index": 1,
"unit_sequence": 2,
"unit_key": "item-1-1",
"item_id": "SKU-1",
"name": "Mug",
"sku": null,
"weight_g": 400,
"cargo_form": "loose",
"source_item_count": 1,
"pallet_group_key": null,
"metadata": {
"stackable": true,
"max_stack_layers": null,
"bearing_level": null,
"allowed_orientations": [
"LWH",
"WLH",
"WHL"
],
"stack_level": 1
}
},
{
"x_mm": 120,
"y_mm": 200,
"z_mm": 0,
"length_mm": 120,
"width_mm": 100,
"height_mm": 100,
"rotation_key": "LWH",
"stack_level": 1,
"container_index": 1,
"unit_sequence": 3,
"unit_key": "item-1-2",
"item_id": "SKU-1",
"name": "Mug",
"sku": null,
"weight_g": 400,
"cargo_form": "loose",
"source_item_count": 1,
"pallet_group_key": null,
"metadata": {
"stackable": true,
"max_stack_layers": null,
"bearing_level": null,
"allowed_orientations": [
"LWH",
"WLH",
"WHL"
],
"stack_level": 1
}
},
{
"x_mm": 250,
"y_mm": 0,
"z_mm": 0,
"length_mm": 120,
"width_mm": 100,
"height_mm": 100,
"rotation_key": "LWH",
"stack_level": 1,
"container_index": 1,
"unit_sequence": 4,
"unit_key": "item-1-3",
"item_id": "SKU-1",
"name": "Mug",
"sku": null,
"weight_g": 400,
"cargo_form": "loose",
"source_item_count": 1,
"pallet_group_key": null,
"metadata": {
"stackable": true,
"max_stack_layers": null,
"bearing_level": null,
"allowed_orientations": [
"LWH",
"WLH",
"WHL"
],
"stack_level": 1
}
},
{
"x_mm": 250,
"y_mm": 100,
"z_mm": 0,
"length_mm": 120,
"width_mm": 100,
"height_mm": 100,
"rotation_key": "LWH",
"stack_level": 1,
"container_index": 1,
"unit_sequence": 5,
"unit_key": "item-1-4",
"item_id": "SKU-1",
"name": "Mug",
"sku": null,
"weight_g": 400,
"cargo_form": "loose",
"source_item_count": 1,
"pallet_group_key": null,
"metadata": {
"stackable": true,
"max_stack_layers": null,
"bearing_level": null,
"allowed_orientations": [
"LWH",
"WLH",
"WHL"
],
"stack_level": 1
}
}
],
"metrics": {
"unit_count": 5,
"packed_volume_mm3": 17300000,
"inner_volume_mm3": 36000000,
"utilization_percent": 48.056,
"net_weight_g": 3100,
"gross_weight_g": 3100,
"gravity": {
"cog_x_mm": 171.5,
"cog_y_mm": 138.7,
"cog_z_mm": 86.3,
"offset_x_percent": 14.27,
"offset_y_percent": 7.53,
"cog_height_percent": 28.76,
"balanced": true
}
},
"validation": {
"passed": true,
"version": "independent-aabb-1.3"
},
"checksum": "9fdc5c755fec1f510d77baa4a8aa726475f0545da45cd171cc9e43ff640ad0d1"
}
],
"unplaced": [],
"totals": {
"package_count": 1,
"total_outer_volume_mm3": 36000000,
"total_inner_volume_mm3": 36000000,
"packed_volume_mm3": 17300000,
"wasted_volume_mm3": 18700000,
"overall_utilization_percent": 48.056,
"total_net_weight_g": 3100,
"total_gross_weight_g": 3100,
"total_cost": 1.2,
"unplaced_quantity": 0
},
"warnings": []
}
],
"unpackable": []
},
"warnings": [],
"meta": {
"solver_version": "packing-selection-1.0",
"validator_version": "independent-aabb-1.3",
"units": {
"dimensions": "cm",
"weight": "kg"
}
},
"billing": {
"unit": "job",
"quantity": 1,
"counted": true,
"breakdown": {
"packagings": 2,
"item_rows": 2,
"units": 5
}
}
}
}
}
Load planning
openLoadingSolve
mutation
job
Beta
Place cargo in a trailer or container with centre of gravity and unload order.
mutation Run($input: Json!) {
openLoadingSolve(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"container": {
"preset": "custom",
"length_cm": 600,
"width_cm": 240,
"height_cm": 240,
"max_payload_kg": 24000
},
"items": [
{
"id": "PAL-1",
"quantity": 4,
"length_cm": 120,
"width_cm": 100,
"height_cm": 120,
"weight_kg": 400
}
]
}
}
Response example
{
"data": {
"openLoadingSolve": {
"mode": "sync",
"job": null,
"data": {
"coordinate_system": {
"unit": "cm",
"origin": "container_inner_bottom_left_rear",
"x_axis": "container_length",
"y_axis": "container_width",
"z_axis": "up"
},
"candidates": [
{
"rank": 1,
"algorithm": "balanced_volume",
"score": 16.667,
"placements": [
{
"x_cm": 0,
"y_cm": 0,
"z_cm": 0,
"length_cm": 120,
"width_cm": 100,
"height_cm": 120,
"rotation_key": "LWH",
"stack_level": 1,
"container_index": 1,
"unit_sequence": 1,
"unit_key": "item-1-1",
"item_id": "PAL-1",
"name": "PAL-1",
"sku": null,
"weight_kg": 400,
"cargo_form": "loose",
"source_item_count": 1,
"pallet_group_key": null,
"metadata": {
"stackable": true,
"max_stack_layers": null,
"bearing_level": null,
"allowed_orientations": [
"LWH",
"WLH",
"LHW"
],
"stack_level": 1
}
},
{
"x_cm": 0,
"y_cm": 100,
"z_cm": 0,
"length_cm": 120,
"width_cm": 100,
"height_cm": 120,
"rotation_key": "LWH",
"stack_level": 1,
"container_index": 1,
"unit_sequence": 2,
"unit_key": "item-1-2",
"item_id": "PAL-1",
"name": "PAL-1",
"sku": null,
"weight_kg": 400,
"cargo_form": "loose",
"source_item_count": 1,
"pallet_group_key": null,
"metadata": {
"stackable": true,
"max_stack_layers": null,
"bearing_level": null,
"allowed_orientations": [
"LWH",
"WLH",
"LHW"
],
"stack_level": 1
}
},
{
"x_cm": 120,
"y_cm": 0,
"z_cm": 0,
"length_cm": 120,
"width_cm": 100,
"height_cm": 120,
"rotation_key": "LWH",
"stack_level": 1,
"container_index": 1,
"unit_sequence": 3,
"unit_key": "item-1-3",
"item_id": "PAL-1",
"name": "PAL-1",
"sku": null,
"weight_kg": 400,
"cargo_form": "loose",
"source_item_count": 1,
"pallet_group_key": null,
"metadata": {
"stackable": true,
"max_stack_layers": null,
"bearing_level": null,
"allowed_orientations": [
"LWH",
"WLH",
"LHW"
],
"stack_level": 1
}
},
{
"x_cm": 120,
"y_cm": 100,
"z_cm": 0,
"length_cm": 120,
"width_cm": 100,
"height_cm": 120,
"rotation_key": "LWH",
"stack_level": 1,
"container_index": 1,
"unit_sequence": 4,
"unit_key": "item-1-4",
"item_id": "PAL-1",
"name": "PAL-1",
"sku": null,
"weight_kg": 400,
"cargo_form": "loose",
"source_item_count": 1,
"pallet_group_key": null,
"metadata": {
"stackable": true,
"max_stack_layers": null,
"bearing_level": null,
"allowed_orientations": [
"LWH",
"WLH",
"LHW"
],
"stack_level": 1
}
}
],
"unplaced": [],
"metrics": {
"container_count": 1,
"placed_quantity": 4,
"unplaced_quantity": 0,
"used_volume_m3": 5.76,
"container_volume_m3": 34.56,
"volume_utilization_percent": 16.667,
"used_weight_kg": 1600,
"max_payload_kg": 24000,
"payload_utilization_percent": 6.667,
"target_achieved": false,
"gravity_max_quadrant_percent": 50,
"gravity_imbalanced": true
},
"warnings": [
"TARGET_UTILIZATION_NOT_REACHED",
"GRAVITY_IMBALANCED"
],
"checksum": "dfe9189f5980c2d4ca6945a426c2197d879ee85934809c80a591f4562ed9246e"
}
]
},
"warnings": [],
"meta": {
"solver_version": "php-guillotine-3d-1.2",
"rules_version": "ocean-no-sequence-1.2",
"candidate_limit": 3,
"input_hash": "4c4ebf12319f01e2c9bf8c1ff12eec06f9a236c9a6bc50b01adad01d18b3ad7b",
"units": {
"dimensions": "cm",
"weight": "kg"
}
},
"billing": {
"unit": "job",
"quantity": 1,
"counted": true,
"breakdown": {
"item_rows": 1,
"units": 4,
"candidates": 3
}
}
}
}
}
Pick batching
openPickingBatch
mutation
job
Beta
Group warehouse orders into pick batches and receive the walk through the bins for each batch.
mutation Run($input: Json!) {
openPickingBatch(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"orders": [
{
"id": "SO-1001",
"lines": [
{
"sku": "MUG-BLUE",
"quantity": 2,
"location": "A-01-02",
"weight_kg": 0.4,
"volume_l": 0.9
},
{
"sku": "TEA-50",
"location": "C-04-01",
"weight_kg": 0.2,
"volume_l": 0.5
}
],
"attributes": {
"carrier": "canada_post"
}
},
{
"id": "SO-1002",
"lines": [
{
"sku": "TEA-50",
"quantity": 3,
"location": "C-04-01",
"weight_kg": 0.2,
"volume_l": 0.5
}
],
"attributes": {
"carrier": "canada_post"
}
},
{
"id": "SO-1003",
"lines": [
{
"sku": "KETTLE",
"location": "B-02-03",
"weight_kg": 1.6,
"volume_l": 6
},
{
"sku": "MUG-BLUE",
"location": "A-01-02",
"weight_kg": 0.4,
"volume_l": 0.9
}
],
"attributes": {
"carrier": "ups"
}
},
{
"id": "SO-1004",
"lines": [
{
"sku": "KETTLE",
"quantity": 2,
"location": "B-02-03",
"weight_kg": 1.6,
"volume_l": 6
}
],
"attributes": {
"carrier": "ups"
}
},
{
"id": "SO-1005",
"lines": [
{
"sku": "SPOON-SET",
"location": "D-01-01",
"weight_kg": 0.3,
"volume_l": 0.4
}
],
"attributes": {
"carrier": "canada_post"
}
}
],
"locations": [
{
"id": "A-01-02",
"position": 4
},
{
"id": "B-02-03",
"position": 18
},
{
"id": "C-04-01",
"position": 31
},
{
"id": "D-01-01",
"position": 46
}
],
"limits": {
"orders": 3,
"weight_kg": 15,
"slots": 3
},
"group_by": [
"carrier"
],
"single_piece_batches": false
}
}
Response example
{
"data": {
"openPickingBatch": {
"mode": "sync",
"job": null,
"data": {
"batches": [
{
"number": 1,
"kind": "in_cart",
"orders": [
"SO-1001",
"SO-1002",
"SO-1005"
],
"stops": [
{
"location": "A-01-02",
"picks": [
{
"order": "SO-1001",
"sku": "MUG-BLUE",
"quantity": 2,
"slot": 1
}
]
},
{
"location": "C-04-01",
"picks": [
{
"order": "SO-1001",
"sku": "TEA-50",
"quantity": 1,
"slot": 1
},
{
"order": "SO-1002",
"sku": "TEA-50",
"quantity": 3,
"slot": 2
}
]
},
{
"location": "D-01-01",
"picks": [
{
"order": "SO-1005",
"sku": "SPOON-SET",
"quantity": 1,
"slot": 3
}
]
}
],
"walk_meters": 92,
"weight_kg": 1.9,
"volume_l": 4.2,
"units": 7,
"skus": 3,
"group": {
"carrier": "canada_post"
}
},
{
"number": 2,
"kind": "in_cart",
"orders": [
"SO-1003",
"SO-1004"
],
"stops": [
{
"location": "A-01-02",
"picks": [
{
"order": "SO-1003",
"sku": "MUG-BLUE",
"quantity": 1,
"slot": 1
}
]
},
{
"location": "B-02-03",
"picks": [
{
"order": "SO-1003",
"sku": "KETTLE",
"quantity": 1,
"slot": 1
},
{
"order": "SO-1004",
"sku": "KETTLE",
"quantity": 2,
"slot": 2
}
]
}
],
"walk_meters": 36,
"weight_kg": 5.2,
"volume_l": 18.9,
"units": 4,
"skus": 2,
"group": {
"carrier": "ups"
}
}
],
"unplaced": [],
"totals": {
"batches": 2,
"orders": 5,
"walk_meters": 128
}
},
"warnings": [],
"meta": {
"distances": "path",
"solve_ms": 1,
"units": {
"walk": "m",
"weight": "kg",
"volume": "L"
}
},
"billing": {
"unit": "job",
"quantity": 1,
"counted": true,
"breakdown": {
"orders": 5,
"lines": 7
}
}
}
}
}
Territory design
openTerritoryDesign
mutation
point_1k
Beta
Cut weighted points into compact, non-overlapping territories that each carry a balanced share of the work.
mutation Run($input: Json!) {
openTerritoryDesign(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"points": [
{
"id": "stop-1",
"lat": 45.48886,
"lng": -73.63285,
"weight": 1
},
{
"id": "stop-2",
"lat": 45.45869,
"lng": -73.56354,
"weight": 3
},
{
"id": "stop-3",
"lat": 45.51993,
"lng": -73.49625,
"weight": 2
},
{
"id": "stop-4",
"lat": 45.4545,
"lng": -73.58194,
"weight": 1
},
{
"id": "stop-5",
"lat": 45.47888,
"lng": -73.56081,
"weight": 1
},
{
"id": "stop-6",
"lat": 45.54922,
"lng": -73.63772,
"weight": 2
},
{
"id": "stop-7",
"lat": 45.52568,
"lng": -73.55506,
"weight": 1
},
{
"id": "stop-8",
"lat": 45.51925,
"lng": -73.5886,
"weight": 2
},
{
"id": "stop-9",
"lat": 45.45559,
"lng": -73.50548,
"weight": 3
},
{
"id": "stop-10",
"lat": 45.5003,
"lng": -73.56268,
"weight": 3
},
{
"id": "stop-11",
"lat": 45.51723,
"lng": -73.53724,
"weight": 1
},
{
"id": "stop-12",
"lat": 45.51979,
"lng": -73.545,
"weight": 3
}
],
"zones": [
{
"id": "east",
"anchor": {
"lat": 45.5,
"lng": -73.55
}
},
{
"id": "west",
"anchor": {
"lat": 45.5,
"lng": -73.64
}
},
{
"id": "north",
"share": 0.5
}
],
"tolerance_percent": 20
}
}
Response example
{
"data": {
"openTerritoryDesign": {
"mode": "sync",
"job": null,
"data": {
"zones": [
{
"id": "east",
"center": {
"lat": 45.520306,
"lng": -73.5314
},
"anchored": true,
"points": 4,
"weight": 7,
"target": 9,
"outline": {
"type": "Polygon",
"coordinates": [
[
[
-73.55506,
45.52568
],
[
-73.545,
45.51979
],
[
-73.53724,
45.51723
],
[
-73.49625,
45.51993
],
[
-73.55506,
45.52568
]
]
]
}
},
{
"id": "west",
"center": {
"lat": 45.506008,
"lng": -73.591628
},
"anchored": true,
"points": 6,
"weight": 10,
"target": 9,
"outline": {
"type": "Polygon",
"coordinates": [
[
[
-73.63772,
45.54922
],
[
-73.63285,
45.48886
],
[
-73.58194,
45.4545
],
[
-73.56081,
45.47888
],
[
-73.56268,
45.5003
],
[
-73.5886,
45.51925
],
[
-73.63772,
45.54922
]
]
]
}
},
{
"id": "north",
"center": {
"lat": 45.45714,
"lng": -73.53451
},
"anchored": false,
"points": 2,
"weight": 6,
"target": 5,
"outline": null
}
],
"assignment": [
{
"point": "stop-1",
"zone": "west"
},
{
"point": "stop-2",
"zone": "north"
},
{
"point": "stop-3",
"zone": "east"
},
{
"point": "stop-4",
"zone": "west"
},
{
"point": "stop-5",
"zone": "west"
},
{
"point": "stop-6",
"zone": "west"
},
{
"point": "stop-7",
"zone": "east"
},
{
"point": "stop-8",
"zone": "west"
},
{
"point": "stop-9",
"zone": "north"
},
{
"point": "stop-10",
"zone": "west"
},
{
"point": "stop-11",
"zone": "east"
},
{
"point": "stop-12",
"zone": "east"
}
],
"unplaced": [],
"summary": {
"zones": 3,
"points": 12,
"weight": 23,
"largest_deviation_percent": 22.2
}
},
"warnings": [],
"meta": {
"distance": "straight_line",
"rounds": 3
},
"billing": {
"unit": "point_1k",
"quantity": 12,
"counted": true
}
}
}
}
Network scenarios
openNetworkSiteScenario
mutation
job
Beta
Compare your delivery days as they are with a new depot, a different fleet size or other shift hours.
mutation Run($input: Json!) {
openNetworkSiteScenario(input: $input) {
mode
job
data
warnings
meta
billing { unit quantity counted breakdown }
}
}
Variables
{
"input": {
"time_zone": "America/Toronto",
"currency": "CAD",
"days": {
"from": "2026-11-03",
"to": "2026-11-03"
},
"depots": [
{
"id": "MTL-West",
"name": "Montreal West",
"lat": 45.4706,
"lng": -73.7408
},
{
"id": "MTL-Centre",
"name": "Montreal Centre",
"lat": 45.4972,
"lng": -73.5786
}
],
"orders": [
{
"id": "SO-2001",
"lat": 45.49524,
"lng": -73.59163,
"date": "2026-11-03",
"packages": 2
},
{
"id": "SO-2002",
"lat": 45.49518,
"lng": -73.55029,
"date": "2026-11-03",
"packages": 1
},
{
"id": "SO-2003",
"lat": 45.46847,
"lng": -73.59833,
"date": "2026-11-03",
"packages": 3
},
{
"id": "SO-2004",
"lat": 45.5114,
"lng": -73.64394,
"date": "2026-11-03",
"packages": 2
},
{
"id": "SO-2005",
"lat": 45.48034,
"lng": -73.65731,
"date": "2026-11-03",
"packages": 3
},
{
"id": "SO-2006",
"lat": 45.51345,
"lng": -73.58664,
"date": "2026-11-03",
"packages": 2
},
{
"id": "SO-2007",
"lat": 45.54648,
"lng": -73.57845,
"date": "2026-11-03",
"packages": 3
},
{
"id": "SO-2008",
"lat": 45.51501,
"lng": -73.58276,
"date": "2026-11-03",
"packages": 3
},
{
"id": "SO-2009",
"lat": 45.45632,
"lng": -73.66501,
"date": "2026-11-03",
"packages": 1
},
{
"id": "SO-2010",
"lat": 45.50996,
"lng": -73.56106,
"date": "2026-11-03",
"packages": 2
}
],
"vehicles": [
{
"depot": "MTL-West",
"count": 2,
"work_from": "08:00",
"work_to": "17:00"
},
{
"depot": "MTL-Centre",
"count": 2,
"work_from": "08:00",
"work_to": "17:00"
}
],
"driver_cost": {
"per_hour": 24,
"per_km": 0.45
},
"scenarios": [
{
"id": "east-depot",
"name": "Depot in Anjou",
"changes": [
{
"type": "add_depot",
"name": "Anjou",
"lat": 45.604,
"lng": -73.56,
"radius_km": 6,
"vehicles": 1
}
]
},
{
"id": "bigger-fleet",
"name": "Half as many vans again",
"changes": [
{
"type": "fleet",
"factor_percent": 150
}
]
}
]
}
}
Response example
{
"data": {
"openNetworkSiteScenario": {
"mode": "async",
"job": {
"id": "job_01k8zt6f2q4w8e0r2t4y6u8i0p",
"status": "queued",
"poll_after_ms": 1000,
"result_url": "/v1/jobs/job_01k8zt6f2q4w8e0r2t4y6u8i0p/result"
},
"data": null,
"warnings": null,
"meta": null,
"billing": {
"unit": "job",
"quantity": 1,
"counted": true,
"breakdown": {
"orders": 40,
"depots": 2,
"scenarios": 2
}
}
}
}
}
Platform
openCapabilities
query
free
Stable
List what this key can call, at what price, against which quota.
query Capabilities($family: String, $includeDisabled: Boolean) {
openCapabilities(family: $family, includeDisabled: $includeDisabled) {
key
platform
capabilities
totals
}
}
Variables
{
"family": null,
"includeDisabled": false
}
Response example
{
"data": {
"openCapabilities": {
"key": {
"key_id": "sr_live_7Hq2LmX9pR4sT1vW8yZ3nB6c"
},
"platform": {
"graphql_url": "/v1/graphql",
"rest_url": "/v1"
},
"capabilities": [
{
"code": "routing.optimize",
"family": "routing",
"status": "ga",
"billing_unit": "node",
"callable": true,
"reason": null
},
{
"code": "routing.refine",
"family": "routing",
"status": "ga",
"billing_unit": "node",
"callable": true,
"reason": null
}
],
"totals": {
"capabilities": 20,
"enabled": 20
}
}
}
}
openGeoCoverage
query
free
Stable
List what this key can call, at what price, against which quota.
query {
openGeoCoverage
}
Variables
{}
Response example
{
"data": {
"openGeoCoverage": {
"countries": [
{
"country": "CA",
"forward_chain": [
"internal",
"qcaddress",
"bcaddress",
"geolocator",
"google"
],
"reverse_chain": [
"internal",
"bcaddress",
"google"
],
"postcode_pattern": "/^[A-Z][0-9][A-Z][- ]?[0-9][A-Z][0-9]$/i"
},
{
"country": "US",
"forward_chain": [
"internal",
"census",
"google"
],
"reverse_chain": [
"internal",
"google"
],
"postcode_pattern": "/^[0-9]{5}([- ]?[0-9]{4})?$/"
}
],
"providers": [
{
"code": "internal",
"name": "SuperRoute Geocoding",
"capabilities": [
"forward",
"forward_text",
"reverse"
],
"available": true
},
{
"code": "google",
"name": "Google Maps",
"capabilities": [
"forward",
"forward_text",
"reverse",
"places",
"forward_within_postcode"
],
"available": true
}
]
}
}
}
openHealth
query
free
Stable
Report platform liveness and engine reachability.
query {
openHealth
}
Variables
{}
Response example
{
"data": {
"openHealth": {
"status": "ok",
"service": "Superroute Open Platform",
"version": "9.11.57",
"time": "2026-10-23T09:27:49-04:00",
"engines": {
"sroute2": {
"configured": true,
"status": "healthy",
"version": "1.6.1"
},
"sroute2t": {
"configured": false,
"status": "unknown",
"version": null
},
"sroute3": {
"configured": false,
"status": "unknown",
"version": null
}
}
}
}
}
openJob
query
free
Stable
Track a long-running solve and collect its result.
query Job($id: String!) {
openJob(id: $id) {
id
status
capability
progress
stage
createdAt
startedAt
finishedAt
resultUrl
resultExpiresAt
error
}
}
Variables
{
"id": "job_01k8zq4a6c8e0g2j4l6n8q0s2u"
}
Response example
{
"data": {
"openJob": {
"id": "job_01k8zq4a6c8e0g2j4l6n8q0s2u",
"status": "succeeded",
"capability": "routing.optimize",
"progress": 100,
"stage": "done",
"createdAt": "2026-10-23T09:27:40-04:00",
"startedAt": "2026-10-23T09:27:40-04:00",
"finishedAt": "2026-10-23T09:27:40-04:00",
"resultUrl": "/v1/jobs/job_01k8zq4a6c8e0g2j4l6n8q0s2u/result",
"resultExpiresAt": "2026-10-24T09:27:40-04:00",
"error": null
}
}
}
openJobCancel
mutation
free
Stable
Track a long-running solve and collect its result.
mutation Cancel($id: String!) {
openJobCancel(id: $id) {
id
status
capability
progress
stage
createdAt
startedAt
finishedAt
resultUrl
resultExpiresAt
error
}
}
Variables
{
"id": "job_01k8zq4a6c8e0g2j4l6n8q0s2u"
}
Response example
{
"data": {
"openJobCancel": {
"id": "job_01k8zq4a6c8e0g2j4l6n8q0s2u",
"status": "succeeded",
"capability": "routing.optimize",
"progress": 100,
"stage": "done",
"createdAt": "2026-10-23T09:27:40-04:00",
"startedAt": "2026-10-23T09:27:40-04:00",
"finishedAt": "2026-10-23T09:27:40-04:00",
"resultUrl": "/v1/jobs/job_01k8zq4a6c8e0g2j4l6n8q0s2u/result",
"resultExpiresAt": "2026-10-24T09:27:40-04:00",
"error": null
}
}
}
openJobDeliveries
query
free
Stable
Track a long-running solve and collect its result.
query Deliveries($id: String!) {
openJobDeliveries(id: $id)
}
Variables
{
"id": "job_01k8zq4a6c8e0g2j4l6n8q0s2u"
}
Response example
{
"data": {
"openJobDeliveries": {
"deliveries": [
{
"delivery_id": "dlv_01k8zq4h2k4m6p8r0t2w4y6a8c",
"event": "job.succeeded",
"status": "delivered",
"endpoint_host": "hooks.example.com",
"attempt_count": 1,
"http_status": 200,
"response_time_ms": 0,
"error_code": null,
"error_message": null,
"last_attempt_at": "2026-10-23T09:27:49-04:00",
"next_attempt_at": null,
"delivered_at": "2026-10-23T09:27:49-04:00"
}
]
}
}
}
openJobDeliveryReplay
mutation
free
Stable
Track a long-running solve and collect its result.
mutation Replay($jobId: String!, $deliveryId: String!) {
openJobDeliveryReplay(jobId: $jobId, deliveryId: $deliveryId)
}
Variables
{
"jobId": "job_01k8zq4a6c8e0g2j4l6n8q0s2u",
"deliveryId": "dlv_01k8zq4h2k4m6p8r0t2w4y6a8c"
}
Response example
{
"data": {
"openJobDeliveryReplay": {
"delivery_id": "dlv_01k8zq4h2k4m6p8r0t2w4y6a8c",
"status": "pending"
}
}
}
openJobResult
query
free
Stable
Track a long-running solve and collect its result.
query JobResult($id: String!) {
openJobResult(id: $id)
}
Variables
{
"id": "job_01k8zq4a6c8e0g2j4l6n8q0s2u"
}
Response example
{
"data": {
"openJobResult": {
"data": {
"routes": [
{
"vehicle_id": "van-2",
"stops": [
{
"type": "start",
"arrival": "2026-11-02T08:31:07-05:00",
"arrival_epoch": 1793626267,
"distance_meters": 0,
"duration_seconds": 0,
"load": [
6
]
},
{
"type": "job",
"arrival": "2026-11-02T08:35:11-05:00",
"arrival_epoch": 1793626511,
"distance_meters": 1839,
"duration_seconds": 244,
"leg_distance_meters": 1839,
"leg_duration_seconds": 244,
"id": "order-1001",
"load": [
4
]
},
{
"type": "job",
"arrival": "2026-11-02T08:47:56-05:00",
"arrival_epoch": 1793627276,
"distance_meters": 5338,
"duration_seconds": 709,
"leg_distance_meters": 3499,
"leg_duration_seconds": 465,
"id": "order-1003",
"load": [
3
]
},
{
"type": "job",
"arrival": "2026-11-02T09:00:00-05:00",
"arrival_epoch": 1793628000,
"distance_meters": 9220,
"duration_seconds": 1193,
"leg_distance_meters": 3882,
"leg_duration_seconds": 484,
"id": "order-1002",
"load": [
0
]
},
{
"type": "end",
"arrival": "2026-11-02T09:08:17-05:00",
"arrival_epoch": 1793628497,
"distance_meters": 10687,
"duration_seconds": 1390,
"leg_distance_meters": 1467,
"leg_duration_seconds": 197,
"load": [
0
]
}
],
"stop_count": 5,
"task_count": 3,
"distance_meters": 10687,
"duration_seconds": 1390,
"service_seconds": 840,
"waiting_seconds": 0,
"geometry": null
}
],
"unassigned": [],
"summary": {
"routes": 1,
"assigned": 3,
"unassigned": 0,
"distance_meters": 10687,
"duration_seconds": 1390
}
},
"warnings": [],
"meta": {
"engine": "sroute2",
"engine_version": "1.6.1",
"solve_id": "e363b370-4113-44a0-8630-1579e1fbc799",
"capacity_dimensions": [
"0"
]
},
"billing": {
"unit": "node",
"quantity": 5,
"counted": false,
"breakdown": {
"nodes": 5,
"jobs": 3,
"shipments": 0,
"shipment_nodes": 0,
"vehicles": 2,
"vehicle_nodes": 2
}
}
}
}
}
openJobs
query
free
Stable
Track a long-running solve and collect its result.
query Jobs($limit: Int) {
openJobs(limit: $limit) {
id
status
capability
progress
stage
createdAt
startedAt
finishedAt
resultUrl
resultExpiresAt
error
}
}
Variables
{
"limit": 20
}
Response example
{
"data": {
"openJobs": [
{
"id": "job_01k8zq4a6c8e0g2j4l6n8q0s2u",
"status": "succeeded",
"capability": "routing.optimize",
"progress": 100,
"stage": "done",
"createdAt": "2026-10-23T09:27:40-04:00",
"startedAt": "2026-10-23T09:27:40-04:00",
"finishedAt": "2026-10-23T09:27:40-04:00",
"resultUrl": "/v1/jobs/job_01k8zq4a6c8e0g2j4l6n8q0s2u/result",
"resultExpiresAt": "2026-10-24T09:27:40-04:00",
"error": null
}
]
}
}
openPlanMatrixClose
mutation
free
Stable
Upload a fleet, depot or plan once and reference it by id.
mutation Run($matrix: String!) {
openPlanMatrixClose(matrix: $matrix) {
mode
data
billing { unit quantity counted }
}
}
Variables
{
"matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910"
}
Response example
{
"data": {
"openPlanMatrixClose": {
"mode": "sync",
"data": {
"matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
"closed": true
},
"billing": {
"unit": "free",
"quantity": 0,
"counted": false
}
}
}
}
openPlanMatrixOpen
mutation
free
Stable
Upload a fleet, depot or plan once and reference it by id.
mutation Run($input: Json) {
openPlanMatrixOpen(input: $input) {
mode
data
meta
billing { unit quantity counted }
}
}
Variables
{
"input": {
"region": "NA",
"profile": "car",
"points": [
{
"lat": 45.5017,
"lng": -73.5673
},
{
"lat": 45.5088,
"lng": -73.554
},
{
"lat": 45.4972,
"lng": -73.5786
}
]
}
}
Response example
{
"data": {
"openPlanMatrixOpen": {
"mode": "sync",
"data": {
"matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
"expires_at": "2026-10-23T14:30:00Z",
"node": "tile2"
},
"meta": {
"region": "NA",
"profile": "car"
},
"billing": {
"unit": "free",
"quantity": 0,
"counted": false
}
}
}
}
openPlanMatrixPoints
mutation
free
Stable
Upload a fleet, depot or plan once and reference it by id.
mutation Run($matrix: String!, $input: Json) {
openPlanMatrixPoints(matrix: $matrix, input: $input) {
mode
data
billing { unit quantity counted }
}
}
Variables
{
"matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
"input": {
"points": [
{
"lat": 45.5231,
"lng": -73.5817
}
],
"wait_ms": 1000
}
}
Response example
{
"data": {
"openPlanMatrixPoints": {
"mode": "sync",
"data": {
"matrix": "tile2.3f0c9a5e7b1d4c2a9e8f6d5c4b3a2910",
"queued": 1,
"ready": true
},
"billing": {
"unit": "free",
"quantity": 0,
"counted": false
}
}
}
}
openRoutingPresets
query
free
Stable
List what this key can call, at what price, against which quota.
query Presets($engine: String) {
openRoutingPresets(engine: $engine)
}
Variables
{
"engine": "sroute2"
}
Response example
{
"data": {
"openRoutingPresets": {
"presets": {
"none": {
"strategies": [],
"weights": [],
"title": "No balance",
"description": "Cheapest plan; drivers may be uneven",
"category": "balance",
"hidden": false,
"alias_of": null,
"new": false
},
"min_change": {
"strategies": [
"orders"
],
"weights": {
"orders": 0.3
},
"title": "Minimal change",
"description": "Touch as little as possible of the current plan",
"category": "execution",
"hidden": false,
"alias_of": null,
"new": false
},
"balanced": {
"strategies": [
"time",
"distance"
],
"weights": {
"time": 0.5,
"distance": 0.5
},
"title": "Balanced",
"description": "",
"category": "balance",
"hidden": true,
"alias_of": "time",
"new": false
}
},
"engine": "sroute2",
"engines": [
"sroute",
"sroute2"
],
"default_engine": "sroute2",
"priorities": [
{
"name": "hold",
"value": 10
},
{
"name": "flexible",
"value": 20
},
{
"name": "economy",
"value": 30
},
{
"name": "standard",
"value": 40
},
{
"name": "express",
"value": 50
},
{
"name": "rush",
"value": 60
},
{
"name": "emergency",
"value": 70
},
{
"name": "due",
"value": 80
},
{
"name": "overdue",
"value": 90
}
],
"priority_rule": "Priority is 0-100. When the problem is infeasible, lower-priority tasks are dropped to `unassigned` first. These named levels are the same ladder the Superroute platform plans with.",
"routing_rules": [
{
"rule": "max_ride",
"fields": [
"shipments.*.max_ride_seconds",
"constraints.max_ride_seconds"
],
"engines": {
"sroute": {
"status": "unsupported"
},
"sroute2": {
"status": "unsupported"
},
"sroute2t": {
"status": "native",
"min_version": "1.0.19"
},
"sroute3": {
"status": "native",
"min_version": "1.0.0"
}
}
},
{
"rule": "latest_departure",
"fields": [
"vehicles.*.latest_departure_at"
],
"engines": {
"sroute": {
"status": "unsupported"
},
"sroute2": {
"status": "unsupported"
},
"sroute2t": {
"status": "native",
"min_version": "1.0.19"
},
"sroute3": {
"status": "native",
"min_version": "1.0.0"
}
}
}
],
"hours": {
"balance": "hours",
"field": "constraints.balance_tolerance",
"unit": "percent",
"min": 1,
"max": 100,
"default": 15,
"engines": [
"sroute",
"sroute2"
],
"operations": [
"routing.optimize"
],
"measured_in": "seconds of working time per vehicle (driving including the return to an end point, setup, service, waiting), read from the solved plan",
"rule": "Solves, measures every vehicle's working time, and while a vehicle sits above the band closes every vehicle's working day at the band's top (then a step tighter), hands the tasks the busiest give up to the lightest by their measured time per task, and re-solves, at most twice. A re-solve is kept only when it evens the day out without leaving more work unassigned. Reported back in meta.balance."
},
"zone_hours": {
"balance": "zone_hours",
"field": "constraints.balance_tolerance",
"unit": "percent",
"min": 1,
"max": 100,
"default": 15,
"engines": [
"sroute",
"sroute2"
],
"operations": [
"routing.optimize"
],
"measured_in": "seconds of working time per vehicle (driving including the return to an end point, setup, service, waiting), read from the solved plan; the zones are cut on each task's setup + service plus a travel estimate",
"rule": "Cuts the tasks into one compact, non-overlapping zone per vehicle on estimated time — a slow area gets a smaller zone — pins every task to its zone's vehicle, solves, then while a vehicle's measured working time sits outside the band scales the zone targets by expected / measured, re-cuts and re-solves, at most twice. Routes never cross; a task its zone's vehicle cannot fit is offered once to the others. Reported back in meta.balance."
},
"zone": {
"balance": "zone",
"field": "constraints.balance_tolerance",
"unit": "percent",
"min": 1,
"max": 100,
"default": 15,
"engines": [
"sroute",
"sroute2"
],
"operations": [
"routing.optimize"
],
"measured_in": "tasks (a shipment counts as two: its pickup and its delivery)",
"rule": "Cuts the tasks into one compact, non-overlapping zone per vehicle, each holding that vehicle's balanced share within the tolerance, and lets the solver sequence inside each zone — routes never cross. A task its zone's vehicle cannot fit is offered once to the others. Reported back in meta.balance."
},
"tolerance": {
"balance": "tolerance",
"field": "constraints.balance_tolerance",
"unit": "percent",
"min": 1,
"max": 100,
"default": 15,
"engines": [
"sroute",
"sroute2"
],
"operations": [
"routing.optimize"
],
"measured_in": "tasks (a shipment counts as two: its pickup and its delivery)",
"rule": "Caps every vehicle at the balanced share plus the tolerance, then re-solves under a lower ceiling if a vehicle still came out below the band. Route quality stays close to no balancing at all while the gap between vehicles stays inside the tolerance. Reported back in meta.balance."
}
}
}
}
openWebhookVerify
mutation
free
Stable
Track a long-running solve and collect its result.
mutation Verify($url: String!, $secret: String) {
openWebhookVerify(url: $url, secret: $secret)
}
Variables
{
"url": "https://hooks.example.com/superroute",
"secret": "whsec_0123456789abcdef"
}
Response example
{
"data": {
"openWebhookVerify": {
"verified": true,
"reason": null
}
}
}