Tracking, status, and ETA
Last updated July 30, 2026
List your shipments
GET /shipments?status=&from=&to=&page=&limit=
All filters are optional. status is one of pending, assigned, picked_up, in_transit, delivered, failed, cancelled. from/to filter by creation date.
Get a single shipment
GET /shipments/:id
Returns the full shipment document, including statusHistory, the assigned agent (once dispatched), and current etaAt.
Lightweight status check
GET /shipments/:id/status
Returns just { trackingCode, status, statusHistory, etaAt }. Use this instead of the full shipment fetch when you're polling frequently and don't need the rest of the payload.
Live ETA
GET /shipments/:id/eta
For shipments that have been picked up or are in transit, this recalculates the estimated arrival time from the assigned agent's current live location, so it stays accurate as the delivery progresses. For shipments that haven't been picked up yet, it returns the original booking-time estimate. The response tells you which:
{ "etaAt": "2026-07-30T22:04:00.000Z", "source": "live", "status": "in_transit" }
source is either "live" (recalculated from the agent's current position) or "estimated" (the original quote-time estimate).
Public tracking
GET /track/:trackingCode
This endpoint requires no authentication and is safe to link to directly from a customer-facing order confirmation page or SMS. Pass the trackingCode you received when the shipment was created.
Cancelling a shipment
POST /shipments/:id/cancel
Only allowed while the shipment is still pending or assigned, before it has been picked up. Cancelling triggers an automatic refund to your wallet for the environment the shipment was created in.
What happens if a shipment can't be picked up
If a shipment is charged but a pickup turns out to be impossible, it's marked failed and automatically refunded, with an email notification sent to your registered contact address. You'll also receive a shipment.failed webhook event (see Webhooks) if you have one configured.