> ## 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.

# Lista los intentos de entrega de webhook

> Cada intento que Listo hizo para enviar con POST un evento a tu URL de webhook, del más reciente
al más antiguo, paginado por keyset: la URL, el estado con que respondió tu endpoint,
los primeros 500 caracteres de su cuerpo, cuánto tardó y si
contó como éxito. Un evento tiene un intento por cada envío: el primero, cada reintento
automático y cada reenvío que pediste (`resent: true`).

Filtra por `event_id` (los intentos de un evento), `status`
(`failed` o `succeeded`), `created_after` y `created_before`. Un
`event_id` que no es de los tuyos es `404 not_found`, así que una página vacía
siempre significa que ese evento no tuvo intentos.

Un `status_code` en null significa que nada respondió (un timeout, una
conexión rechazada, un error de certificado) y `error_message` dice cuál. Un evento sin intentos todavía no se ha enviado, o no tenía endpoint configurado para su modo
cuando ocurrió.




## OpenAPI

````yaml /openapi/es.yaml get /v1/webhook_deliveries
openapi: 3.1.0
info:
  title: Listo Delivery API
  version: 1.34.0
  description: >
    Cotiza un envío, despáchalo y sigue el recorrido hasta la puerta.


    Cada solicitud se autentica con una llave de API bearer. La llave misma
    decide el modo en el que actúa: una llave de prueba despacha repartidores
    simulados y no mueve dinero, y una llave real despacha repartidores reales.
    Una llave también puede ser de solo lectura: solo puede llamar a GET y HEAD,
    y cualquier otra llamada responde `403 read_only_key`. El dinero siempre va
    en pesos mexicanos y siempre en centavos enteros, y cada marca de tiempo es
    ISO-8601 en UTC.


    Los ids son cadenas opacas con prefijo (`st_` una tienda, `qt_` una
    cotización, `dlv_` un

    envío, `wd_` un retiro, `evt_` un evento, `le_` un movimiento del historial,

    `whd_` un intento de entrega de webhook, `req_` una llamada registrada).
    Trátalos

    como cadenas de longitud ilimitada y nunca los analices.


    Los cambios a v1 son aditivos: pueden aparecer campos nuevos y valores
    nuevos de enumeración, así que ignora lo que no reconozcas en lugar de
    fallar.
servers:
  - url: https://api.listo.delivery
security: []
tags:
  - name: Authentication
    description: Verifica que una llave funciona antes de empezar a construir con ella.
    x-group: Autenticación
  - name: Stores
    description: Las ubicaciones de recolección desde las que despachas.
    x-group: Tiendas
  - name: Account connection
    description: Conectar la cuenta de Listo que ya tiene un restaurante contigo.
    x-group: Conexión de cuenta
  - name: Quotes
    description: Lo que cuesta un envío, cotizado y retenido.
    x-group: Cotizaciones
  - name: Deliveries
    description: Despachar un pedido y seguirlo hasta la puerta.
    x-group: Envíos
  - name: Balance
    description: El saldo prepagado del que salen tus envíos.
    x-group: Saldo
  - name: Withdrawals
    description: Sacar dinero de ese saldo hacia tu banco.
    x-group: Retiros
  - name: Card onboarding
    description: Conectar la cuenta que recibe los pagos con tarjeta.
    x-group: Alta de cobros con tarjeta
  - name: Events
    description: >-
      Los eventos que Listo te envió, al reenviar uno y al enviar un evento de
      prueba a tu endpoint.
    x-group: Eventos
  - name: Webhook deliveries
    description: >-
      Cada intento que hizo Listo de enviar un evento a tu endpoint, y lo que
      respondió tu endpoint.
    x-group: Entregas de webhook
  - name: Request logs
    description: >-
      Cada llamada que hicieron tus llaves a esta API, con lo que enviaste y con
      lo que respondimos.
    x-group: Registro de solicitudes
  - name: Ledger
    x-group: Historial
  - name: Webhooks
    x-group: Webhooks
paths:
  /v1/webhook_deliveries:
    get:
      tags:
        - Webhook deliveries
      summary: Lista los intentos de entrega de webhook
      description: >
        Cada intento que Listo hizo para enviar con POST un evento a tu URL de
        webhook, del más reciente

        al más antiguo, paginado por keyset: la URL, el estado con que respondió
        tu endpoint,

        los primeros 500 caracteres de su cuerpo, cuánto tardó y si

        contó como éxito. Un evento tiene un intento por cada envío: el primero,
        cada reintento

        automático y cada reenvío que pediste (`resent: true`).


        Filtra por `event_id` (los intentos de un evento), `status`

        (`failed` o `succeeded`), `created_after` y `created_before`. Un

        `event_id` que no es de los tuyos es `404 not_found`, así que una página
        vacía

        siempre significa que ese evento no tuvo intentos.


        Un `status_code` en null significa que nada respondió (un timeout, una

        conexión rechazada, un error de certificado) y `error_message` dice
        cuál. Un evento sin intentos todavía no se ha enviado, o no tenía
        endpoint configurado para su modo

        cuando ocurrió.
      operationId: listWebhookDeliveries
      parameters:
        - name: event_id
          in: query
          required: false
          description: >-
            Solo los intentos de entregar un evento, por su id `evt_`. Un id que
            no es de tus eventos en este modo es `404 not_found`.
          schema:
            type: string
          example: evt_9pQ2vX7mKdR4tYb1nZ3sLwCe
        - name: status
          in: query
          required: false
          description: >-
            Solo intentos que fallaron (`failed`) o que tuvieron éxito
            (`succeeded`). Cualquier otro valor no coincide con nada.
          schema:
            type: string
            enum:
              - failed
              - succeeded
          example: failed
        - name: created_after
          in: query
          required: false
          description: >-
            Solo intentos realizados en este momento o después (ISO-8601). Un
            valor que no se pueda interpretar es `422 validation_failed` con
            `param: "created_after"`.
          schema:
            type: string
          example: '2026-07-28T09:00:00Z'
        - name: created_before
          in: query
          required: false
          description: >-
            Solo los intentos hechos en este instante o antes (ISO-8601). Un
            valor que no se puede leer es `422 validation_failed` con `param:
            "created_before"`.
          schema:
            type: string
          example: '2026-07-30T09:00:00Z'
        - name: cursor
          in: query
          required: false
          description: >-
            El `cursor` de la página anterior, para leer la siguiente. Es opaco:
            nunca lo construyas ni lo analices.
          schema:
            type: string
          example: 1785628920000000-1024
      responses:
        '200':
          description: La solicitud fue exitosa.
          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: Una página de intentos de envío, del más reciente al más antiguo.
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/WebhookDelivery'
        has_more:
          type: boolean
          description: Verdadero cuando existe una página siguiente.
        cursor:
          type:
            - string
            - 'null'
          description: >-
            Pásalo como `cursor` para leer la siguiente página. Null en la
            última página.
      required:
        - data
        - has_more
        - cursor
    WebhookDelivery:
      type: object
      description: >
        Un intento de enviar un evento por POST a tu URL de webhook, y lo que
        respondió. Cada evento tiene un intento por cada vez que se intenta: el
        primer envío, cada reintento automático y cada reenvío que solicitaste.
      properties:
        id:
          type: string
          description: El id del intento, con prefijo `whd_`.
          example: whd_8d2e5f1a7c3b9046a1b2c3d4
        event_id:
          type: string
          description: El evento del que este fue un intento de envío, con prefijo `evt_`.
          example: evt_9pQ2vX7mKdR4tYb1nZ3sLwCe
        event_type:
          type: string
          description: El tipo de ese evento.
          enum:
            - delivery.status_changed
            - delivery.updated
            - delivery.courier_location
            - withdrawal.updated
            - store.updated
            - store.connected
        attempt:
          type: integer
          description: >
            Qué intento es este para el evento, contado desde 1 en el orden en
            que

            se hicieron. Un reenvío continúa la cuenta.
          example: 1
        resent:
          type: boolean
          description: >-
            Verdadero cuando pediste este intento (`POST
            /v1/events/{id}/resend`) en lugar de que Listo lo hiciera por su
            cuenta según su calendario.
        url:
          type: string
          description: La URL a la que se envió, tal como estaba cuando se hizo el intento.
          example: https://example.com/listo/webhooks
        status_code:
          type:
            - integer
            - 'null'
          description: >-
            El estado HTTP con el que respondió tu endpoint. Es Null cuando nada
            respondió (un tiempo de espera agotado, una conexión rechazada, un
            error de certificado); `error_message` indica cuál.
          example: 200
        error_message:
          type:
            - string
            - 'null'
          description: >-
            Por qué el intento contó como fallido, explicado con palabras (un
            timeout, una conexión rechazada, un estado distinto de 2xx). Null en
            un intento exitoso.
        response_body:
          type:
            - string
            - 'null'
          description: >-
            Los primeros 500 caracteres del cuerpo con el que respondió tu
            endpoint. Null cuando nada respondió o el cuerpo estaba vacío.
          example: ok
        duration_ms:
          type:
            - integer
            - 'null'
          description: Cuánto tardó el intento, en milisegundos. Null cuando no se midió.
          example: 84
        succeeded:
          type: boolean
          description: >-
            Verdadero cuando tu endpoint respondió con un 2xx. Cualquier otra
            respuesta se reintenta, salvo que el intento haya sido un reenvío o
            que el evento sea una posición del repartidor.
        created_at:
          type: string
          format: date-time
          description: Cuándo se hizo el intento, en ISO-8601 y en 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: >-
        Tu llave de API, enviada como `Authorization: Bearer <key>`. Las llaves
        reales y de prueba son distintas; la llave que envías decide en qué modo
        actúa la llamada. Para probar llamadas, usa una llave de prueba (empieza
        con `lst_test_`): no se envía ningún repartidor real y no se mueve
        dinero real, pero los webhooks se disparan y el `dropoff.phone` que des
        puede recibir mensajes de WhatsApp, así que usa tu propio número. Una
        llave real (empieza con `lst_live_`) reserva y cobra envíos reales.

````

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