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

# Retrieve a request log entry

> One call, with what it sent (`request_body`) and what Listo answered
(`response_body`), both as JSON. For a failure, the answer is the error
envelope you received and the request is what actually went over the
wire.

These are the stored copies. An API key anywhere in a body reads as its
first characters followed by `[key masked]`. The one-time link in the
answer to `POST /v1/connect_requests` or to a Stripe onboarding call
reads `[redacted: one-time link]`; what you received is untouched. A body
over 64 KB is stored as an object with `_listo_truncated: true`, its
`original_bytes` and the first 64 KB as `text`, so you are always told
when you are not reading all of it. Headers are never stored.

A call that was not yours, or was made with a key of the other mode, is
`404 not_found`.




## OpenAPI

````yaml /openapi/en.yaml get /v1/request_logs/{id}
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/request_logs/{id}:
    get:
      tags:
        - Request logs
      summary: Retrieve a request log entry
      description: >
        One call, with what it sent (`request_body`) and what Listo answered

        (`response_body`), both as JSON. For a failure, the answer is the error

        envelope you received and the request is what actually went over the

        wire.


        These are the stored copies. An API key anywhere in a body reads as its

        first characters followed by `[key masked]`. The one-time link in the

        answer to `POST /v1/connect_requests` or to a Stripe onboarding call

        reads `[redacted: one-time link]`; what you received is untouched. A
        body

        over 64 KB is stored as an object with `_listo_truncated: true`, its

        `original_bytes` and the first 64 KB as `text`, so you are always told

        when you are not reading all of it. Headers are never stored.


        A call that was not yours, or was made with a key of the other mode, is

        `404 not_found`.
      operationId: getRequestLog
      parameters:
        - name: id
          in: path
          required: true
          description: >-
            The call's `req_` id, from `GET /v1/request_logs`. A call that is
            not yours, or was made with a key of the other mode, is `404
            not_found`.
          schema:
            type: string
          example: req_4f9c2b7e1a8d3056b1c2d3e4
      responses:
        '200':
          description: The request succeeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RequestLogDetail'
              example:
                id: req_4f9c2b7e1a8d3056b1c2d3e4
                method: POST
                path: /v1/deliveries
                endpoint: api/v1/deliveries#create
                status: 201
                error_code: null
                duration_ms: 120
                request_id: 0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10
                api_key_prefix: lst_live_Ab1
                test: false
                created_at: '2026-08-01T12:00:00Z'
                request_body:
                  reference: order-1042
                response_body:
                  id: dlv_7hK2mQ9xR4tV6bN1cZ8sLwYe
                  status: pending
      security:
        - BearerAuth: []
components:
  schemas:
    RequestLogDetail:
      type: object
      description: >
        One call with what was sent and what came back. The bodies are the

        stored copy: an API key anywhere in them reads as its first characters

        and `[key masked]`, the link in the answer to `POST
        /v1/connect_requests`

        or a Stripe onboarding call reads `[redacted: one-time link]`, and a
        body

        over 64 KB is an object with `_listo_truncated: true`, its

        `original_bytes` and the first 64 KB as `text`. Headers are never kept.
      properties:
        id:
          type: string
          description: The call's id, `req_` prefixed.
          example: req_4f9c2b7e1a8d3056b1c2d3e4
        method:
          type: string
          description: The HTTP method of the call.
          example: POST
        path:
          type:
            - string
            - 'null'
          description: |
            The path that was called, with its query string. Null on a call made
            before paths were kept.
          example: /v1/deliveries
        endpoint:
          type: string
          description: Which operation the call reached, as `controller#action`.
          example: api/v1/deliveries#create
        status:
          type: integer
          description: The HTTP status Listo answered with.
          example: 422
        error_code:
          type:
            - string
            - 'null'
          description: The `error.code` of the answer when it was an error, otherwise null.
          example: validation_failed
        duration_ms:
          type:
            - integer
            - 'null'
          description: >-
            How long Listo took to answer, in milliseconds. Null when it was not
            measured.
          example: 118
        request_id:
          type:
            - string
            - 'null'
          description: >-
            The call's request id, the value of the `X-Request-Id` response
            header. Null on a call made before request ids were kept.
          example: 0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10
        api_key_prefix:
          type:
            - string
            - 'null'
          description: >-
            The first characters of the key that made the call, never the
            secret. Null when no key is on record for the call.
          example: lst_test_Ab1
        test:
          type: boolean
          description: True when the call was made with a test key.
        created_at:
          type: string
          format: date-time
          description: When Listo received the call, ISO-8601 in UTC.
          example: '2026-11-06T16:02:11Z'
        request_body:
          description: |
            What the call sent, as JSON. Null when nothing was sent, on a call
            made before bodies were kept, and on the three debugging reads
            themselves, which keep no bodies.
        response_body:
          description: |
            What Listo answered, as JSON. Null on the same rows `request_body`
            is.
      required:
        - id
        - method
        - path
        - endpoint
        - status
        - error_code
        - duration_ms
        - request_id
        - api_key_prefix
        - test
        - created_at
        - request_body
        - response_body
  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.