Webhook events
The events we send, what each one carries, and how retries work.
Register an endpoint with POST /v1/webhooks and pick the events you want in event_types.
A tracking's status is one of not_yet_scanned, in_transit, out_for_delivery, delivered, exception, returned or unknown. returned means the carrier is sending the parcel back (return to sender), told apart from other exceptions.
Event | Sent when |
|---|---|
| A tracking is added. |
| We checked the carrier and saved the result. |
| The status changes, for example from |
| The parcel is delivered. |
| The carrier reports a problem (a failed delivery, a hold), or we couldn't reach the carrier on this check. |
| The parcel is being returned to its sender. The tracking's status becomes |
Every delivery is a POST with a JSON body:
{
"id": "evt_...",
"type": "tracking.status_changed",
"created_at": "2026-10-21T20:18:19.402Z",
"data": {
"tracking": { "id": "trk_...", "tracking_number": "1Z999AA10123456784", "status": "out_for_delivery", "events": [] },
"previous_status": "in_transit",
"current_status": "out_for_delivery"
}
}Retries
Answer with any 2xx status once you've accepted the event. Anything else, or no answer, and we try again: up to 5 attempts, about 30 seconds apart. An endpoint that fails 100 times in a row is disabled; turn it back on in the dashboard once it's fixed.
Use the event id to ignore an event you've already handled. To test your handler, POST /v1/webhooks/{id}/test returns a signed sample event without sending it.