Get tracking events
Returns the tracking history for a shipment: every checkpoint the courier has reported, plus the shipment's current status and the courier's branding.
This is the pull side of tracking. If you want the events as they happen rather
than on a schedule, subscribe to the tracking/updated
webhook, which delivers the same object, so the same
parsing code handles both.
Unlike every other endpoint, this one is not tied to your account: it looks the tracking reference up across Bob Go, the way the public tracking page does.
Parameters
| Name | Type | Required | Notes |
|---|---|---|---|
tracking_reference |
string | yes | Bob Go's tracking reference for the shipment. |
There is no paging: every checkpoint comes back, and limit and offset are
ignored.
Response
The response is an array, even when you asked for one tracking reference. Take the first element.
See the example response.
| Field | Notes |
|---|---|
status |
The shipment's current tracking status. Use this for display. |
status_friendly |
The same status, written for a human. |
checkpoints |
Every event the courier reported, most recently received first. That is usually, but not always, the order they happened in, so sort on time if the order matters. |
grouped_checkpoints |
The same events grouped by day and sorted by time, for rendering a timeline. |
shipment_movement_events |
The five milestone timestamps, extracted from the checkpoints, and empty until reached. Usually the only part you need. |
courier_*, merchant_*, show_branding |
For rendering a tracking page. show_branding reflects the merchant's setting. |
last_checkpoint_time |
When the courier last reported anything. |
shipment_estimated_delivery_date_from / _to |
The estimated window, as full timestamps. Empty once the shipment is delivered or otherwise finished, and while it waits at a pickup point. |
id and custom_order_name are still returned but are due to be
discontinued. Key on shipment_tracking_reference and channel_order_number
instead.
Three things to expect from real courier data:
- Fields are often blank.
country,zone,cityandzipon a checkpoint are always empty, andlocationandmessagedepend entirely on what the courier sends. Render what is there rather than requiring it. - Times are strings, not RFC 3339, and not all in one zone. Checkpoint
timeand the estimated delivery window are South African time (2023-06-05 14:15:41+02:00), andtime_stringis only the time of day.last_checkpoint_time,shipment_time_createdand theshipment_movement_eventsare UTC (+00:00). Parse the offset rather than assuming one. - Errors have their own shape.
messageholds a JSON string rather than text. Parse it, and the error is indata.messageanddata.code. A tracking reference that does not exist comes back as a500.
Pickup point shipments carry extra fields, collection_location,
delivery_location, pickup_point_provider_name and the
show_pickup_point_details flags, for rendering locker collection details.
The
shipmentobject, with the collection and delivery contact details, is only included in thetracking/updatedwebhook payload. It is not returned here.