Orders in. Routes out.
Push jobs from the system you already run and get back a sequenced route with your own identifiers intact. Three endpoints, no SDK required.
Three calls, and that is the surface
| Verb | Path | Purpose |
|---|---|---|
| POST | /v1/integration-token | Exchange client credentials for a bearer token, valid one hour |
| POST | /v1/integration-import | Import a job with its stops, geocode the addresses, optimise the route and assign the driver — one request |
| GET | /v1/integration-jobs | Job and stop status: progress counts, per-stop state, the optimised order |
Import, geocode, optimise, assign
POST /v1/integration-import HTTP/1.1
Authorization: Bearer {token}
Content-Type: application/json
{
"external_job_id": "WMS-2026-07-30-A",
"driver_email": "driver@fleet.com.au",
"optimize": true,
"stops": [
{ "external_stop_id": "SO-88214",
"address": "3/216 Brunswick St, Fitzroy VIC 3065",
"parcel_count": 2,
"duration_minutes": 4 }
]
}{
"job_id": "job_7Yq2c",
"external_job_id": "WMS-2026-07-30-A",
"assigned_to": "driver@fleet.com.au",
"optimized": true,
"stops_imported": 142,
"stops": [
{ "external_stop_id": "SO-88214",
"stop_id": "stp_9f2",
"sequence": 38,
"status": "pending" }
],
"warnings": []
}Your ids, kept
Every identifier you send comes back on the way out, on the job and on each stop. You never have to keep a mapping table between your order numbers and ours.
| external_job_id | Your own batch reference — comes back on every stop, so you never hold a mapping table |
| external_stop_id | Your order or consignment number, carried through to status and completion |
| address | A single address line; geocoded on import, with failures returned as warnings |
| parcel_count | Used for load and handling assumptions on the stop |
| duration_minutes | Service time at the door — spent in the model, not assumed away |
| driver_email | Assigns the finished route to a driver already on the account |
What it does when things go wrong
Idempotent writes
Re-importing the same external_job_id updates the job rather than creating a second one. A retry after a timeout is safe.
Partial success
A stop that cannot be geocoded comes back in warnings[] with the rest of the job imported. The request does not fail whole because one address is bad.
Versioning
The version is in the path. Fields are added, never removed or repurposed inside a version, so an integration written today keeps parsing.
Sandbox keys are free
Build against a sandbox before you commit to anything. Ask and we will send credentials and a worked example against your own data shape.