> ## Documentation Index
> Fetch the complete documentation index at: https://docs.signa.so/llms.txt
> Use this file to discover all available pages before exploring further.

# List Webhook Deliveries

> Audit log of delivery attempts for an endpoint

## Overview

Requires the `portfolios:manage` scope.

## Path Parameters

<ParamField path="id" type="string" required>Endpoint ID (`whk_*`).</ParamField>

## Query Parameters

<ParamField query="limit" type="integer" default="20">Page size (1-100).</ParamField>
<ParamField query="cursor" type="string">Opaque cursor.</ParamField>

<ParamField query="since" type="string">
  ISO 8601 timestamp. Only deliveries with `created_at >= since` are returned. Useful for
  incremental polling: set `since` to the last `created_at` you saw and walk pages until
  exhausted. Composes cleanly with `cursor`.
</ParamField>

## Response

<ResponseField name="object" type="string">Always `"list"`.</ResponseField>

<ResponseField name="data" type="object[]">
  Array of `WebhookDelivery` rows.

  <Expandable title="WebhookDelivery">
    <ResponseField name="id" type="string">Raw UUID of the attempt row.</ResponseField>
    <ResponseField name="object" type="string">Always `"webhook_delivery"`.</ResponseField>
    <ResponseField name="endpoint_id" type="string">Source endpoint (`whk_*`).</ResponseField>
    <ResponseField name="alert_id" type="string | null">Source alert (`alt_*`), when applicable.</ResponseField>
    <ResponseField name="event_id" type="string">Stable event identifier, same value as the `webhook-id` header on the delivery.</ResponseField>
    <ResponseField name="event_type" type="string">Event type (e.g. `alert.created`).</ResponseField>
    <ResponseField name="attempt" type="integer">Retry attempt number (1-indexed).</ResponseField>
    <ResponseField name="delivery_attempt_id" type="string">UUID of this specific attempt.</ResponseField>
    <ResponseField name="status" type="string">One of `pending`, `delivered`, `failed`, or `exhausted`. `exhausted` is the terminal state after all retry attempts have failed.</ResponseField>
    <ResponseField name="http_status" type="integer | null">Response code from your endpoint.</ResponseField>
    <ResponseField name="response_body" type="string | null">First 1KB of the response body, truncated.</ResponseField>
    <ResponseField name="signature_timestamp" type="string">ISO timestamp embedded in the `webhook-timestamp` header.</ResponseField>
    <ResponseField name="next_retry_at" type="string | null">ISO timestamp of the next scheduled retry.</ResponseField>
    <ResponseField name="delivered_at" type="string | null">When the delivery succeeded.</ResponseField>
    <ResponseField name="created_at" type="string">When the attempt was scheduled.</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="has_more" type="boolean">Whether more pages exist.</ResponseField>
<ResponseField name="pagination" type="object">Cursor envelope.</ResponseField>
<ResponseField name="request_id" type="string">Request identifier.</ResponseField>

Delivery rows are retained for 30 days; queries for `since` values older than that return an
empty list rather than an error. For alert history beyond 30 days, use
[List Alerts](/api-reference/monitoring/alerts/list).

## Errors

| Status | `type`             | When                                             |
| ------ | ------------------ | ------------------------------------------------ |
| 400    | `validation_error` | `since` is not a valid ISO 8601 timestamp        |
| 404    | `not_found`        | Endpoint doesn't exist or belongs to another org |

## Code Examples

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://api.signa.so/v1/webhooks/whk_2mR8vNkT/deliveries?since=2026-06-01T00:00:00Z" \
    -H "Authorization: Bearer sig_YOUR_KEY"
  ```

  ```typescript TypeScript theme={null}
  import { Signa } from "@signa-so/sdk";
  const signa = new Signa({ api_key: process.env.SIGNA_API_KEY });

  const deliveries = await signa.webhooks.listDeliveries("whk_2mR8vNkT", {
    since: "2026-06-01T00:00:00Z",
  });
  ```
</CodeGroup>

<ResponseExample>
  ```json theme={null}
  {
    "object": "list",
    "data": [
      {
        "id": "018f9b2e-0000-7000-8000-000000000010",
        "object": "webhook_delivery",
        "endpoint_id": "whk_2mR8vNkT",
        "alert_id": "alt_4tYpL2Qn",
        "event_id": "018f9b2e-0000-7000-8000-000000000011",
        "event_type": "alert.created",
        "attempt": 1,
        "delivery_attempt_id": "018f9b2e-0000-7000-8000-000000000012",
        "status": "delivered",
        "http_status": 200,
        "response_body": "ok",
        "signature_timestamp": "2026-07-05T09:12:31.000Z",
        "next_retry_at": null,
        "delivered_at": "2026-07-05T09:12:31.500Z",
        "created_at": "2026-07-05T09:12:31.000Z"
      }
    ],
    "has_more": false,
    "pagination": { "cursor": null },
    "request_id": "req_8mQ2vXpL"
  }
  ```
</ResponseExample>

## Related Endpoints

* [Retrieve Webhook Delivery](/api-reference/monitoring/webhooks/retrieve-delivery) - fetch a single delivery attempt
* [Redeliver Webhook](/api-reference/monitoring/webhooks/redeliver) - manually re-attempt a delivery
* [Watch Diagnostics](/api-reference/monitoring/watches/diagnostics) - cross-reference `alert_id` against why an alert fired
