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

> ## Agent Instructions
> Notes on the Listo Partner Delivery API:
> - Every endpoint is under `https://api.listo.delivery/v1/` and authenticates with a bearer API key.
> - This documentation site is at https://docs.listo.delivery. The full machine-readable reference is the OpenAPI document at https://api.listo.delivery/docs/openapi.yaml (served by the API host, not by this site).
> - Any page of this site is also available as raw markdown by appending `.md` to its URL, for example https://docs.listo.delivery/en/guides/webhooks.md. The index of every page is https://docs.listo.delivery/llms.txt and all of them in one file is https://docs.listo.delivery/llms-full.txt.
> - Every page is published in English under https://docs.listo.delivery/en/ and in Spanish under https://docs.listo.delivery/es/, with the same path after the language. The API reference is under https://docs.listo.delivery/api-reference/ in English and https://docs.listo.delivery/es/api-reference/ in Spanish.
> - To debug an integration yourself: `GET /v1/request_logs` lists the calls your keys made with what you sent and what was answered, `GET /v1/events` lists the events Listo emitted, `GET /v1/webhook_deliveries` lists every attempt to deliver them, `POST /v1/events/{id}/resend` sends one event again and `POST /v1/test_webhooks` sends a sample event (`"test": true`). The page https://docs.listo.delivery/en/guides/debugging describes them. A resent event is a snapshot from when it happened; `GET /v1/deliveries` is still how you recover current state.
> - Every error response has `error.doc_url`, a page that explains that error code and what to do, and `error.request_id`, the same value as the `X-Request-Id` response header. All the pages are listed at https://docs.listo.delivery/en/errors. Filter `GET /v1/request_logs` with `request_id` to read the logged call.
> - A `409 account_exists` from `POST /v1/stores` means the restaurant already has its own Listo account: connect it instead of creating it, as the page https://docs.listo.delivery/en/guides/connect-existing-account describes.
> - Every live store carries one Plan Listo, charged to the partner. The exception is a connected restaurant that had already paid its current month: it keeps paying its own plan until its next renewal, shown as `paid_by: "store"` with the handover date in `pending_paid_by_on`. A `402 plan_required` from a quote, a delivery create or a retry means the store's plan is not paid or has ended; the page https://docs.listo.delivery/en/guides/plan-and-billing describes the plan, the `plan` block on a store and how to end or restart it.
> - An AI assistant (Claude Code, Cursor, Codex) can act through the same API key at `https://api.listo.delivery/mcp`, an MCP server over Streamable HTTP authenticated with `Authorization: Bearer <API key>`. Every tool runs the matching `/v1/` endpoint, and each one that moves money first previews and then needs a confirmation token; the page https://docs.listo.delivery/en/guides/connect-ai-client lists the tools and describes the two steps.

# List webhook delivery attempts

> Every attempt Listo made to POST an event to your webhook URL, newest
first, keyset-paginated: the URL, the status your endpoint answered with,
the first 500 characters of its body, how long it took and whether it
counted as a success. An event has one attempt per try: the first send,
each automatic retry, and each resend you asked for (`resent: true`).

Filter by `event_id` (the attempts for one event), `status`
(`failed` or `succeeded`), `created_after` and `created_before`. An
`event_id` that is not one of yours is `404 not_found`, so an empty page
always means that event had no attempts.

A `status_code` of null means nothing answered at all (a timeout, a
refused connection, a certificate error) and `error_message` says which.
An event with no attempts has not been sent yet, or had no endpoint configured for its mode
when it happened.




## OpenAPI

````yaml /openapi/en.yaml get /v1/webhook_deliveries
openapi: 3.1.0
info:
  title: Listo Delivery API
  version: 1.34.0
  description: |
    Quote a delivery, dispatch it, and follow it to the door.

    Every request authenticates with a bearer API key. The key itself decides
    the world it acts in: a test key dispatches simulated couriers and moves no
    money, a live key dispatches real ones. A key can also be read-only: it
    may call GET and HEAD and nothing else, and any other call answers
    `403 read_only_key`. Money is always in Mexican pesos and
    always in integer cents, and every timestamp is ISO-8601 in UTC.

    Ids are opaque prefixed strings (`st_` a store, `qt_` a quote, `dlv_` a
    delivery, `wd_` a withdrawal, `evt_` an event, `le_` a ledger entry,
    `whd_` a webhook delivery attempt, `req_` a logged request). Treat
    them as strings of unbounded length and never parse them.

    Changes to v1 are additive: new fields and new enum values can appear, so
    ignore what you do not recognise rather than failing on it.
servers:
  - url: https://api.listo.delivery
security: []
tags:
  - name: Authentication
    description: Checking that a key works before you build against it.
  - name: Stores
    description: The pickup locations you dispatch from.
  - name: Account connection
    description: Connecting a restaurant's existing Listo account to you.
  - name: Quotes
    description: What a delivery costs, priced and held.
  - name: Deliveries
    description: Dispatching an order and following it to the door.
  - name: Balance
    description: The prepaid balance your deliveries draw on.
  - name: Withdrawals
    description: Moving money out of that balance to your bank.
  - name: Card onboarding
    description: Connecting the account that takes card payments.
  - name: Events
    description: >-
      The events Listo sent you, resending one, and sending a test event to your
      endpoint.
  - name: Webhook deliveries
    description: >-
      Every attempt Listo made to send an event to your endpoint, and what came
      back.
  - name: Request logs
    description: >-
      Every call your keys made to this API, with what you sent and what we
      answered.
paths:
  /v1/webhook_deliveries:
    get:
      tags:
        - Webhook deliveries
      summary: List webhook delivery attempts
      description: >
        Every attempt Listo made to POST an event to your webhook URL, newest

        first, keyset-paginated: the URL, the status your endpoint answered
        with,

        the first 500 characters of its body, how long it took and whether it

        counted as a success. An event has one attempt per try: the first send,

        each automatic retry, and each resend you asked for (`resent: true`).


        Filter by `event_id` (the attempts for one event), `status`

        (`failed` or `succeeded`), `created_after` and `created_before`. An

        `event_id` that is not one of yours is `404 not_found`, so an empty page

        always means that event had no attempts.


        A `status_code` of null means nothing answered at all (a timeout, a

        refused connection, a certificate error) and `error_message` says which.

        An event with no attempts has not been sent yet, or had no endpoint
        configured for its mode

        when it happened.
      operationId: listWebhookDeliveries
      parameters:
        - name: event_id
          in: query
          required: false
          description: >-
            Only the attempts to deliver one event, by its `evt_` id. An id that
            is not one of your events in this mode is `404 not_found`.
          schema:
            type: string
          example: evt_9pQ2vX7mKdR4tYb1nZ3sLwCe
        - name: status
          in: query
          required: false
          description: >-
            Only attempts that failed (`failed`) or succeeded (`succeeded`). Any
            other value matches nothing.
          schema:
            type: string
            enum:
              - failed
              - succeeded
          example: failed
        - name: created_after
          in: query
          required: false
          description: >-
            Only attempts made at or after this instant (ISO-8601). A value that
            does not parse is `422 validation_failed` with `param:
            "created_after"`.
          schema:
            type: string
          example: '2026-07-28T09:00:00Z'
        - name: created_before
          in: query
          required: false
          description: >-
            Only attempts made at or before this instant (ISO-8601). A value
            that does not parse is `422 validation_failed` with `param:
            "created_before"`.
          schema:
            type: string
          example: '2026-07-30T09:00:00Z'
        - name: cursor
          in: query
          required: false
          description: >-
            The `cursor` of the previous page, to read the next one. Opaque:
            never build or parse one.
          schema:
            type: string
          example: 1785628920000000-1024
      responses:
        '200':
          description: The request succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookDeliveryList'
              example:
                data:
                  - id: whd_8d2e5f1a7c3b9046a1b2c3d4
                    event_id: evt_9pQ2vX7mKdR4tYb1nZ3sLwCe
                    event_type: delivery.status_changed
                    attempt: 1
                    resent: false
                    url: https://hooks.example.com/listo/live
                    status_code: 200
                    error_message: null
                    response_body: ok
                    duration_ms: 84
                    succeeded: true
                    created_at: '2026-08-01T12:00:00Z'
                  - id: whd_8d2e5f1a7c3b9046a1b2c3d4
                    event_id: evt_9pQ2vX7mKdR4tYb1nZ3sLwCe
                    event_type: delivery.status_changed
                    attempt: 1
                    resent: false
                    url: https://old.example.com/hook
                    status_code: 200
                    error_message: null
                    response_body: ok
                    duration_ms: 84
                    succeeded: true
                    created_at: '2026-08-01T09:00:00Z'
                has_more: false
                cursor: null
      security:
        - BearerAuth: []
components:
  schemas:
    WebhookDeliveryList:
      type: object
      description: One page of delivery attempts, newest first.
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/WebhookDelivery'
        has_more:
          type: boolean
          description: True when a further page exists.
        cursor:
          type:
            - string
            - 'null'
          description: Pass as `cursor` to read the next page. Null on the last page.
      required:
        - data
        - has_more
        - cursor
    WebhookDelivery:
      type: object
      description: |
        One attempt to POST an event to your webhook URL, and what came back. An
        event has one attempt per try: the first send, each automatic retry, and
        each resend you asked for.
      properties:
        id:
          type: string
          description: The attempt's id, `whd_` prefixed.
          example: whd_8d2e5f1a7c3b9046a1b2c3d4
        event_id:
          type: string
          description: The event this was an attempt to deliver, `evt_` prefixed.
          example: evt_9pQ2vX7mKdR4tYb1nZ3sLwCe
        event_type:
          type: string
          description: The type of that event.
          enum:
            - delivery.status_changed
            - delivery.updated
            - delivery.courier_location
            - withdrawal.updated
            - store.updated
            - store.connected
        attempt:
          type: integer
          description: >
            Which attempt this is for the event, counted from 1 in the order
            they

            were made. A resend continues the count.
          example: 1
        resent:
          type: boolean
          description: >-
            True when you asked for this attempt (`POST /v1/events/{id}/resend`)
            rather than Listo making it on its own schedule.
        url:
          type: string
          description: The URL that was posted to, as it was when the attempt was made.
          example: https://example.com/listo/webhooks
        status_code:
          type:
            - integer
            - 'null'
          description: >-
            The HTTP status your endpoint answered with. Null when nothing
            answered at all (a timeout, a refused connection, a certificate
            error); `error_message` says which.
          example: 200
        error_message:
          type:
            - string
            - 'null'
          description: >-
            Why the attempt counted as failed, in words (a timeout, a refused
            connection, a non-2xx status). Null on a successful attempt.
        response_body:
          type:
            - string
            - 'null'
          description: >-
            The first 500 characters of the body your endpoint answered with.
            Null when nothing answered or the body was empty.
          example: ok
        duration_ms:
          type:
            - integer
            - 'null'
          description: >-
            How long the attempt took, in milliseconds. Null when it was not
            measured.
          example: 84
        succeeded:
          type: boolean
          description: >-
            True when your endpoint answered with a 2xx. Anything else is
            retried, unless the attempt was a resend or the event is a courier
            position.
        created_at:
          type: string
          format: date-time
          description: When the attempt was made, ISO-8601 in UTC.
          example: '2026-11-06T16:04:31Z'
      required:
        - id
        - event_id
        - event_type
        - attempt
        - resent
        - url
        - status_code
        - error_message
        - response_body
        - duration_ms
        - succeeded
        - created_at
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Your API key, sent as `Authorization: Bearer <key>`. Live and test keys
        are separate; the key you send decides which world the call acts in. To
        try calls, use a test key (it starts with `lst_test_`): no real courier
        is sent and no real money moves, but webhooks fire and the
        `dropoff.phone` you give can receive WhatsApp messages, so use your own
        number. A live key (it starts with `lst_live_`) books and charges real
        deliveries.

````

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