---
title: "List webhook delivery audit log + redeliver a failed delivery"
method: POST
path: "/v1/webhook-deliveries"
tags: ["Monitors"]
---

# List webhook delivery audit log + redeliver a failed delivery

`POST /v1/webhook-deliveries`

## Request

- Base URL: `https://api.rateapi.dev`
- URL: `https://api.rateapi.dev/v1/webhook-deliveries`
- Auth: API key in header `X-API-Key`

Org-scoped (key-authed) observability for monitor webhook deliveries. Returns a per-event delivery log with status (delivered/failed/pending), response code, error, response time, and timestamp, plus a rollup summary. Set `action: "redeliver"` with a `delivery_id` to replay a stored payload verbatim (the replay is itself audited). Every row is scoped to the authenticated API key for org isolation. This route is the single source of truth; the MCP `list_webhook_deliveries` tool and the dashboard call it.

**Authentication required**: Pass your API key in the `X-API-Key` header.

## Request body

- union
  - object
    - `action` 'list': Which operation to perform: `list` reads past deliveries, `redeliver` re-sends one.
    - `monitor_id` string: Filter to one monitor.
    - `status` 'delivered' | 'failed' | 'pending': Filter by delivery outcome.
    - `limit` integer: Maximum number of records this response may contain.
    - `offset` integer: How many records were skipped before this page.
  - object
    - `action` 'redeliver', required: Which operation to perform: `list` reads past deliveries, `redeliver` re-sends one.
    - `delivery_id` integer, required: The audit-log id of the delivery to replay.

## Response `200`

Delivery log (list) or redelivery result.

- union
  - object: Returned by `action: "list"`.
    - `deliveries` object[], required: Past webhook deliveries, most recent first.
      - `id` integer: Identifier of this delivery attempt, which `redeliver` takes as `delivery_id`.
      - `monitor_id` string: Monitor whose trigger produced this delivery.
      - `event_id` string: Identifier of the event that was delivered. Reuse it to deduplicate on your side.
      - `event_type` string: The kind of event that was delivered.
      - `trigger_type` string: What caused the monitor to fire.
      - `status` 'delivered' | 'failed' | 'pending': Outcome of the attempt: `delivered` on a 2xx from your endpoint, `failed` on any other outcome, `pending` while it is still in flight.
      - `delivery_status_code` integer, nullable: HTTP status your endpoint returned, or null if no response was received.
      - `delivery_error` string, nullable: Why the attempt failed, or null when it succeeded.
      - `response_time_ms` integer, nullable: How long your endpoint took to respond, in milliseconds, or null if it never did.
      - `webhook_url` string: Endpoint the payload was posted to.
      - `is_simulation` boolean: True when the delivery came from a simulated run rather than a live trigger.
      - `timestamp` string, date-time: When the attempt was made.
    - `summary` object, required: Counts of the deliveries matching this query, by outcome.
      - `total` integer: Total deliveries matching the query.
      - `delivered` integer: How many succeeded.
      - `failed` integer: How many failed.
      - `pending` integer: How many are still in flight.
    - `limit` integer, required: Maximum number of records this response may contain.
    - `offset` integer, required: How many records were skipped before this page.
  - object: Returned by `action: "redeliver"`.
    - `redelivered` boolean, required: True when the redelivery was attempted.
    - `delivery_id` integer, required: The delivery attempt that was re-sent.
    - `new_status` 'delivered' | 'failed' | 'pending', required: Outcome of the redelivery attempt.
    - `delivery_status_code` integer, nullable, required: HTTP status your endpoint returned on the redelivery, or null if no response was received.
    - `response_time_ms` integer, nullable, required: How long your endpoint took to respond to the redelivery, in milliseconds, or null if it never did.
    - `error` string, nullable, required: Short machine-comparable error label.

## Other responses

- `400`: The request was malformed — a missing required field, an unparseable body, or a parameter outside its allowed range. The `error` field names what was wrong; retrying the identical request will fail identically.
- `401`: No API key, or a key that is unknown or disabled. Send it in the `X-API-Key` header. Free keys are issued instantly by POST /keys with an email address. The response carries `WWW-Authenticate` pointing at this host's protected-resource metadata, and the `RateLimit-*` headers describing the Free-tier budget a key issued now would carry (scope `anonymous`) — a rejected request spends none of it, so `Remaining` equals `Limit`.
- `404`: No resource matches the identifier supplied. For rate queries an empty result set is a 200 with an empty array, so a 404 here means the resource itself does not exist.
- `429`: Quota exhausted for the current window. `Retry-After` gives the seconds to wait; `upgradeInfo` explains how to lift the cap. Retrying before the reset will fail again and still counts as a request.

---

[API](https://skmtc.dev/rateapi/apis/rate-api.md) · [All operations](https://skmtc.dev/rateapi/apis/rate-api/llms.txt) · [OpenAPI document](https://skmtc.dev/rateapi/apis/rate-api/revisions/06a6db76995f?raw)
