---
title: "Fire a test webhook"
method: POST
path: "/sandbox/webhooks/fire"
tags: ["Sandbox"]
---

# Fire a test webhook

`POST /sandbox/webhooks/fire`

## Request

- Base URL: `https://api.layout.link/v1`
- URL: `https://api.layout.link/v1/sandbox/webhooks/fire`
- Auth: HTTP bearer

Sends one signed test event to each enabled endpoint of this application that subscribes to it, through the real delivery pipeline: the sandbox signing secret, the same headers, the delivery log and the retries. The payload carries `test: true`. With `orderId`, the event describes that sandbox order of this application, with its real id and store, and the response's `order` shows what was sent. Sandbox keys only, and nothing is built.

## Headers

- `Layout-Version` '2026-10-01'
- `Idempotency-Key` string

## Request body

- FireWebhookRequest
  - `event` 'order.building' | 'order.carted' | 'order.placing' | 'order.placed' | 'order.failed' | 'order.unconfirmed' | 'order.challenge' | 'order.updated', required: The event to send. `order.needs_approval` is reserved and never sent, so it cannot be fired.
  - `orderId` string

## Response `200`

Sent. Read each delivery's outcome.

- FireWebhookResult
  - `event` 'order.building' | 'order.carted' | 'order.placing' | 'order.placed' | 'order.failed' | 'order.unconfirmed' | 'order.challenge' | 'order.updated', required
  - `order` FiredOrder, required
    - `id` string, required: With `orderId`, that order's id. Without it, `ord_test_000000000000`, which matches nothing.
    - `state` 'building' | 'carted' | 'placing' | 'placed' | 'failed' | 'unconfirmed' | 'refunded', required
    - `store` string, nullable, required
  - `deliveries` FiredDelivery[], required: One per enabled endpoint that subscribes to the event.
    - `id` string, required: The delivery id, as the payload's `delivery_id` and the console's delivery log show it.
    - `url` string, required: The endpoint it went to.
    - `outcome` 'delivered' | 'retry' | 'dead', required: `delivered`: your endpoint answered 2xx. `retry`: it did not, and the ordinary retry schedule takes over. `dead`: retries are exhausted.

## Other responses

- `400`: The body is not valid. The message names the field. `unsupported_version`: the Layout-Version header names no version this API answers.
- `401`: Secret not recognised, malformed, or rotated.
- `403`: A live key, or an application not permitted. This endpoint works with a sandbox key only.
- `404`: No enabled endpoint subscribes to that event, or `orderId` is not one of this application's sandbox orders.
- `409`: `idempotency_conflict`: the Idempotency-Key was already used with a different request. `in_progress`: the first request with that key is still running; retry after `Retry-After`.
- `429`: A per-minute brake, or this developer account's daily test events.
- `500`: Layout failed to answer. Retry with backoff.
- `503`: Layout or a dependency could not be reached. Retry with backoff.

---

[API](https://skmtc.dev/layout/apis/layout-partner-api.md) · [All operations](https://skmtc.dev/layout/apis/layout-partner-api/llms.txt) · [OpenAPI document](https://skmtc.dev/layout/apis/layout-partner-api/revisions/7ff4ba01bf56?raw)
