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

# List deliveries

> List a webhook endpoint's delivery attempts from the last 30 days, with each one's HTTP status, timing and error, and the attempts still queued.

**Cost:** Free.

```bash
curl "https://api.alura.io/v1/webhooks/we_01JMOCK0000000000000000000/deliveries" \
  -H "Authorization: Bearer $ALURA_API_KEY"
```

Needs the `webhooks:write` scope. Attempts come newest first, by when each was made, or queued for a `pending` one. Your endpoint's response body is never stored.

## Retries

Any `2xx` answer counts as delivered. Anything else, no answer within 15 seconds, or a redirect (never followed) is a failure. Alura tries again 5 seconds, 5 minutes, 30 minutes, 2 hours, 5 hours, 10 hours and 10 hours later: 8 attempts at most.

Each attempt is its own row, with `attempt` from 1 to 8. `next_attempt_at` says when the next try is due. Every attempt of one event has the same `event_id`, sent as the `webhook-id` header: de-duplicate on it.

## Why an attempt failed

| `error` | Meaning |
| - | - |
| `dns_failed`, `connect_failed`, `tls_failed` | The host couldn't be resolved, reached or spoken to over TLS. |
| `address_refused` | The URL resolves to a private or local address. |
| `timeout` | No answer within 15 seconds. |
| `invalid_response` | The connection ended without a usable HTTP status. |
| `redirect_not_followed` | Your endpoint answered a `3xx`. |
| `invalid_url` | The endpoint's URL isn't a usable HTTPS URL. |
| `internal_error` | Alura couldn't finish the attempt. It's retried on the schedule. |
| `endpoint_disabled`, `endpoint_changed`, `event_expired` | Cancelled before sending: the endpoint was disabled, its filters no longer want the event, or the event expired. |

`http_status` is the status your endpoint answered, `null` when there was no answer.

> [accordion] Automatic disabling
>
> After 5 days without a successful delivery and at least 20 failed attempts, Alura disables the endpoint: `status` becomes `disabled` with `disabled_reason: "failing"`. Fix it, then set `status` back to `enabled` with [Update webhook](https://docs.alura.io/api-reference/webhooks/endpoints/update.md). What it missed isn't sent again.

To check an endpoint now, [send a test event](https://docs.alura.io/api-reference/webhooks/endpoints/test.md) and watch it here.


## OpenAPI

````yaml /openapi.json get /v1/webhooks/{id}/deliveries
openapi: 3.1.0
info:
  title: Alura API
  version: 1.0.0
  description: Etsy market research for scripts and AI assistants.
servers:
  - url: https://api.alura.io
security:
  - apiKey: []
paths:
  /v1/webhooks/{id}/deliveries:
    get:
      summary: List deliveries
      description: >-
        An endpoint's delivery attempts from the last 30 days, newest first by
        when each was made (or queued, while pending): each attempt to send an
        event, its HTTP status and timing, and the ones queued. Your endpoint's
        response body is never stored. Free.


        Cost: free.
      operationId: webhooks.deliveries.list
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 64
            description: The webhook endpoint ID (`we_...`).
            example: we_01JMOCK0000000000000000000
        - name: limit
          in: query
          required: false
          description: 'Page size: default 25, at most 100.'
          schema:
            type: integer
            minimum: 1
            maximum: 100
        - name: cursor
          in: query
          required: false
          description: >-
            The `next_cursor` of the previous page. Bound to the query, the
            workspace and the key.
          schema:
            type: string
        - name: fields
          in: query
          required: false
          description: >-
            Comma-separated dotted paths to return; `id`, `object` and `as_of`
            always come back.
          schema:
            type: string
      responses:
        '200':
          description: OK
          headers:
            Request-Id:
              $ref: '#/components/headers/Request-Id'
            Alura-Credits-Cost:
              $ref: '#/components/headers/Alura-Credits-Cost'
            Alura-Credits-Remaining:
              $ref: '#/components/headers/Alura-Credits-Remaining'
          content:
            application/json:
              schema:
                type: object
                properties:
                  object:
                    type: string
                    const: list
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        object:
                          type: string
                          const: webhook_delivery
                        id:
                          type: string
                          description: >-
                            `dlv_...`: this attempt, also sent as the
                            `alura-delivery-id` header.
                        event_id:
                          type: string
                          description: >-
                            The event sent (`evt_...`). It is also the
                            `webhook-id` header, the same on every attempt of
                            the event: de-duplicate on it.
                        attempt:
                          type: integer
                          description: >-
                            1 for the first attempt, up to 8: retries come 5
                            seconds, 5 minutes, 30 minutes, 2 hours, 5 hours, 10
                            hours and 10 hours after a failure.
                        status:
                          type: string
                          enum:
                            - pending
                            - succeeded
                            - failed
                          description: >-
                            `pending`: not sent yet (due at `next_attempt_at`).
                            `succeeded`: your endpoint answered 2xx. `failed`:
                            it did not, or the attempt was cancelled (`error`
                            says why).
                        http_status:
                          anyOf:
                            - type: integer
                            - type: 'null'
                          description: >-
                            The HTTP status your endpoint answered; null when
                            there was no answer or it wasn't sent.
                        duration_ms:
                          anyOf:
                            - type: integer
                            - type: 'null'
                          description: >-
                            How long the attempt took, connection included; null
                            when it was not made.
                        error:
                          description: >-
                            Why an attempt failed without a usable answer:
                            `dns_failed`, `address_refused` (the URL resolves to
                            a private or local address), `connect_failed`,
                            `tls_failed`, `timeout` (15 seconds),
                            `invalid_response`, `redirect_not_followed` (a 3xx;
                            redirects are never followed), `invalid_url`,
                            `internal_error` (Alura could not finish the
                            attempt; it is retried on the schedule); or why it
                            was cancelled without being sent:
                            `endpoint_disabled`, `endpoint_changed` (the
                            endpoint's filters no longer want the event),
                            `event_expired`. Null otherwise.
                          type:
                            - string
                            - 'null'
                        created_at:
                          type: string
                          description: >-
                            When the attempt was made; for a `pending` one, when
                            it was queued.
                        next_attempt_at:
                          description: >-
                            For `pending`, when it is due; for `failed`, when
                            the retry is due. Null when nothing follows.
                          type:
                            - string
                            - 'null'
                      required:
                        - object
                        - id
                        - event_id
                        - attempt
                        - status
                        - http_status
                        - duration_ms
                        - error
                        - created_at
                        - next_attempt_at
                      additionalProperties: false
                  has_more:
                    type: boolean
                  next_cursor:
                    type:
                      - string
                      - 'null'
                  total:
                    type: object
                    properties:
                      value:
                        type: integer
                      relation:
                        type: string
                        enum:
                          - eq
                          - gte
                    required:
                      - value
                      - relation
                    additionalProperties: false
                required:
                  - object
                  - data
                  - has_more
                  - next_cursor
                  - total
                additionalProperties: false
              example:
                object: list
                data:
                  - object: webhook_delivery
                    id: dlv_01JMOCK0000000000000000000
                    event_id: evt_01JMOCK0000000000000000000
                    attempt: 1
                    status: succeeded
                    http_status: 200
                    duration_ms: 143
                    error: null
                    created_at: '2026-10-22T09:15:03.000Z'
                    next_attempt_at: null
                has_more: false
                next_cursor: null
                total:
                  value: 1
                  relation: eq
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '402':
          $ref: '#/components/responses/Problem402'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '405':
          $ref: '#/components/responses/Problem405'
        '429':
          $ref: '#/components/responses/Problem429'
        '500':
          $ref: '#/components/responses/Problem500'
        '503':
          $ref: '#/components/responses/Problem503'
      x-codeSamples:
        - lang: bash
          label: cURL
          source: >-
            curl
            "https://api.alura.io/v1/webhooks/we_01JMOCK0000000000000000000/deliveries"
            \
              -H "Authorization: Bearer $ALURA_API_KEY"
        - lang: typescript
          label: TypeScript
          source: >-
            const res = await
            fetch('https://api.alura.io/v1/webhooks/we_01JMOCK0000000000000000000/deliveries',
            {
              headers: {
                Authorization: `Bearer ${process.env.ALURA_API_KEY}`,
              },
            });

            console.log(await res.json());
        - lang: python
          label: Python
          source: |-
            import json
            import os
            import urllib.request

            request = urllib.request.Request(
                "https://api.alura.io/v1/webhooks/we_01JMOCK0000000000000000000/deliveries",
                headers={
                    "Authorization": f"Bearer {os.environ['ALURA_API_KEY']}",
                },
            )
            with urllib.request.urlopen(request) as response:
                print(json.load(response))
components:
  headers:
    Request-Id:
      description: '`req_` + ULID; quote it when reporting a problem.'
      schema:
        type: string
    Alura-Credits-Cost:
      description: API credits this call cost.
      schema:
        type: integer
    Alura-Credits-Remaining:
      description: >-
        API credits left in the workspace's monthly allowance, counting calls
        still in flight. Absent when it cannot be read right now.
      schema:
        type: integer
  responses:
    Problem400:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/invalid_request
            title: Invalid request
            status: 400
            code: invalid_request
            detail: Invalid request
            suggestion: Fix the request as the detail says, then send it again.
            retryable: false
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem401:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/unauthorized
            title: Unauthorized
            status: 401
            code: unauthorized
            detail: Unauthorized
            suggestion: 'Send a valid API key as `Authorization: Bearer alura_sk_...`.'
            retryable: false
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem402:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/credits_exhausted
            title: API credits exhausted
            status: 402
            code: credits_exhausted
            detail: API credits exhausted
            suggestion: Upgrade the plan or wait for the monthly reset.
            retryable: false
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem403:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/plan_required
            title: Plan required
            status: 403
            code: plan_required
            detail: Plan required
            suggestion: Upgrade the workspace plan to use this operation.
            retryable: false
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem404:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/not_found
            title: Not found
            status: 404
            code: not_found
            detail: Not found
            suggestion: Check the ID, or search for it first.
            retryable: false
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem405:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/method_not_allowed
            title: Method not allowed
            status: 405
            code: method_not_allowed
            detail: Method not allowed
            suggestion: Use one of the methods in the Allow header.
            retryable: false
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem429:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/rate_limited
            title: Rate limited
            status: 429
            code: rate_limited
            detail: Rate limited
            suggestion: Wait for Retry-After, then retry.
            retryable: true
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem500:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/internal_error
            title: Internal error
            status: 500
            code: internal_error
            detail: Internal error
            suggestion: Retry; if it keeps failing, report the request_id.
            retryable: true
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
    Problem503:
      description: Error
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://docs.alura.io/errors/credits_unavailable
            title: API credits unavailable
            status: 503
            code: credits_unavailable
            detail: API credits unavailable
            suggestion: Retry shortly.
            retryable: true
            request_id: req_01JQ5W3H8M2N4P6R8T0V2X4Z6B
  schemas:
    Problem:
      type: object
      description: RFC 9457 problem details.
      properties:
        type:
          type: string
          format: uri
        title:
          type: string
        status:
          type: integer
        code:
          type: string
          description: A code from the error catalog; new codes may be added.
          x-extensible-enum:
            - invalid_request
            - unknown_parameter
            - invalid_cursor
            - cursor_window_exceeded
            - invalid_reference
            - id_type_mismatch
            - invalid_keyword
            - shop_id_required
            - listing_not_publishable
            - sales_window_not_covered
            - unauthorized
            - credits_exhausted
            - plan_required
            - insufficient_scope
            - workspace_required
            - workspace_locked
            - your_shop_unavailable
            - writes_suspended
            - browser_refused
            - role_required
            - impersonation_refused
            - recent_sign_in_required
            - etsy_scope_required
            - etsy_partner_required
            - not_found
            - not_collected
            - not_found_on_etsy
            - shop_opted_out
            - method_not_allowed
            - conflict
            - key_limit_reached
            - reconnect_required
            - settings_not_fetched
            - listing_busy
            - settings_busy
            - shop_create_busy
            - idempotency_partial_unverifiable
            - listing_has_variations
            - changed_since
            - change_not_revertable
            - listing_in_ab_test
            - activation_skipped
            - idempotency_processing
            - confirmation_required
            - test_shop_active_cap
            - write_outcome_unknown
            - unprocessable
            - listing_removed_on_etsy
            - endpoint_removed
            - rate_limited
            - throttled
            - daily_credit_cap_exceeded
            - credits_reserved
            - fetch_limit_reached
            - write_rate_limited
            - sync_cooldown
            - shop_write_budget_exhausted
            - internal_error
            - write_misconfigured
            - upstream_unavailable
            - credits_unavailable
            - service_unavailable
            - fetch_unavailable
            - create_lock_unavailable
            - writes_paused
            - etsy_capacity
            - upstream_timeout
        detail:
          type: string
        suggestion:
          type: string
        retryable:
          type: boolean
        request_id:
          type: string
        upgrade_url:
          type: string
          format: uri
          description: 'credits_exhausted and plan_required: where to upgrade the plan.'
        credits_needed:
          type: integer
          description: 'API credit refusals: what the call needed.'
        credits_remaining:
          type: integer
          description: >-
            API credit refusals: what is left (of the month, or of the day for
            daily_credit_cap_exceeded).
        resets_at:
          type: string
          format: date-time
          description: >-
            credits_exhausted and daily_credit_cap_exceeded: when the limit
            resets.
      required:
        - type
        - title
        - status
        - code
        - detail
        - suggestion
        - retryable
        - request_id
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: 'An API key: `Authorization: Bearer alura_sk_...`.'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.