Relay API
endpoints
What merchants call, what recipients call without an account, and what handhelds push
/
Fit
SVG
PNG
Shipments
5 endpoints
GET /v1/shipments · List the calling merchant's shipments, newest first · auth: api-key · → Shipment[]
GET
/v1/shipments
200 401
🔒 api-key
List the calling merchant's shipments, newest first
POST /v1/shipments · Book a shipment and mint a tracking number per parcel · auth: api-key · → Shipment
POST
/v1/shipments
201 400 402 422
🔒 api-key
Book a shipment and mint a tracking number per parcel
GET /v1/shipments/{id} · One shipment with all of its parcels · auth: api-key · → Shipment
GET
/v1/shipments/{id}
200 404
🔒 api-key
One shipment with all of its parcels
POST /v1/shipments/{id}/cancel · Cancel before collection; fails once any parcel has been scanned · auth: api-key · → Shipment
POST
/v1/shipments/{id}/cancel
200 404 409
🔒 api-key
Cancel before collection; fails once any parcel has been scanned
GET /v1/parcels/{id}/label · The printable label as a PDF · auth: api-key · → application/pdf
GET
/v1/parcels/{id}/label
200 404
🔒 api-key
The printable label as a PDF
Tracking
4 endpoints
GET /v1/track/{tracking_number} · Public tracking history for one parcel · → TrackingEvent[]
GET
/v1/track/{tracking_number}
200 404 429
Public tracking history for one parcel
POST /v1/track/{tracking_number}/reschedule · Pick another delivery day · auth: otp · → TrackingEvent
POST
/v1/track/{tracking_number}/reschedule
200 409 410
🔒 otp
Pick another delivery day
POST /v1/track/{tracking_number}/redirect · Send it to a neighbour or a safe place instead · auth: otp · → TrackingEvent
POST
/v1/track/{tracking_number}/redirect
200 409 410
🔒 otp
Send it to a neighbour or a safe place instead
GET /track/{tracking_number} · Unversioned tracking; use /v1/track · → TrackingEvent[]
GET
/track/{tracking_number}
deprecated
200 404
Unversioned tracking; use /v1/track
Field devices
3 endpoints
POST /v1/scans · Upload a batch of scans taken while offline · auth: mtls · → ScanBatchResult
POST
/v1/scans
202 207 401
🔒 mtls
Upload a batch of scans taken while offline
POST /v1/attempts · Record a failed delivery attempt with a reason and a photo · auth: mtls · → TrackingEvent
POST
/v1/attempts
201 401 422
🔒 mtls
Record a failed delivery attempt with a reason and a photo
GET /v1/routes/{id}/manifest · Today's sequenced stops for a driver, cacheable offline · auth: mtls · → Stop[]
GET
/v1/routes/{id}/manifest
200 404
🔒 mtls
Today's sequenced stops for a driver, cacheable offline
Network operations
2 endpoints
GET /v1/depots · Every depot and the postcodes it serves · auth: bearer · → Depot[]
GET
/v1/depots
200
🔒 bearer
Every depot and the postcodes it serves
POST /v1/routes/{id}/sequence · Ask the routing engine to order the stops · auth: bearer · → Route
POST
/v1/routes/{id}/sequence
200 409 503
🔒 bearer
Ask the routing engine to order the stops
Published events
3 endpoints
EVENT parcel.delivered · Published when a delivery scan lands · → ParcelDeliveredEvent
EVENT
parcel.delivered
Published when a delivery scan lands
EVENT parcel.attempt-failed · Published when a courier records a failed attempt · → ParcelAttemptEvent
EVENT
parcel.attempt-failed
Published when a courier records a failed attempt
EVENT parcel.exception · Published when a parcel is marked lost or begins returning · → ParcelExceptionEvent
EVENT
parcel.exception
Published when a parcel is marked lost or begins returning
Types (8)
CreateShipmentInput
CreateShipmentInput
input
reference · string
reference
string
service_level · ServiceLevel!
service_level
ServiceLevel!
recipient · RecipientInput!
recipient
RecipientInput!
destination · AddressInput!
destination
AddressInput!
parcels · ParcelInput[]!
parcels
ParcelInput[]!
Shipment
Shipment
object
id · uuid!
id
uuid!
reference · string
reference
string
service_level · ServiceLevel!
service_level
ServiceLevel!
parcels · Parcel[]!
parcels
Parcel[]!
booked_at · datetime!
booked_at
datetime!
Parcel
Parcel
object
id · uuid!
id
uuid!
tracking_number · string!
tracking_number
string!
status · ParcelStatus!
status
ParcelStatus!
attempts · int!
attempts
int!
weight_grams · int!
weight_grams
int!
TrackingEvent
TrackingEvent
object
type · ScanType!
type
ScanType!
at · datetime!
at
datetime!
depot · string
depot
string
message · string!
message
string!
ScanBatch
ScanBatch
input
device_id · string!
device_id
string!
scans · ScanInput[]!
scans
ScanInput[]!
RescheduleInput
RescheduleInput
input
service_date · date!
service_date
date!
otp · string!
otp
string!
ParcelStatus
ParcelStatus
enum
(no fields)
ServiceLevel
ServiceLevel
enum
(no fields)
drag to pan · wheel to zoom · click a node · Esc clears
Auth is per audience
Merchants: a long-lived API key scoped to one merchant
Recipients: no account — a one-time code sent to the phone on the shipment
Handhelds: client certificates, rotated per device