API · v1

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.

Base URL
api.routemate.app/v1
Auth
OAuth2 client_credentials
Token lifetime
3600 s
Availability
Team plan and above
01 · Endpoints

Three calls, and that is the surface

RouteMate integration API endpoints.
VerbPathPurpose
POST/v1/integration-tokenExchange client credentials for a bearer token, valid one hour
POST/v1/integration-importImport a job with its stops, geocode the addresses, optimise the route and assign the driver — one request
GET/v1/integration-jobsJob and stop status: progress counts, per-stop state, the optimised order
02 · A worked call

Import, geocode, optimise, assign

Request
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 }
  ]
}
Response · 200 OK
{
  "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": []
}
03 · Field reference

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.

Import field reference.
external_job_idYour own batch reference — comes back on every stop, so you never hold a mapping table
external_stop_idYour order or consignment number, carried through to status and completion
addressA single address line; geocoded on import, with failures returned as warnings
parcel_countUsed for load and handling assumptions on the stop
duration_minutesService time at the door — spent in the model, not assumed away
driver_emailAssigns the finished route to a driver already on the account
04 · Behaviour

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.