An order event

postWebhookorder

Payload

event'order.building' | 'order.carted' | 'order.placing' | 'order.placed' | 'order.failed' | 'order.unconfirmed' | 'order.needs_approval' | 'order.challenge' | 'order.updated' required

order.updated comes after order.placed each time more pickup details arrive (the name the order is under, the ready time, the store's own order number, instructions). Layout reads them from several places, such as the store's confirmation screen and its email, so they can arrive in more than one wave, minutes apart. On a delivery order it also comes when the driver picks the food up, when it is delivered, and when delivery could not happen (the order then reads as a pickup with changed_from: "delivery"). Handle every one. Its state stays placed. Read GET /orders/{orderId} for the details.

event_idstring required
delivery_idstring required

This delivery. A retry of it keeps the id; a replay gets a new one.

testtrue

A test delivery: the console's Send test event, POST /v1/sandbox/webhooks/fire, or layout trigger.

occurred_atstring required

When the order changed. Use it, not sent_at, to order events.

sent_atstring required

When Layout wrote this delivery.

Example payload

{
  "event_id": "evt_87228f5aa7b9_placed",
  "delivery_id": "dl_351eacf74201",
  "order": {
    "id": "ord_7c21e4b9a0d3",
    "store": "Layout test kitchen",
    "store_address": "1 Sandbox Way, San Francisco, CA 94107",
    "currency": "usd"
  },
  "user": {
    "id": "usr_4b8e9a01c2d3"
  },
  "occurred_at": "2026-10-01T17:01:05Z",
  "sent_at": "2026-09-13T10:14:03Z"
}

Response

Any 2xx acknowledges it. Anything else is retried.

Changes

Webhooks have no change history: a webhook is keyed by its event name rather than a path and method, so no recorded change can name it.