---
title: "Recent delivery attempts for a webhook"
method: GET
path: "/api/v1/webhooks/{id}/deliveries"
tags: ["Webhooks"]
---

# Recent delivery attempts for a webhook

`GET /api/v1/webhooks/{id}/deliveries`

## Request

- Base URL: `https://propraven.com`
- URL: `https://propraven.com/api/v1/webhooks/{id}/deliveries`
- Auth: HTTP bearer

Returns the last 100 delivery attempts for an endpoint — useful for debugging signature mismatches, retry visibility, and dead-letter inspection.

## Path parameters

- `id` string, uuid, required

## Response `200`

Recent deliveries returned (max 100, newest first).

- object
  - `deliveries` WebhookDelivery[]
    - `id` string, uuid: Delivery id; sent as the `X-PropRaven-Delivery-Id` header on every attempt.
    - `event_id` string: Deterministic event identifier — sha256(source || pk || event_type). Idempotent re-deliveries share this.
    - `event_type` 'parcel.sold' | 'parcel.permit_filed' | 'parcel.owner_changed'
    - `event_occurred_at` string, date-time
    - `status` 'pending' | 'in_flight' | 'delivered' | 'dead_lettered' | 'failed': `pending` = queued or waiting for its next retry (`next_attempt_at`); `in_flight` = being sent, or the outcome of a send is unknown (network error or timeout) and it is held for reconciliation, not retried automatically; `delivered` = your endpoint answered 2xx; `dead_lettered` = all 8 attempts got non-2xx, or the send was refused before dispatch (re-queue with the retry route); `failed` = legacy value the current dispatcher never sets (still accepted by the retry route).
    - `attempts` integer: Attempts made so far (at most 8).
    - `last_attempt_at` string, date-time, nullable
    - `next_attempt_at` string, date-time, nullable
    - `last_response_status` integer, nullable: HTTP status your endpoint returned on the last attempt; null when no status came back.
    - `last_response_body` string, nullable: Never your endpoint's body: after any attempt that got an HTTP status back it is the fixed text `[redacted: response body not persisted]`; null before the first such attempt.
    - `last_error` string, nullable: Why the last send did not complete (for example `Delivery outcome unknown; reconciliation required`); null otherwise.
    - `dead_lettered_at` string, date-time, nullable
    - `created_at` string, date-time

## Other responses

- `400`: A query or body parameter is invalid. Nothing was read or charged.
- `401`: Missing, malformed or invalid credential.
- `404`: The resource (or the endpoint) does not exist.
- `405`: The endpoint exists but does not support this method. `Allow` lists the methods it does.
- `429`: Rate limit exceeded.
- `500`: Unexpected server error. The body never carries database or driver text.

---

[API](https://skmtc.dev/propraven/apis/propraven-api.md) · [All operations](https://skmtc.dev/propraven/apis/propraven-api/llms.txt) · [OpenAPI document](https://skmtc.dev/propraven/apis/propraven-api/revisions/37f8158c4eda?raw)
