---
title: "List Deliveries"
method: GET
path: "/webhooks/deliveries"
tags: ["Webhooks"]
---

# List Deliveries

`GET /webhooks/deliveries`

## Request

- Base URL: `https://api.hedra.com/v3`
- URL: `https://api.hedra.com/v3/webhooks/deliveries`
- Auth: one of:
  - API key in header `Authorization`
  - HTTP bearer

## Query parameters

- `limit` integer: Maximum items per page.
- `cursor` string, nullable: Opaque cursor from the previous page's `next_cursor`; omit for the first page.

## Response `200`

Successful Response

- WebhookDeliveryListResponse
  - `data` WebhookDeliverySummary[], required: This page of items.
    - `job_id` string, required: The job whose terminal event this delivers.
    - `job_accessible` boolean, required: Whether GET /v3/jobs/{job_id} works for the caller — false when the job belongs to a different owner than the authenticating key.
    - `model` string, required: The resolved model id the job ran on.
    - `event_type` 'job.completed' | 'job.failed': The terminal events an outbound webhook announces. One delivery carries exactly one of these, chosen from the job's final status when the delivery fires.
    - `status` 'PENDING' | 'DELIVERING' | 'DELIVERED' | 'FAILED', required: Where a delivery stands: queued, in flight, or its terminal outcome.
    - `source` 'per_job' | 'default', required: Which URL resolution created this delivery.
    - `attempts` integer, required: Delivery attempts so far, cumulative across replays.
    - `redelivery_count` integer: How many operator replays this delivery has had; 0 means every attempt was automatic.
    - `redeliveries` WebhookRedelivery[]: One entry per operator replay, oldest first — each holds the delivery's fields as they stood when the replay was requested. Replays recorded before this history existed appear only in `redelivery_count`, so the list can be shorter.
      - `requested_at` string, date-time, required: ISO-8601 instant the redelivery was requested.
      - `status` 'PENDING' | 'DELIVERING' | 'DELIVERED' | 'FAILED', required: Where a delivery stands: queued, in flight, or its terminal outcome.
      - `attempts` integer, required: Cumulative attempt count as it stood when this replay was requested.
      - `last_response_status` integer, nullable: HTTP status of the superseded cycle's last attempt; null when it never got a response.
      - `last_error` ErrorEnvelope
        - `code` 'UNKNOWN' | 'INVALID_ARGUMENT' | 'NOT_FOUND' | 'GONE' | 'ALREADY_EXISTS' | 'ALREADY_IN_PROGRESS' | 'UNAUTHORIZED' | 'PERMISSION_DENIED' | 'INSUFFICIENT_BALANCE' | 'MODERATION_FAILED' | 'FAILED_PRECONDITION' | 'CANCELLED' | 'DEADLINE_EXCEEDED' | 'RESOURCE_EXHAUSTED' | 'UNAVAILABLE' | 'INTERNAL', required: Universal error code space. Modeled after gRPC status codes. Every exception in the system carries an ErrorCode. SDK clients map 3rd-party errors to these codes at the lowest level. Retry logic, HTTP status mapping, and OTEL metrics all key off this enum. NOTE: The semantic meaning of these error codes is roughly mapped from the semantic of the gRPC status codes: see https://grpc.io/docs/guides/status-codes/ for details.
        - `message` string, required: Human-readable summary of the error. Fixed per condition — match on `code`, not on this text.
        - `retryable` boolean: Whether retrying the same request can succeed. Describes the condition, not a promise — pair with `retry_after` when present.
        - `retry_after` integer, nullable: Seconds to wait before retrying; set when the error is retryable. Mirrors the `Retry-After` response header.
        - `param` string, nullable: The primary offending input field, when the error is about one specific field.
        - `details` FieldError[], nullable: Every field-level problem, when the error is a validation failure — all of them at once, not just the first.
          - `field` string, required: Dotted path to the offending input (e.g. `input.resolution`).
          - `message` string, required: What is wrong with this field's value.
          - `reason` string, nullable: Machine-readable hint for which constraint failed ("required", "enum", "type", …).
          - `allowed` string[], nullable: Accepted values for an enum, or accepted field names on the first unknown-field violation. Omitted on subsequent unknown fields.
        - `replaced_by` string, nullable: The id of a successor model, set when the requested model has been retired (code `GONE`) and replaced; null otherwise. Lets a client programmatically migrate off a retired model.
        - `billing` BillingError: Why a request was refused for funds, and what would clear it. The envelope's structured detail for `INSUFFICIENT_BALANCE`, the way `details` is its structured detail for a validation failure. Every amount is in `currency`, and `balance` is the same number `GET /balance` returns — so a client can decide whether to top up, wait, or fail over without a second round trip to work out which balance was short.
          - `balance` number, required: Spendable balance on the account this request bills, at the moment it was refused. The same value `GET /balance` returns.
          - `required` number, nullable: What this request needed. Null when the refusal is a funding precondition rather than a priced one — an upload is not priced, and some models cannot be quoted until their inputs are measured (`POST /models/{model}/estimate` says so explicitly).
          - `currency` string: ISO-4217 code the amounts above are denominated in.
          - `funding_url` string, required: Where a human can add funds to the account this request bills. The API itself cannot add them.
          - `reason` string, nullable: Why the automatic top-up did not fund the balance, when known. `card_declined`: the card that pays for automatic top-ups was declined, and the payment method must be updated on the billing page before a top-up can succeed. Clients MUST tolerate unrecognized values: new reasons may be added at any time.
          - `affordable_output_tokens` integer, nullable: On a chat request's refusal, the largest output bound in tokens, `max_tokens` or `max_output_tokens` on `POST /responses`, whose hold the balance covers for this request's prompt. A chat request (`POST /chat/completions`, `POST /responses`, `POST /anthropic/v1/messages`) holds its worst-case price, `required`, until it completes. The balance covers the hold of the same request with this bound until the balance changes. 0 when the balance does not cover the prompt with the model's smallest output bound. Null on every other refusal.
        - `type` 'invalid_request_error' | 'authentication_error' | 'permission_error' | 'rate_limit_error' | 'server_error', required: The OpenAI error type for an error's HTTP status, published so an OpenAI SDK's `APIStatusError.type` carries a value.
      - `last_attempt_at` string, date-time, nullable: ISO-8601 instant of the superseded cycle's last attempt.
    - `last_response_status` integer, nullable: HTTP status of the most recent attempt; null when it never got a response.
    - `last_error` ErrorEnvelope
      - `code` 'UNKNOWN' | 'INVALID_ARGUMENT' | 'NOT_FOUND' | 'GONE' | 'ALREADY_EXISTS' | 'ALREADY_IN_PROGRESS' | 'UNAUTHORIZED' | 'PERMISSION_DENIED' | 'INSUFFICIENT_BALANCE' | 'MODERATION_FAILED' | 'FAILED_PRECONDITION' | 'CANCELLED' | 'DEADLINE_EXCEEDED' | 'RESOURCE_EXHAUSTED' | 'UNAVAILABLE' | 'INTERNAL', required: Universal error code space. Modeled after gRPC status codes. Every exception in the system carries an ErrorCode. SDK clients map 3rd-party errors to these codes at the lowest level. Retry logic, HTTP status mapping, and OTEL metrics all key off this enum. NOTE: The semantic meaning of these error codes is roughly mapped from the semantic of the gRPC status codes: see https://grpc.io/docs/guides/status-codes/ for details.
      - `message` string, required: Human-readable summary of the error. Fixed per condition — match on `code`, not on this text.
      - `retryable` boolean: Whether retrying the same request can succeed. Describes the condition, not a promise — pair with `retry_after` when present.
      - `retry_after` integer, nullable: Seconds to wait before retrying; set when the error is retryable. Mirrors the `Retry-After` response header.
      - `param` string, nullable: The primary offending input field, when the error is about one specific field.
      - `details` FieldError[], nullable: Every field-level problem, when the error is a validation failure — all of them at once, not just the first.
        - `field` string, required: Dotted path to the offending input (e.g. `input.resolution`).
        - `message` string, required: What is wrong with this field's value.
        - `reason` string, nullable: Machine-readable hint for which constraint failed ("required", "enum", "type", …).
        - `allowed` string[], nullable: Accepted values for an enum, or accepted field names on the first unknown-field violation. Omitted on subsequent unknown fields.
      - `replaced_by` string, nullable: The id of a successor model, set when the requested model has been retired (code `GONE`) and replaced; null otherwise. Lets a client programmatically migrate off a retired model.
      - `billing` BillingError: Why a request was refused for funds, and what would clear it. The envelope's structured detail for `INSUFFICIENT_BALANCE`, the way `details` is its structured detail for a validation failure. Every amount is in `currency`, and `balance` is the same number `GET /balance` returns — so a client can decide whether to top up, wait, or fail over without a second round trip to work out which balance was short.
        - `balance` number, required: Spendable balance on the account this request bills, at the moment it was refused. The same value `GET /balance` returns.
        - `required` number, nullable: What this request needed. Null when the refusal is a funding precondition rather than a priced one — an upload is not priced, and some models cannot be quoted until their inputs are measured (`POST /models/{model}/estimate` says so explicitly).
        - `currency` string: ISO-4217 code the amounts above are denominated in.
        - `funding_url` string, required: Where a human can add funds to the account this request bills. The API itself cannot add them.
        - `reason` string, nullable: Why the automatic top-up did not fund the balance, when known. `card_declined`: the card that pays for automatic top-ups was declined, and the payment method must be updated on the billing page before a top-up can succeed. Clients MUST tolerate unrecognized values: new reasons may be added at any time.
        - `affordable_output_tokens` integer, nullable: On a chat request's refusal, the largest output bound in tokens, `max_tokens` or `max_output_tokens` on `POST /responses`, whose hold the balance covers for this request's prompt. A chat request (`POST /chat/completions`, `POST /responses`, `POST /anthropic/v1/messages`) holds its worst-case price, `required`, until it completes. The balance covers the hold of the same request with this bound until the balance changes. 0 when the balance does not cover the prompt with the model's smallest output bound. Null on every other refusal.
      - `type` 'invalid_request_error' | 'authentication_error' | 'permission_error' | 'rate_limit_error' | 'server_error', required: The OpenAI error type for an error's HTTP status, published so an OpenAI SDK's `APIStatusError.type` carries a value.
    - `webhook_url` string, required: The destination endpoint.
    - `created_at` string, date-time, required: ISO-8601 instant the delivery was registered.
    - `last_attempt_at` string, date-time, nullable: ISO-8601 instant of the most recent attempt; null before the first one.
  - `next_cursor` string, nullable, required: Opaque cursor for the next page, or null when this response completes the list. Always present. Endpoints that serve the whole collection at once always return null.

## Other responses

- `400`: Invalid or failed-validation request.
- `401`: Authentication failed: missing, malformed, or invalid credentials.
- `403`: Insufficient scope or plan.
- `404`: Resource not found.
- `429`: Rate limit exceeded.
- `500`: Internal error.

## Changes

- **2026-10-16** `06692d16e78a`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/hedra-labs/apis/hedra-api/changes/webhooks/deliveries/get.md)

---

[API](https://skmtc.dev/hedra-labs/apis/hedra-api.md) - [All operations](https://skmtc.dev/hedra-labs/apis/hedra-api/llms.txt) - [OpenAPI document](https://skmtc.dev/hedra-labs/apis/hedra-api/revisions/6ef35a11cefe?raw)
