API reference

Send orders from your store, WMS, or lab system straight into dispatch, and pull back delivery status and proof of delivery. API access is included with the Business plan.

Authentication

Create a key in Settings → API keys and send it as a bearer token. Keys act with dispatcher permissions for the organization that created them.

curl https://api.routecheetah.com/orders?unrouted=true \
  -H "Authorization: Bearer rck_your_key"

Errors return JSON with a machine-readable code: validation (with per-field details), plan_limit, feature_unavailable, not_found.

Download the OpenAPI 3.1 spec to generate a client in any language.

Orders

GET /orders

List orders

  • date: Service date (YYYY-MM-DD)
  • status: Order status
  • unrouted: "true" for orders not yet on a route

POST /orders

Create a pickup-and-delivery order

Request body
  • serviceDate string (required)
  • priority string
  • serviceLevel string
  • autoServiceLevel boolean
  • recurring boolean
  • refrigerated boolean
  • reference object
  • poNumber object
  • pickup object (required)
  • delivery object (required)
  • packages object
  • weightLbs object
  • notesForDriver object
  • notesInternal object
  • requesterName object
  • requesterPhone object
  • customerId object
  • items array

POST /ai/order-draft

Draft an order from a customer's email or text message, or a photo of a paper order or label, with AI (Business plan). Returns matched saved places, service level, date, and times for review; nothing is created

Request body
  • text string
  • image string

GET /orders/{id}

Get an order with its pickup and delivery status

PATCH /orders/{id}/pricing

Change an order's service level, recurring rate, special handling, billed customer, failed-attempt billing, or extra costs, and reprice it from the rate card

Request body
  • serviceLevel string
  • recurring boolean
  • refrigerated boolean
  • customerId object
  • attemptBillable boolean
  • otherCostCents integer
  • refreshFuelPrice boolean

POST /orders/{id}/redeliver

Redeliver a failed order on a separate trip: a new order with the same stops, priced in full

Request body
  • serviceDate string (required)
  • serviceLevel string

POST /orders/{id}/cancel

Cancel an order

POST /orders/{id}/dispatch

Dispatch an order: to a driver's route for its date (created if needed), or onto the route in routeId

Request body
  • driverMembershipId object (required)
  • mode string
  • routeId object

POST /orders/{id}/items

Chain of custody: add items (bags, totes, packages) to scan at pickup and delivery, each with an optional temperature range. Returns all the order's items

Request body
  • items array (required)

DELETE /orders/{id}/items/{itemId}

Chain of custody: remove an item nobody has scanned yet

GET /orders/{id}/custody

Chain of custody report: each item's status, every scan with who, where, when, and temperature, exceptions, and temperature excursions

  • format: "json" (default) or "html" for a printable page

Routes

GET /routes

List routes

  • date: Service date (YYYY-MM-DD)
  • from: Range start
  • to: Range end

POST /routes

Create a route

Request body
  • name object
  • serviceDate string (required)
  • driverMembershipId object
  • start object
  • end object
  • roundTrip boolean

GET /routes/{id}

Get a route with its stops and proof of delivery

PATCH /routes/{id}

Update a route

Request body
  • name object
  • serviceDate string
  • driverMembershipId object
  • start object
  • end object
  • roundTrip boolean

DELETE /routes/{id}

Delete a route that has not started

POST /routes/{id}/stops

Add new stops or move unrouted order stops onto a route

Request body
  • stops array
  • stopIds array

POST /ai/stops-from-photo

Read delivery stops (name, address, phone, notes) from a photo of shipping labels or a printed or handwritten list, as rows for /routes/{id}/import. Nothing is added until you import them

Request body
  • image string (required)

POST /routes/{id}/import

Import stops from spreadsheet rows (rows that cannot be located are added and counted as unlocated)

Request body
  • rows array (required)

PUT /routes/{id}/sequence

Set the stop order

Request body
  • stopIds array (required)

POST /routes/{id}/optimize

Optimize the stop order. With traffic-aware routing (paid plans), `plan` on the route has a fastest and a fuel-efficient option when they differ: drive time with traffic, miles, fuel, and cost. The route follows `objective`, or the organization's default

Request body
  • objective string

POST /routes/{id}/plan

Switch a route between the fastest and fuel-efficient options of its plan: resequences the stops and updates distance, drive time, and ETAs. Drivers can switch their own route before starting it when the organization allows it

Request body
  • objective string (required)

POST /routes/{id}/assign

Assign or offer a route to a driver

Request body
  • driverMembershipId object (required)
  • mode string

Stops

GET /stops/{id}

Get a stop

POST /stops/{id}/status

Change a stop status (on the way, arrived, attempted, skipped, reopen)

Request body
  • status string (required)
  • failureReason object
  • note object
  • lat object
  • lng object

POST /stops/{id}/complete

Complete a stop with proof of delivery

Request body
  • recipientName object
  • recipientRelation object
  • signature object
  • photos array
  • notes object
  • waitMinutes object
  • waitAutoMinutes object
  • lat object
  • lng object

POST /stops/{id}/retry

Try a failed stop again on the same route. A billable failed attempt adds one stop fee to the order

POST /stops/{id}/arrival-check

Text the stop's contact from RouteCheetah's number asking whether someone will be there (reply Y or N). Once per stop; the reply shows on the stop as arrivalCheck

POST /stops/{id}/custody

Chain of custody: record item scans, exceptions for items that can't be scanned, and a temperature reading at an order's pickup or delivery. Labels not on the order are logged as exceptions. Completing the stop needs every item scanned or excused, and a reading for refrigerated loads

Request body
  • scans array
  • exceptions array
  • temperatureC object
  • handoff boolean
  • at object
  • lat object
  • lng object

Places

GET /places

List or search saved places

  • q: Search text

POST /places

Save a place

Request body
  • name string (required)
  • contactName object
  • phone object
  • email object
  • notes object
  • address object (required)

PUT /places/{id}/rates

Set a customer's negotiated rates (any rate-card field; null clears them). Orders billed to the place are priced with them

Request body
  • rateOverrides object (required)

Reports

GET /reports/deliveries

Completed stops in a date range

  • from (required): YYYY-MM-DD
  • to (required): YYYY-MM-DD
  • format: "json" (default) or "csv"

GET /reports/recovered

Revenue recovered by automatic pricing, by month: fuel surcharge, measured wait time the driver kept, and service levels raised by the rules (owners and admins)

  • from (required): YYYY-MM-DD
  • to (required): YYYY-MM-DD

GET /fuel

The diesel price fuel surcharges follow today, where it comes from (EIA weekly or entered by hand), and recent weeks

Tracking

GET /tracking/live

Latest position of each active driver

GET /tracking/board

Live map for a day: each driver's position, route stops, the stop they're heading to, today's trail, and driving stats (distance, driving time, average and top speed, speeding)

  • date (required): Service date (YYYY-MM-DD)

Questions about integrating? Email [email protected].

Connect your systems to dispatch

Start a free trial, then upgrade to Business when you're ready to connect via the API.