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

# Get a delivery

> The payload one webhook delivery carried.

Every delivery to an endpoint is numbered, and this returns exactly what one of them carried:
the same `{ id, name, created_at, data }`
[delivery body](/webhooks/overview#the-delivery-body) it was sent, from the one stored copy
every retry of that delivery already reused.

That body arrives inside the `{ data, error }` envelope every `/v1` read answers with, so the
event's records are at `data.data`. The outer key is the envelope and the inner one is the
delivery body's own `data`. A delivery sent to your endpoint is never enveloped, so unwrap one
level and a replayed delivery is byte-identical to a live one.

Use it to fill a gap. Sequence numbers are per-endpoint, monotonic and gapless, so a jump from
`127` to `129` in what you received means `128` exists and can be fetched. See
[Sequence and replay](/webhooks/overview#sequence-and-replay) for the worked example. The
sequence comes back on the response's own `X-Webhook-Sequence` header, never in the body,
matching the original delivery.

`404` is deliberately the same whether the endpoint does not exist, belongs to someone else, the
sequence was never allocated, or the delivery has aged out of the 30-day retention window. The
response cannot be used to learn which endpoint ids are real.

For what the payloads contain, see [Events](/webhooks/events). For verifying that a delivery is
genuine, see [Security](/webhooks/security).


## OpenAPI

````yaml openapi.json GET /v1/webhooks/endpoints/{endpointId}/deliveries/{sequence}
openapi: 3.0.0
info:
  title: Cromos API
  version: 1.0.0
servers:
  - url: https://api.cromos.so
security:
  - bearerAuth: []
paths:
  /v1/webhooks/endpoints/{endpointId}/deliveries/{sequence}:
    get:
      tags:
        - Webhooks
      summary: Get a delivery
      description: >-
        The payload of one webhook delivery, by endpoint and sequence number.
        Use it to fetch what a delivery carried after the fact, and to replay
        it. In `data.data`, the outer key is this API's envelope and the inner
        one is the event payload, byte-identical to what the live delivery
        POSTed. Returns 404 if the endpoint or the sequence is unknown to the
        caller.
      operationId: getWebhookDelivery
      parameters:
        - schema:
            type: string
          required: true
          name: endpointId
          in: path
        - schema:
            type: integer
            description: This delivery's per-endpoint sequence number, starting at 1.
          required: true
          description: This delivery's per-endpoint sequence number, starting at 1.
          name: sequence
          in: path
      responses:
        '200':
          description: The payload that was delivered
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/WebhookDeliveryPayload'
                  error:
                    type: object
                    nullable: true
                required:
                  - data
                  - error
              example:
                data:
                  id: evt_9a3f6c1e8d2b4a7f9c1e6d3a8f2b5c7d
                  name: pokemon.card_variants.deleted
                  created_at: '2026-07-31T03:58:41.006Z'
                  data:
                    variants:
                      - card_id: bog-4
                        variant_id: 48212
                      - card_id: sv08-125
                        variant_id: 48214
                error: null
        '304':
          description: >-
            Not modified. The `If-None-Match` you sent still matches, and there
            is no body.
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
        '400':
          description: Bad request
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not found
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate limited
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal error
          headers:
            ETag:
              description: >-
                A strong validator over the response body. Send it back as
                `If-None-Match` to get a `304 Not Modified` when nothing has
                changed.
              schema:
                type: string
            RateLimit:
              description: >-
                Remaining budget in the current window, RFC 9239 draft-7 form:
                `limit=300, remaining=284, reset=41`. `reset` is seconds until
                the window rolls.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                The policy the budget above is drawn from. `300;w=60` is 300
                requests a minute.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    WebhookDeliveryPayload:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        created_at:
          type: string
        data:
          nullable: true
      required:
        - id
        - name
        - created_at
    ErrorResponse:
      type: object
      properties:
        data:
          type: object
          nullable: true
        error:
          $ref: '#/components/schemas/ApiError'
      required:
        - data
        - error
    ApiError:
      type: object
      properties:
        code:
          type: string
          description: A stable machine-readable token. Switch on this, not on `message`.
        message:
          type: string
          description: A human-readable sentence. Always present, never empty.
      required:
        - code
        - message
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````