Skip to main content
Once errand_create is called with callback_url, the platform POSTs JSON to that address whenever the order status changes. Return HTTP 200 on receipt (the response body isn’t checked). Besides status changes during delivery, the platform also pushes when payment succeeds and rider dispatch begins (dispatching), when rider dispatch fails (dispatch_failed, with the amount paid refunded in full), and when a pending-payment order auto-closes after 2 minutes unpaid (cancelled). The only case with no push is when you call the cancellation tool yourself and it succeeds — the tool’s response already gives you the result.
A callback is a notification, not the source of truth. Delivery is single-attempt with no retry, so network blips can drop it; the order’s actual state is always whatever errand_get_order returns. When the callback fires is decided by the delivery provider — the platform makes no delivery-time guarantee — don’t use it to build a timeout check; query directly when you need to know the current state for certain.
Events may arrive more than once or out of order — the delivery provider retries failed pushes. Handle them idempotently by order_id, and use time to determine ordering: ignore an event whose time is earlier than one you’ve already processed. The three event types carry different fields, so branch on event — don’t assume any particular field is always present.
A callback only fires once the push address is configured on the delivery provider’s side — confirm with the platform that it’s enabled for your account before you integrate; don’t treat the callback as the only source of order status. rider_changed (rider changed) is disabled by default and needs to be enabled separately.

Common fields (present on all three event types)

status_changed — status progressed

Sent whenever the order status changes; the most common event type.

exception — delivery exception reported

Sent when something unexpected happens during delivery. This event is informational only — it doesn’t change the order status (a single exception report doesn’t turn the order into a failure), and delivery may resume normally afterward. Consider showing it to the user and asking how to proceed.

rider_changed — rider changed

Sent when the rider changes, usually with the new rider attached; in a few cases the rider field isn’t included. If you need the real-time location, or this event didn’t include the rider, call errand_get_rider.

Exception reason values (error_reason)