Event: Status Request

delivery_provider.status_request — the polling alternative for providers that cannot push.

Event: Status Request

event_type: delivery_provider.status_request

Only relevant if you cannot push status updates. Pushing is the default and the better option: it is immediate, cheaper for both sides, and needs no extra endpoint behaviour from you beyond what Pushing Status Updates describes. Implement polling only if your platform genuinely has no outbound webhook capability, and agree it with us during onboarding.

A hybrid is also possible, and is worth raising if it fits your platform: lifecycle statuses arrive by push, while driver position is polled because your pull API returns coordinates only.

🚧

Polling is agreed case by case

No provider integrated so far receives this event at a self-hosted endpoint, so treat it as an arrangement to negotiate rather than a self-service option. If you cannot push, raise it at the start of onboarding: the cadence, the rate limits and the failure handling all need agreeing, and the alternative is that your deliveries have no lifecycle at all.

How polling runs

Once a delivery is dispatched, YUMBI Gateway starts a polling workflow for it and calls this event on an interval until the delivery reaches a terminal status.

Default interval15 seconds
Maximum duration3 hours, after which polling stops regardless
Stops early onAny terminal status — delivered, cancelled, failed, undeliverable — from any source, including a pushed update or a cancellation you confirmed

The interval is configurable per environment. Tell us during onboarding if your rate limits need something slower.

Successful polls are not written to the webhook log — at this cadence they would flood it. Failures still are.

Request

{
  "event_id": "5e8a0d42-9f31-4c6b-a7d0-3b1c2e4f5a68",
  "event_type": "delivery_provider.status_request",
  "event_timestamp": 1785063100,
  "user_id": 12,
  "data": {
    "brand_id": null,
    "brand_guid": null,
    "provider_store_id": "STORE-8871",
    "provider_delivery_id": "prv_dl_xyz789",
    "order_guid": "6f1c2b18-3f4d-4f0e-9a6f-2f3b1a9c4d55",
    "order_id": 884213,
    "order_delivery_assignment_id": 5512
  }
}
FieldTypeNotes
provider_delivery_idstringThe delivery being polled. Always present.
order_guidUUID | nullThe order it belongs to.
order_idinteger | nullThe same order as a number.
provider_store_idstring | nullYour store identifier.
order_delivery_assignment_idinteger | nullYUMBI Gateway's internal id for this delivery attempt.
brand_id, brand_guidnullInternal to YUMBI Gateway. Always null for you.

Response

Return 200 with the delivery's current state. The field names are the same ones a pushed update uses, so one internal mapping serves both.

{
  "provider_delivery_id": "prv_dl_xyz789",
  "delivery_status": "on_route",
  "driver_full_name": "Sipho Ndlovu",
  "driver_registration": "CA 123-456",
  "vehicle_type": "motorcycle",
  "vehicle_color": "red",
  "driver_latitude": -29.7801,
  "driver_longitude": 30.7842,
  "estimated_time_of_arrival": "2026-08-07T14:41:00+02:00"
}
FieldTypeNotes
provider_delivery_idstringEcho the id you were polled for.
delivery_statusstring | nullA canonical status. null means "unchanged" — see below.
driver_full_namestring | null
driver_registrationstring | nullVehicle registration or licence plate.
vehicle_typestring | nullFree text, e.g. motorcycle, car.
vehicle_colorstring | nullFree text.
driver_latitudenumber | nullDecimal degrees.
driver_longitudenumber | nullDecimal degrees.
estimated_time_of_arrivalISO 8601 | null
delivery_coords_overridestring | nullCorrected dropoff coordinates, if you moved the pin.

Return everything you know on every poll. Fields you omit keep their stored value, so nothing is lost by leaving one out, but the poll is your only channel in this mode.

Status changes versus location pings

YUMBI Gateway decides for you. A poll whose delivery_status has not advanced since the last one — or which carries no status at all, as with a coordinates-only API — is treated as a location ping: the driver's position moves on the customer's map without running the status state machine. A poll carrying a new status is a status change.

This means a coordinates-only pull API is a perfectly valid implementation. Return the position and leave delivery_status null; push the lifecycle separately if you can, or map it as best you can from what you have.

Failing a poll

Return a non-2xx. Polling continues on its interval and the next tick tries again. A single failed poll is harmless; sustained failure means the customer's map goes stale, and with polling as your only lifecycle source it means the delivery completes with nothing ever reaching the channel.

If a poll tells you the delivery no longer exists on your side, return the terminal status you do have — cancelled or failed — rather than an error. That ends the polling cleanly instead of letting it run to the three-hour cap.


Did this page help you?