{
"error": {
"code": "read_only_key",
"message": "This API key is read-only. Use a key without the read-only setting to create, change or cancel anything.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/read_only_key",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"error": {
"code": "webhook_endpoint_not_configured",
"message": "There is no webhook URL configured for this mode, so there is nowhere to send it.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/webhook_endpoint_not_configured",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"error": {
"code": "validation_failed",
"message": "That is not a webhook event type.",
"param": "type",
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/validation_failed",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"error": {
"code": "test_webhook_limit_reached",
"message": "30 test webhooks were already sent in the last hour. Try again later.",
"param": null,
"retryable": true,
"doc_url": "https://docs.listo.delivery/en/errors/test_webhook_limit_reached",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
Eventos
Envía un webhook de prueba
Envía un evento sintético de un type publicado a tu URL de webhook, para
probar un endpoint sin hacer un pedido. La respuesta es 202
con el evento tal como lo recibe tu endpoint, y el intento aparece en
GET /v1/webhook_deliveries como cualquier otro.
test: true va en el sobre del evento. Un evento real nunca trae el
campo. Revísalo antes de hacer algo con consecuencias.
Sus ids no resuelven a nada.data es una muestra realista del
tipo, pero el envío, la tienda, el retiro o la cotización que nombra no
existen, así que leerlo después responde 404.
Cualquiera de los dos modos. Una llave de prueba envía a tu endpoint de prueba y una llave real
al tuyo real. El endpoint real sí recibe el evento de prueba.
Treinta por hora y por modo. La trigésima primera es
429 test_webhook_limit_reached, que se puede reintentar cuando pase la hora.
Retry-After indica cuántos segundos faltan para que puedas volver a enviar.
Un type que no es un tipo de evento publicado es 422 validation_failed
con param: "type". Si no hay URL de webhook configurada para el modo de la llave,
la respuesta es 409 webhook_endpoint_not_configured.
{
"error": {
"code": "read_only_key",
"message": "This API key is read-only. Use a key without the read-only setting to create, change or cancel anything.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/read_only_key",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"error": {
"code": "webhook_endpoint_not_configured",
"message": "There is no webhook URL configured for this mode, so there is nowhere to send it.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/webhook_endpoint_not_configured",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"error": {
"code": "validation_failed",
"message": "That is not a webhook event type.",
"param": "type",
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/validation_failed",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"error": {
"code": "test_webhook_limit_reached",
"message": "30 test webhooks were already sent in the last hour. Try again later.",
"param": null,
"retryable": true,
"doc_url": "https://docs.listo.delivery/en/errors/test_webhook_limit_reached",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
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.
El tipo de evento publicado del que enviar una muestra.
Opciones disponibles:
delivery.status_changed,
delivery.updated,
delivery.courier_location,
withdrawal.updated,
store.updated,
store.connected
Respuesta
Aceptado. El evento de prueba es el que recibe tu endpoint, con test: true incluido (el campo test del evento). El envío queda en cola y ocurre justo después de esta respuesta; su resultado es un nuevo intento en GET /v1/webhook_deliveries.
Option 1
Option 2
Option 3
Option 4
Option 5
Option 6
Cada evento que recibe tu endpoint de webhook, y cada evento que devuelven
las lecturas de depuración: uno de los seis de abajo, distinguidos por type.
data es el objeto al que se refiere el evento, y su forma depende de
type. Consulta WebhookEventEnvelope para los campos que todos comparten y
para saber cómo se comporta la entrega (al menos una vez, sin orden).
La forma de un envío: cada campo que puede llevar el objeto, con la
nulabilidad que realmente tiene cada uno. Es la respuesta de cada operación
que responde un envío (la creación, la consulta, una fila de lista, la
reprogramación, la cancelación, el reintento y el reembolso) y el data de
cada evento completo de envío, así que UN tipo sostiene todos ellos.
Cada operación devuelve el objeto completo. Un campo que una llamada dada
todavía no puede tener está presente y es null en lugar de faltar: una respuesta
de creación tiene courier en null, porque todavía no se asigna ningún repartidor,
y una reprogramación solo responde con un pedido que sigue programado,
así que su delivered_at es null.
El dinero va en centavos enteros, las marcas de tiempo son ISO-8601 en UTC, y cada
enumeración de abajo es nuestra y no una copia de la de un tercero.
Presente, y en true, solo en un evento de prueba que pediste con
POST /v1/test_webhooks. Un evento real no trae el campo en absoluto. El data de un evento de prueba es una muestra cuyos ids no corresponden a nada.
Ejemplo:
true
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Listo Partner API","description":"Quote, create and track deliveries, and manage your balance, through the Listo Partner Delivery API.","colors":{"primary":"#15171C","light":"#F4F4F5","dark":"#15171C"},"logo":{"light":"https://mintcdn.com/listo-c5a11a00/mreCwXzcEA2bSZog/logo/light.svg?fit=max\u0026auto=format\u0026n=mreCwXzcEA2bSZog\u0026q=85\u0026s=da2b28d464dc6987329dfd5971085dd7","dark":"https://mintcdn.com/listo-c5a11a00/mreCwXzcEA2bSZog/logo/dark.svg?fit=max\u0026auto=format\u0026n=mreCwXzcEA2bSZog\u0026q=85\u0026s=ad013a6a0d979eb46c1cea550ec6a460","href":"/"},"favicon":"https://mintcdn.com/listo-c5a11a00/mreCwXzcEA2bSZog/favicon.svg?fit=max\u0026auto=format\u0026n=mreCwXzcEA2bSZog\u0026q=85\u0026s=f790496dfe0c2ad9971d8de95e45be8d","api":{"playground":{"display":"interactive"}},"thumbnails":{"preset":"minimal","appearance":"dark","background":"https://mintcdn.com/listo-c5a11a00/lF-Gm03tnDMquh_z/images/og-background.jpg?fit=max\u0026auto=format\u0026n=lF-Gm03tnDMquh_z\u0026q=85\u0026s=d73469201c8ffe28afc598d23fde5d84","fonts":{"family":"Archivo ExtraBold","source":"fonts/archivo-800.ttf","format":"ttf"},"eyebrow":{"source":"none"}},"markdown":{"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 \u003cAPI 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."]},"styling":{"latex":true},"navigation":{"languages":[{"language":"en","default":true,"navbar":{"links":[{"href":"https://status.listo.delivery","label":"Status"}]},"href":"en/quickstart"},{"language":"es","navbar":{"links":[{"href":"https://status.listo.delivery","label":"Estado del servicio"}]},"href":"es/quickstart"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"listo-c5a11a00","hasAudioNarration":false,"actualSubdomain":"listo-c5a11a00","customDomains":["docs.listo.delivery"],"gitSource":{"type":"github","owner":"davidalejandroaguilar","repo":"listo","deployBranch":"main","contentDirectory":"docs-site","isPrivate":true,"mountPath":"","label":"","_id":"6aed6954347cccfbc77ed1c5"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aeeb167ae7fce64eae954de","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"en","tag":"Errors","count":43},{"language":"en","tag":"Reference","count":43},{"language":"es","tag":"Errores","count":43},{"language":"es","tag":"Referencia","count":43},{"language":"en","tag":"Guides","count":9},{"language":"es","tag":"Guías","count":9},{"language":"en","tag":"Stores","count":8},{"language":"es","tag":"Tiendas","count":8},{"language":"en","tag":"Deliveries","count":7},{"language":"es","tag":"Envíos","count":7},{"language":"en","tag":"Webhooks","count":6},{"language":"es","tag":"Webhooks","count":6},{"language":"en","tag":"Concepts","count":5},{"language":"es","tag":"Conceptos","count":5},{"language":"en","tag":"Card onboarding","count":4},{"language":"en","tag":"Events","count":4},{"language":"es","tag":"Alta de cobros con tarjeta","count":4},{"language":"es","tag":"Eventos","count":4},{"language":"en","tag":"Withdrawals","count":3},{"language":"es","tag":"Retiros","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":":is(#sidebar-content,#mobile-nav) li[data-active=\"true\"]>a{background-color:#ffc400;color:#15171c}"}],"page":{"pagePath":"es/api-reference/events/send-a-test-webhook","slug":"/es/api-reference/events/send-a-test-webhook","pageMetadata":{"title":"Envía un webhook de prueba","description":"Envía un evento sintético de un `type` publicado a tu URL de webhook, para\nprobar un endpoint sin hacer un pedido. La respuesta es `202`\ncon el evento tal como lo recibe tu endpoint, y el intento aparece en\n`GET /v1/webhook_deliveries` como cualquier otro.\n\n- **`test: true` va en el sobre del evento.** Un evento real nunca trae el\n campo. Revísalo antes de hacer algo con consecuencias.\n- **Sus ids no resuelven a nada.** `data` es una muestra realista del\n tipo, pero el envío, la tienda, el retiro o la cotización que nombra no\n existen, así que leerlo después responde `404`.\n- **Cualquiera de los dos modos.** Una llave de prueba envía a tu endpoint de prueba y una llave real\n al tuyo real. El endpoint real sí recibe el evento de prueba.\n- **Treinta por hora y por modo.** La trigésima primera es\n `429 test_webhook_limit_reached`, que se puede reintentar cuando pase la hora.\n `Retry-After` indica cuántos segundos faltan para que puedas volver a enviar.\n\nUn `type` que no es un tipo de evento publicado es `422 validation_failed`\ncon `param: \"type\"`. Si no hay URL de webhook configurada para el modo de la llave,\nla respuesta es `409 webhook_endpoint_not_configured`.\n","deprecated":null,"version":null,"sidebarTitle":"Envía un webhook de prueba","openapi":"/openapi/es.yaml post /v1/test_webhooks","href":"/es/api-reference/events/send-a-test-webhook","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Envía un evento sintético de un \", _jsx(_components.code, {\n children: \"type\"\n }), \" publicado a tu URL de webhook, para\\nprobar un endpoint sin hacer un pedido. La respuesta es \", _jsx(_components.code, {\n children: \"202\"\n }), \"\\ncon el evento tal como lo recibe tu endpoint, y el intento aparece en\\n\", _jsx(_components.code, {\n children: \"GET /v1/webhook_deliveries\"\n }), \" como cualquier otro.\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsxs(_components.strong, {\n children: [_jsx(_components.code, {\n children: \"test: true\"\n }), \" va en el sobre del evento.\"]\n }), \" Un evento real nunca trae el\\ncampo. Revísalo antes de hacer algo con consecuencias.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Sus ids no resuelven a nada.\"\n }), \" \", _jsx(_components.code, {\n children: \"data\"\n }), \" es una muestra realista del\\ntipo, pero el envío, la tienda, el retiro o la cotización que nombra no\\nexisten, así que leerlo después responde \", _jsx(_components.code, {\n children: \"404\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Cualquiera de los dos modos.\"\n }), \" Una llave de prueba envía a tu endpoint de prueba y una llave real\\nal tuyo real. El endpoint real sí recibe el evento de prueba.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.strong, {\n children: \"Treinta por hora y por modo.\"\n }), \" La trigésima primera es\\n\", _jsx(_components.code, {\n children: \"429 test_webhook_limit_reached\"\n }), \", que se puede reintentar cuando pase la hora.\\n\", _jsx(_components.code, {\n children: \"Retry-After\"\n }), \" indica cuántos segundos faltan para que puedas volver a enviar.\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Un \", _jsx(_components.code, {\n children: \"type\"\n }), \" que no es un tipo de evento publicado es \", _jsx(_components.code, {\n children: \"422 validation_failed\"\n }), \"\\ncon \", _jsx(_components.code, {\n children: \"param: \\\"type\\\"\"\n }), \". Si no hay URL de webhook configurada para el modo de la llave,\\nla respuesta es \", _jsx(_components.code, {\n children: \"409 webhook_endpoint_not_configured\"\n }), \".\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Envía un webhook de prueba","description":"Envía un evento sintético de un `type` publicado a tu URL de webhook, para\nprobar un endpoint sin hacer un pedido. La respuesta es `202`\ncon el evento tal como lo recibe tu endpoint, y el intento aparece en\n`GET /v1/webhook_deliveries` como cualquier otro.\n\n- **`test: true` va en el sobre del evento.** Un evento real nunca trae el\n campo. Revísalo antes de hacer algo con consecuencias.\n- **Sus ids no resuelven a nada.** `data` es una muestra realista del\n tipo, pero el envío, la tienda, el retiro o la cotización que nombra no\n existen, así que leerlo después responde `404`.\n- **Cualquiera de los dos modos.** Una llave de prueba envía a tu endpoint de prueba y una llave real\n al tuyo real. El endpoint real sí recibe el evento de prueba.\n- **Treinta por hora y por modo.** La trigésima primera es\n `429 test_webhook_limit_reached`, que se puede reintentar cuando pase la hora.\n `Retry-After` indica cuántos segundos faltan para que puedas volver a enviar.\n\nUn `type` que no es un tipo de evento publicado es `422 validation_failed`\ncon `param: \"type\"`. Si no hay URL de webhook configurada para el modo de la llave,\nla respuesta es `409 webhook_endpoint_not_configured`.\n","deprecated":null,"version":null,"sidebarTitle":"Envía un webhook de prueba","openapi":"/openapi/es.yaml post /v1/test_webhooks","href":"/es/api-reference/events/send-a-test-webhook","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Envía un webhook de prueba","description":"Envía un evento sintético de un `type` publicado a tu URL de webhook, para\nprobar un endpoint sin hacer un pedido. La respuesta es `202`\ncon el evento tal como lo recibe tu endpoint, y el intento aparece en\n`GET /v1/webhook_deliveries` como cualquier otro.\n\n- **`test: true` va en el sobre del evento.** Un evento real nunca trae el\n campo. Revísalo antes de hacer algo con consecuencias.\n- **Sus ids no resuelven a nada.** `data` es una muestra realista del\n tipo, pero el envío, la tienda, el retiro o la cotización que nombra no\n existen, así que leerlo después responde `404`.\n- **Cualquiera de los dos modos.** Una llave de prueba envía a tu endpoint de prueba y una llave real\n al tuyo real. El endpoint real sí recibe el evento de prueba.\n- **Treinta por hora y por modo.** La trigésima primera es\n `429 test_webhook_limit_reached`, que se puede reintentar cuando pase la hora.\n `Retry-After` indica cuántos segundos faltan para que puedas volver a enviar.\n\nUn `type` que no es un tipo de evento publicado es `422 validation_failed`\ncon `param: \"type\"`. Si no hay URL de webhook configurada para el modo de la llave,\nla respuesta es `409 webhook_endpoint_not_configured`.\n","tags":["Events"],"operationId":"sendTestWebhook","security":["8ad36263-f598-48c2-93b8-5d50f3e3fe43"],"requestBody":"68a07434-0ae9-47ca-9d95-fa4ab4840850","responses":{"202":"4e8b2b01-b511-44f3-8def-a009c125adba","403":"38eef0ce-4db4-4a68-bc9a-dc1bb6f162e8","409":"f1248fa4-c8c7-435a-b80c-c376d82c2b0e","422":"727f9bc3-e208-4b93-ad97-50c625308071","429":"b270a378-f160-4c00-8f82-6c3188daf2f7"},"x-mint":{"href":"/es/api-reference/events/send-a-test-webhook","metadata":{"sidebarTitle":"Envía un webhook de prueba"}},"method":"post","type":"path","servers":["f399fc83-7e7d-462b-bf3b-3042989289cb"],"path":"/v1/test_webhooks","baseUrlOptions":["https://api.listo.delivery"],"title":"Envía un webhook de prueba","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"De qué evento enviar una muestra.","properties":{"type":{"type":"string","enum":["delivery.status_changed","delivery.updated","delivery.courier_location","withdrawal.updated","store.updated","store.connected"],"description":"El tipo de evento publicado del que enviar una muestra.","isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"}},"required":["type"],"uniqueKey":"","typeLabel":"object"},"example":{"type":"delivery.status_changed"},"examples":{"Example":{"title":"Example","value":{"type":"delivery.status_changed"}}},"exampleType":"examples"}},"required":true,"exampleType":"examples"},"responses":{"4e8b2b01-b511-44f3-8def-a009c125adba":{"description":"Aceptado. El evento de prueba es el que recibe tu endpoint, con `test: true` incluido (el campo `test` del evento). El envío queda en cola y ocurre justo después de esta respuesta; su resultado es un nuevo intento en `GET /v1/webhook_deliveries`.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"Cada evento que recibe tu endpoint de webhook, y cada evento que devuelven\nlas lecturas de depuración: uno de los seis de abajo, distinguidos por `type`.\n`data` es el objeto al que se refiere el evento, y su forma depende de\n`type`. Consulta `WebhookEventEnvelope` para los campos que todos comparten y\npara saber cómo se comporta la entrega (al menos una vez, sin orden).\n","required":["type","data","id","created_at"],"properties":{"id":{"type":"string","description":"El id del evento, con prefijo `evt_`. Deduplica por este.","example":"evt_9pQ2vX7mKdR4tYb1nZ3sLwCe","isRequired":true,"uniqueKey":"oneOf.0.id","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","description":"Cuándo se registró el evento, ISO-8601 en UTC.","example":"2026-07-28T18:41:03Z","isRequired":true,"uniqueKey":"oneOf.0.created_at","typeLabel":"string\u003cdate-time>"},"type":{"type":"string","description":"Qué evento es este.","enum":["delivery.status_changed"],"isRequired":true,"uniqueKey":"oneOf.0.type","typeLabel":"enum\u003cstring>"},"data":{"type":"object","description":"La forma de un envío: cada campo que puede llevar el objeto, con la\nnulabilidad que realmente tiene cada uno. Es la respuesta de cada operación\nque responde un envío (la creación, la consulta, una fila de lista, la\nreprogramación, la cancelación, el reintento y el reembolso) y el `data` de\ncada evento completo de envío, así que UN tipo sostiene todos ellos.\n\nCada operación devuelve el objeto completo. Un campo que una llamada dada\ntodavía no puede tener está presente y es null en lugar de faltar: una respuesta\nde creación tiene `courier` en null, porque todavía no se asigna ningún repartidor,\ny una reprogramación solo responde con un pedido que sigue programado,\nasí que su `delivered_at` es null.\n\nEl dinero va en centavos enteros, las marcas de tiempo son ISO-8601 en UTC, y cada\nenumeración de abajo es nuestra y no una copia de la de un tercero.\n","properties":{"id":{"type":"string","description":"El id del envío, con prefijo `dlv_`.","example":"dlv_7hK2mQ9xR4tV6bN1cZ8sLwYe","isRequired":true,"uniqueKey":"oneOf.0.data.id","typeLabel":"string"},"external_id":{"oneOf":[{"type":"string","description":"Tu propia referencia del pedido, devuelta exactamente como la enviaste.","example":"order-841","isRequired":true,"uniqueKey":"oneOf.0.data.external_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Tu propia referencia del pedido, devuelta exactamente como la enviaste.","example":"order-841","isRequired":true,"uniqueKey":"oneOf.0.data.external_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.external_id","typeLabel":"string | null"},"origin":{"type":"string","enum":["api","console","whatsapp"],"description":"Qué vía creó el envío. `api` es uno que creaste con `POST /v1/deliveries`. `console` es uno que la tienda despachó desde la consola de comerciante de Listo, algo que una tienda solo puede hacer en el nivel de acceso `full`. `whatsapp` es uno que un cliente pidió a la tienda en un chat, y que la tienda luego aceptó; ningún operador lo escribió en ningún lado.\n\nSiempre está presente, nunca es null, y queda fijo durante toda la vida del envío. Un pedido de consola trae un `external_id` null, pero lee este campo en lugar de ese null: la referencia faltante es una consecuencia de la vía, no una forma de identificarla.\n","example":"api","isRequired":true,"uniqueKey":"oneOf.0.data.origin","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"El código de pedido que citan el repartidor y nuestro soporte. Es único por\ntienda, no a nivel global, así que nunca identifiques un pedido solo por él.\n","example":"LS-2048","isRequired":true,"uniqueKey":"oneOf.0.data.code","typeLabel":"string"},"status":{"type":"string","enum":["awaiting_payment","awaiting_location","scheduled","dispatching","courier_assigned","picking_up","en_route","returning","delivered","returned","canceled","no_courier"],"description":"`delivered`, `returned` y `canceled` son terminales. `no_courier` es un\ncallejón sin salida que puedes reintentar o cancelar. Un envío `returned` es este\nmismo objeto de principio a fin; no hay un segundo envío para el tramo de\nregreso.\n\n`returning`: la entrega falló y el repartidor está llevando el\npedido de regreso a la tienda; termina en `returned`. NO es terminal,\ny es donde un envío fallido ahora pasa los minutos entre el momento en que el\nrepartidor se rinde en la puerta del cliente y el pedido llega de regreso. `returned` significa que el pedido ya regresó. Trata `returning`\ncomo un envío vivo: el repartidor sigue en movimiento y los eventos\n`delivery.courier_location` siguen llegando para él.\n\nEl cargo de regreso se registra cuando el envío entra en `returning`,\nno cuando llega a `returned`, así que `charges` ya está completo en\nel evento `returning`.\n\n`awaiting_location`: un pedido que la tienda tomó por la consola de Listo\no por su asistente de WhatsApp, retenido en espera de la ubicación de entrega. Todavía no\nse pide un repartidor. El cliente confirma la ubicación con un\nenlace de mapa o compartiéndola en el chat de WhatsApp, o la tienda\nla confirma desde su consola. Luego el envío pasa a\n`scheduled` o `dispatching`; a `no_courier` cuando no se puede pedir un repartidor\npara él (la ubicación está fuera de la zona donde entrega la tienda, o la tienda misma no puede pedir un repartidor\nen este momento); o a `canceled` si el pedido se cancela o la tienda\nlo cambia a recolección en el mostrador. Un envío que creas\npor esta API nunca pasa por ese estado.\n","isRequired":true,"uniqueKey":"oneOf.0.data.status","typeLabel":"enum\u003cstring>"},"store_id":{"type":"string","description":"El id `st_` de la tienda de donde recoge el repartidor.","isRequired":true,"uniqueKey":"oneOf.0.data.store_id","typeLabel":"string"},"test":{"type":"boolean","description":"Si este pedido vive en el sandbox. Se deriva de la tienda, así que no hay un campo que fijar: una llave de prueba solo puede llegar a tiendas de prueba.\n","isRequired":true,"uniqueKey":"oneOf.0.data.test","typeLabel":"boolean"},"payment":{"type":"object","description":"Cómo paga el cliente y en qué estado va el pago.","properties":{"method":{"type":"string","enum":["prepaid","cash","card"],"isRequired":true,"uniqueKey":"oneOf.0.data.payment.method","typeLabel":"enum\u003cstring>"},"status":{"type":"string","enum":["unpaid","awaiting_payment","paid","partially_refunded","refunded"],"isRequired":true,"uniqueKey":"oneOf.0.data.payment.status","typeLabel":"enum\u003cstring>"},"url":{"oneOf":[{"type":"string","format":"uri","description":"El enlace de pago, con marca propia, para un pedido con tarjeta que todavía espera\npago. Listo se lo envía a tu cliente por sí mismo, por WhatsApp\ny por SMS cuando el WhatsApp no le llega, así que puedes mostrarlo o guardarlo pero no necesitas enviarlo. Es null en el momento en que el pedido se paga o se cancela, porque entonces el enlace ya está muerto.\n","isRequired":true,"uniqueKey":"oneOf.0.data.payment.url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"El enlace de pago, con marca propia, para un pedido con tarjeta que todavía espera\npago. Listo se lo envía a tu cliente por sí mismo, por WhatsApp\ny por SMS cuando el WhatsApp no le llega, así que puedes mostrarlo o guardarlo pero no necesitas enviarlo. Es null en el momento en que el pedido se paga o se cancela, porque entonces el enlace ya está muerto.\n","isRequired":true,"uniqueKey":"oneOf.0.data.payment.url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.payment.url","typeLabel":"string\u003curi> | null"},"cash_to_collect_cents":{"oneOf":[{"type":"integer","description":"Lo que el repartidor cobra en la puerta: el valor de la mercancía más la parte de la tarifa que le toca al cliente. Es null, no cero, en cualquier pedido que no sea en efectivo. Cero es un valor real en un pedido en efectivo cuyo total en la puerta es cero (un pedido de valor `0` que cubres por completo); un pedido así se despacha sin cobro que hacer.\n","isRequired":true,"uniqueKey":"oneOf.0.data.payment.cash_to_collect_cents.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Lo que el repartidor cobra en la puerta: el valor de la mercancía más la parte de la tarifa que le toca al cliente. Es null, no cero, en cualquier pedido que no sea en efectivo. Cero es un valor real en un pedido en efectivo cuyo total en la puerta es cero (un pedido de valor `0` que cubres por completo); un pedido así se despacha sin cobro que hacer.\n","isRequired":true,"uniqueKey":"oneOf.0.data.payment.cash_to_collect_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.payment.cash_to_collect_cents","typeLabel":"integer | null"},"paid_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.payment.paid_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.payment.paid_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.payment.paid_at","typeLabel":"string\u003cdate-time> | null"}},"required":["method","status","url","cash_to_collect_cents","paid_at"],"isRequired":true,"uniqueKey":"oneOf.0.data.payment","typeLabel":"object"},"order_value_cents":{"oneOf":[{"type":"integer","description":"El valor de la mercancía que enviaste, sin cambios.","isRequired":true,"uniqueKey":"oneOf.0.data.order_value_cents.oneOf.0","typeLabel":"integer"},{"type":"null","description":"El valor de la mercancía que enviaste, sin cambios.","isRequired":true,"uniqueKey":"oneOf.0.data.order_value_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.order_value_cents","typeLabel":"integer | null"},"fee_cents":{"type":"integer","description":"La tarifa total de envío.","isRequired":true,"uniqueKey":"oneOf.0.data.fee_cents","typeLabel":"integer"},"business_fee_cents":{"type":"integer","description":"La parte de `fee_cents` que se te cobra a ti.","isRequired":true,"uniqueKey":"oneOf.0.data.business_fee_cents","typeLabel":"integer"},"customer_fee_cents":{"type":"integer","description":"La parte de `fee_cents` que se cobra al cliente. Siempre suma, junto con\n`business_fee_cents`, el total de `fee_cents`.\n","isRequired":true,"uniqueKey":"oneOf.0.data.customer_fee_cents","typeLabel":"integer"},"tip_cents":{"type":"integer","description":"La propina al repartidor que enviaste en este envío, que se paga al repartidor y se\npasa tal cual, al costo, sin margen. Deliberadamente FUERA de\n`fee_cents`, que es la tarifa de envío a la que suman `business_fee_cents` y\n`customer_fee_cents`. Es 0 cuando no enviaste ninguna, y nunca es null.\n","isRequired":true,"uniqueKey":"oneOf.0.data.tip_cents","typeLabel":"integer"},"currency":{"type":"string","enum":["MXN"],"isRequired":true,"uniqueKey":"oneOf.0.data.currency","typeLabel":"enum\u003cstring>"},"quote_id":{"oneOf":[{"type":"string","description":"La cotización `qt_` que vinculó este pedido, para que puedas ligar el precio que te\ncotizaron con el pedido que lo gastó. Es null cuando el pedido se cotizó en línea.\n","isRequired":true,"uniqueKey":"oneOf.0.data.quote_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"La cotización `qt_` que vinculó este pedido, para que puedas ligar el precio que te\ncotizaron con el pedido que lo gastó. Es null cuando el pedido se cotizó en línea.\n","isRequired":true,"uniqueKey":"oneOf.0.data.quote_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.quote_id","typeLabel":"string | null"},"pickup":{"type":"object","description":"Dónde recoge el repartidor, tomado como instantánea al crear, para que un pedido histórico siga reportando a dónde fue el repartidor de verdad aunque la tienda cambie de nombre o de lugar.\n","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.pickup.name","typeLabel":"string"},"street":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.pickup.street","typeLabel":"string"},"lat":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.0.data.pickup.lat.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"oneOf.0.data.pickup.lat.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.pickup.lat","typeLabel":"number\u003cdouble> | null"},"lng":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.0.data.pickup.lng.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"oneOf.0.data.pickup.lng.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.pickup.lng","typeLabel":"number\u003cdouble> | null"},"notes":{"oneOf":[{"type":"string","description":"Las instrucciones permanentes de recolección de la tienda, no un valor por pedido.","isRequired":true,"uniqueKey":"oneOf.0.data.pickup.notes.oneOf.0","typeLabel":"string"},{"type":"null","description":"Las instrucciones permanentes de recolección de la tienda, no un valor por pedido.","isRequired":true,"uniqueKey":"oneOf.0.data.pickup.notes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.pickup.notes","typeLabel":"string | null"}},"required":["name","street","lat","lng","notes"],"isRequired":true,"uniqueKey":"oneOf.0.data.pickup","typeLabel":"object"},"dropoff":{"type":"object","description":"A dónde entrega el repartidor, devuelto tal como lo enviaste.","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.name","typeLabel":"string"},"phone":{"type":"string","description":"E.164, normalizado al recibirlo.","example":"+528112345678","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.phone","typeLabel":"string"},"street":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.street","typeLabel":"string"},"apt_unit":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.apt_unit.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.apt_unit.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.apt_unit","typeLabel":"string | null"},"lat":{"oneOf":[{"type":"number","format":"double","description":"Null cuando la dirección nunca se geocodificó y el texto se juzgó en su lugar. Nunca un cero inventado.\n","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.lat.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","description":"Null cuando la dirección nunca se geocodificó y el texto se juzgó en su lugar. Nunca un cero inventado.\n","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.lat.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.lat","typeLabel":"number\u003cdouble> | null"},"lng":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.lng.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.lng.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.lng","typeLabel":"number\u003cdouble> | null"},"notes":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.notes.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.notes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.notes","typeLabel":"string | null"},"handoff":{"type":"string","enum":["meet_at_door","leave_at_door","meet_outside"],"isRequired":true,"uniqueKey":"oneOf.0.data.dropoff.handoff","typeLabel":"enum\u003cstring>"}},"required":["name","phone","street","apt_unit","lat","lng","notes","handoff"],"isRequired":true,"uniqueKey":"oneOf.0.data.dropoff","typeLabel":"object"},"manifest":{"oneOf":[{"type":"object","description":"La lista descriptiva de artículos que enviaste, para el repartidor. El dinero nunca\nsale de ella, con una excepción: un artículo de tamaño `xlarge` hace que el viaje sea en auto. Es null cuando no enviaste ninguna.\n","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.manifest.oneOf.0.\\items.items.[INDEX].name","typeLabel":"string"},"quantity":{"type":"integer","isRequired":true,"uniqueKey":"oneOf.0.data.manifest.oneOf.0.\\items.items.[INDEX].quantity","typeLabel":"integer"},"size":{"type":"string","enum":["small","medium","large","xlarge"],"description":"Cómo se envió el artículo. `small` cuando no enviaste ninguno, y en todos los artículos creados antes de que existieran los tamaños, que es como se enviaron esos artículos.\n","isRequired":true,"uniqueKey":"oneOf.0.data.manifest.oneOf.0.\\items.items.[INDEX].size","typeLabel":"enum\u003cstring>"}},"required":["name","quantity","size"],"uniqueKey":"oneOf.0.data.manifest.oneOf.0.\\items.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.0.data.manifest.oneOf.0.\\items","typeLabel":"object[]"}},"required":["items"],"isRequired":true,"uniqueKey":"oneOf.0.data.manifest.oneOf.0","typeLabel":"object"},{"type":"null","description":"La lista descriptiva de artículos que enviaste, para el repartidor. El dinero nunca\nsale de ella, con una excepción: un artículo de tamaño `xlarge` hace que el viaje sea en auto. Es null cuando no enviaste ninguna.\n","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"quantity":{"type":"integer"},"size":{"type":"string","enum":["small","medium","large","xlarge"],"description":"Cómo se envió el artículo. `small` cuando no enviaste ninguno, y en todos los artículos creados antes de que existieran los tamaños, que es como se enviaron esos artículos.\n"}},"required":["name","quantity","size"]}}},"required":["items"],"isRequired":true,"uniqueKey":"oneOf.0.data.manifest.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.manifest","typeLabel":"object | null"},"vehicle":{"type":"string","enum":["moto","car"],"description":"Cómo se cotizó y despachó el viaje: `car` cuando pediste uno o cuando un artículo tenía tamaño `xlarge`, `moto` en los demás casos. El recargo de un auto va dentro de `fee_cents`. Siempre está presente, nunca es null, y queda fijo durante toda la vida del envío.\n\nNo es el vehículo que llegó. Ese es `courier.vehicle_type`, que puede ser un auto en un viaje `moto` sin que la tarifa cambie.\n","example":"moto","isRequired":true,"uniqueKey":"oneOf.0.data.vehicle","typeLabel":"enum\u003cstring>"},"courier":{"oneOf":[{"type":"object","description":"Null hasta que se asigna un repartidor, y después CONGELADO: un envío terminal sigue reportando quién lo llevó.\n","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.name","typeLabel":"string"},"vehicle":{"oneOf":[{"type":"string","description":"En qué viaja el repartidor, en inglés sin importar el idioma de la solicitud (\"Motorcycle\", \"Bicycle\"). Se deriva de `vehicle_type`, así que es null exactamente cuando él lo es: muéstralo, y decide con `vehicle_type` en su lugar.\n","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.vehicle.oneOf.0","typeLabel":"string"},{"type":"null","description":"En qué viaja el repartidor, en inglés sin importar el idioma de la solicitud (\"Motorcycle\", \"Bicycle\"). Se deriva de `vehicle_type`, así que es null exactamente cuando él lo es: muéstralo, y decide con `vehicle_type` en su lugar.\n","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.vehicle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.vehicle","typeLabel":"string | null"},"vehicle_type":{"oneOf":[{"type":"string","description":"El tipo legible por máquina: `bicycle`, `car`, `van`, `truck`,\n`scooter`, `motorcycle` o `walker`. Null hasta que se asigna un vehículo al repartidor. Trata un valor que no aparece en la lista como desconocido y no como error: esta lista crece.\n","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.vehicle_type.oneOf.0","typeLabel":"string"},{"type":"null","description":"El tipo legible por máquina: `bicycle`, `car`, `van`, `truck`,\n`scooter`, `motorcycle` o `walker`. Null hasta que se asigna un vehículo al repartidor. Trata un valor que no aparece en la lista como desconocido y no como error: esta lista crece.\n","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.vehicle_type.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.vehicle_type","typeLabel":"string | null"},"plate":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.plate.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.plate.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.plate","typeLabel":"string | null"},"phone":{"oneOf":[{"type":"object","description":"Un número enmascarado y el PIN de IVR, nunca un número personal. Marca\n`masked` e ingresa `pin` cuando el sistema lo pida. Null cuando no se ha\nasignado ningún número a este repartidor.\n","properties":{"masked":{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.phone.oneOf.0.masked","typeLabel":"string"},"pin":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.phone.oneOf.0.pin.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.phone.oneOf.0.pin.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.phone.oneOf.0.pin","typeLabel":"string | null"}},"required":["masked","pin"],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.phone.oneOf.0","typeLabel":"object"},{"type":"null","description":"Un número enmascarado y el PIN de IVR, nunca un número personal. Marca\n`masked` e ingresa `pin` cuando el sistema lo pida. Null cuando no se ha\nasignado ningún número a este repartidor.\n","properties":{"masked":{"type":"string"},"pin":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["masked","pin"],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.phone.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.phone","typeLabel":"object | null"},"location":{"oneOf":[{"type":"object","description":"La posición en vivo, presente solo mientras el repartidor está realmente en\nmovimiento y solo cuando ya hay una señal real de ubicación.\n","properties":{"lat":{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.location.oneOf.0.lat","typeLabel":"number\u003cdouble>"},"lng":{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.location.oneOf.0.lng","typeLabel":"number\u003cdouble>"},"updated_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.location.oneOf.0.updated_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.location.oneOf.0.updated_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.location.oneOf.0.updated_at","typeLabel":"string\u003cdate-time> | null"}},"required":["lat","lng","updated_at"],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.location.oneOf.0","typeLabel":"object"},{"type":"null","description":"La posición en vivo, presente solo mientras el repartidor está realmente en\nmovimiento y solo cuando ya hay una señal real de ubicación.\n","properties":{"lat":{"type":"number","format":"double"},"lng":{"type":"number","format":"double"},"updated_at":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]}},"required":["lat","lng","updated_at"],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.location.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.location","typeLabel":"object | null"},"imminent":{"type":"boolean","description":"El repartidor está a un minuto aproximadamente. Siempre es false una vez que termina el viaje.","isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0.imminent","typeLabel":"boolean"}},"required":["name","vehicle","vehicle_type","plate","phone","location","imminent"],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.0","typeLabel":"object"},{"type":"null","description":"Null hasta que se asigna un repartidor, y después CONGELADO: un envío terminal sigue reportando quién lo llevó.\n","properties":{"name":{"type":"string"},"vehicle":{"oneOf":[{"type":"string","description":"En qué viaja el repartidor, en inglés sin importar el idioma de la solicitud (\"Motorcycle\", \"Bicycle\"). Se deriva de `vehicle_type`, así que es null exactamente cuando él lo es: muéstralo, y decide con `vehicle_type` en su lugar.\n"},{"type":"null","description":"En qué viaja el repartidor, en inglés sin importar el idioma de la solicitud (\"Motorcycle\", \"Bicycle\"). Se deriva de `vehicle_type`, así que es null exactamente cuando él lo es: muéstralo, y decide con `vehicle_type` en su lugar.\n"}]},"vehicle_type":{"oneOf":[{"type":"string","description":"El tipo legible por máquina: `bicycle`, `car`, `van`, `truck`,\n`scooter`, `motorcycle` o `walker`. Null hasta que se asigna un vehículo al repartidor. Trata un valor que no aparece en la lista como desconocido y no como error: esta lista crece.\n"},{"type":"null","description":"El tipo legible por máquina: `bicycle`, `car`, `van`, `truck`,\n`scooter`, `motorcycle` o `walker`. Null hasta que se asigna un vehículo al repartidor. Trata un valor que no aparece en la lista como desconocido y no como error: esta lista crece.\n"}]},"plate":{"oneOf":[{"type":"string"},{"type":"null"}]},"phone":{"oneOf":[{"type":"object","description":"Un número enmascarado y el PIN de IVR, nunca un número personal. Marca\n`masked` e ingresa `pin` cuando el sistema lo pida. Null cuando no se ha\nasignado ningún número a este repartidor.\n","properties":{"masked":{"type":"string"},"pin":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["masked","pin"]},{"type":"null","description":"Un número enmascarado y el PIN de IVR, nunca un número personal. Marca\n`masked` e ingresa `pin` cuando el sistema lo pida. Null cuando no se ha\nasignado ningún número a este repartidor.\n","properties":{"masked":{"type":"string"},"pin":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["masked","pin"]}]},"location":{"oneOf":[{"type":"object","description":"La posición en vivo, presente solo mientras el repartidor está realmente en\nmovimiento y solo cuando ya hay una señal real de ubicación.\n","properties":{"lat":{"type":"number","format":"double"},"lng":{"type":"number","format":"double"},"updated_at":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]}},"required":["lat","lng","updated_at"]},{"type":"null","description":"La posición en vivo, presente solo mientras el repartidor está realmente en\nmovimiento y solo cuando ya hay una señal real de ubicación.\n","properties":{"lat":{"type":"number","format":"double"},"lng":{"type":"number","format":"double"},"updated_at":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]}},"required":["lat","lng","updated_at"]}]},"imminent":{"type":"boolean","description":"El repartidor está a un minuto aproximadamente. Siempre es false una vez que termina el viaje."}},"required":["name","vehicle","vehicle_type","plate","phone","location","imminent"],"isRequired":true,"uniqueKey":"oneOf.0.data.courier.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.courier","typeLabel":"object | null"},"pickup_eta_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo se espera que el repartidor llegue a la tienda. Es una hora absoluta, así que calcula tu propia cuenta regresiva; una cuenta regresiva calculada aquí ya está desactualizada cuando la lees.\n","isRequired":true,"uniqueKey":"oneOf.0.data.pickup_eta_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo se espera que el repartidor llegue a la tienda. Es una hora absoluta, así que calcula tu propia cuenta regresiva; una cuenta regresiva calculada aquí ya está desactualizada cuando la lees.\n","isRequired":true,"uniqueKey":"oneOf.0.data.pickup_eta_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.pickup_eta_at","typeLabel":"string\u003cdate-time> | null"},"dropoff_eta_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo se espera que el repartidor llegue con el cliente. Es null hasta que hay una estimación, y vuelve a ser null cuando la entrega fallida ya ocurrió (`returning`, `returned`): el repartidor entonces regresa el pedido a la tienda, no queda una llegada al cliente que describir, y aquí nunca se publica la hora en que vuelve a la tienda.\n","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff_eta_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo se espera que el repartidor llegue con el cliente. Es null hasta que hay una estimación, y vuelve a ser null cuando la entrega fallida ya ocurrió (`returning`, `returned`): el repartidor entonces regresa el pedido a la tienda, no queda una llegada al cliente que describir, y aquí nunca se publica la hora en que vuelve a la tienda.\n","isRequired":true,"uniqueKey":"oneOf.0.data.dropoff_eta_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.dropoff_eta_at","typeLabel":"string\u003cdate-time> | null"},"tracking_url":{"oneOf":[{"type":"string","format":"uri","description":"La página de seguimiento en vivo, con marca propia, para el cliente: el mapa, el\nrepartidor, el código de entrega y lo que se cobra en la puerta. Es null cuando no hay\npágina a la que apuntar, así que nunca reenvías un enlace muerto.\n\nHay página desde el momento en que el pedido se despacha, incluida\ntoda la ventana antes de que se asigne un repartidor, y durante 48 horas\ndespués de que el pedido se entrega, se cancela o regresa. Es null mientras\nun pedido sigue retenido esperando pago o esperando un pin de punto de entrega confirmado, y vuelve a ser null cuando pasan esas 48 horas.\n","example":"https://app.listo.delivery/t/abc123","isRequired":true,"uniqueKey":"oneOf.0.data.tracking_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"La página de seguimiento en vivo, con marca propia, para el cliente: el mapa, el\nrepartidor, el código de entrega y lo que se cobra en la puerta. Es null cuando no hay\npágina a la que apuntar, así que nunca reenvías un enlace muerto.\n\nHay página desde el momento en que el pedido se despacha, incluida\ntoda la ventana antes de que se asigne un repartidor, y durante 48 horas\ndespués de que el pedido se entrega, se cancela o regresa. Es null mientras\nun pedido sigue retenido esperando pago o esperando un pin de punto de entrega confirmado, y vuelve a ser null cuando pasan esas 48 horas.\n","example":"https://app.listo.delivery/t/abc123","isRequired":true,"uniqueKey":"oneOf.0.data.tracking_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.tracking_url","typeLabel":"string\u003curi> | null"},"verification":{"oneOf":[{"type":"object","description":"Está presente solo cuando el pedido trae un PIN de entrega: cuando lo pediste (`verification.dropoff_pincode` en la creación), o cuando Listo exige un PIN en cada envío de la cuenta de esta tienda, en cuyo caso está presente aunque no lo pediste. `pincode` es null hasta que el pedido se despacha de verdad, que es cuando se genera el código.\n","properties":{"pincode":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.verification.oneOf.0.pincode.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.0.data.verification.oneOf.0.pincode.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.verification.oneOf.0.pincode","typeLabel":"string | null"}},"required":["pincode"],"isRequired":true,"uniqueKey":"oneOf.0.data.verification.oneOf.0","typeLabel":"object"},{"type":"null","description":"Está presente solo cuando el pedido trae un PIN de entrega: cuando lo pediste (`verification.dropoff_pincode` en la creación), o cuando Listo exige un PIN en cada envío de la cuenta de esta tienda, en cuyo caso está presente aunque no lo pediste. `pincode` es null hasta que el pedido se despacha de verdad, que es cuando se genera el código.\n","properties":{"pincode":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["pincode"],"isRequired":true,"uniqueKey":"oneOf.0.data.verification.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.verification","typeLabel":"object | null"},"return_verification":{"type":"object","description":"El código de devolución. Cuando un pedido no se puede entregar y el repartidor lo regresa a la tienda, el repartidor debe recibir este código en la tienda para entregar el pedido; sin él la devolución no se puede completar. `pincode` es una cadena de 4 dígitos mientras el envío está en `returning`, y null en cualquier otro estado (antes de la devolución, y una vez que está en `returned`). El objeto siempre está presente, así que este campo nunca necesita una verificación de presencia. Llega en `delivery.status_changed` (el paso a `returning`) y en `delivery.updated`, que traen el objeto completo. Un nuevo intento (un reintento) recibe su propio código. Muéstraselo a la tienda, y nunca al cliente.\n","properties":{"pincode":{"oneOf":[{"type":"string","example":"4821","isRequired":true,"uniqueKey":"oneOf.0.data.return_verification.pincode.oneOf.0","typeLabel":"string"},{"type":"null","example":"4821","isRequired":true,"uniqueKey":"oneOf.0.data.return_verification.pincode.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.return_verification.pincode","typeLabel":"string | null"}},"required":["pincode"],"isRequired":true,"uniqueKey":"oneOf.0.data.return_verification","typeLabel":"object"},"proof":{"oneOf":[{"type":"object","description":"Prueba de entrega. Null a menos que tengamos alguna, y cada campo es null cuando falta esa pieza; una foto sin firma es normal. Las URL son enlaces firmados propios de Listo hacia la copia guardada y son válidas durante 24 horas desde la respuesta (o el webhook) que las trajo: vuelve a pedir `GET /v1/deliveries/{id}` para obtener un enlace nuevo, o guarda una copia. **Una URL es null hasta que Listo tiene su propia copia de la imagen** (unos segundos después de que el repartidor la toma); la llegada de la copia se anuncia con un webhook `delivery.updated` que trae el enlace. Puede venir de un intento de entrega que falló en la puerta, así que por sí sola no prueba que el pedido se entregó: `proofs.dropoff.delivered` dice cuál. Prefiere `proofs`, que separa cada momento del viaje.\n","properties":{"picture_url":{"oneOf":[{"type":"string","format":"uri","isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0.picture_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0.picture_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0.picture_url","typeLabel":"string\u003curi> | null"},"signature_image_url":{"oneOf":[{"type":"string","format":"uri","isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0.signature_image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0.signature_image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0.signature_image_url","typeLabel":"string\u003curi> | null"},"signature_name":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0.signature_name.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0.signature_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0.signature_name","typeLabel":"string | null"},"captured_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0.captured_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0.captured_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0.captured_at","typeLabel":"string\u003cdate-time> | null"}},"required":["picture_url","signature_image_url","signature_name","captured_at"],"isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.0","typeLabel":"object"},{"type":"null","description":"Prueba de entrega. Null a menos que tengamos alguna, y cada campo es null cuando falta esa pieza; una foto sin firma es normal. Las URL son enlaces firmados propios de Listo hacia la copia guardada y son válidas durante 24 horas desde la respuesta (o el webhook) que las trajo: vuelve a pedir `GET /v1/deliveries/{id}` para obtener un enlace nuevo, o guarda una copia. **Una URL es null hasta que Listo tiene su propia copia de la imagen** (unos segundos después de que el repartidor la toma); la llegada de la copia se anuncia con un webhook `delivery.updated` que trae el enlace. Puede venir de un intento de entrega que falló en la puerta, así que por sí sola no prueba que el pedido se entregó: `proofs.dropoff.delivered` dice cuál. Prefiere `proofs`, que separa cada momento del viaje.\n","properties":{"picture_url":{"oneOf":[{"type":"string","format":"uri"},{"type":"null","format":"uri"}]},"signature_image_url":{"oneOf":[{"type":"string","format":"uri"},{"type":"null","format":"uri"}]},"signature_name":{"oneOf":[{"type":"string"},{"type":"null"}]},"captured_at":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]}},"required":["picture_url","signature_image_url","signature_name","captured_at"],"isRequired":true,"uniqueKey":"oneOf.0.data.proof.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proof","typeLabel":"object | null"},"proofs":{"type":"object","description":"La evidencia que dejó el viaje, una entrada por momento. Cada momento es\nnull hasta que sucede (todavía no se capturó nada para él), así que\neste objeto siempre está presente con sus tres llaves. Un enlace de foto o de firma es el\nenlace firmado de Listo al archivo guardado, y **es null hasta que Listo tiene ese archivo** (unos segundos después de que el repartidor toma la foto): el resto del momento, quién firmó, la hora y la distancia, está desde el principio, y cuando el archivo llega un webhook `delivery.updated` trae el enlace. **Cada enlace es válido por 24 horas** desde la respuesta (o el webhook) que lo trajo: es un enlace firmado de vida corta, nunca uno permanente. Un socio que necesite la imagen después vuelve a pedir `GET /v1/deliveries/{id}` para obtener un enlace nuevo, o guarda una copia.\n","properties":{"pickup":{"oneOf":[{"type":"object","description":"El repartidor que recoge el pedido en la tienda. Es null hasta que existe la\nfoto de recolección.\n","properties":{"photo_url":{"oneOf":[{"type":"string","format":"uri","description":"Foto del pedido en la tienda.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.pickup.oneOf.0.photo_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Foto del pedido en la tienda.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.pickup.oneOf.0.photo_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.pickup.oneOf.0.photo_url","typeLabel":"string\u003curi> | null"},"captured_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo vio Listo por primera vez esta foto.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.pickup.oneOf.0.captured_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo vio Listo por primera vez esta foto.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.pickup.oneOf.0.captured_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.pickup.oneOf.0.captured_at","typeLabel":"string\u003cdate-time> | null"}},"required":["photo_url","captured_at"],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.pickup.oneOf.0","typeLabel":"object"},{"type":"null","description":"El repartidor que recoge el pedido en la tienda. Es null hasta que existe la\nfoto de recolección.\n","properties":{"photo_url":{"oneOf":[{"type":"string","format":"uri","description":"Foto del pedido en la tienda."},{"type":"null","format":"uri","description":"Foto del pedido en la tienda."}]},"captured_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo vio Listo por primera vez esta foto."},{"type":"null","format":"date-time","description":"Cuándo vio Listo por primera vez esta foto."}]}},"required":["photo_url","captured_at"],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.pickup.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.pickup","typeLabel":"object | null"},"dropoff":{"oneOf":[{"type":"object","description":"El repartidor en la puerta del cliente. Está presente una vez que el pedido se entrega, o una vez que el intento dejó una foto, una firma o un\nfirmante ahí, **incluido un intento que falló**: lee\n`delivered`, no la presencia de una foto, para saber si el pedido se entregó.\n","properties":{"photo_url":{"oneOf":[{"type":"string","format":"uri","description":"Foto tomada en la puerta.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.photo_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Foto tomada en la puerta.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.photo_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.photo_url","typeLabel":"string\u003curi> | null"},"signature_url":{"oneOf":[{"type":"string","format":"uri","description":"Imagen de la firma del destinatario.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.signature_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Imagen de la firma del destinatario.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.signature_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.signature_url","typeLabel":"string\u003curi> | null"},"signer_name":{"oneOf":[{"type":"string","description":"El nombre que escribió la persona que firmó.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.signer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"El nombre que escribió la persona que firmó.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.signer_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.signer_name","typeLabel":"string | null"},"captured_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.captured_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.captured_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.captured_at","typeLabel":"string\u003cdate-time> | null"},"delivered":{"type":"boolean","description":"True solo cuando el envío fue entregado. False significa que la\nevidencia viene de un intento que no entregó el pedido.\n","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0.delivered","typeLabel":"boolean"}},"required":["photo_url","signature_url","signer_name","captured_at","delivered"],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.0","typeLabel":"object"},{"type":"null","description":"El repartidor en la puerta del cliente. Está presente una vez que el pedido se entrega, o una vez que el intento dejó una foto, una firma o un\nfirmante ahí, **incluido un intento que falló**: lee\n`delivered`, no la presencia de una foto, para saber si el pedido se entregó.\n","properties":{"photo_url":{"oneOf":[{"type":"string","format":"uri","description":"Foto tomada en la puerta."},{"type":"null","format":"uri","description":"Foto tomada en la puerta."}]},"signature_url":{"oneOf":[{"type":"string","format":"uri","description":"Imagen de la firma del destinatario."},{"type":"null","format":"uri","description":"Imagen de la firma del destinatario."}]},"signer_name":{"oneOf":[{"type":"string","description":"El nombre que escribió la persona que firmó."},{"type":"null","description":"El nombre que escribió la persona que firmó."}]},"captured_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia."},{"type":"null","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia."}]},"delivered":{"type":"boolean","description":"True solo cuando el envío fue entregado. False significa que la\nevidencia viene de un intento que no entregó el pedido.\n"}},"required":["photo_url","signature_url","signer_name","captured_at","delivered"],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.dropoff","typeLabel":"object | null"},"return":{"oneOf":[{"type":"object","description":"El repartidor que regresa el pedido a la tienda después de una entrega fallida. Es null salvo que el pedido haya regresado con evidencia.\n","properties":{"photo_url":{"oneOf":[{"type":"string","format":"uri","description":"Foto del pedido devuelto en la tienda.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.photo_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Foto del pedido devuelto en la tienda.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.photo_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.photo_url","typeLabel":"string\u003curi> | null"},"signature_url":{"oneOf":[{"type":"string","format":"uri","description":"Imagen de la firma de quien lo recibió en la tienda.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.signature_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Imagen de la firma de quien lo recibió en la tienda.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.signature_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.signature_url","typeLabel":"string\u003curi> | null"},"signer_name":{"oneOf":[{"type":"string","description":"El nombre que escribió la persona que firmó.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.signer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"El nombre que escribió la persona que firmó.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.signer_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.signer_name","typeLabel":"string | null"},"captured_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.captured_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia.","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.captured_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.captured_at","typeLabel":"string\u003cdate-time> | null"},"meters_from_store":{"oneOf":[{"type":"integer","description":"Qué tan lejos estaba el repartidor de la tienda cuando se capturó esto, en metros enteros en línea recta. Null cuando alguna de las dos posiciones es desconocida. Es evidencia para que una persona la lea, no un veredicto.\n","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.meters_from_store.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Qué tan lejos estaba el repartidor de la tienda cuando se capturó esto, en metros enteros en línea recta. Null cuando alguna de las dos posiciones es desconocida. Es evidencia para que una persona la lea, no un veredicto.\n","isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.meters_from_store.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0.meters_from_store","typeLabel":"integer | null"}},"required":["photo_url","signature_url","signer_name","captured_at","meters_from_store"],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.0","typeLabel":"object"},{"type":"null","description":"El repartidor que regresa el pedido a la tienda después de una entrega fallida. Es null salvo que el pedido haya regresado con evidencia.\n","properties":{"photo_url":{"oneOf":[{"type":"string","format":"uri","description":"Foto del pedido devuelto en la tienda."},{"type":"null","format":"uri","description":"Foto del pedido devuelto en la tienda."}]},"signature_url":{"oneOf":[{"type":"string","format":"uri","description":"Imagen de la firma de quien lo recibió en la tienda."},{"type":"null","format":"uri","description":"Imagen de la firma de quien lo recibió en la tienda."}]},"signer_name":{"oneOf":[{"type":"string","description":"El nombre que escribió la persona que firmó."},{"type":"null","description":"El nombre que escribió la persona que firmó."}]},"captured_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia."},{"type":"null","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia."}]},"meters_from_store":{"oneOf":[{"type":"integer","description":"Qué tan lejos estaba el repartidor de la tienda cuando se capturó esto, en metros enteros en línea recta. Null cuando alguna de las dos posiciones es desconocida. Es evidencia para que una persona la lea, no un veredicto.\n"},{"type":"null","description":"Qué tan lejos estaba el repartidor de la tienda cuando se capturó esto, en metros enteros en línea recta. Null cuando alguna de las dos posiciones es desconocida. Es evidencia para que una persona la lea, no un veredicto.\n"}]}},"required":["photo_url","signature_url","signer_name","captured_at","meters_from_store"],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs.return","typeLabel":"object | null"}},"required":["pickup","dropoff","return"],"isRequired":true,"uniqueKey":"oneOf.0.data.proofs","typeLabel":"object"},"cancellation":{"oneOf":[{"type":"object","description":"Quién canceló el pedido, y por qué. Es null en un pedido que no se canceló.","properties":{"party":{"type":"string","enum":["partner","courier","platform"],"description":"`partner` eres tú. `courier` es la persona que lo lleva. `platform` somos nosotros, y también cubre una cancelación reportada a nosotros en nombre del cliente final: el cliente final no es un actor en esta API, así que este campo nunca nombra a una persona que no puedas correlacionar.\n","isRequired":true,"uniqueKey":"oneOf.0.data.cancellation.oneOf.0.party","typeLabel":"enum\u003cstring>"},"reason":{"oneOf":[{"type":"string","enum":["customer_canceled","store_closed","item_unavailable","wrong_address","no_longer_needed","other",null],"description":"El motivo que enviaste al cancelar. Es null cuando la atribución se derivó en lugar de darse, que es el caso de toda cancelación que tú no hiciste.\n","isRequired":true,"uniqueKey":"oneOf.0.data.cancellation.oneOf.0.reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["customer_canceled","store_closed","item_unavailable","wrong_address","no_longer_needed","other",null],"description":"El motivo que enviaste al cancelar. Es null cuando la atribución se derivó en lugar de darse, que es el caso de toda cancelación que tú no hiciste.\n","isRequired":true,"uniqueKey":"oneOf.0.data.cancellation.oneOf.0.reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.cancellation.oneOf.0.reason","typeLabel":"enum\u003cstring> | null"},"description":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.0.data.cancellation.oneOf.0.description.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.0.data.cancellation.oneOf.0.description.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.cancellation.oneOf.0.description","typeLabel":"string | null"}},"required":["party","reason","description"],"isRequired":true,"uniqueKey":"oneOf.0.data.cancellation.oneOf.0","typeLabel":"object"},{"type":"null","description":"Quién canceló el pedido, y por qué. Es null en un pedido que no se canceló.","properties":{"party":{"type":"string","enum":["partner","courier","platform"],"description":"`partner` eres tú. `courier` es la persona que lo lleva. `platform` somos nosotros, y también cubre una cancelación reportada a nosotros en nombre del cliente final: el cliente final no es un actor en esta API, así que este campo nunca nombra a una persona que no puedas correlacionar.\n"},"reason":{"oneOf":[{"type":"string","enum":["customer_canceled","store_closed","item_unavailable","wrong_address","no_longer_needed","other",null],"description":"El motivo que enviaste al cancelar. Es null cuando la atribución se derivó en lugar de darse, que es el caso de toda cancelación que tú no hiciste.\n"},{"type":"null","enum":["customer_canceled","store_closed","item_unavailable","wrong_address","no_longer_needed","other",null],"description":"El motivo que enviaste al cancelar. Es null cuando la atribución se derivó en lugar de darse, que es el caso de toda cancelación que tú no hiciste.\n"}]},"description":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["party","reason","description"],"isRequired":true,"uniqueKey":"oneOf.0.data.cancellation.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.cancellation","typeLabel":"object | null"},"failure_reason":{"oneOf":[{"type":"string","enum":["no_couriers_available","address_unreachable","customer_unavailable","delivery_failed",null],"description":"Por qué falló un despacho, agrupado según de qué lado está el problema, para que puedas actuar en lugar de solo reintentar a ciegas.\n`no_couriers_available` es el que se puede reintentar.\n`delivery_failed` es el cajón general honesto. Es null a menos que se haya registrado una falla.\n","isRequired":true,"uniqueKey":"oneOf.0.data.failure_reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["no_couriers_available","address_unreachable","customer_unavailable","delivery_failed",null],"description":"Por qué falló un despacho, agrupado según de qué lado está el problema, para que puedas actuar en lugar de solo reintentar a ciegas.\n`no_couriers_available` es el que se puede reintentar.\n`delivery_failed` es el cajón general honesto. Es null a menos que se haya registrado una falla.\n","isRequired":true,"uniqueKey":"oneOf.0.data.failure_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.failure_reason","typeLabel":"enum\u003cstring> | null"},"charges":{"type":"array","description":"Lo que se cobra por un viaje que se recorrió pero se desperdició: la tarifa de envío\nde cada tramo recorrido, menos tu propio margen de tienda. Vacío en\ncasi todos los envíos, y nunca null.\n\n**Este monto cambió el 2026-08-29.** Antes era lo que le costaba a Listo el\nviaje desperdiciado, así que espera valores mayores en los mismos pedidos\na partir de esa fecha. El campo en sí no cambió.\n\nSiempre está presente en un objeto de envío, así que trata un `charges`\nausente como imposible y no como \"sin cargos\". Por esa razón está en la lista\n`required` de este esquema.\n\nUn cargo puede llegar en el `delivery.status_changed` final del envío o, cuando el\ncosto se liquida después, en un `delivery.updated` posterior. No puedes suponer cuál,\nasí que lee este campo en ambos: cobrar en el momento en que un envío llega a su\nestado terminal cobra de menos en cada pedido cuyo costo llegó tarde.\n\nEl mismo movimiento aparece en `GET /v1/ledger` como una fila con signo, así que\nallí se lee negativo mientras que `amount_cents` aquí es positivo.\n","items":{"type":"object","properties":{"type":{"type":"string","enum":["cancellation_fee","return_fee"],"description":"Por qué se hizo el cargo. `cancellation_fee` es una cancelación tardía, cuando un repartidor ya estaba trabajando en el pedido. `return_fee` es un viaje de regreso después de una entrega fallida, y se cobra como UNA sola entrada que cubre los dos tramos del viaje en lugar de dos.\n","isRequired":true,"uniqueKey":"oneOf.0.data.charges.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"amount_cents":{"type":"integer","description":"Lo que te cobraron, positivo, en centavos de peso mexicano: la tarifa de envío de cada tramo que se recorrió, menos tu propio margen de tienda.\n","isRequired":true,"uniqueKey":"oneOf.0.data.charges.items.[INDEX].amount_cents","typeLabel":"integer"},"charged_at":{"type":"string","format":"date-time","description":"Cuándo se registró el cargo, que no es cuando terminó el envío.\n","isRequired":true,"uniqueKey":"oneOf.0.data.charges.items.[INDEX].charged_at","typeLabel":"string\u003cdate-time>"}},"required":["type","amount_cents","charged_at"],"uniqueKey":"oneOf.0.data.charges.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.0.data.charges","typeLabel":"object[]"},"refunds":{"type":"array","description":"Cada vez que se devolvió dinero al cliente por este pedido, del más reciente al más antiguo. Vacío en un pedido que nunca se ha reembolsado, y nunca null.\n\nSiempre presente en un objeto de envío, así que trata un `refunds` ausente como algo imposible, no como \"sin reembolsos\". Está en la lista `required` de este esquema por esa razón, igual que `charges` arriba.\n\nEs una LISTA porque los reembolsos se repiten: un reembolso parcial va seguido de otro reembolso, cada uno con su propio monto, su propio motivo y su propio resultado. Aquí aparece todo reembolso que podemos ver, sin importar quién lo hizo, y por eso la lista vale la pena para conciliar. La cuenta conectada pertenece al comercio de registro (el titular del cargo), que puede reembolsar un cargo en ella sin pasar por nosotros; esos llegan como `requested_via: external`, y una lista que mostrara solo los reembolsos que tú pediste contradiría en silencio el `payment.status` de este pedido.\n\nUn reembolso viaja en `delivery.updated`, nunca en un evento propio.\n","items":{"type":"object","properties":{"id":{"type":"string","description":"El id del reembolso, con prefijo `rfn_`.","example":"rfn_4bQ7wS2xK9mT6vN3cZ8pLdYe","isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].id","typeLabel":"string"},"amount_cents":{"oneOf":[{"type":"integer","description":"Lo que volvió, positivo, en centavos de peso mexicano. NULL Y NO CERO mientras un reembolso del saldo restante sigue en curso: no lleva monto hasta que el reembolso se confirma, y un cero diría que un reembolso no movió nada. Lee `refunded_cents` más abajo en lugar de sumar este arreglo, que es justo la razón por la que se publican los dos totales.\n","isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].amount_cents.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Lo que volvió, positivo, en centavos de peso mexicano. NULL Y NO CERO mientras un reembolso del saldo restante sigue en curso: no lleva monto hasta que el reembolso se confirma, y un cero diría que un reembolso no movió nada. Lee `refunded_cents` más abajo en lugar de sumar este arreglo, que es justo la razón por la que se publican los dos totales.\n","isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].amount_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].amount_cents","typeLabel":"integer | null"},"reason":{"oneOf":[{"type":"string","description":"El texto libre que escribió quien pidió el reembolso, o null.\nTus propias palabras cuando tú las enviaste; nunca es un enum.\n","isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"El texto libre que escribió quien pidió el reembolso, o null.\nTus propias palabras cuando tú las enviaste; nunca es un enum.\n","isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].reason","typeLabel":"string | null"},"status":{"type":"string","enum":["pending","succeeded","failed"],"description":"`pending` NO ES UNA FALLA y no debe reintentarse: un reembolso de cargo directo queda retenido mientras el saldo de la cuenta está corto y se aplica cuando llegan los fondos. Pasa a `succeeded` por sí solo y lo publica como `delivery.updated`. `failed` significa que no se movió nada.\n","isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"requested_via":{"type":"string","enum":["api","console","automatic","external"],"description":"Qué vía emitió el reembolso. `api` es tu propio `POST /v1/deliveries/{id}/refunds`. `console` es el comerciante que lo presiona en la consola de Listo. `automatic` es uno que emitimos sin que nadie lo pidiera, en una cancelación o una devolución. `external` es uno hecho en el panel de pagos propio del comerciante, del que nos enteramos después.\n","isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].requested_via","typeLabel":"enum\u003cstring>"},"party":{"type":"string","enum":["business","platform"],"description":"De quién fue la decisión. `business` es el comerciante, o tú actuando por tu tienda. `platform` es Listo emitiéndolo porque el pedido terminó sin llegar al cliente.\n","isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].party","typeLabel":"enum\u003cstring>"},"created_at":{"type":"string","format":"date-time","description":"Cuándo se pidió el reembolso.","isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"succeeded_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo se confirmó que el dinero iba en camino. Es null en un reembolso pendiente o fallido.\n","isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].succeeded_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo se confirmó que el dinero iba en camino. Es null en un reembolso pendiente o fallido.\n","isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].succeeded_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.refunds.items.[INDEX].succeeded_at","typeLabel":"string\u003cdate-time> | null"}},"required":["id","amount_cents","reason","status","requested_via","party","created_at","succeeded_at"],"uniqueKey":"oneOf.0.data.refunds.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.0.data.refunds","typeLabel":"object[]"},"refunded_cents":{"type":"integer","description":"La suma de los reembolsos EXITOSOS de arriba, en centavos de peso mexicano. 0,\nnunca null, en un pedido al que nada se le haya devuelto. Un reembolso `pending` no se cuenta, porque el dinero no se ha movido y todavía puede ser rechazado.\n\nSe publica en lugar de dejártelo calcular, porque el arreglo no siempre se puede sumar bien: un reembolso del saldo restante no lleva `amount_cents` hasta que se confirma, así que sumar la lista lo cuenta como cero y hace que todo el cargo parezca todavía reembolsable. En cambio tomamos ese caso de forma pesimista, como si hubiera consumido todo el saldo restante, porque adivinar a la baja termina reembolsando dos veces a un cliente.\n","isRequired":true,"uniqueKey":"oneOf.0.data.refunded_cents","typeLabel":"integer"},"refundable_cents":{"type":"integer","description":"Lo que todavía podría devolver un reembolso adicional: lo que pagó el cliente (`order_value_cents` más `customer_fee_cents`, que ES el cargo) menos `refunded_cents`, sin bajar de cero. 0, nunca null.\n\n0 en cualquier pedido sin un pago con tarjeta cobrado detrás, sin importar su valor. El efectivo nunca tocó nuestros rieles de pago, el cliente de un pedido prepagado es tuyo y nosotros no tenemos nada de él, y un pedido que todavía espera pago nunca se cobró, así que en ninguno de estos hay algo que un reembolso pudiera devolver.\n\nEste es el techo contra el que `POST /v1/deliveries/{id}/refunds` rechaza un `amount_cents`, así que léelo antes de llamar en lugar de descubrir el límite a partir de un `refund_amount_too_large`.\n","isRequired":true,"uniqueKey":"oneOf.0.data.refundable_cents","typeLabel":"integer"},"support_reference":{"oneOf":[{"type":"string","description":"Un identificador corto que citas cuando nos escalas un pedido. Null hasta\nque el pedido llega a despacho.\n","example":"2080F","isRequired":true,"uniqueKey":"oneOf.0.data.support_reference.oneOf.0","typeLabel":"string"},{"type":"null","description":"Un identificador corto que citas cuando nos escalas un pedido. Null hasta\nque el pedido llega a despacho.\n","example":"2080F","isRequired":true,"uniqueKey":"oneOf.0.data.support_reference.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.support_reference","typeLabel":"string | null"},"pickup_ready_at":{"oneOf":[{"type":"string","format":"date-time","description":"La hora de recolección programada que pediste. Es null en un pedido de despacho inmediato.","isRequired":true,"uniqueKey":"oneOf.0.data.pickup_ready_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"La hora de recolección programada que pediste. Es null en un pedido de despacho inmediato.","isRequired":true,"uniqueKey":"oneOf.0.data.pickup_ready_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.pickup_ready_at","typeLabel":"string\u003cdate-time> | null"},"requested_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.requested_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.requested_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.requested_at","typeLabel":"string\u003cdate-time> | null"},"courier_assigned_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo se observó por primera vez a un repartidor en el intento actual. En realidad es una observación y no un reloj de asignación, porque no se nos publica ningún momento de asignación. Es null en un intento que nunca lo tuvo.\n","isRequired":true,"uniqueKey":"oneOf.0.data.courier_assigned_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo se observó por primera vez a un repartidor en el intento actual. En realidad es una observación y no un reloj de asignación, porque no se nos publica ningún momento de asignación. Es null en un intento que nunca lo tuvo.\n","isRequired":true,"uniqueKey":"oneOf.0.data.courier_assigned_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.courier_assigned_at","typeLabel":"string\u003cdate-time> | null"},"picked_up_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.picked_up_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.picked_up_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.picked_up_at","typeLabel":"string\u003cdate-time> | null"},"delivered_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.delivered_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.delivered_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.delivered_at","typeLabel":"string\u003cdate-time> | null"},"canceled_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.canceled_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.canceled_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.canceled_at","typeLabel":"string\u003cdate-time> | null"},"returned_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.returned_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.returned_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.0.data.returned_at","typeLabel":"string\u003cdate-time> | null"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.0.data.updated_at","typeLabel":"string\u003cdate-time>"}},"required":["id","external_id","origin","code","status","store_id","test","payment","order_value_cents","fee_cents","business_fee_cents","customer_fee_cents","tip_cents","currency","quote_id","pickup","dropoff","manifest","vehicle","courier","pickup_eta_at","dropoff_eta_at","tracking_url","verification","return_verification","proof","proofs","cancellation","failure_reason","support_reference","pickup_ready_at","requested_at","courier_assigned_at","picked_up_at","delivered_at","canceled_at","returned_at","created_at","updated_at","charges","refunds","refunded_cents","refundable_cents"],"isRequired":true,"uniqueKey":"oneOf.0.data","typeLabel":"object"},"test":{"type":"boolean","description":"Presente, y en true, solo en un evento de prueba que pediste con\n`POST /v1/test_webhooks`. Un evento real no trae el campo en absoluto. El `data` de un evento de prueba es una muestra cuyos ids no corresponden a nada.\n","example":true,"uniqueKey":"oneOf.0.test","typeLabel":"boolean"}},"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","description":"Cada evento que recibe tu endpoint de webhook, y cada evento que devuelven\nlas lecturas de depuración: uno de los seis de abajo, distinguidos por `type`.\n`data` es el objeto al que se refiere el evento, y su forma depende de\n`type`. Consulta `WebhookEventEnvelope` para los campos que todos comparten y\npara saber cómo se comporta la entrega (al menos una vez, sin orden).\n","required":["type","data","id","created_at"],"properties":{"id":{"type":"string","description":"El id del evento, con prefijo `evt_`. Deduplica por este.","example":"evt_9pQ2vX7mKdR4tYb1nZ3sLwCe","isRequired":true,"uniqueKey":"oneOf.1.id","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","description":"Cuándo se registró el evento, ISO-8601 en UTC.","example":"2026-07-28T18:41:03Z","isRequired":true,"uniqueKey":"oneOf.1.created_at","typeLabel":"string\u003cdate-time>"},"type":{"type":"string","description":"Qué evento es este.","enum":["delivery.updated"],"isRequired":true,"uniqueKey":"oneOf.1.type","typeLabel":"enum\u003cstring>"},"data":{"type":"object","description":"La forma de un envío: cada campo que puede llevar el objeto, con la\nnulabilidad que realmente tiene cada uno. Es la respuesta de cada operación\nque responde un envío (la creación, la consulta, una fila de lista, la\nreprogramación, la cancelación, el reintento y el reembolso) y el `data` de\ncada evento completo de envío, así que UN tipo sostiene todos ellos.\n\nCada operación devuelve el objeto completo. Un campo que una llamada dada\ntodavía no puede tener está presente y es null en lugar de faltar: una respuesta\nde creación tiene `courier` en null, porque todavía no se asigna ningún repartidor,\ny una reprogramación solo responde con un pedido que sigue programado,\nasí que su `delivered_at` es null.\n\nEl dinero va en centavos enteros, las marcas de tiempo son ISO-8601 en UTC, y cada\nenumeración de abajo es nuestra y no una copia de la de un tercero.\n","properties":{"id":{"type":"string","description":"El id del envío, con prefijo `dlv_`.","example":"dlv_7hK2mQ9xR4tV6bN1cZ8sLwYe","isRequired":true,"uniqueKey":"oneOf.1.data.id","typeLabel":"string"},"external_id":{"oneOf":[{"type":"string","description":"Tu propia referencia del pedido, devuelta exactamente como la enviaste.","example":"order-841","isRequired":true,"uniqueKey":"oneOf.1.data.external_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Tu propia referencia del pedido, devuelta exactamente como la enviaste.","example":"order-841","isRequired":true,"uniqueKey":"oneOf.1.data.external_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.external_id","typeLabel":"string | null"},"origin":{"type":"string","enum":["api","console","whatsapp"],"description":"Qué vía creó el envío. `api` es uno que creaste con `POST /v1/deliveries`. `console` es uno que la tienda despachó desde la consola de comerciante de Listo, algo que una tienda solo puede hacer en el nivel de acceso `full`. `whatsapp` es uno que un cliente pidió a la tienda en un chat, y que la tienda luego aceptó; ningún operador lo escribió en ningún lado.\n\nSiempre está presente, nunca es null, y queda fijo durante toda la vida del envío. Un pedido de consola trae un `external_id` null, pero lee este campo en lugar de ese null: la referencia faltante es una consecuencia de la vía, no una forma de identificarla.\n","example":"api","isRequired":true,"uniqueKey":"oneOf.1.data.origin","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"El código de pedido que citan el repartidor y nuestro soporte. Es único por\ntienda, no a nivel global, así que nunca identifiques un pedido solo por él.\n","example":"LS-2048","isRequired":true,"uniqueKey":"oneOf.1.data.code","typeLabel":"string"},"status":{"type":"string","enum":["awaiting_payment","awaiting_location","scheduled","dispatching","courier_assigned","picking_up","en_route","returning","delivered","returned","canceled","no_courier"],"description":"`delivered`, `returned` y `canceled` son terminales. `no_courier` es un\ncallejón sin salida que puedes reintentar o cancelar. Un envío `returned` es este\nmismo objeto de principio a fin; no hay un segundo envío para el tramo de\nregreso.\n\n`returning`: la entrega falló y el repartidor está llevando el\npedido de regreso a la tienda; termina en `returned`. NO es terminal,\ny es donde un envío fallido ahora pasa los minutos entre el momento en que el\nrepartidor se rinde en la puerta del cliente y el pedido llega de regreso. `returned` significa que el pedido ya regresó. Trata `returning`\ncomo un envío vivo: el repartidor sigue en movimiento y los eventos\n`delivery.courier_location` siguen llegando para él.\n\nEl cargo de regreso se registra cuando el envío entra en `returning`,\nno cuando llega a `returned`, así que `charges` ya está completo en\nel evento `returning`.\n\n`awaiting_location`: un pedido que la tienda tomó por la consola de Listo\no por su asistente de WhatsApp, retenido en espera de la ubicación de entrega. Todavía no\nse pide un repartidor. El cliente confirma la ubicación con un\nenlace de mapa o compartiéndola en el chat de WhatsApp, o la tienda\nla confirma desde su consola. Luego el envío pasa a\n`scheduled` o `dispatching`; a `no_courier` cuando no se puede pedir un repartidor\npara él (la ubicación está fuera de la zona donde entrega la tienda, o la tienda misma no puede pedir un repartidor\nen este momento); o a `canceled` si el pedido se cancela o la tienda\nlo cambia a recolección en el mostrador. Un envío que creas\npor esta API nunca pasa por ese estado.\n","isRequired":true,"uniqueKey":"oneOf.1.data.status","typeLabel":"enum\u003cstring>"},"store_id":{"type":"string","description":"El id `st_` de la tienda de donde recoge el repartidor.","isRequired":true,"uniqueKey":"oneOf.1.data.store_id","typeLabel":"string"},"test":{"type":"boolean","description":"Si este pedido vive en el sandbox. Se deriva de la tienda, así que no hay un campo que fijar: una llave de prueba solo puede llegar a tiendas de prueba.\n","isRequired":true,"uniqueKey":"oneOf.1.data.test","typeLabel":"boolean"},"payment":{"type":"object","description":"Cómo paga el cliente y en qué estado va el pago.","properties":{"method":{"type":"string","enum":["prepaid","cash","card"],"isRequired":true,"uniqueKey":"oneOf.1.data.payment.method","typeLabel":"enum\u003cstring>"},"status":{"type":"string","enum":["unpaid","awaiting_payment","paid","partially_refunded","refunded"],"isRequired":true,"uniqueKey":"oneOf.1.data.payment.status","typeLabel":"enum\u003cstring>"},"url":{"oneOf":[{"type":"string","format":"uri","description":"El enlace de pago, con marca propia, para un pedido con tarjeta que todavía espera\npago. Listo se lo envía a tu cliente por sí mismo, por WhatsApp\ny por SMS cuando el WhatsApp no le llega, así que puedes mostrarlo o guardarlo pero no necesitas enviarlo. Es null en el momento en que el pedido se paga o se cancela, porque entonces el enlace ya está muerto.\n","isRequired":true,"uniqueKey":"oneOf.1.data.payment.url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"El enlace de pago, con marca propia, para un pedido con tarjeta que todavía espera\npago. Listo se lo envía a tu cliente por sí mismo, por WhatsApp\ny por SMS cuando el WhatsApp no le llega, así que puedes mostrarlo o guardarlo pero no necesitas enviarlo. Es null en el momento en que el pedido se paga o se cancela, porque entonces el enlace ya está muerto.\n","isRequired":true,"uniqueKey":"oneOf.1.data.payment.url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.payment.url","typeLabel":"string\u003curi> | null"},"cash_to_collect_cents":{"oneOf":[{"type":"integer","description":"Lo que el repartidor cobra en la puerta: el valor de la mercancía más la parte de la tarifa que le toca al cliente. Es null, no cero, en cualquier pedido que no sea en efectivo. Cero es un valor real en un pedido en efectivo cuyo total en la puerta es cero (un pedido de valor `0` que cubres por completo); un pedido así se despacha sin cobro que hacer.\n","isRequired":true,"uniqueKey":"oneOf.1.data.payment.cash_to_collect_cents.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Lo que el repartidor cobra en la puerta: el valor de la mercancía más la parte de la tarifa que le toca al cliente. Es null, no cero, en cualquier pedido que no sea en efectivo. Cero es un valor real en un pedido en efectivo cuyo total en la puerta es cero (un pedido de valor `0` que cubres por completo); un pedido así se despacha sin cobro que hacer.\n","isRequired":true,"uniqueKey":"oneOf.1.data.payment.cash_to_collect_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.payment.cash_to_collect_cents","typeLabel":"integer | null"},"paid_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.payment.paid_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.payment.paid_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.payment.paid_at","typeLabel":"string\u003cdate-time> | null"}},"required":["method","status","url","cash_to_collect_cents","paid_at"],"isRequired":true,"uniqueKey":"oneOf.1.data.payment","typeLabel":"object"},"order_value_cents":{"oneOf":[{"type":"integer","description":"El valor de la mercancía que enviaste, sin cambios.","isRequired":true,"uniqueKey":"oneOf.1.data.order_value_cents.oneOf.0","typeLabel":"integer"},{"type":"null","description":"El valor de la mercancía que enviaste, sin cambios.","isRequired":true,"uniqueKey":"oneOf.1.data.order_value_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.order_value_cents","typeLabel":"integer | null"},"fee_cents":{"type":"integer","description":"La tarifa total de envío.","isRequired":true,"uniqueKey":"oneOf.1.data.fee_cents","typeLabel":"integer"},"business_fee_cents":{"type":"integer","description":"La parte de `fee_cents` que se te cobra a ti.","isRequired":true,"uniqueKey":"oneOf.1.data.business_fee_cents","typeLabel":"integer"},"customer_fee_cents":{"type":"integer","description":"La parte de `fee_cents` que se cobra al cliente. Siempre suma, junto con\n`business_fee_cents`, el total de `fee_cents`.\n","isRequired":true,"uniqueKey":"oneOf.1.data.customer_fee_cents","typeLabel":"integer"},"tip_cents":{"type":"integer","description":"La propina al repartidor que enviaste en este envío, que se paga al repartidor y se\npasa tal cual, al costo, sin margen. Deliberadamente FUERA de\n`fee_cents`, que es la tarifa de envío a la que suman `business_fee_cents` y\n`customer_fee_cents`. Es 0 cuando no enviaste ninguna, y nunca es null.\n","isRequired":true,"uniqueKey":"oneOf.1.data.tip_cents","typeLabel":"integer"},"currency":{"type":"string","enum":["MXN"],"isRequired":true,"uniqueKey":"oneOf.1.data.currency","typeLabel":"enum\u003cstring>"},"quote_id":{"oneOf":[{"type":"string","description":"La cotización `qt_` que vinculó este pedido, para que puedas ligar el precio que te\ncotizaron con el pedido que lo gastó. Es null cuando el pedido se cotizó en línea.\n","isRequired":true,"uniqueKey":"oneOf.1.data.quote_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"La cotización `qt_` que vinculó este pedido, para que puedas ligar el precio que te\ncotizaron con el pedido que lo gastó. Es null cuando el pedido se cotizó en línea.\n","isRequired":true,"uniqueKey":"oneOf.1.data.quote_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.quote_id","typeLabel":"string | null"},"pickup":{"type":"object","description":"Dónde recoge el repartidor, tomado como instantánea al crear, para que un pedido histórico siga reportando a dónde fue el repartidor de verdad aunque la tienda cambie de nombre o de lugar.\n","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.pickup.name","typeLabel":"string"},"street":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.pickup.street","typeLabel":"string"},"lat":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.1.data.pickup.lat.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"oneOf.1.data.pickup.lat.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.pickup.lat","typeLabel":"number\u003cdouble> | null"},"lng":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.1.data.pickup.lng.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"oneOf.1.data.pickup.lng.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.pickup.lng","typeLabel":"number\u003cdouble> | null"},"notes":{"oneOf":[{"type":"string","description":"Las instrucciones permanentes de recolección de la tienda, no un valor por pedido.","isRequired":true,"uniqueKey":"oneOf.1.data.pickup.notes.oneOf.0","typeLabel":"string"},{"type":"null","description":"Las instrucciones permanentes de recolección de la tienda, no un valor por pedido.","isRequired":true,"uniqueKey":"oneOf.1.data.pickup.notes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.pickup.notes","typeLabel":"string | null"}},"required":["name","street","lat","lng","notes"],"isRequired":true,"uniqueKey":"oneOf.1.data.pickup","typeLabel":"object"},"dropoff":{"type":"object","description":"A dónde entrega el repartidor, devuelto tal como lo enviaste.","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.name","typeLabel":"string"},"phone":{"type":"string","description":"E.164, normalizado al recibirlo.","example":"+528112345678","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.phone","typeLabel":"string"},"street":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.street","typeLabel":"string"},"apt_unit":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.apt_unit.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.apt_unit.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.apt_unit","typeLabel":"string | null"},"lat":{"oneOf":[{"type":"number","format":"double","description":"Null cuando la dirección nunca se geocodificó y el texto se juzgó en su lugar. Nunca un cero inventado.\n","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.lat.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","description":"Null cuando la dirección nunca se geocodificó y el texto se juzgó en su lugar. Nunca un cero inventado.\n","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.lat.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.lat","typeLabel":"number\u003cdouble> | null"},"lng":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.lng.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.lng.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.lng","typeLabel":"number\u003cdouble> | null"},"notes":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.notes.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.notes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.notes","typeLabel":"string | null"},"handoff":{"type":"string","enum":["meet_at_door","leave_at_door","meet_outside"],"isRequired":true,"uniqueKey":"oneOf.1.data.dropoff.handoff","typeLabel":"enum\u003cstring>"}},"required":["name","phone","street","apt_unit","lat","lng","notes","handoff"],"isRequired":true,"uniqueKey":"oneOf.1.data.dropoff","typeLabel":"object"},"manifest":{"oneOf":[{"type":"object","description":"La lista descriptiva de artículos que enviaste, para el repartidor. El dinero nunca\nsale de ella, con una excepción: un artículo de tamaño `xlarge` hace que el viaje sea en auto. Es null cuando no enviaste ninguna.\n","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.manifest.oneOf.0.\\items.items.[INDEX].name","typeLabel":"string"},"quantity":{"type":"integer","isRequired":true,"uniqueKey":"oneOf.1.data.manifest.oneOf.0.\\items.items.[INDEX].quantity","typeLabel":"integer"},"size":{"type":"string","enum":["small","medium","large","xlarge"],"description":"Cómo se envió el artículo. `small` cuando no enviaste ninguno, y en todos los artículos creados antes de que existieran los tamaños, que es como se enviaron esos artículos.\n","isRequired":true,"uniqueKey":"oneOf.1.data.manifest.oneOf.0.\\items.items.[INDEX].size","typeLabel":"enum\u003cstring>"}},"required":["name","quantity","size"],"uniqueKey":"oneOf.1.data.manifest.oneOf.0.\\items.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.1.data.manifest.oneOf.0.\\items","typeLabel":"object[]"}},"required":["items"],"isRequired":true,"uniqueKey":"oneOf.1.data.manifest.oneOf.0","typeLabel":"object"},{"type":"null","description":"La lista descriptiva de artículos que enviaste, para el repartidor. El dinero nunca\nsale de ella, con una excepción: un artículo de tamaño `xlarge` hace que el viaje sea en auto. Es null cuando no enviaste ninguna.\n","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"quantity":{"type":"integer"},"size":{"type":"string","enum":["small","medium","large","xlarge"],"description":"Cómo se envió el artículo. `small` cuando no enviaste ninguno, y en todos los artículos creados antes de que existieran los tamaños, que es como se enviaron esos artículos.\n"}},"required":["name","quantity","size"]}}},"required":["items"],"isRequired":true,"uniqueKey":"oneOf.1.data.manifest.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.manifest","typeLabel":"object | null"},"vehicle":{"type":"string","enum":["moto","car"],"description":"Cómo se cotizó y despachó el viaje: `car` cuando pediste uno o cuando un artículo tenía tamaño `xlarge`, `moto` en los demás casos. El recargo de un auto va dentro de `fee_cents`. Siempre está presente, nunca es null, y queda fijo durante toda la vida del envío.\n\nNo es el vehículo que llegó. Ese es `courier.vehicle_type`, que puede ser un auto en un viaje `moto` sin que la tarifa cambie.\n","example":"moto","isRequired":true,"uniqueKey":"oneOf.1.data.vehicle","typeLabel":"enum\u003cstring>"},"courier":{"oneOf":[{"type":"object","description":"Null hasta que se asigna un repartidor, y después CONGELADO: un envío terminal sigue reportando quién lo llevó.\n","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.name","typeLabel":"string"},"vehicle":{"oneOf":[{"type":"string","description":"En qué viaja el repartidor, en inglés sin importar el idioma de la solicitud (\"Motorcycle\", \"Bicycle\"). Se deriva de `vehicle_type`, así que es null exactamente cuando él lo es: muéstralo, y decide con `vehicle_type` en su lugar.\n","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.vehicle.oneOf.0","typeLabel":"string"},{"type":"null","description":"En qué viaja el repartidor, en inglés sin importar el idioma de la solicitud (\"Motorcycle\", \"Bicycle\"). Se deriva de `vehicle_type`, así que es null exactamente cuando él lo es: muéstralo, y decide con `vehicle_type` en su lugar.\n","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.vehicle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.vehicle","typeLabel":"string | null"},"vehicle_type":{"oneOf":[{"type":"string","description":"El tipo legible por máquina: `bicycle`, `car`, `van`, `truck`,\n`scooter`, `motorcycle` o `walker`. Null hasta que se asigna un vehículo al repartidor. Trata un valor que no aparece en la lista como desconocido y no como error: esta lista crece.\n","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.vehicle_type.oneOf.0","typeLabel":"string"},{"type":"null","description":"El tipo legible por máquina: `bicycle`, `car`, `van`, `truck`,\n`scooter`, `motorcycle` o `walker`. Null hasta que se asigna un vehículo al repartidor. Trata un valor que no aparece en la lista como desconocido y no como error: esta lista crece.\n","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.vehicle_type.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.vehicle_type","typeLabel":"string | null"},"plate":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.plate.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.plate.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.plate","typeLabel":"string | null"},"phone":{"oneOf":[{"type":"object","description":"Un número enmascarado y el PIN de IVR, nunca un número personal. Marca\n`masked` e ingresa `pin` cuando el sistema lo pida. Null cuando no se ha\nasignado ningún número a este repartidor.\n","properties":{"masked":{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.phone.oneOf.0.masked","typeLabel":"string"},"pin":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.phone.oneOf.0.pin.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.phone.oneOf.0.pin.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.phone.oneOf.0.pin","typeLabel":"string | null"}},"required":["masked","pin"],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.phone.oneOf.0","typeLabel":"object"},{"type":"null","description":"Un número enmascarado y el PIN de IVR, nunca un número personal. Marca\n`masked` e ingresa `pin` cuando el sistema lo pida. Null cuando no se ha\nasignado ningún número a este repartidor.\n","properties":{"masked":{"type":"string"},"pin":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["masked","pin"],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.phone.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.phone","typeLabel":"object | null"},"location":{"oneOf":[{"type":"object","description":"La posición en vivo, presente solo mientras el repartidor está realmente en\nmovimiento y solo cuando ya hay una señal real de ubicación.\n","properties":{"lat":{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.location.oneOf.0.lat","typeLabel":"number\u003cdouble>"},"lng":{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.location.oneOf.0.lng","typeLabel":"number\u003cdouble>"},"updated_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.location.oneOf.0.updated_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.location.oneOf.0.updated_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.location.oneOf.0.updated_at","typeLabel":"string\u003cdate-time> | null"}},"required":["lat","lng","updated_at"],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.location.oneOf.0","typeLabel":"object"},{"type":"null","description":"La posición en vivo, presente solo mientras el repartidor está realmente en\nmovimiento y solo cuando ya hay una señal real de ubicación.\n","properties":{"lat":{"type":"number","format":"double"},"lng":{"type":"number","format":"double"},"updated_at":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]}},"required":["lat","lng","updated_at"],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.location.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.location","typeLabel":"object | null"},"imminent":{"type":"boolean","description":"El repartidor está a un minuto aproximadamente. Siempre es false una vez que termina el viaje.","isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0.imminent","typeLabel":"boolean"}},"required":["name","vehicle","vehicle_type","plate","phone","location","imminent"],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.0","typeLabel":"object"},{"type":"null","description":"Null hasta que se asigna un repartidor, y después CONGELADO: un envío terminal sigue reportando quién lo llevó.\n","properties":{"name":{"type":"string"},"vehicle":{"oneOf":[{"type":"string","description":"En qué viaja el repartidor, en inglés sin importar el idioma de la solicitud (\"Motorcycle\", \"Bicycle\"). Se deriva de `vehicle_type`, así que es null exactamente cuando él lo es: muéstralo, y decide con `vehicle_type` en su lugar.\n"},{"type":"null","description":"En qué viaja el repartidor, en inglés sin importar el idioma de la solicitud (\"Motorcycle\", \"Bicycle\"). Se deriva de `vehicle_type`, así que es null exactamente cuando él lo es: muéstralo, y decide con `vehicle_type` en su lugar.\n"}]},"vehicle_type":{"oneOf":[{"type":"string","description":"El tipo legible por máquina: `bicycle`, `car`, `van`, `truck`,\n`scooter`, `motorcycle` o `walker`. Null hasta que se asigna un vehículo al repartidor. Trata un valor que no aparece en la lista como desconocido y no como error: esta lista crece.\n"},{"type":"null","description":"El tipo legible por máquina: `bicycle`, `car`, `van`, `truck`,\n`scooter`, `motorcycle` o `walker`. Null hasta que se asigna un vehículo al repartidor. Trata un valor que no aparece en la lista como desconocido y no como error: esta lista crece.\n"}]},"plate":{"oneOf":[{"type":"string"},{"type":"null"}]},"phone":{"oneOf":[{"type":"object","description":"Un número enmascarado y el PIN de IVR, nunca un número personal. Marca\n`masked` e ingresa `pin` cuando el sistema lo pida. Null cuando no se ha\nasignado ningún número a este repartidor.\n","properties":{"masked":{"type":"string"},"pin":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["masked","pin"]},{"type":"null","description":"Un número enmascarado y el PIN de IVR, nunca un número personal. Marca\n`masked` e ingresa `pin` cuando el sistema lo pida. Null cuando no se ha\nasignado ningún número a este repartidor.\n","properties":{"masked":{"type":"string"},"pin":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["masked","pin"]}]},"location":{"oneOf":[{"type":"object","description":"La posición en vivo, presente solo mientras el repartidor está realmente en\nmovimiento y solo cuando ya hay una señal real de ubicación.\n","properties":{"lat":{"type":"number","format":"double"},"lng":{"type":"number","format":"double"},"updated_at":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]}},"required":["lat","lng","updated_at"]},{"type":"null","description":"La posición en vivo, presente solo mientras el repartidor está realmente en\nmovimiento y solo cuando ya hay una señal real de ubicación.\n","properties":{"lat":{"type":"number","format":"double"},"lng":{"type":"number","format":"double"},"updated_at":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]}},"required":["lat","lng","updated_at"]}]},"imminent":{"type":"boolean","description":"El repartidor está a un minuto aproximadamente. Siempre es false una vez que termina el viaje."}},"required":["name","vehicle","vehicle_type","plate","phone","location","imminent"],"isRequired":true,"uniqueKey":"oneOf.1.data.courier.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.courier","typeLabel":"object | null"},"pickup_eta_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo se espera que el repartidor llegue a la tienda. Es una hora absoluta, así que calcula tu propia cuenta regresiva; una cuenta regresiva calculada aquí ya está desactualizada cuando la lees.\n","isRequired":true,"uniqueKey":"oneOf.1.data.pickup_eta_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo se espera que el repartidor llegue a la tienda. Es una hora absoluta, así que calcula tu propia cuenta regresiva; una cuenta regresiva calculada aquí ya está desactualizada cuando la lees.\n","isRequired":true,"uniqueKey":"oneOf.1.data.pickup_eta_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.pickup_eta_at","typeLabel":"string\u003cdate-time> | null"},"dropoff_eta_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo se espera que el repartidor llegue con el cliente. Es null hasta que hay una estimación, y vuelve a ser null cuando la entrega fallida ya ocurrió (`returning`, `returned`): el repartidor entonces regresa el pedido a la tienda, no queda una llegada al cliente que describir, y aquí nunca se publica la hora en que vuelve a la tienda.\n","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff_eta_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo se espera que el repartidor llegue con el cliente. Es null hasta que hay una estimación, y vuelve a ser null cuando la entrega fallida ya ocurrió (`returning`, `returned`): el repartidor entonces regresa el pedido a la tienda, no queda una llegada al cliente que describir, y aquí nunca se publica la hora en que vuelve a la tienda.\n","isRequired":true,"uniqueKey":"oneOf.1.data.dropoff_eta_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.dropoff_eta_at","typeLabel":"string\u003cdate-time> | null"},"tracking_url":{"oneOf":[{"type":"string","format":"uri","description":"La página de seguimiento en vivo, con marca propia, para el cliente: el mapa, el\nrepartidor, el código de entrega y lo que se cobra en la puerta. Es null cuando no hay\npágina a la que apuntar, así que nunca reenvías un enlace muerto.\n\nHay página desde el momento en que el pedido se despacha, incluida\ntoda la ventana antes de que se asigne un repartidor, y durante 48 horas\ndespués de que el pedido se entrega, se cancela o regresa. Es null mientras\nun pedido sigue retenido esperando pago o esperando un pin de punto de entrega confirmado, y vuelve a ser null cuando pasan esas 48 horas.\n","example":"https://app.listo.delivery/t/abc123","isRequired":true,"uniqueKey":"oneOf.1.data.tracking_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"La página de seguimiento en vivo, con marca propia, para el cliente: el mapa, el\nrepartidor, el código de entrega y lo que se cobra en la puerta. Es null cuando no hay\npágina a la que apuntar, así que nunca reenvías un enlace muerto.\n\nHay página desde el momento en que el pedido se despacha, incluida\ntoda la ventana antes de que se asigne un repartidor, y durante 48 horas\ndespués de que el pedido se entrega, se cancela o regresa. Es null mientras\nun pedido sigue retenido esperando pago o esperando un pin de punto de entrega confirmado, y vuelve a ser null cuando pasan esas 48 horas.\n","example":"https://app.listo.delivery/t/abc123","isRequired":true,"uniqueKey":"oneOf.1.data.tracking_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.tracking_url","typeLabel":"string\u003curi> | null"},"verification":{"oneOf":[{"type":"object","description":"Está presente solo cuando el pedido trae un PIN de entrega: cuando lo pediste (`verification.dropoff_pincode` en la creación), o cuando Listo exige un PIN en cada envío de la cuenta de esta tienda, en cuyo caso está presente aunque no lo pediste. `pincode` es null hasta que el pedido se despacha de verdad, que es cuando se genera el código.\n","properties":{"pincode":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.verification.oneOf.0.pincode.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.1.data.verification.oneOf.0.pincode.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.verification.oneOf.0.pincode","typeLabel":"string | null"}},"required":["pincode"],"isRequired":true,"uniqueKey":"oneOf.1.data.verification.oneOf.0","typeLabel":"object"},{"type":"null","description":"Está presente solo cuando el pedido trae un PIN de entrega: cuando lo pediste (`verification.dropoff_pincode` en la creación), o cuando Listo exige un PIN en cada envío de la cuenta de esta tienda, en cuyo caso está presente aunque no lo pediste. `pincode` es null hasta que el pedido se despacha de verdad, que es cuando se genera el código.\n","properties":{"pincode":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["pincode"],"isRequired":true,"uniqueKey":"oneOf.1.data.verification.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.verification","typeLabel":"object | null"},"return_verification":{"type":"object","description":"El código de devolución. Cuando un pedido no se puede entregar y el repartidor lo regresa a la tienda, el repartidor debe recibir este código en la tienda para entregar el pedido; sin él la devolución no se puede completar. `pincode` es una cadena de 4 dígitos mientras el envío está en `returning`, y null en cualquier otro estado (antes de la devolución, y una vez que está en `returned`). El objeto siempre está presente, así que este campo nunca necesita una verificación de presencia. Llega en `delivery.status_changed` (el paso a `returning`) y en `delivery.updated`, que traen el objeto completo. Un nuevo intento (un reintento) recibe su propio código. Muéstraselo a la tienda, y nunca al cliente.\n","properties":{"pincode":{"oneOf":[{"type":"string","example":"4821","isRequired":true,"uniqueKey":"oneOf.1.data.return_verification.pincode.oneOf.0","typeLabel":"string"},{"type":"null","example":"4821","isRequired":true,"uniqueKey":"oneOf.1.data.return_verification.pincode.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.return_verification.pincode","typeLabel":"string | null"}},"required":["pincode"],"isRequired":true,"uniqueKey":"oneOf.1.data.return_verification","typeLabel":"object"},"proof":{"oneOf":[{"type":"object","description":"Prueba de entrega. Null a menos que tengamos alguna, y cada campo es null cuando falta esa pieza; una foto sin firma es normal. Las URL son enlaces firmados propios de Listo hacia la copia guardada y son válidas durante 24 horas desde la respuesta (o el webhook) que las trajo: vuelve a pedir `GET /v1/deliveries/{id}` para obtener un enlace nuevo, o guarda una copia. **Una URL es null hasta que Listo tiene su propia copia de la imagen** (unos segundos después de que el repartidor la toma); la llegada de la copia se anuncia con un webhook `delivery.updated` que trae el enlace. Puede venir de un intento de entrega que falló en la puerta, así que por sí sola no prueba que el pedido se entregó: `proofs.dropoff.delivered` dice cuál. Prefiere `proofs`, que separa cada momento del viaje.\n","properties":{"picture_url":{"oneOf":[{"type":"string","format":"uri","isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0.picture_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0.picture_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0.picture_url","typeLabel":"string\u003curi> | null"},"signature_image_url":{"oneOf":[{"type":"string","format":"uri","isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0.signature_image_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0.signature_image_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0.signature_image_url","typeLabel":"string\u003curi> | null"},"signature_name":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0.signature_name.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0.signature_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0.signature_name","typeLabel":"string | null"},"captured_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0.captured_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0.captured_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0.captured_at","typeLabel":"string\u003cdate-time> | null"}},"required":["picture_url","signature_image_url","signature_name","captured_at"],"isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.0","typeLabel":"object"},{"type":"null","description":"Prueba de entrega. Null a menos que tengamos alguna, y cada campo es null cuando falta esa pieza; una foto sin firma es normal. Las URL son enlaces firmados propios de Listo hacia la copia guardada y son válidas durante 24 horas desde la respuesta (o el webhook) que las trajo: vuelve a pedir `GET /v1/deliveries/{id}` para obtener un enlace nuevo, o guarda una copia. **Una URL es null hasta que Listo tiene su propia copia de la imagen** (unos segundos después de que el repartidor la toma); la llegada de la copia se anuncia con un webhook `delivery.updated` que trae el enlace. Puede venir de un intento de entrega que falló en la puerta, así que por sí sola no prueba que el pedido se entregó: `proofs.dropoff.delivered` dice cuál. Prefiere `proofs`, que separa cada momento del viaje.\n","properties":{"picture_url":{"oneOf":[{"type":"string","format":"uri"},{"type":"null","format":"uri"}]},"signature_image_url":{"oneOf":[{"type":"string","format":"uri"},{"type":"null","format":"uri"}]},"signature_name":{"oneOf":[{"type":"string"},{"type":"null"}]},"captured_at":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null","format":"date-time"}]}},"required":["picture_url","signature_image_url","signature_name","captured_at"],"isRequired":true,"uniqueKey":"oneOf.1.data.proof.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proof","typeLabel":"object | null"},"proofs":{"type":"object","description":"La evidencia que dejó el viaje, una entrada por momento. Cada momento es\nnull hasta que sucede (todavía no se capturó nada para él), así que\neste objeto siempre está presente con sus tres llaves. Un enlace de foto o de firma es el\nenlace firmado de Listo al archivo guardado, y **es null hasta que Listo tiene ese archivo** (unos segundos después de que el repartidor toma la foto): el resto del momento, quién firmó, la hora y la distancia, está desde el principio, y cuando el archivo llega un webhook `delivery.updated` trae el enlace. **Cada enlace es válido por 24 horas** desde la respuesta (o el webhook) que lo trajo: es un enlace firmado de vida corta, nunca uno permanente. Un socio que necesite la imagen después vuelve a pedir `GET /v1/deliveries/{id}` para obtener un enlace nuevo, o guarda una copia.\n","properties":{"pickup":{"oneOf":[{"type":"object","description":"El repartidor que recoge el pedido en la tienda. Es null hasta que existe la\nfoto de recolección.\n","properties":{"photo_url":{"oneOf":[{"type":"string","format":"uri","description":"Foto del pedido en la tienda.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.pickup.oneOf.0.photo_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Foto del pedido en la tienda.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.pickup.oneOf.0.photo_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.pickup.oneOf.0.photo_url","typeLabel":"string\u003curi> | null"},"captured_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo vio Listo por primera vez esta foto.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.pickup.oneOf.0.captured_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo vio Listo por primera vez esta foto.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.pickup.oneOf.0.captured_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.pickup.oneOf.0.captured_at","typeLabel":"string\u003cdate-time> | null"}},"required":["photo_url","captured_at"],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.pickup.oneOf.0","typeLabel":"object"},{"type":"null","description":"El repartidor que recoge el pedido en la tienda. Es null hasta que existe la\nfoto de recolección.\n","properties":{"photo_url":{"oneOf":[{"type":"string","format":"uri","description":"Foto del pedido en la tienda."},{"type":"null","format":"uri","description":"Foto del pedido en la tienda."}]},"captured_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo vio Listo por primera vez esta foto."},{"type":"null","format":"date-time","description":"Cuándo vio Listo por primera vez esta foto."}]}},"required":["photo_url","captured_at"],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.pickup.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.pickup","typeLabel":"object | null"},"dropoff":{"oneOf":[{"type":"object","description":"El repartidor en la puerta del cliente. Está presente una vez que el pedido se entrega, o una vez que el intento dejó una foto, una firma o un\nfirmante ahí, **incluido un intento que falló**: lee\n`delivered`, no la presencia de una foto, para saber si el pedido se entregó.\n","properties":{"photo_url":{"oneOf":[{"type":"string","format":"uri","description":"Foto tomada en la puerta.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.photo_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Foto tomada en la puerta.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.photo_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.photo_url","typeLabel":"string\u003curi> | null"},"signature_url":{"oneOf":[{"type":"string","format":"uri","description":"Imagen de la firma del destinatario.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.signature_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Imagen de la firma del destinatario.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.signature_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.signature_url","typeLabel":"string\u003curi> | null"},"signer_name":{"oneOf":[{"type":"string","description":"El nombre que escribió la persona que firmó.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.signer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"El nombre que escribió la persona que firmó.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.signer_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.signer_name","typeLabel":"string | null"},"captured_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.captured_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.captured_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.captured_at","typeLabel":"string\u003cdate-time> | null"},"delivered":{"type":"boolean","description":"True solo cuando el envío fue entregado. False significa que la\nevidencia viene de un intento que no entregó el pedido.\n","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0.delivered","typeLabel":"boolean"}},"required":["photo_url","signature_url","signer_name","captured_at","delivered"],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.0","typeLabel":"object"},{"type":"null","description":"El repartidor en la puerta del cliente. Está presente una vez que el pedido se entrega, o una vez que el intento dejó una foto, una firma o un\nfirmante ahí, **incluido un intento que falló**: lee\n`delivered`, no la presencia de una foto, para saber si el pedido se entregó.\n","properties":{"photo_url":{"oneOf":[{"type":"string","format":"uri","description":"Foto tomada en la puerta."},{"type":"null","format":"uri","description":"Foto tomada en la puerta."}]},"signature_url":{"oneOf":[{"type":"string","format":"uri","description":"Imagen de la firma del destinatario."},{"type":"null","format":"uri","description":"Imagen de la firma del destinatario."}]},"signer_name":{"oneOf":[{"type":"string","description":"El nombre que escribió la persona que firmó."},{"type":"null","description":"El nombre que escribió la persona que firmó."}]},"captured_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia."},{"type":"null","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia."}]},"delivered":{"type":"boolean","description":"True solo cuando el envío fue entregado. False significa que la\nevidencia viene de un intento que no entregó el pedido.\n"}},"required":["photo_url","signature_url","signer_name","captured_at","delivered"],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.dropoff","typeLabel":"object | null"},"return":{"oneOf":[{"type":"object","description":"El repartidor que regresa el pedido a la tienda después de una entrega fallida. Es null salvo que el pedido haya regresado con evidencia.\n","properties":{"photo_url":{"oneOf":[{"type":"string","format":"uri","description":"Foto del pedido devuelto en la tienda.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.photo_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Foto del pedido devuelto en la tienda.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.photo_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.photo_url","typeLabel":"string\u003curi> | null"},"signature_url":{"oneOf":[{"type":"string","format":"uri","description":"Imagen de la firma de quien lo recibió en la tienda.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.signature_url.oneOf.0","typeLabel":"string\u003curi>"},{"type":"null","format":"uri","description":"Imagen de la firma de quien lo recibió en la tienda.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.signature_url.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.signature_url","typeLabel":"string\u003curi> | null"},"signer_name":{"oneOf":[{"type":"string","description":"El nombre que escribió la persona que firmó.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.signer_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"El nombre que escribió la persona que firmó.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.signer_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.signer_name","typeLabel":"string | null"},"captured_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.captured_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia.","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.captured_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.captured_at","typeLabel":"string\u003cdate-time> | null"},"meters_from_store":{"oneOf":[{"type":"integer","description":"Qué tan lejos estaba el repartidor de la tienda cuando se capturó esto, en metros enteros en línea recta. Null cuando alguna de las dos posiciones es desconocida. Es evidencia para que una persona la lea, no un veredicto.\n","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.meters_from_store.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Qué tan lejos estaba el repartidor de la tienda cuando se capturó esto, en metros enteros en línea recta. Null cuando alguna de las dos posiciones es desconocida. Es evidencia para que una persona la lea, no un veredicto.\n","isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.meters_from_store.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0.meters_from_store","typeLabel":"integer | null"}},"required":["photo_url","signature_url","signer_name","captured_at","meters_from_store"],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.0","typeLabel":"object"},{"type":"null","description":"El repartidor que regresa el pedido a la tienda después de una entrega fallida. Es null salvo que el pedido haya regresado con evidencia.\n","properties":{"photo_url":{"oneOf":[{"type":"string","format":"uri","description":"Foto del pedido devuelto en la tienda."},{"type":"null","format":"uri","description":"Foto del pedido devuelto en la tienda."}]},"signature_url":{"oneOf":[{"type":"string","format":"uri","description":"Imagen de la firma de quien lo recibió en la tienda."},{"type":"null","format":"uri","description":"Imagen de la firma de quien lo recibió en la tienda."}]},"signer_name":{"oneOf":[{"type":"string","description":"El nombre que escribió la persona que firmó."},{"type":"null","description":"El nombre que escribió la persona que firmó."}]},"captured_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia."},{"type":"null","format":"date-time","description":"Cuándo vio Listo por primera vez esta evidencia."}]},"meters_from_store":{"oneOf":[{"type":"integer","description":"Qué tan lejos estaba el repartidor de la tienda cuando se capturó esto, en metros enteros en línea recta. Null cuando alguna de las dos posiciones es desconocida. Es evidencia para que una persona la lea, no un veredicto.\n"},{"type":"null","description":"Qué tan lejos estaba el repartidor de la tienda cuando se capturó esto, en metros enteros en línea recta. Null cuando alguna de las dos posiciones es desconocida. Es evidencia para que una persona la lea, no un veredicto.\n"}]}},"required":["photo_url","signature_url","signer_name","captured_at","meters_from_store"],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs.return","typeLabel":"object | null"}},"required":["pickup","dropoff","return"],"isRequired":true,"uniqueKey":"oneOf.1.data.proofs","typeLabel":"object"},"cancellation":{"oneOf":[{"type":"object","description":"Quién canceló el pedido, y por qué. Es null en un pedido que no se canceló.","properties":{"party":{"type":"string","enum":["partner","courier","platform"],"description":"`partner` eres tú. `courier` es la persona que lo lleva. `platform` somos nosotros, y también cubre una cancelación reportada a nosotros en nombre del cliente final: el cliente final no es un actor en esta API, así que este campo nunca nombra a una persona que no puedas correlacionar.\n","isRequired":true,"uniqueKey":"oneOf.1.data.cancellation.oneOf.0.party","typeLabel":"enum\u003cstring>"},"reason":{"oneOf":[{"type":"string","enum":["customer_canceled","store_closed","item_unavailable","wrong_address","no_longer_needed","other",null],"description":"El motivo que enviaste al cancelar. Es null cuando la atribución se derivó en lugar de darse, que es el caso de toda cancelación que tú no hiciste.\n","isRequired":true,"uniqueKey":"oneOf.1.data.cancellation.oneOf.0.reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["customer_canceled","store_closed","item_unavailable","wrong_address","no_longer_needed","other",null],"description":"El motivo que enviaste al cancelar. Es null cuando la atribución se derivó en lugar de darse, que es el caso de toda cancelación que tú no hiciste.\n","isRequired":true,"uniqueKey":"oneOf.1.data.cancellation.oneOf.0.reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.cancellation.oneOf.0.reason","typeLabel":"enum\u003cstring> | null"},"description":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.1.data.cancellation.oneOf.0.description.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.1.data.cancellation.oneOf.0.description.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.cancellation.oneOf.0.description","typeLabel":"string | null"}},"required":["party","reason","description"],"isRequired":true,"uniqueKey":"oneOf.1.data.cancellation.oneOf.0","typeLabel":"object"},{"type":"null","description":"Quién canceló el pedido, y por qué. Es null en un pedido que no se canceló.","properties":{"party":{"type":"string","enum":["partner","courier","platform"],"description":"`partner` eres tú. `courier` es la persona que lo lleva. `platform` somos nosotros, y también cubre una cancelación reportada a nosotros en nombre del cliente final: el cliente final no es un actor en esta API, así que este campo nunca nombra a una persona que no puedas correlacionar.\n"},"reason":{"oneOf":[{"type":"string","enum":["customer_canceled","store_closed","item_unavailable","wrong_address","no_longer_needed","other",null],"description":"El motivo que enviaste al cancelar. Es null cuando la atribución se derivó en lugar de darse, que es el caso de toda cancelación que tú no hiciste.\n"},{"type":"null","enum":["customer_canceled","store_closed","item_unavailable","wrong_address","no_longer_needed","other",null],"description":"El motivo que enviaste al cancelar. Es null cuando la atribución se derivó en lugar de darse, que es el caso de toda cancelación que tú no hiciste.\n"}]},"description":{"oneOf":[{"type":"string"},{"type":"null"}]}},"required":["party","reason","description"],"isRequired":true,"uniqueKey":"oneOf.1.data.cancellation.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.cancellation","typeLabel":"object | null"},"failure_reason":{"oneOf":[{"type":"string","enum":["no_couriers_available","address_unreachable","customer_unavailable","delivery_failed",null],"description":"Por qué falló un despacho, agrupado según de qué lado está el problema, para que puedas actuar en lugar de solo reintentar a ciegas.\n`no_couriers_available` es el que se puede reintentar.\n`delivery_failed` es el cajón general honesto. Es null a menos que se haya registrado una falla.\n","isRequired":true,"uniqueKey":"oneOf.1.data.failure_reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["no_couriers_available","address_unreachable","customer_unavailable","delivery_failed",null],"description":"Por qué falló un despacho, agrupado según de qué lado está el problema, para que puedas actuar en lugar de solo reintentar a ciegas.\n`no_couriers_available` es el que se puede reintentar.\n`delivery_failed` es el cajón general honesto. Es null a menos que se haya registrado una falla.\n","isRequired":true,"uniqueKey":"oneOf.1.data.failure_reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.failure_reason","typeLabel":"enum\u003cstring> | null"},"charges":{"type":"array","description":"Lo que se cobra por un viaje que se recorrió pero se desperdició: la tarifa de envío\nde cada tramo recorrido, menos tu propio margen de tienda. Vacío en\ncasi todos los envíos, y nunca null.\n\n**Este monto cambió el 2026-08-29.** Antes era lo que le costaba a Listo el\nviaje desperdiciado, así que espera valores mayores en los mismos pedidos\na partir de esa fecha. El campo en sí no cambió.\n\nSiempre está presente en un objeto de envío, así que trata un `charges`\nausente como imposible y no como \"sin cargos\". Por esa razón está en la lista\n`required` de este esquema.\n\nUn cargo puede llegar en el `delivery.status_changed` final del envío o, cuando el\ncosto se liquida después, en un `delivery.updated` posterior. No puedes suponer cuál,\nasí que lee este campo en ambos: cobrar en el momento en que un envío llega a su\nestado terminal cobra de menos en cada pedido cuyo costo llegó tarde.\n\nEl mismo movimiento aparece en `GET /v1/ledger` como una fila con signo, así que\nallí se lee negativo mientras que `amount_cents` aquí es positivo.\n","items":{"type":"object","properties":{"type":{"type":"string","enum":["cancellation_fee","return_fee"],"description":"Por qué se hizo el cargo. `cancellation_fee` es una cancelación tardía, cuando un repartidor ya estaba trabajando en el pedido. `return_fee` es un viaje de regreso después de una entrega fallida, y se cobra como UNA sola entrada que cubre los dos tramos del viaje en lugar de dos.\n","isRequired":true,"uniqueKey":"oneOf.1.data.charges.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"amount_cents":{"type":"integer","description":"Lo que te cobraron, positivo, en centavos de peso mexicano: la tarifa de envío de cada tramo que se recorrió, menos tu propio margen de tienda.\n","isRequired":true,"uniqueKey":"oneOf.1.data.charges.items.[INDEX].amount_cents","typeLabel":"integer"},"charged_at":{"type":"string","format":"date-time","description":"Cuándo se registró el cargo, que no es cuando terminó el envío.\n","isRequired":true,"uniqueKey":"oneOf.1.data.charges.items.[INDEX].charged_at","typeLabel":"string\u003cdate-time>"}},"required":["type","amount_cents","charged_at"],"uniqueKey":"oneOf.1.data.charges.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.1.data.charges","typeLabel":"object[]"},"refunds":{"type":"array","description":"Cada vez que se devolvió dinero al cliente por este pedido, del más reciente al más antiguo. Vacío en un pedido que nunca se ha reembolsado, y nunca null.\n\nSiempre presente en un objeto de envío, así que trata un `refunds` ausente como algo imposible, no como \"sin reembolsos\". Está en la lista `required` de este esquema por esa razón, igual que `charges` arriba.\n\nEs una LISTA porque los reembolsos se repiten: un reembolso parcial va seguido de otro reembolso, cada uno con su propio monto, su propio motivo y su propio resultado. Aquí aparece todo reembolso que podemos ver, sin importar quién lo hizo, y por eso la lista vale la pena para conciliar. La cuenta conectada pertenece al comercio de registro (el titular del cargo), que puede reembolsar un cargo en ella sin pasar por nosotros; esos llegan como `requested_via: external`, y una lista que mostrara solo los reembolsos que tú pediste contradiría en silencio el `payment.status` de este pedido.\n\nUn reembolso viaja en `delivery.updated`, nunca en un evento propio.\n","items":{"type":"object","properties":{"id":{"type":"string","description":"El id del reembolso, con prefijo `rfn_`.","example":"rfn_4bQ7wS2xK9mT6vN3cZ8pLdYe","isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].id","typeLabel":"string"},"amount_cents":{"oneOf":[{"type":"integer","description":"Lo que volvió, positivo, en centavos de peso mexicano. NULL Y NO CERO mientras un reembolso del saldo restante sigue en curso: no lleva monto hasta que el reembolso se confirma, y un cero diría que un reembolso no movió nada. Lee `refunded_cents` más abajo en lugar de sumar este arreglo, que es justo la razón por la que se publican los dos totales.\n","isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].amount_cents.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Lo que volvió, positivo, en centavos de peso mexicano. NULL Y NO CERO mientras un reembolso del saldo restante sigue en curso: no lleva monto hasta que el reembolso se confirma, y un cero diría que un reembolso no movió nada. Lee `refunded_cents` más abajo en lugar de sumar este arreglo, que es justo la razón por la que se publican los dos totales.\n","isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].amount_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].amount_cents","typeLabel":"integer | null"},"reason":{"oneOf":[{"type":"string","description":"El texto libre que escribió quien pidió el reembolso, o null.\nTus propias palabras cuando tú las enviaste; nunca es un enum.\n","isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].reason.oneOf.0","typeLabel":"string"},{"type":"null","description":"El texto libre que escribió quien pidió el reembolso, o null.\nTus propias palabras cuando tú las enviaste; nunca es un enum.\n","isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].reason.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].reason","typeLabel":"string | null"},"status":{"type":"string","enum":["pending","succeeded","failed"],"description":"`pending` NO ES UNA FALLA y no debe reintentarse: un reembolso de cargo directo queda retenido mientras el saldo de la cuenta está corto y se aplica cuando llegan los fondos. Pasa a `succeeded` por sí solo y lo publica como `delivery.updated`. `failed` significa que no se movió nada.\n","isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"requested_via":{"type":"string","enum":["api","console","automatic","external"],"description":"Qué vía emitió el reembolso. `api` es tu propio `POST /v1/deliveries/{id}/refunds`. `console` es el comerciante que lo presiona en la consola de Listo. `automatic` es uno que emitimos sin que nadie lo pidiera, en una cancelación o una devolución. `external` es uno hecho en el panel de pagos propio del comerciante, del que nos enteramos después.\n","isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].requested_via","typeLabel":"enum\u003cstring>"},"party":{"type":"string","enum":["business","platform"],"description":"De quién fue la decisión. `business` es el comerciante, o tú actuando por tu tienda. `platform` es Listo emitiéndolo porque el pedido terminó sin llegar al cliente.\n","isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].party","typeLabel":"enum\u003cstring>"},"created_at":{"type":"string","format":"date-time","description":"Cuándo se pidió el reembolso.","isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].created_at","typeLabel":"string\u003cdate-time>"},"succeeded_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo se confirmó que el dinero iba en camino. Es null en un reembolso pendiente o fallido.\n","isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].succeeded_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo se confirmó que el dinero iba en camino. Es null en un reembolso pendiente o fallido.\n","isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].succeeded_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.refunds.items.[INDEX].succeeded_at","typeLabel":"string\u003cdate-time> | null"}},"required":["id","amount_cents","reason","status","requested_via","party","created_at","succeeded_at"],"uniqueKey":"oneOf.1.data.refunds.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.1.data.refunds","typeLabel":"object[]"},"refunded_cents":{"type":"integer","description":"La suma de los reembolsos EXITOSOS de arriba, en centavos de peso mexicano. 0,\nnunca null, en un pedido al que nada se le haya devuelto. Un reembolso `pending` no se cuenta, porque el dinero no se ha movido y todavía puede ser rechazado.\n\nSe publica en lugar de dejártelo calcular, porque el arreglo no siempre se puede sumar bien: un reembolso del saldo restante no lleva `amount_cents` hasta que se confirma, así que sumar la lista lo cuenta como cero y hace que todo el cargo parezca todavía reembolsable. En cambio tomamos ese caso de forma pesimista, como si hubiera consumido todo el saldo restante, porque adivinar a la baja termina reembolsando dos veces a un cliente.\n","isRequired":true,"uniqueKey":"oneOf.1.data.refunded_cents","typeLabel":"integer"},"refundable_cents":{"type":"integer","description":"Lo que todavía podría devolver un reembolso adicional: lo que pagó el cliente (`order_value_cents` más `customer_fee_cents`, que ES el cargo) menos `refunded_cents`, sin bajar de cero. 0, nunca null.\n\n0 en cualquier pedido sin un pago con tarjeta cobrado detrás, sin importar su valor. El efectivo nunca tocó nuestros rieles de pago, el cliente de un pedido prepagado es tuyo y nosotros no tenemos nada de él, y un pedido que todavía espera pago nunca se cobró, así que en ninguno de estos hay algo que un reembolso pudiera devolver.\n\nEste es el techo contra el que `POST /v1/deliveries/{id}/refunds` rechaza un `amount_cents`, así que léelo antes de llamar en lugar de descubrir el límite a partir de un `refund_amount_too_large`.\n","isRequired":true,"uniqueKey":"oneOf.1.data.refundable_cents","typeLabel":"integer"},"support_reference":{"oneOf":[{"type":"string","description":"Un identificador corto que citas cuando nos escalas un pedido. Null hasta\nque el pedido llega a despacho.\n","example":"2080F","isRequired":true,"uniqueKey":"oneOf.1.data.support_reference.oneOf.0","typeLabel":"string"},{"type":"null","description":"Un identificador corto que citas cuando nos escalas un pedido. Null hasta\nque el pedido llega a despacho.\n","example":"2080F","isRequired":true,"uniqueKey":"oneOf.1.data.support_reference.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.support_reference","typeLabel":"string | null"},"pickup_ready_at":{"oneOf":[{"type":"string","format":"date-time","description":"La hora de recolección programada que pediste. Es null en un pedido de despacho inmediato.","isRequired":true,"uniqueKey":"oneOf.1.data.pickup_ready_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"La hora de recolección programada que pediste. Es null en un pedido de despacho inmediato.","isRequired":true,"uniqueKey":"oneOf.1.data.pickup_ready_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.pickup_ready_at","typeLabel":"string\u003cdate-time> | null"},"requested_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.requested_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.requested_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.requested_at","typeLabel":"string\u003cdate-time> | null"},"courier_assigned_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo se observó por primera vez a un repartidor en el intento actual. En realidad es una observación y no un reloj de asignación, porque no se nos publica ningún momento de asignación. Es null en un intento que nunca lo tuvo.\n","isRequired":true,"uniqueKey":"oneOf.1.data.courier_assigned_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo se observó por primera vez a un repartidor en el intento actual. En realidad es una observación y no un reloj de asignación, porque no se nos publica ningún momento de asignación. Es null en un intento que nunca lo tuvo.\n","isRequired":true,"uniqueKey":"oneOf.1.data.courier_assigned_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.courier_assigned_at","typeLabel":"string\u003cdate-time> | null"},"picked_up_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.picked_up_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.picked_up_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.picked_up_at","typeLabel":"string\u003cdate-time> | null"},"delivered_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.delivered_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.delivered_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.delivered_at","typeLabel":"string\u003cdate-time> | null"},"canceled_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.canceled_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.canceled_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.canceled_at","typeLabel":"string\u003cdate-time> | null"},"returned_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.returned_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.returned_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.1.data.returned_at","typeLabel":"string\u003cdate-time> | null"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.1.data.updated_at","typeLabel":"string\u003cdate-time>"}},"required":["id","external_id","origin","code","status","store_id","test","payment","order_value_cents","fee_cents","business_fee_cents","customer_fee_cents","tip_cents","currency","quote_id","pickup","dropoff","manifest","vehicle","courier","pickup_eta_at","dropoff_eta_at","tracking_url","verification","return_verification","proof","proofs","cancellation","failure_reason","support_reference","pickup_ready_at","requested_at","courier_assigned_at","picked_up_at","delivered_at","canceled_at","returned_at","created_at","updated_at","charges","refunds","refunded_cents","refundable_cents"],"isRequired":true,"uniqueKey":"oneOf.1.data","typeLabel":"object"},"test":{"type":"boolean","description":"Presente, y en true, solo en un evento de prueba que pediste con\n`POST /v1/test_webhooks`. Un evento real no trae el campo en absoluto. El `data` de un evento de prueba es una muestra cuyos ids no corresponden a nada.\n","example":true,"uniqueKey":"oneOf.1.test","typeLabel":"boolean"}},"uniqueKey":"oneOf.1","typeLabel":"object"},{"type":"object","description":"Cada evento que recibe tu endpoint de webhook, y cada evento que devuelven\nlas lecturas de depuración: uno de los seis de abajo, distinguidos por `type`.\n`data` es el objeto al que se refiere el evento, y su forma depende de\n`type`. Consulta `WebhookEventEnvelope` para los campos que todos comparten y\npara saber cómo se comporta la entrega (al menos una vez, sin orden).\n","required":["type","data","id","created_at"],"properties":{"id":{"type":"string","description":"El id del evento, con prefijo `evt_`. Deduplica por este.","example":"evt_9pQ2vX7mKdR4tYb1nZ3sLwCe","isRequired":true,"uniqueKey":"oneOf.2.id","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","description":"Cuándo se registró el evento, ISO-8601 en UTC.","example":"2026-07-28T18:41:03Z","isRequired":true,"uniqueKey":"oneOf.2.created_at","typeLabel":"string\u003cdate-time>"},"type":{"type":"string","description":"Qué evento es este.","enum":["delivery.courier_location"],"isRequired":true,"uniqueKey":"oneOf.2.type","typeLabel":"enum\u003cstring>"},"data":{"type":"object","description":"El cuerpo reducido de un evento `delivery.courier_location`. Relaciónalo con un envío que ya tengas; no es el objeto del envío.\n","properties":{"delivery_id":{"type":"string","description":"El id `dlv_` del envío que lleva el repartidor.","isRequired":true,"uniqueKey":"oneOf.2.data.delivery_id","typeLabel":"string"},"external_id":{"oneOf":[{"type":"string","description":"Tu propia referencia de ese envío, para que no tengas que guardar la nuestra.","isRequired":true,"uniqueKey":"oneOf.2.data.external_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Tu propia referencia de ese envío, para que no tengas que guardar la nuestra.","isRequired":true,"uniqueKey":"oneOf.2.data.external_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.2.data.external_id","typeLabel":"string | null"},"location":{"type":"object","properties":{"lat":{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.2.data.location.lat","typeLabel":"number\u003cdouble>"},"lng":{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.2.data.location.lng","typeLabel":"number\u003cdouble>"}},"required":["lat","lng"],"isRequired":true,"uniqueKey":"oneOf.2.data.location","typeLabel":"object"},"updated_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo se confirmó por última vez esta posición, que no es lo mismo que cuando se envió el evento.\n","isRequired":true,"uniqueKey":"oneOf.2.data.updated_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo se confirmó por última vez esta posición, que no es lo mismo que cuando se envió el evento.\n","isRequired":true,"uniqueKey":"oneOf.2.data.updated_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.2.data.updated_at","typeLabel":"string\u003cdate-time> | null"}},"required":["delivery_id","external_id","location","updated_at"],"isRequired":true,"uniqueKey":"oneOf.2.data","typeLabel":"object"},"test":{"type":"boolean","description":"Presente, y en true, solo en un evento de prueba que pediste con\n`POST /v1/test_webhooks`. Un evento real no trae el campo en absoluto. El `data` de un evento de prueba es una muestra cuyos ids no corresponden a nada.\n","example":true,"uniqueKey":"oneOf.2.test","typeLabel":"boolean"}},"uniqueKey":"oneOf.2","typeLabel":"object"},{"type":"object","description":"Cada evento que recibe tu endpoint de webhook, y cada evento que devuelven\nlas lecturas de depuración: uno de los seis de abajo, distinguidos por `type`.\n`data` es el objeto al que se refiere el evento, y su forma depende de\n`type`. Consulta `WebhookEventEnvelope` para los campos que todos comparten y\npara saber cómo se comporta la entrega (al menos una vez, sin orden).\n","required":["type","data","id","created_at"],"properties":{"id":{"type":"string","description":"El id del evento, con prefijo `evt_`. Deduplica por este.","example":"evt_9pQ2vX7mKdR4tYb1nZ3sLwCe","isRequired":true,"uniqueKey":"oneOf.3.id","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","description":"Cuándo se registró el evento, ISO-8601 en UTC.","example":"2026-07-28T18:41:03Z","isRequired":true,"uniqueKey":"oneOf.3.created_at","typeLabel":"string\u003cdate-time>"},"type":{"type":"string","description":"Qué evento es este.","enum":["withdrawal.updated"],"isRequired":true,"uniqueKey":"oneOf.3.type","typeLabel":"enum\u003cstring>"},"data":{"type":"object","description":"Una solicitud para mover dinero de tu saldo a tu cuenta bancaria.","properties":{"id":{"type":"string","description":"El id del retiro, con prefijo `wd_`.","example":"wd_2xN6bK9mR4tQ7vC1sZ8pLwYe","isRequired":true,"uniqueKey":"oneOf.3.data.id","typeLabel":"string"},"amount_cents":{"type":"integer","description":"Lo que recibe tu banco. En un retiro `same_day` la tarifa es un SEGUNDO cargo en lugar de una deducción, así que esta cifra es lo que llega en cualquiera de los dos casos, y `fee_cents` es lo que tu saldo pierde encima de ella.\n","isRequired":true,"uniqueKey":"oneOf.3.data.amount_cents","typeLabel":"integer"},"fee_cents":{"type":"integer","description":"Cuánto costó el retiro, con IVA incluido. Siempre `0` en un retiro `standard`. Siempre está presente.\n","isRequired":true,"uniqueKey":"oneOf.3.data.fee_cents","typeLabel":"integer"},"currency":{"type":"string","enum":["MXN"],"isRequired":true,"uniqueKey":"oneOf.3.data.currency","typeLabel":"enum\u003cstring>"},"kind":{"type":"string","enum":["standard","same_day"],"description":"`standard` es la vía gratuita: solo tu saldo liberado, enviado en 1 a 3 días hábiles. `same_day` cuesta `fee_cents`, puede alcanzar efectivo que todavía está retenido, y se envía el mismo día dentro de los horarios indicados en `POST /v1/withdrawals`.\n","isRequired":true,"uniqueKey":"oneOf.3.data.kind","typeLabel":"enum\u003cstring>"},"status":{"type":"string","enum":["pending","paid","failed"],"description":"`pending` hasta que una persona lo liquide. El paso a `paid` o `failed` es lo que anuncia `withdrawal.updated`.\n","isRequired":true,"uniqueKey":"oneOf.3.data.status","typeLabel":"enum\u003cstring>"},"requested_at":{"oneOf":[{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.3.data.requested_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","isRequired":true,"uniqueKey":"oneOf.3.data.requested_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.3.data.requested_at","typeLabel":"string\u003cdate-time> | null"},"due_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo se espera que se haya enviado un retiro `same_day`, sellado cuando lo solicitaste y nunca recalculado después. Es null en cada retiro `standard`: la vía gratuita promete un rango de días hábiles en lugar de un instante.\n","isRequired":true,"uniqueKey":"oneOf.3.data.due_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo se espera que se haya enviado un retiro `same_day`, sellado cuando lo solicitaste y nunca recalculado después. Es null en cada retiro `standard`: la vía gratuita promete un rango de días hábiles en lugar de un instante.\n","isRequired":true,"uniqueKey":"oneOf.3.data.due_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.3.data.due_at","typeLabel":"string\u003cdate-time> | null"},"resolved_at":{"oneOf":[{"type":"string","format":"date-time","description":"Null mientras siga pendiente.","isRequired":true,"uniqueKey":"oneOf.3.data.resolved_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Null mientras siga pendiente.","isRequired":true,"uniqueKey":"oneOf.3.data.resolved_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.3.data.resolved_at","typeLabel":"string\u003cdate-time> | null"},"clave_de_rastreo":{"oneOf":[{"type":["string","null"],"description":"La clave de rastreo SPEI de la transferencia: el identificador que tu propio banco\nusa para localizar el depósito. Es con lo que concilias un pago\ncontra un estado de cuenta bancario, y es la misma clave que ves en el\npanel de este retiro.\n\nSiempre está presente, y es null hasta que se envía la transferencia. Se queda en null\npara siempre en un retiro `failed`, porque nunca hubo transferencia.\n","example":"MBAN01002608120001234567","isRequired":true,"uniqueKey":"oneOf.3.data.clave_de_rastreo.oneOf.0","typeLabel":"string"},{"type":"null","description":"La clave de rastreo SPEI de la transferencia: el identificador que tu propio banco\nusa para localizar el depósito. Es con lo que concilias un pago\ncontra un estado de cuenta bancario, y es la misma clave que ves en el\npanel de este retiro.\n\nSiempre está presente, y es null hasta que se envía la transferencia. Se queda en null\npara siempre en un retiro `failed`, porque nunca hubo transferencia.\n","example":"MBAN01002608120001234567","isRequired":true,"uniqueKey":"oneOf.3.data.clave_de_rastreo.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.3.data.clave_de_rastreo","typeLabel":"string | null"},"test":{"type":"boolean","isRequired":true,"uniqueKey":"oneOf.3.data.test","typeLabel":"boolean"}},"required":["id","amount_cents","fee_cents","currency","kind","status","requested_at","due_at","resolved_at","clave_de_rastreo","test"],"isRequired":true,"uniqueKey":"oneOf.3.data","typeLabel":"object"},"test":{"type":"boolean","description":"Presente, y en true, solo en un evento de prueba que pediste con\n`POST /v1/test_webhooks`. Un evento real no trae el campo en absoluto. El `data` de un evento de prueba es una muestra cuyos ids no corresponden a nada.\n","example":true,"uniqueKey":"oneOf.3.test","typeLabel":"boolean"}},"uniqueKey":"oneOf.3","typeLabel":"object"},{"type":"object","description":"Cada evento que recibe tu endpoint de webhook, y cada evento que devuelven\nlas lecturas de depuración: uno de los seis de abajo, distinguidos por `type`.\n`data` es el objeto al que se refiere el evento, y su forma depende de\n`type`. Consulta `WebhookEventEnvelope` para los campos que todos comparten y\npara saber cómo se comporta la entrega (al menos una vez, sin orden).\n","required":["type","data","id","created_at"],"properties":{"id":{"type":"string","description":"El id del evento, con prefijo `evt_`. Deduplica por este.","example":"evt_9pQ2vX7mKdR4tYb1nZ3sLwCe","isRequired":true,"uniqueKey":"oneOf.4.id","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","description":"Cuándo se registró el evento, ISO-8601 en UTC.","example":"2026-07-28T18:41:03Z","isRequired":true,"uniqueKey":"oneOf.4.created_at","typeLabel":"string\u003cdate-time>"},"type":{"type":"string","description":"Qué evento es este.","enum":["store.updated"],"isRequired":true,"uniqueKey":"oneOf.4.type","typeLabel":"enum\u003cstring>"},"data":{"type":"object","description":"Un punto de recolección. La disponibilidad para cobrar con tarjeta NO es un\ncampo aquí a propósito: tiene endpoint propio, con detalle propio de requisitos pendientes.\n","properties":{"id":{"type":"string","description":"El id de la tienda, con prefijo `st_`.","example":"st_4bR8kM2wQ7xT1nV5cZ9pLdYe","isRequired":true,"uniqueKey":"oneOf.4.data.id","typeLabel":"string"},"external_id":{"oneOf":[{"type":"string","description":"Tu propia referencia de esta ubicación, si enviaste una. Es única por modo de llave, y se puede filtrar en la lista, para que puedas conciliar contra tu propio libro de tiendas sin guardar nuestros ids.\n","example":"pos-store-41","isRequired":true,"uniqueKey":"oneOf.4.data.external_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Tu propia referencia de esta ubicación, si enviaste una. Es única por modo de llave, y se puede filtrar en la lista, para que puedas conciliar contra tu propio libro de tiendas sin guardar nuestros ids.\n","example":"pos-store-41","isRequired":true,"uniqueKey":"oneOf.4.data.external_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.external_id","typeLabel":"string | null"},"name":{"type":"string","description":"El nombre que le diste a la tienda; para un restaurante que conectó una cuenta con varias sucursales, el negocio y la sucursal, como lo leen sus propios clientes (`Tortería La Mera Mera, Zapopan`). Una sucursal cuyo nombre ya empieza con el nombre del negocio, como `Tortería La Mera Mera Centro`, se publica tal cual. Cuando envías un nombre, un valor que empieza con el nombre de negocio de la tienda y una coma se lee como ese negocio más la sucursal, así que devolver el nombre que leíste no cambia nada.\n","isRequired":true,"uniqueKey":"oneOf.4.data.name","typeLabel":"string"},"phone":{"type":"string","description":"E.164, normalizado al recibirlo.","isRequired":true,"uniqueKey":"oneOf.4.data.phone","typeLabel":"string"},"street":{"type":"string","isRequired":true,"uniqueKey":"oneOf.4.data.street","typeLabel":"string"},"apt_unit":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.4.data.apt_unit.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.4.data.apt_unit.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.apt_unit","typeLabel":"string | null"},"lat":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.4.data.lat.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"oneOf.4.data.lat.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.lat","typeLabel":"number\u003cdouble> | null"},"lng":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.4.data.lng.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"oneOf.4.data.lng.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.lng","typeLabel":"number\u003cdouble> | null"},"pickup_notes":{"oneOf":[{"type":"string","description":"Instrucciones permanentes para el repartidor que recoge aquí.","isRequired":true,"uniqueKey":"oneOf.4.data.pickup_notes.oneOf.0","typeLabel":"string"},{"type":"null","description":"Instrucciones permanentes para el repartidor que recoge aquí.","isRequired":true,"uniqueKey":"oneOf.4.data.pickup_notes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.pickup_notes","typeLabel":"string | null"},"timezone":{"type":"string","description":"La zona IANA en la que la tienda guarda sus horarios, normalizada a una\nsola escritura por zona. Se deriva de las coordenadas de la tienda, y\nse vuelve a derivar cada vez que la posición de la tienda se mueve. Una zona que tú envías\nse usa solo cuando la posición no puede responder (una tienda sin\ncoordenadas, o una posición que ninguna zona reclama), y una que no coincide con la posición ni se guarda ni se trata\ncomo error.\n","example":"America/Mexico_City","isRequired":true,"uniqueKey":"oneOf.4.data.timezone","typeLabel":"string"},"default_business_fee_share":{"type":"integer","minimum":0,"maximum":100,"description":"La parte de la tarifa de envío que esta tienda cubre por defecto, como porcentaje. El resto se cobra al cliente. Solo está vigente cuando `default_fee_split_mode` es `percent`; en cualquiera de los dos modos de monto, este es el porcentaje que la tienda conserva para cuando vuelva a ser uno.\n","isRequired":true,"uniqueKey":"oneOf.4.data.default_business_fee_share","typeLabel":"integer"},"default_fee_split_mode":{"type":"string","enum":["percent","business_amount","customer_amount"],"description":"Qué forma tiene el reparto predeterminado de esta tienda, y por eso cuál de los dos campos de arriba y de abajo está vigente. `percent` reparte la tarifa según `default_business_fee_share`; `business_amount` significa que la tienda cubre hasta `default_fee_split_amount_cents` de ella y el cliente paga el resto; `customer_amount` es el espejo, el cliente paga hasta ese monto y la tienda cubre el resto.\n\nSolo lectura. Lo fija el restaurante en su propia consola de Listo, y enviar `default_business_fee_share` al crear o actualizar devuelve la tienda a `percent`.\n","isRequired":true,"uniqueKey":"oneOf.4.data.default_fee_split_mode","typeLabel":"enum\u003cstring>"},"default_fee_split_amount_cents":{"oneOf":[{"type":"integer","minimum":0,"description":"El monto entre el que dividen la tarifa los dos modos de monto, en centavos. Es null en\nmodo `percent`, y nunca es null en ninguno de los dos modos de monto. Solo lectura.\n","isRequired":true,"uniqueKey":"oneOf.4.data.default_fee_split_amount_cents.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"El monto entre el que dividen la tarifa los dos modos de monto, en centavos. Es null en\nmodo `percent`, y nunca es null en ninguno de los dos modos de monto. Solo lectura.\n","isRequired":true,"uniqueKey":"oneOf.4.data.default_fee_split_amount_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.default_fee_split_amount_cents","typeLabel":"integer | null"},"access_tier":{"type":"string","enum":["api_only","wallet","full"],"description":"Cuánto de Listo usa la propia tienda. Los envíos de una tienda `api_only` gastan tu saldo, y los de una tienda `wallet` o `full` gastan el suyo; `billing` dice cuál. Se puede escribir al crear y al actualizar, y siempre es `api_only` en una tienda de prueba. Una tienda real de una cuenta cuyos restaurantes pagan su propio Plan Listo no puede ser `api_only`: no tiene consola desde la cual comprar un plan, así que una creación o una actualización que lo pida se rechaza con `422 validation_failed` y `param: \"access_tier\"`.\n","isRequired":true,"uniqueKey":"oneOf.4.data.access_tier","typeLabel":"enum\u003cstring>"},"markup_cents":{"type":"integer","minimum":0,"description":"Tu propio margen sobre cada envío de esta tienda, en centavos. Se suma a la tarifa de envío, se reparte con el cliente como el resto de la tarifa, y se abona a tu saldo cuando el envío se entrega. Se puede escribir al crear y al actualizar.\n","isRequired":true,"uniqueKey":"oneOf.4.data.markup_cents","typeLabel":"integer"},"billing":{"type":"string","enum":["partner","store"],"description":"De quién es el saldo que paga los envíos de esta tienda, leído de `access_tier` para que nunca tengas que derivarlo: `partner` es tuyo, `store` es el propio de la tienda. Solo lectura. No es quién paga el plan de la tienda, que es `plan.paid_by`.\n","isRequired":true,"uniqueKey":"oneOf.4.data.billing","typeLabel":"enum\u003cstring>"},"test":{"type":"boolean","isRequired":true,"uniqueKey":"oneOf.4.data.test","typeLabel":"boolean"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.4.data.created_at","typeLabel":"string\u003cdate-time>"},"plan":{"oneOf":[{"description":"El Plan Listo de la tienda, o `null` cuando la tienda no necesita plan: una tienda de prueba, o una tienda real creada antes de que existiera Plan Listo, que sigue pidiendo repartidores sin uno. También es `null` cuando la tienda paga su propio plan (cada tienda de una cuenta cuyas tiendas pagan su propio Plan Listo) y el restaurante todavía no ha comprado uno: el restaurante lo compra en su propia consola, y no tienes nada que pagar ni reactivar. También es `null` para una tienda de un socio con el esquema de precios sin Plan Listo, que no necesita plan. Cuando es un objeto, todas las llaves están presentes, y las que no aplican son `null`. Consulta [Plan y facturación](https://docs.listo.delivery/es/guides/plan-and-billing).\n","type":"object","properties":{"status":{"type":"string","enum":["active","past_due","canceling","canceled","awaiting_payment"],"description":"`active` está al corriente y se renueva en `next_charge_on` (null en un plan que está pasando al restaurante, ver `pending_paid_by`). `past_due` tiene un mes sin pagar, y sus envíos se rechazan con `402\nplan_required` hasta que el cobro pase. `awaiting_payment` es una tienda cuyo primer mes no pudieron cubrir ni tu saldo ni tu tarjeta: todavía no tiene plan, `price_cents` es el precio que se le cobrará antes de IVA (el monto necesario para pagar es ese más IVA), todas las fechas son null, sus envíos se rechazan con `402 plan_required`, y Listo le cobra por sí mismo en cuanto tu saldo o tu tarjeta lo cubran. `canceling` se canceló y se sirve hasta el día anterior a `ends_on`. `canceled` ya terminó, y se puede reiniciar.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.status","typeLabel":"enum\u003cstring>"},"price_cents":{"type":"integer","description":"Lo que te cuesta un mes del plan de esta tienda, antes de IVA: tu precio, incluso mientras un restaurante que se conectó contigo sigue pagando su propio plan. Cuando `paid_by` es `store` porque la tienda paga su propio plan, es el precio de un `interval` del plan propio del restaurante, que no te corresponde pagar.\n","example":199000,"isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.price_cents","typeLabel":"integer"},"currency":{"type":"string","example":"MXN","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.currency","typeLabel":"string"},"interval":{"type":"string","description":"Cuánto dura un periodo de este plan, y el ciclo del que `price_cents` es el precio. `month` para todo plan que pagas. Una tienda que paga su propio plan reporta el intervalo que compró su restaurante, así que `year` es un restaurante que pagó doce meses de una vez.\n","example":"month","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.interval","typeLabel":"string"},"current_period_ends_on":{"oneOf":[{"type":"string","format":"date","description":"El último día del periodo actual, ya pagado salvo que `status` sea `past_due`.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.current_period_ends_on.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"El último día del periodo actual, ya pagado salvo que `status` sea `past_due`.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.current_period_ends_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.current_period_ends_on","typeLabel":"string\u003cdate> | null"},"next_charge_on":{"oneOf":[{"type":"string","format":"date","description":"El día en que se te cobra lo siguiente: la siguiente renovación o, mientras un restaurante que se conectó contigo siga pagando su propio plan, tu primer cobro. Es null una vez que el plan está terminando o ya terminó, y es null mientras está `past_due`: el mes adeudado se cobra en el momento en que tu saldo o tu tarjeta guardada lo permitan, y se reintenta cada día hasta que se paga. También es null mientras `courtesy` sea true. Igualmente es null en un plan que tú pagas y que está pasando al restaurante (`pending_paid_by` es `store`): pagas el periodo en el que estás y nada después. Cuando `paid_by` es `store` porque la tienda paga su propio plan, es el día en que se renueva el plan propio del restaurante, no un cobro a ti.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.next_charge_on.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"El día en que se te cobra lo siguiente: la siguiente renovación o, mientras un restaurante que se conectó contigo siga pagando su propio plan, tu primer cobro. Es null una vez que el plan está terminando o ya terminó, y es null mientras está `past_due`: el mes adeudado se cobra en el momento en que tu saldo o tu tarjeta guardada lo permitan, y se reintenta cada día hasta que se paga. También es null mientras `courtesy` sea true. Igualmente es null en un plan que tú pagas y que está pasando al restaurante (`pending_paid_by` es `store`): pagas el periodo en el que estás y nada después. Cuando `paid_by` es `store` porque la tienda paga su propio plan, es el día en que se renueva el plan propio del restaurante, no un cobro a ti.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.next_charge_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.next_charge_on","typeLabel":"string\u003cdate> | null"},"canceled_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo cancelaste el plan.","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.canceled_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo cancelaste el plan.","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.canceled_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.canceled_at","typeLabel":"string\u003cdate-time> | null"},"ends_on":{"oneOf":[{"type":"string","format":"date","description":"El día en que el plan deja de dar servicio a la tienda, que es el día después del último día pagado, o el día en que se canceló un plan cuyo cobro estaba pendiente. Es null salvo que el plan esté terminando o ya haya terminado.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.ends_on.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"El día en que el plan deja de dar servicio a la tienda, que es el día después del último día pagado, o el día en que se canceló un plan cuyo cobro estaba pendiente. Es null salvo que el plan esté terminando o ya haya terminado.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.ends_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.ends_on","typeLabel":"string\u003cdate> | null"},"paid_by":{"type":"string","enum":["partner","store"],"description":"Quién paga este plan: `partner`, que eres tú, o `store`, el propio restaurante. `store` es un restaurante que se conectó contigo y aún paga su propio plan, y cada tienda que paga su propio Plan Listo porque tu cuenta está configurada así; ninguna de ellas te toca pagar.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.paid_by","typeLabel":"enum\u003cstring>"},"pending_paid_by":{"oneOf":[{"type":"string","description":"Quién lo pagará a partir de `pending_paid_by_on`, cuando eso está por cambiar, o null. `partner` eres tú: un restaurante que se conectó contigo y aún paga su propio plan, hasta la renovación que pagas tú. `store` es el restaurante: un plan que pagas tú y que pasa al restaurante en su próxima renovación porque tu cuenta está configurada para que cada restaurante pague su propio plan. Pagas el periodo en el que estás y nada después de él, por eso `next_charge_on` es null.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.pending_paid_by.oneOf.0","typeLabel":"string"},{"type":"null","description":"Quién lo pagará a partir de `pending_paid_by_on`, cuando eso está por cambiar, o null. `partner` eres tú: un restaurante que se conectó contigo y aún paga su propio plan, hasta la renovación que pagas tú. `store` es el restaurante: un plan que pagas tú y que pasa al restaurante en su próxima renovación porque tu cuenta está configurada para que cada restaurante pague su propio plan. Pagas el periodo en el que estás y nada después de él, por eso `next_charge_on` es null.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.pending_paid_by.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.pending_paid_by","typeLabel":"string | null"},"pending_paid_by_on":{"oneOf":[{"type":"string","format":"date","description":"La fecha en que entra el cambio (el día en que empieza el primer periodo del nuevo pagador), o null.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.pending_paid_by_on.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"La fecha en que entra el cambio (el día en que empieza el primer periodo del nuevo pagador), o null.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.pending_paid_by_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.pending_paid_by_on","typeLabel":"string\u003cdate> | null"},"courtesy":{"type":"boolean","description":"`courtesy` es true mientras Listo le perdona el plan a esta tienda: no se cobra nada y `next_charge_on` es null.\n","isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0.courtesy","typeLabel":"boolean"}},"required":["status","price_cents","currency","interval","current_period_ends_on","next_charge_on","canceled_at","ends_on","paid_by","pending_paid_by","pending_paid_by_on","courtesy"],"isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.0","typeLabel":"object"},{"description":"El Plan Listo de la tienda, o `null` cuando la tienda no necesita plan: una tienda de prueba, o una tienda real creada antes de que existiera Plan Listo, que sigue pidiendo repartidores sin uno. También es `null` cuando la tienda paga su propio plan (cada tienda de una cuenta cuyas tiendas pagan su propio Plan Listo) y el restaurante todavía no ha comprado uno: el restaurante lo compra en su propia consola, y no tienes nada que pagar ni reactivar. También es `null` para una tienda de un socio con el esquema de precios sin Plan Listo, que no necesita plan. Cuando es un objeto, todas las llaves están presentes, y las que no aplican son `null`. Consulta [Plan y facturación](https://docs.listo.delivery/es/guides/plan-and-billing).\n","type":"null","properties":{"status":{"type":"string","enum":["active","past_due","canceling","canceled","awaiting_payment"],"description":"`active` está al corriente y se renueva en `next_charge_on` (null en un plan que está pasando al restaurante, ver `pending_paid_by`). `past_due` tiene un mes sin pagar, y sus envíos se rechazan con `402\nplan_required` hasta que el cobro pase. `awaiting_payment` es una tienda cuyo primer mes no pudieron cubrir ni tu saldo ni tu tarjeta: todavía no tiene plan, `price_cents` es el precio que se le cobrará antes de IVA (el monto necesario para pagar es ese más IVA), todas las fechas son null, sus envíos se rechazan con `402 plan_required`, y Listo le cobra por sí mismo en cuanto tu saldo o tu tarjeta lo cubran. `canceling` se canceló y se sirve hasta el día anterior a `ends_on`. `canceled` ya terminó, y se puede reiniciar.\n"},"price_cents":{"type":"integer","description":"Lo que te cuesta un mes del plan de esta tienda, antes de IVA: tu precio, incluso mientras un restaurante que se conectó contigo sigue pagando su propio plan. Cuando `paid_by` es `store` porque la tienda paga su propio plan, es el precio de un `interval` del plan propio del restaurante, que no te corresponde pagar.\n","example":199000},"currency":{"type":"string","example":"MXN"},"interval":{"type":"string","description":"Cuánto dura un periodo de este plan, y el ciclo del que `price_cents` es el precio. `month` para todo plan que pagas. Una tienda que paga su propio plan reporta el intervalo que compró su restaurante, así que `year` es un restaurante que pagó doce meses de una vez.\n","example":"month"},"current_period_ends_on":{"oneOf":[{"type":"string","format":"date","description":"El último día del periodo actual, ya pagado salvo que `status` sea `past_due`.\n"},{"type":"null","format":"date","description":"El último día del periodo actual, ya pagado salvo que `status` sea `past_due`.\n"}]},"next_charge_on":{"oneOf":[{"type":"string","format":"date","description":"El día en que se te cobra lo siguiente: la siguiente renovación o, mientras un restaurante que se conectó contigo siga pagando su propio plan, tu primer cobro. Es null una vez que el plan está terminando o ya terminó, y es null mientras está `past_due`: el mes adeudado se cobra en el momento en que tu saldo o tu tarjeta guardada lo permitan, y se reintenta cada día hasta que se paga. También es null mientras `courtesy` sea true. Igualmente es null en un plan que tú pagas y que está pasando al restaurante (`pending_paid_by` es `store`): pagas el periodo en el que estás y nada después. Cuando `paid_by` es `store` porque la tienda paga su propio plan, es el día en que se renueva el plan propio del restaurante, no un cobro a ti.\n"},{"type":"null","format":"date","description":"El día en que se te cobra lo siguiente: la siguiente renovación o, mientras un restaurante que se conectó contigo siga pagando su propio plan, tu primer cobro. Es null una vez que el plan está terminando o ya terminó, y es null mientras está `past_due`: el mes adeudado se cobra en el momento en que tu saldo o tu tarjeta guardada lo permitan, y se reintenta cada día hasta que se paga. También es null mientras `courtesy` sea true. Igualmente es null en un plan que tú pagas y que está pasando al restaurante (`pending_paid_by` es `store`): pagas el periodo en el que estás y nada después. Cuando `paid_by` es `store` porque la tienda paga su propio plan, es el día en que se renueva el plan propio del restaurante, no un cobro a ti.\n"}]},"canceled_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo cancelaste el plan."},{"type":"null","format":"date-time","description":"Cuándo cancelaste el plan."}]},"ends_on":{"oneOf":[{"type":"string","format":"date","description":"El día en que el plan deja de dar servicio a la tienda, que es el día después del último día pagado, o el día en que se canceló un plan cuyo cobro estaba pendiente. Es null salvo que el plan esté terminando o ya haya terminado.\n"},{"type":"null","format":"date","description":"El día en que el plan deja de dar servicio a la tienda, que es el día después del último día pagado, o el día en que se canceló un plan cuyo cobro estaba pendiente. Es null salvo que el plan esté terminando o ya haya terminado.\n"}]},"paid_by":{"type":"string","enum":["partner","store"],"description":"Quién paga este plan: `partner`, que eres tú, o `store`, el propio restaurante. `store` es un restaurante que se conectó contigo y aún paga su propio plan, y cada tienda que paga su propio Plan Listo porque tu cuenta está configurada así; ninguna de ellas te toca pagar.\n"},"pending_paid_by":{"oneOf":[{"type":"string","description":"Quién lo pagará a partir de `pending_paid_by_on`, cuando eso está por cambiar, o null. `partner` eres tú: un restaurante que se conectó contigo y aún paga su propio plan, hasta la renovación que pagas tú. `store` es el restaurante: un plan que pagas tú y que pasa al restaurante en su próxima renovación porque tu cuenta está configurada para que cada restaurante pague su propio plan. Pagas el periodo en el que estás y nada después de él, por eso `next_charge_on` es null.\n"},{"type":"null","description":"Quién lo pagará a partir de `pending_paid_by_on`, cuando eso está por cambiar, o null. `partner` eres tú: un restaurante que se conectó contigo y aún paga su propio plan, hasta la renovación que pagas tú. `store` es el restaurante: un plan que pagas tú y que pasa al restaurante en su próxima renovación porque tu cuenta está configurada para que cada restaurante pague su propio plan. Pagas el periodo en el que estás y nada después de él, por eso `next_charge_on` es null.\n"}]},"pending_paid_by_on":{"oneOf":[{"type":"string","format":"date","description":"La fecha en que entra el cambio (el día en que empieza el primer periodo del nuevo pagador), o null.\n"},{"type":"null","format":"date","description":"La fecha en que entra el cambio (el día en que empieza el primer periodo del nuevo pagador), o null.\n"}]},"courtesy":{"type":"boolean","description":"`courtesy` es true mientras Listo le perdona el plan a esta tienda: no se cobra nada y `next_charge_on` es null.\n"}},"required":["status","price_cents","currency","interval","current_period_ends_on","next_charge_on","canceled_at","ends_on","paid_by","pending_paid_by","pending_paid_by_on","courtesy"],"isRequired":true,"uniqueKey":"oneOf.4.data.plan.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.4.data.plan","typeLabel":"object | null"}},"required":["id","external_id","name","phone","street","apt_unit","lat","lng","pickup_notes","timezone","default_business_fee_share","default_fee_split_mode","default_fee_split_amount_cents","access_tier","markup_cents","billing","test","created_at","plan"],"isRequired":true,"uniqueKey":"oneOf.4.data","typeLabel":"object"},"test":{"type":"boolean","description":"Presente, y en true, solo en un evento de prueba que pediste con\n`POST /v1/test_webhooks`. Un evento real no trae el campo en absoluto. El `data` de un evento de prueba es una muestra cuyos ids no corresponden a nada.\n","example":true,"uniqueKey":"oneOf.4.test","typeLabel":"boolean"}},"uniqueKey":"oneOf.4","typeLabel":"object"},{"type":"object","description":"Cada evento que recibe tu endpoint de webhook, y cada evento que devuelven\nlas lecturas de depuración: uno de los seis de abajo, distinguidos por `type`.\n`data` es el objeto al que se refiere el evento, y su forma depende de\n`type`. Consulta `WebhookEventEnvelope` para los campos que todos comparten y\npara saber cómo se comporta la entrega (al menos una vez, sin orden).\n","required":["type","data","id","created_at"],"properties":{"id":{"type":"string","description":"El id del evento, con prefijo `evt_`. Deduplica por este.","example":"evt_9pQ2vX7mKdR4tYb1nZ3sLwCe","isRequired":true,"uniqueKey":"oneOf.5.id","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","description":"Cuándo se registró el evento, ISO-8601 en UTC.","example":"2026-07-28T18:41:03Z","isRequired":true,"uniqueKey":"oneOf.5.created_at","typeLabel":"string\u003cdate-time>"},"type":{"type":"string","description":"Qué evento es este.","enum":["store.connected"],"isRequired":true,"uniqueKey":"oneOf.5.type","typeLabel":"enum\u003cstring>"},"data":{"type":"object","description":"Un punto de recolección. La disponibilidad para cobrar con tarjeta NO es un\ncampo aquí a propósito: tiene endpoint propio, con detalle propio de requisitos pendientes.\n","properties":{"id":{"type":"string","description":"El id de la tienda, con prefijo `st_`.","example":"st_4bR8kM2wQ7xT1nV5cZ9pLdYe","isRequired":true,"uniqueKey":"oneOf.5.data.id","typeLabel":"string"},"external_id":{"oneOf":[{"type":"string","description":"Tu propia referencia de esta ubicación, si enviaste una. Es única por modo de llave, y se puede filtrar en la lista, para que puedas conciliar contra tu propio libro de tiendas sin guardar nuestros ids.\n","example":"pos-store-41","isRequired":true,"uniqueKey":"oneOf.5.data.external_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Tu propia referencia de esta ubicación, si enviaste una. Es única por modo de llave, y se puede filtrar en la lista, para que puedas conciliar contra tu propio libro de tiendas sin guardar nuestros ids.\n","example":"pos-store-41","isRequired":true,"uniqueKey":"oneOf.5.data.external_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.external_id","typeLabel":"string | null"},"name":{"type":"string","description":"El nombre que le diste a la tienda; para un restaurante que conectó una cuenta con varias sucursales, el negocio y la sucursal, como lo leen sus propios clientes (`Tortería La Mera Mera, Zapopan`). Una sucursal cuyo nombre ya empieza con el nombre del negocio, como `Tortería La Mera Mera Centro`, se publica tal cual. Cuando envías un nombre, un valor que empieza con el nombre de negocio de la tienda y una coma se lee como ese negocio más la sucursal, así que devolver el nombre que leíste no cambia nada.\n","isRequired":true,"uniqueKey":"oneOf.5.data.name","typeLabel":"string"},"phone":{"type":"string","description":"E.164, normalizado al recibirlo.","isRequired":true,"uniqueKey":"oneOf.5.data.phone","typeLabel":"string"},"street":{"type":"string","isRequired":true,"uniqueKey":"oneOf.5.data.street","typeLabel":"string"},"apt_unit":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"oneOf.5.data.apt_unit.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"oneOf.5.data.apt_unit.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.apt_unit","typeLabel":"string | null"},"lat":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.5.data.lat.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"oneOf.5.data.lat.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.lat","typeLabel":"number\u003cdouble> | null"},"lng":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"oneOf.5.data.lng.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"oneOf.5.data.lng.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.lng","typeLabel":"number\u003cdouble> | null"},"pickup_notes":{"oneOf":[{"type":"string","description":"Instrucciones permanentes para el repartidor que recoge aquí.","isRequired":true,"uniqueKey":"oneOf.5.data.pickup_notes.oneOf.0","typeLabel":"string"},{"type":"null","description":"Instrucciones permanentes para el repartidor que recoge aquí.","isRequired":true,"uniqueKey":"oneOf.5.data.pickup_notes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.pickup_notes","typeLabel":"string | null"},"timezone":{"type":"string","description":"La zona IANA en la que la tienda guarda sus horarios, normalizada a una\nsola escritura por zona. Se deriva de las coordenadas de la tienda, y\nse vuelve a derivar cada vez que la posición de la tienda se mueve. Una zona que tú envías\nse usa solo cuando la posición no puede responder (una tienda sin\ncoordenadas, o una posición que ninguna zona reclama), y una que no coincide con la posición ni se guarda ni se trata\ncomo error.\n","example":"America/Mexico_City","isRequired":true,"uniqueKey":"oneOf.5.data.timezone","typeLabel":"string"},"default_business_fee_share":{"type":"integer","minimum":0,"maximum":100,"description":"La parte de la tarifa de envío que esta tienda cubre por defecto, como porcentaje. El resto se cobra al cliente. Solo está vigente cuando `default_fee_split_mode` es `percent`; en cualquiera de los dos modos de monto, este es el porcentaje que la tienda conserva para cuando vuelva a ser uno.\n","isRequired":true,"uniqueKey":"oneOf.5.data.default_business_fee_share","typeLabel":"integer"},"default_fee_split_mode":{"type":"string","enum":["percent","business_amount","customer_amount"],"description":"Qué forma tiene el reparto predeterminado de esta tienda, y por eso cuál de los dos campos de arriba y de abajo está vigente. `percent` reparte la tarifa según `default_business_fee_share`; `business_amount` significa que la tienda cubre hasta `default_fee_split_amount_cents` de ella y el cliente paga el resto; `customer_amount` es el espejo, el cliente paga hasta ese monto y la tienda cubre el resto.\n\nSolo lectura. Lo fija el restaurante en su propia consola de Listo, y enviar `default_business_fee_share` al crear o actualizar devuelve la tienda a `percent`.\n","isRequired":true,"uniqueKey":"oneOf.5.data.default_fee_split_mode","typeLabel":"enum\u003cstring>"},"default_fee_split_amount_cents":{"oneOf":[{"type":"integer","minimum":0,"description":"El monto entre el que dividen la tarifa los dos modos de monto, en centavos. Es null en\nmodo `percent`, y nunca es null en ninguno de los dos modos de monto. Solo lectura.\n","isRequired":true,"uniqueKey":"oneOf.5.data.default_fee_split_amount_cents.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"El monto entre el que dividen la tarifa los dos modos de monto, en centavos. Es null en\nmodo `percent`, y nunca es null en ninguno de los dos modos de monto. Solo lectura.\n","isRequired":true,"uniqueKey":"oneOf.5.data.default_fee_split_amount_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.default_fee_split_amount_cents","typeLabel":"integer | null"},"access_tier":{"type":"string","enum":["api_only","wallet","full"],"description":"Cuánto de Listo usa la propia tienda. Los envíos de una tienda `api_only` gastan tu saldo, y los de una tienda `wallet` o `full` gastan el suyo; `billing` dice cuál. Se puede escribir al crear y al actualizar, y siempre es `api_only` en una tienda de prueba. Una tienda real de una cuenta cuyos restaurantes pagan su propio Plan Listo no puede ser `api_only`: no tiene consola desde la cual comprar un plan, así que una creación o una actualización que lo pida se rechaza con `422 validation_failed` y `param: \"access_tier\"`.\n","isRequired":true,"uniqueKey":"oneOf.5.data.access_tier","typeLabel":"enum\u003cstring>"},"markup_cents":{"type":"integer","minimum":0,"description":"Tu propio margen sobre cada envío de esta tienda, en centavos. Se suma a la tarifa de envío, se reparte con el cliente como el resto de la tarifa, y se abona a tu saldo cuando el envío se entrega. Se puede escribir al crear y al actualizar.\n","isRequired":true,"uniqueKey":"oneOf.5.data.markup_cents","typeLabel":"integer"},"billing":{"type":"string","enum":["partner","store"],"description":"De quién es el saldo que paga los envíos de esta tienda, leído de `access_tier` para que nunca tengas que derivarlo: `partner` es tuyo, `store` es el propio de la tienda. Solo lectura. No es quién paga el plan de la tienda, que es `plan.paid_by`.\n","isRequired":true,"uniqueKey":"oneOf.5.data.billing","typeLabel":"enum\u003cstring>"},"test":{"type":"boolean","isRequired":true,"uniqueKey":"oneOf.5.data.test","typeLabel":"boolean"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"oneOf.5.data.created_at","typeLabel":"string\u003cdate-time>"},"plan":{"oneOf":[{"description":"El Plan Listo de la tienda, o `null` cuando la tienda no necesita plan: una tienda de prueba, o una tienda real creada antes de que existiera Plan Listo, que sigue pidiendo repartidores sin uno. También es `null` cuando la tienda paga su propio plan (cada tienda de una cuenta cuyas tiendas pagan su propio Plan Listo) y el restaurante todavía no ha comprado uno: el restaurante lo compra en su propia consola, y no tienes nada que pagar ni reactivar. También es `null` para una tienda de un socio con el esquema de precios sin Plan Listo, que no necesita plan. Cuando es un objeto, todas las llaves están presentes, y las que no aplican son `null`. Consulta [Plan y facturación](https://docs.listo.delivery/es/guides/plan-and-billing).\n","type":"object","properties":{"status":{"type":"string","enum":["active","past_due","canceling","canceled","awaiting_payment"],"description":"`active` está al corriente y se renueva en `next_charge_on` (null en un plan que está pasando al restaurante, ver `pending_paid_by`). `past_due` tiene un mes sin pagar, y sus envíos se rechazan con `402\nplan_required` hasta que el cobro pase. `awaiting_payment` es una tienda cuyo primer mes no pudieron cubrir ni tu saldo ni tu tarjeta: todavía no tiene plan, `price_cents` es el precio que se le cobrará antes de IVA (el monto necesario para pagar es ese más IVA), todas las fechas son null, sus envíos se rechazan con `402 plan_required`, y Listo le cobra por sí mismo en cuanto tu saldo o tu tarjeta lo cubran. `canceling` se canceló y se sirve hasta el día anterior a `ends_on`. `canceled` ya terminó, y se puede reiniciar.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.status","typeLabel":"enum\u003cstring>"},"price_cents":{"type":"integer","description":"Lo que te cuesta un mes del plan de esta tienda, antes de IVA: tu precio, incluso mientras un restaurante que se conectó contigo sigue pagando su propio plan. Cuando `paid_by` es `store` porque la tienda paga su propio plan, es el precio de un `interval` del plan propio del restaurante, que no te corresponde pagar.\n","example":199000,"isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.price_cents","typeLabel":"integer"},"currency":{"type":"string","example":"MXN","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.currency","typeLabel":"string"},"interval":{"type":"string","description":"Cuánto dura un periodo de este plan, y el ciclo del que `price_cents` es el precio. `month` para todo plan que pagas. Una tienda que paga su propio plan reporta el intervalo que compró su restaurante, así que `year` es un restaurante que pagó doce meses de una vez.\n","example":"month","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.interval","typeLabel":"string"},"current_period_ends_on":{"oneOf":[{"type":"string","format":"date","description":"El último día del periodo actual, ya pagado salvo que `status` sea `past_due`.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.current_period_ends_on.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"El último día del periodo actual, ya pagado salvo que `status` sea `past_due`.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.current_period_ends_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.current_period_ends_on","typeLabel":"string\u003cdate> | null"},"next_charge_on":{"oneOf":[{"type":"string","format":"date","description":"El día en que se te cobra lo siguiente: la siguiente renovación o, mientras un restaurante que se conectó contigo siga pagando su propio plan, tu primer cobro. Es null una vez que el plan está terminando o ya terminó, y es null mientras está `past_due`: el mes adeudado se cobra en el momento en que tu saldo o tu tarjeta guardada lo permitan, y se reintenta cada día hasta que se paga. También es null mientras `courtesy` sea true. Igualmente es null en un plan que tú pagas y que está pasando al restaurante (`pending_paid_by` es `store`): pagas el periodo en el que estás y nada después. Cuando `paid_by` es `store` porque la tienda paga su propio plan, es el día en que se renueva el plan propio del restaurante, no un cobro a ti.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.next_charge_on.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"El día en que se te cobra lo siguiente: la siguiente renovación o, mientras un restaurante que se conectó contigo siga pagando su propio plan, tu primer cobro. Es null una vez que el plan está terminando o ya terminó, y es null mientras está `past_due`: el mes adeudado se cobra en el momento en que tu saldo o tu tarjeta guardada lo permitan, y se reintenta cada día hasta que se paga. También es null mientras `courtesy` sea true. Igualmente es null en un plan que tú pagas y que está pasando al restaurante (`pending_paid_by` es `store`): pagas el periodo en el que estás y nada después. Cuando `paid_by` es `store` porque la tienda paga su propio plan, es el día en que se renueva el plan propio del restaurante, no un cobro a ti.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.next_charge_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.next_charge_on","typeLabel":"string\u003cdate> | null"},"canceled_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo cancelaste el plan.","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.canceled_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Cuándo cancelaste el plan.","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.canceled_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.canceled_at","typeLabel":"string\u003cdate-time> | null"},"ends_on":{"oneOf":[{"type":"string","format":"date","description":"El día en que el plan deja de dar servicio a la tienda, que es el día después del último día pagado, o el día en que se canceló un plan cuyo cobro estaba pendiente. Es null salvo que el plan esté terminando o ya haya terminado.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.ends_on.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"El día en que el plan deja de dar servicio a la tienda, que es el día después del último día pagado, o el día en que se canceló un plan cuyo cobro estaba pendiente. Es null salvo que el plan esté terminando o ya haya terminado.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.ends_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.ends_on","typeLabel":"string\u003cdate> | null"},"paid_by":{"type":"string","enum":["partner","store"],"description":"Quién paga este plan: `partner`, que eres tú, o `store`, el propio restaurante. `store` es un restaurante que se conectó contigo y aún paga su propio plan, y cada tienda que paga su propio Plan Listo porque tu cuenta está configurada así; ninguna de ellas te toca pagar.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.paid_by","typeLabel":"enum\u003cstring>"},"pending_paid_by":{"oneOf":[{"type":"string","description":"Quién lo pagará a partir de `pending_paid_by_on`, cuando eso está por cambiar, o null. `partner` eres tú: un restaurante que se conectó contigo y aún paga su propio plan, hasta la renovación que pagas tú. `store` es el restaurante: un plan que pagas tú y que pasa al restaurante en su próxima renovación porque tu cuenta está configurada para que cada restaurante pague su propio plan. Pagas el periodo en el que estás y nada después de él, por eso `next_charge_on` es null.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.pending_paid_by.oneOf.0","typeLabel":"string"},{"type":"null","description":"Quién lo pagará a partir de `pending_paid_by_on`, cuando eso está por cambiar, o null. `partner` eres tú: un restaurante que se conectó contigo y aún paga su propio plan, hasta la renovación que pagas tú. `store` es el restaurante: un plan que pagas tú y que pasa al restaurante en su próxima renovación porque tu cuenta está configurada para que cada restaurante pague su propio plan. Pagas el periodo en el que estás y nada después de él, por eso `next_charge_on` es null.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.pending_paid_by.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.pending_paid_by","typeLabel":"string | null"},"pending_paid_by_on":{"oneOf":[{"type":"string","format":"date","description":"La fecha en que entra el cambio (el día en que empieza el primer periodo del nuevo pagador), o null.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.pending_paid_by_on.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"La fecha en que entra el cambio (el día en que empieza el primer periodo del nuevo pagador), o null.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.pending_paid_by_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.pending_paid_by_on","typeLabel":"string\u003cdate> | null"},"courtesy":{"type":"boolean","description":"`courtesy` es true mientras Listo le perdona el plan a esta tienda: no se cobra nada y `next_charge_on` es null.\n","isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0.courtesy","typeLabel":"boolean"}},"required":["status","price_cents","currency","interval","current_period_ends_on","next_charge_on","canceled_at","ends_on","paid_by","pending_paid_by","pending_paid_by_on","courtesy"],"isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.0","typeLabel":"object"},{"description":"El Plan Listo de la tienda, o `null` cuando la tienda no necesita plan: una tienda de prueba, o una tienda real creada antes de que existiera Plan Listo, que sigue pidiendo repartidores sin uno. También es `null` cuando la tienda paga su propio plan (cada tienda de una cuenta cuyas tiendas pagan su propio Plan Listo) y el restaurante todavía no ha comprado uno: el restaurante lo compra en su propia consola, y no tienes nada que pagar ni reactivar. También es `null` para una tienda de un socio con el esquema de precios sin Plan Listo, que no necesita plan. Cuando es un objeto, todas las llaves están presentes, y las que no aplican son `null`. Consulta [Plan y facturación](https://docs.listo.delivery/es/guides/plan-and-billing).\n","type":"null","properties":{"status":{"type":"string","enum":["active","past_due","canceling","canceled","awaiting_payment"],"description":"`active` está al corriente y se renueva en `next_charge_on` (null en un plan que está pasando al restaurante, ver `pending_paid_by`). `past_due` tiene un mes sin pagar, y sus envíos se rechazan con `402\nplan_required` hasta que el cobro pase. `awaiting_payment` es una tienda cuyo primer mes no pudieron cubrir ni tu saldo ni tu tarjeta: todavía no tiene plan, `price_cents` es el precio que se le cobrará antes de IVA (el monto necesario para pagar es ese más IVA), todas las fechas son null, sus envíos se rechazan con `402 plan_required`, y Listo le cobra por sí mismo en cuanto tu saldo o tu tarjeta lo cubran. `canceling` se canceló y se sirve hasta el día anterior a `ends_on`. `canceled` ya terminó, y se puede reiniciar.\n"},"price_cents":{"type":"integer","description":"Lo que te cuesta un mes del plan de esta tienda, antes de IVA: tu precio, incluso mientras un restaurante que se conectó contigo sigue pagando su propio plan. Cuando `paid_by` es `store` porque la tienda paga su propio plan, es el precio de un `interval` del plan propio del restaurante, que no te corresponde pagar.\n","example":199000},"currency":{"type":"string","example":"MXN"},"interval":{"type":"string","description":"Cuánto dura un periodo de este plan, y el ciclo del que `price_cents` es el precio. `month` para todo plan que pagas. Una tienda que paga su propio plan reporta el intervalo que compró su restaurante, así que `year` es un restaurante que pagó doce meses de una vez.\n","example":"month"},"current_period_ends_on":{"oneOf":[{"type":"string","format":"date","description":"El último día del periodo actual, ya pagado salvo que `status` sea `past_due`.\n"},{"type":"null","format":"date","description":"El último día del periodo actual, ya pagado salvo que `status` sea `past_due`.\n"}]},"next_charge_on":{"oneOf":[{"type":"string","format":"date","description":"El día en que se te cobra lo siguiente: la siguiente renovación o, mientras un restaurante que se conectó contigo siga pagando su propio plan, tu primer cobro. Es null una vez que el plan está terminando o ya terminó, y es null mientras está `past_due`: el mes adeudado se cobra en el momento en que tu saldo o tu tarjeta guardada lo permitan, y se reintenta cada día hasta que se paga. También es null mientras `courtesy` sea true. Igualmente es null en un plan que tú pagas y que está pasando al restaurante (`pending_paid_by` es `store`): pagas el periodo en el que estás y nada después. Cuando `paid_by` es `store` porque la tienda paga su propio plan, es el día en que se renueva el plan propio del restaurante, no un cobro a ti.\n"},{"type":"null","format":"date","description":"El día en que se te cobra lo siguiente: la siguiente renovación o, mientras un restaurante que se conectó contigo siga pagando su propio plan, tu primer cobro. Es null una vez que el plan está terminando o ya terminó, y es null mientras está `past_due`: el mes adeudado se cobra en el momento en que tu saldo o tu tarjeta guardada lo permitan, y se reintenta cada día hasta que se paga. También es null mientras `courtesy` sea true. Igualmente es null en un plan que tú pagas y que está pasando al restaurante (`pending_paid_by` es `store`): pagas el periodo en el que estás y nada después. Cuando `paid_by` es `store` porque la tienda paga su propio plan, es el día en que se renueva el plan propio del restaurante, no un cobro a ti.\n"}]},"canceled_at":{"oneOf":[{"type":"string","format":"date-time","description":"Cuándo cancelaste el plan."},{"type":"null","format":"date-time","description":"Cuándo cancelaste el plan."}]},"ends_on":{"oneOf":[{"type":"string","format":"date","description":"El día en que el plan deja de dar servicio a la tienda, que es el día después del último día pagado, o el día en que se canceló un plan cuyo cobro estaba pendiente. Es null salvo que el plan esté terminando o ya haya terminado.\n"},{"type":"null","format":"date","description":"El día en que el plan deja de dar servicio a la tienda, que es el día después del último día pagado, o el día en que se canceló un plan cuyo cobro estaba pendiente. Es null salvo que el plan esté terminando o ya haya terminado.\n"}]},"paid_by":{"type":"string","enum":["partner","store"],"description":"Quién paga este plan: `partner`, que eres tú, o `store`, el propio restaurante. `store` es un restaurante que se conectó contigo y aún paga su propio plan, y cada tienda que paga su propio Plan Listo porque tu cuenta está configurada así; ninguna de ellas te toca pagar.\n"},"pending_paid_by":{"oneOf":[{"type":"string","description":"Quién lo pagará a partir de `pending_paid_by_on`, cuando eso está por cambiar, o null. `partner` eres tú: un restaurante que se conectó contigo y aún paga su propio plan, hasta la renovación que pagas tú. `store` es el restaurante: un plan que pagas tú y que pasa al restaurante en su próxima renovación porque tu cuenta está configurada para que cada restaurante pague su propio plan. Pagas el periodo en el que estás y nada después de él, por eso `next_charge_on` es null.\n"},{"type":"null","description":"Quién lo pagará a partir de `pending_paid_by_on`, cuando eso está por cambiar, o null. `partner` eres tú: un restaurante que se conectó contigo y aún paga su propio plan, hasta la renovación que pagas tú. `store` es el restaurante: un plan que pagas tú y que pasa al restaurante en su próxima renovación porque tu cuenta está configurada para que cada restaurante pague su propio plan. Pagas el periodo en el que estás y nada después de él, por eso `next_charge_on` es null.\n"}]},"pending_paid_by_on":{"oneOf":[{"type":"string","format":"date","description":"La fecha en que entra el cambio (el día en que empieza el primer periodo del nuevo pagador), o null.\n"},{"type":"null","format":"date","description":"La fecha en que entra el cambio (el día en que empieza el primer periodo del nuevo pagador), o null.\n"}]},"courtesy":{"type":"boolean","description":"`courtesy` es true mientras Listo le perdona el plan a esta tienda: no se cobra nada y `next_charge_on` es null.\n"}},"required":["status","price_cents","currency","interval","current_period_ends_on","next_charge_on","canceled_at","ends_on","paid_by","pending_paid_by","pending_paid_by_on","courtesy"],"isRequired":true,"uniqueKey":"oneOf.5.data.plan.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"oneOf.5.data.plan","typeLabel":"object | null"}},"required":["id","external_id","name","phone","street","apt_unit","lat","lng","pickup_notes","timezone","default_business_fee_share","default_fee_split_mode","default_fee_split_amount_cents","access_tier","markup_cents","billing","test","created_at","plan"],"isRequired":true,"uniqueKey":"oneOf.5.data","typeLabel":"object"},"test":{"type":"boolean","description":"Presente, y en true, solo en un evento de prueba que pediste con\n`POST /v1/test_webhooks`. Un evento real no trae el campo en absoluto. El `data` de un evento de prueba es una muestra cuyos ids no corresponden a nada.\n","example":true,"uniqueKey":"oneOf.5.test","typeLabel":"boolean"}},"uniqueKey":"oneOf.5","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"example":{"id":"evt_9pQ2vX7mKdR4tYb1nZ3sLwCe","type":"delivery.status_changed","created_at":"2026-11-06T08:49:43Z","data":{"id":"dlv_test_sample_000000000000","external_id":"order-841","origin":"api","code":"LS-2048","status":"courier_assigned","store_id":"st_test_sample_00000000000000","test":false,"payment":{"method":"prepaid","status":"paid","url":null,"cash_to_collect_cents":null,"paid_at":"2026-07-28T18:41:03Z"},"order_value_cents":18000,"fee_cents":6900,"business_fee_cents":6900,"customer_fee_cents":0,"tip_cents":0,"currency":"MXN","quote_id":"qt_test_sample_000000000000","pickup":{"name":"Test Sample Store","street":"Av. Chapultepec 100, Guadalajara","lat":20.6736,"lng":-103.344,"notes":null},"dropoff":{"name":"Test Customer","phone":"+528112345678","street":"Av. Vallarta 200, Guadalajara","apt_unit":null,"lat":20.6766,"lng":-103.3912,"notes":null,"handoff":"meet_at_door"},"manifest":{"items":[{"name":"Tacos","quantity":2,"size":"small"}]},"vehicle":"moto","courier":{"name":"Test Courier","vehicle":"Test motorcycle","vehicle_type":"moto","plate":"TEST-000","phone":{"masked":"+52 81 **** 5678","pin":null},"location":{"lat":20.6745,"lng":-103.3501,"updated_at":"2026-07-28T18:46:00Z"},"imminent":false},"pickup_eta_at":"2026-07-28T18:50:00Z","dropoff_eta_at":"2026-07-28T19:10:00Z","tracking_url":"https://app.listo.delivery/t/test_sample_000000000000","verification":{"pincode":"4821"},"return_verification":{"pincode":null},"proof":null,"proofs":{"pickup":null,"dropoff":null,"return":null},"cancellation":null,"failure_reason":null,"charges":[],"refunds":[],"refunded_cents":0,"refundable_cents":0,"support_reference":null,"pickup_ready_at":null,"requested_at":"2026-07-28T18:41:03Z","courier_assigned_at":"2026-07-28T18:44:00Z","picked_up_at":null,"delivered_at":null,"canceled_at":null,"returned_at":null,"created_at":"2026-07-28T18:41:03Z","updated_at":"2026-07-28T18:46:00Z"},"test":true},"examples":{"Example":{"title":"Example","value":{"id":"evt_9pQ2vX7mKdR4tYb1nZ3sLwCe","type":"delivery.status_changed","created_at":"2026-11-06T08:49:43Z","data":{"id":"dlv_test_sample_000000000000","external_id":"order-841","origin":"api","code":"LS-2048","status":"courier_assigned","store_id":"st_test_sample_00000000000000","test":false,"payment":{"method":"prepaid","status":"paid","url":null,"cash_to_collect_cents":null,"paid_at":"2026-07-28T18:41:03Z"},"order_value_cents":18000,"fee_cents":6900,"business_fee_cents":6900,"customer_fee_cents":0,"tip_cents":0,"currency":"MXN","quote_id":"qt_test_sample_000000000000","pickup":{"name":"Test Sample Store","street":"Av. Chapultepec 100, Guadalajara","lat":20.6736,"lng":-103.344,"notes":null},"dropoff":{"name":"Test Customer","phone":"+528112345678","street":"Av. Vallarta 200, Guadalajara","apt_unit":null,"lat":20.6766,"lng":-103.3912,"notes":null,"handoff":"meet_at_door"},"manifest":{"items":[{"name":"Tacos","quantity":2,"size":"small"}]},"vehicle":"moto","courier":{"name":"Test Courier","vehicle":"Test motorcycle","vehicle_type":"moto","plate":"TEST-000","phone":{"masked":"+52 81 **** 5678","pin":null},"location":{"lat":20.6745,"lng":-103.3501,"updated_at":"2026-07-28T18:46:00Z"},"imminent":false},"pickup_eta_at":"2026-07-28T18:50:00Z","dropoff_eta_at":"2026-07-28T19:10:00Z","tracking_url":"https://app.listo.delivery/t/test_sample_000000000000","verification":{"pincode":"4821"},"return_verification":{"pincode":null},"proof":null,"proofs":{"pickup":null,"dropoff":null,"return":null},"cancellation":null,"failure_reason":null,"charges":[],"refunds":[],"refunded_cents":0,"refundable_cents":0,"support_reference":null,"pickup_ready_at":null,"requested_at":"2026-07-28T18:41:03Z","courier_assigned_at":"2026-07-28T18:44:00Z","picked_up_at":null,"delivered_at":null,"canceled_at":null,"returned_at":null,"created_at":"2026-07-28T18:41:03Z","updated_at":"2026-07-28T18:46:00Z"},"test":true}}},"exampleType":"examples"}},"exampleType":"examples"},"38eef0ce-4db4-4a68-bc9a-dc1bb6f162e8":{"description":"La llave es válida y es de solo lectura (`read_only_key`), así que puede leer pero no crear, cambiar ni cancelar nada. Usa una llave emitida sin la opción de solo lectura.","content":{"application/json":{"schema":{"type":"object","description":"El cuerpo de toda respuesta 4xx y 5xx de esta API.","properties":{"error":{"type":"object","description":"Cómo se ve todo rechazo y toda falla. `code` es el único\ncampo en el que decidir; `message` es para una persona que lee un registro y puede\ncambiar de redacción o de idioma sin aviso.\n","properties":{"code":{"type":"string","description":"Un nombre estable y legible por máquina de lo que salió mal, como\n`validation_failed`, `not_found` o `insufficient_balance`. Decide\ncon base en esto y nunca en `message`. La lista crece sin romper nada: trata\nun código que no conozcas como el fallo genérico que indica su código de estado.\nCada código tiene una página en `doc_url`.\n","example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Una oración para quien depura. Puede cambiar de redacción o de\nidioma en cualquier momento, así que nunca la uses para comparar.\n","example":"order_value_cents is required.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"El campo de la solicitud al que se refiere el rechazo, cuando aplica, escrito\ncomo lo enviaste (`dropoff.street`, `manifest.items`). Null cuando la\nfalla no se refiere a un solo campo.\n","example":"order_value_cents","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"El campo de la solicitud al que se refiere el rechazo, cuando aplica, escrito\ncomo lo enviaste (`dropoff.street`, `manifest.items`). Null cuando la\nfalla no se refiere a un solo campo.\n","example":"order_value_cents","isRequired":true,"uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.param","typeLabel":"string | null"},"retryable":{"type":"boolean","description":"Si volver a enviar la misma solicitud podría tener éxito. `false`\nsignifica que nunca lo tendrá sin un cambio de tu lado o en el mundo.\n","example":false,"isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"La página de documentación de este `code`.","example":"https://docs.listo.delivery/en/errors/validation_failed","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Nuestro id de esta solicitud, el mismo valor que el encabezado de respuesta\n`X-Request-Id`. Cítalo a soporte, y filtra\n`GET /v1/request_logs` por él.\n","example":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"}},"required":["code","message","param","retryable","doc_url","request_id"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"read_only_key":{"title":"read_only_key","value":{"error":{"code":"read_only_key","message":"This API key is read-only. Use a key without the read-only setting to create, change or cancel anything.","param":null,"retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/read_only_key","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"f1248fa4-c8c7-435a-b80c-c376d82c2b0e":{"description":"La solicitud entra en conflicto con el estado actual. El objeto ya no está en un estado que permita esto (`not_cancellable`, `not_reschedulable`, `not_retriable`, `not_editable`, `not_refundable`, `not_reactivatable`, `plan_ended`), la cancelación no se completó (`cancel_failed`), el cobro del plan aún está en el banco (`charge_in_progress`), la llave de idempotencia se reutilizó con otro cuerpo (`idempotency_conflict`, que ningún reintento corrige), la llave de idempotencia aún la retiene la solicitud que la envió primero (`idempotency_conflict`, y una vez que esa solicitud respondió, la misma llamada con la misma llave repite su respuesta), no hay URL de webhook configurada para el modo de la llave, así que no hay a dónde enviar (`webhook_endpoint_not_configured`), el evento es una posición del repartidor, que nunca se vuelve a enviar (`event_not_resendable`), el correo ya tiene una cuenta de Listo (`account_exists`), el punto de recolección de la tienda aún se está moviendo (`pickup_point_pending`), o ningún repartidor está libre para este viaje en este momento (`no_couriers_available`). Vale la pena repetirla sin cambios después de unos minutos: `cancel_failed`, `charge_in_progress`, `pickup_point_pending`, `no_couriers_available`, y una llamada rechazada porque su llave de idempotencia sigue retenida (repítela con la misma llave). Cualquier otro rechazo aquí requiere que primero cambien la solicitud o el objeto.","content":{"application/json":{"schema":{"type":"object","description":"El cuerpo de toda respuesta 4xx y 5xx de esta API.","properties":{"error":{"type":"object","description":"Cómo se ve todo rechazo y toda falla. `code` es el único\ncampo en el que decidir; `message` es para una persona que lee un registro y puede\ncambiar de redacción o de idioma sin aviso.\n","properties":{"code":{"type":"string","description":"Un nombre estable y legible por máquina de lo que salió mal, como\n`validation_failed`, `not_found` o `insufficient_balance`. Decide\ncon base en esto y nunca en `message`. La lista crece sin romper nada: trata\nun código que no conozcas como el fallo genérico que indica su código de estado.\nCada código tiene una página en `doc_url`.\n","example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Una oración para quien depura. Puede cambiar de redacción o de\nidioma en cualquier momento, así que nunca la uses para comparar.\n","example":"order_value_cents is required.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"El campo de la solicitud al que se refiere el rechazo, cuando aplica, escrito\ncomo lo enviaste (`dropoff.street`, `manifest.items`). Null cuando la\nfalla no se refiere a un solo campo.\n","example":"order_value_cents","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"El campo de la solicitud al que se refiere el rechazo, cuando aplica, escrito\ncomo lo enviaste (`dropoff.street`, `manifest.items`). Null cuando la\nfalla no se refiere a un solo campo.\n","example":"order_value_cents","isRequired":true,"uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.param","typeLabel":"string | null"},"retryable":{"type":"boolean","description":"Si volver a enviar la misma solicitud podría tener éxito. `false`\nsignifica que nunca lo tendrá sin un cambio de tu lado o en el mundo.\n","example":false,"isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"La página de documentación de este `code`.","example":"https://docs.listo.delivery/en/errors/validation_failed","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Nuestro id de esta solicitud, el mismo valor que el encabezado de respuesta\n`X-Request-Id`. Cítalo a soporte, y filtra\n`GET /v1/request_logs` por él.\n","example":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"}},"required":["code","message","param","retryable","doc_url","request_id"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"webhook_endpoint_not_configured","message":"There is no webhook URL configured for this mode, so there is nowhere to send it.","param":null,"retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/webhook_endpoint_not_configured","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"webhook_endpoint_not_configured","message":"There is no webhook URL configured for this mode, so there is nowhere to send it.","param":null,"retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/webhook_endpoint_not_configured","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"727f9bc3-e208-4b93-ad97-50c625308071":{"description":"La solicitud se entendió y se rechazó. `error.code` dice por qué y `error.param` nombra el campo con el problema cuando aplica.","content":{"application/json":{"schema":{"type":"object","description":"El cuerpo de toda respuesta 4xx y 5xx de esta API.","properties":{"error":{"type":"object","description":"Cómo se ve todo rechazo y toda falla. `code` es el único\ncampo en el que decidir; `message` es para una persona que lee un registro y puede\ncambiar de redacción o de idioma sin aviso.\n","properties":{"code":{"type":"string","description":"Un nombre estable y legible por máquina de lo que salió mal, como\n`validation_failed`, `not_found` o `insufficient_balance`. Decide\ncon base en esto y nunca en `message`. La lista crece sin romper nada: trata\nun código que no conozcas como el fallo genérico que indica su código de estado.\nCada código tiene una página en `doc_url`.\n","example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Una oración para quien depura. Puede cambiar de redacción o de\nidioma en cualquier momento, así que nunca la uses para comparar.\n","example":"order_value_cents is required.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"El campo de la solicitud al que se refiere el rechazo, cuando aplica, escrito\ncomo lo enviaste (`dropoff.street`, `manifest.items`). Null cuando la\nfalla no se refiere a un solo campo.\n","example":"order_value_cents","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"El campo de la solicitud al que se refiere el rechazo, cuando aplica, escrito\ncomo lo enviaste (`dropoff.street`, `manifest.items`). Null cuando la\nfalla no se refiere a un solo campo.\n","example":"order_value_cents","isRequired":true,"uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.param","typeLabel":"string | null"},"retryable":{"type":"boolean","description":"Si volver a enviar la misma solicitud podría tener éxito. `false`\nsignifica que nunca lo tendrá sin un cambio de tu lado o en el mundo.\n","example":false,"isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"La página de documentación de este `code`.","example":"https://docs.listo.delivery/en/errors/validation_failed","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Nuestro id de esta solicitud, el mismo valor que el encabezado de respuesta\n`X-Request-Id`. Cítalo a soporte, y filtra\n`GET /v1/request_logs` por él.\n","example":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"}},"required":["code","message","param","retryable","doc_url","request_id"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"validation_failed","message":"That is not a webhook event type.","param":"type","retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/validation_failed","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"validation_failed","message":"That is not a webhook event type.","param":"type","retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/validation_failed","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"b270a378-f160-4c00-8f82-6c3188daf2f7":{"description":"Demasiadas solicitudes (`rate_limited`). Espera un momento y vuelve a intentar. Un reenvío rechazado porque el evento ya se había reenviado 5 veces en la última hora es `resend_limit_reached`, y un webhook de prueba rechazado porque ya se habían enviado 30 en la última hora es `test_webhook_limit_reached`; en ambos casos vale la pena reintentarlo cuando haya pasado la hora.","content":{"application/json":{"schema":{"type":"object","description":"El cuerpo de toda respuesta 4xx y 5xx de esta API.","properties":{"error":{"type":"object","description":"Cómo se ve todo rechazo y toda falla. `code` es el único\ncampo en el que decidir; `message` es para una persona que lee un registro y puede\ncambiar de redacción o de idioma sin aviso.\n","properties":{"code":{"type":"string","description":"Un nombre estable y legible por máquina de lo que salió mal, como\n`validation_failed`, `not_found` o `insufficient_balance`. Decide\ncon base en esto y nunca en `message`. La lista crece sin romper nada: trata\nun código que no conozcas como el fallo genérico que indica su código de estado.\nCada código tiene una página en `doc_url`.\n","example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"Una oración para quien depura. Puede cambiar de redacción o de\nidioma en cualquier momento, así que nunca la uses para comparar.\n","example":"order_value_cents is required.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"El campo de la solicitud al que se refiere el rechazo, cuando aplica, escrito\ncomo lo enviaste (`dropoff.street`, `manifest.items`). Null cuando la\nfalla no se refiere a un solo campo.\n","example":"order_value_cents","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"El campo de la solicitud al que se refiere el rechazo, cuando aplica, escrito\ncomo lo enviaste (`dropoff.street`, `manifest.items`). Null cuando la\nfalla no se refiere a un solo campo.\n","example":"order_value_cents","isRequired":true,"uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.param","typeLabel":"string | null"},"retryable":{"type":"boolean","description":"Si volver a enviar la misma solicitud podría tener éxito. `false`\nsignifica que nunca lo tendrá sin un cambio de tu lado o en el mundo.\n","example":false,"isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"La página de documentación de este `code`.","example":"https://docs.listo.delivery/en/errors/validation_failed","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Nuestro id de esta solicitud, el mismo valor que el encabezado de respuesta\n`X-Request-Id`. Cítalo a soporte, y filtra\n`GET /v1/request_logs` por él.\n","example":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10","isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"}},"required":["code","message","param","retryable","doc_url","request_id"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"test_webhook_limit_reached","message":"30 test webhooks were already sent in the last hour. Try again later.","param":null,"retryable":true,"doc_url":"https://docs.listo.delivery/en/errors/test_webhook_limit_reached","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"test_webhook_limit_reached","message":"30 test webhooks were already sent in the last hour. Try again later.","param":null,"retryable":true,"doc_url":"https://docs.listo.delivery/en/errors/test_webhook_limit_reached","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"8ad36263-f598-48c2-93b8-5d50f3e3fe43":{"BearerAuth":{"type":"http","scheme":"bearer","description":"Tu llave de API, enviada como `Authorization: Bearer \u003ckey>`. 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.","scopes":[],"schemeName":"BearerAuth"}}},"servers":{"f399fc83-7e7d-462b-bf3b-3042989289cb":{"url":"https://api.listo.delivery"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Tu llave de API, enviada como `Authorization: Bearer \u003ckey>`. 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.","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Tu llave de API, enviada como `Authorization: Bearer \u003ckey>`. 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.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"}]},"originalFileLocation":"openapi/es.yaml"},"subdomain":"listo-c5a11a00","siteName":"Listo Partner API","title":"Envía un webhook de prueba - Listo Partner API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/api-reference/events/send-a-test-webhook","matchLevel":1},"es":{"href":"/es/api-reference/events/send-a-test-webhook","matchLevel":0}}},"lastModified":"2026-11-07T01:48:56.286Z","originalFileLocation":"es/api-reference/events/send-a-test-webhook.mdx","locale":"es"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Envía un evento sintético de un type publicado a tu URL de webhook, para probar un endpoint sin hacer un pedido. La respuesta es 202 con el evento tal como lo recibe tu endpoint, y el intento aparece en GET /v1/webhook_deliveries como cualquier otro. - test: true va en el sobre del evento. Un evento real nunca trae el campo. Revísalo antes de hacer algo con consecuencias. - Sus ids no resuelven a nada. data es una muestra realista del tipo, pero el envío, la tienda, el retiro o la cotización que nombra no existen, así que leerlo después responde 404. - Cualquiera de los dos modos. Una llave de prueba envía a tu endpoint de prueba y una llave real al tuyo real. El endpoint real sí recibe el evento de prueba. - Treinta por hora y por modo. La trigésima primera es 429 test_webhook_limit_reached, que se puede reintentar cuando pase la hora. Retry-After indica cuántos segundos faltan para que puedas volver a enviar. Un type que no es un tipo de evento publicado es 422 validation_failed con param: \u0026quot;type\u0026quot;. Si no hay URL de webhook configurada para el modo de la llave, la respuesta es 409 webhook_endpoint_not_configured.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Listo Partner API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/listo-c5a11a00/GMBEN5uWEX-r6cRJ/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/listo-c5a11a00/GMBEN5uWEX-r6cRJ/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/listo-c5a11a00/GMBEN5uWEX-r6cRJ/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/listo-c5a11a00/GMBEN5uWEX-r6cRJ/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/listo-c5a11a00/GMBEN5uWEX-r6cRJ/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/listo-c5a11a00/GMBEN5uWEX-r6cRJ/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/listo-c5a11a00/GMBEN5uWEX-r6cRJ/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/listo-c5a11a00/GMBEN5uWEX-r6cRJ/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/listo-c5a11a00/GMBEN5uWEX-r6cRJ/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Envía un webhook de prueba - Listo Partner API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Envía un evento sintético de un type publicado a tu URL de webhook, para probar un endpoint sin hacer un pedido. La respuesta es 202 con el evento tal como lo recibe tu endpoint, y el intento aparece en GET /v1/webhook_deliveries como cualquier otro. - test: true va en el sobre del evento. Un evento real nunca trae el campo. Revísalo antes de hacer algo con consecuencias. - Sus ids no resuelven a nada. data es una muestra realista del tipo, pero el envío, la tienda, el retiro o la cotización que nombra no existen, así que leerlo después responde 404. - Cualquiera de los dos modos. Una llave de prueba envía a tu endpoint de prueba y una llave real al tuyo real. El endpoint real sí recibe el evento de prueba. - Treinta por hora y por modo. La trigésima primera es 429 test_webhook_limit_reached, que se puede reintentar cuando pase la hora. Retry-After indica cuántos segundos faltan para que puedas volver a enviar. Un type que no es un tipo de evento publicado es 422 validation_failed con param: \u0026quot;type\u0026quot;. Si no hay URL de webhook configurada para el modo de la llave, la respuesta es 409 webhook_endpoint_not_configured.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Listo Partner API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.listo.delivery/es/api-reference/events/send-a-test-webhook\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://listo-c5a11a00.mintlify.site/_mintlify/api/og/v2?title=Env%C3%ADa+un+webhook+de+prueba\u0026amp;description=Env%C3%ADa+un+evento+sint%C3%A9tico+de+un+%60type%60+publicado+a+tu+URL+de+webhook%2C+para%0Aprobar+un+endpoint+sin+hacer+un+pedido.+La+respuesta+es+%60202%60%0Acon+el+evento+tal+como+\u0026amp;theme=77fcfc9066d8b9eb9850b729\u0026amp;signature=4be4f503216815b7e455dab4d626c03f1287eb1623d0d649b7576e066129f5f0\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Envía un webhook de prueba - Listo Partner API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Envía un evento sintético de un type publicado a tu URL de webhook, para probar un endpoint sin hacer un pedido. La respuesta es 202 con el evento tal como lo recibe tu endpoint, y el intento aparece en GET /v1/webhook_deliveries como cualquier otro. - test: true va en el sobre del evento. Un evento real nunca trae el campo. Revísalo antes de hacer algo con consecuencias. - Sus ids no resuelven a nada. data es una muestra realista del tipo, pero el envío, la tienda, el retiro o la cotización que nombra no existen, así que leerlo después responde 404. - Cualquiera de los dos modos. Una llave de prueba envía a tu endpoint de prueba y una llave real al tuyo real. El endpoint real sí recibe el evento de prueba. - Treinta por hora y por modo. La trigésima primera es 429 test_webhook_limit_reached, que se puede reintentar cuando pase la hora. Retry-After indica cuántos segundos faltan para que puedas volver a enviar. Un type que no es un tipo de evento publicado es 422 validation_failed con param: \u0026quot;type\u0026quot;. Si no hay URL de webhook configurada para el modo de la llave, la respuesta es 409 webhook_endpoint_not_configured.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://listo-c5a11a00.mintlify.site/_mintlify/api/og/v2?title=Env%C3%ADa+un+webhook+de+prueba\u0026amp;description=Env%C3%ADa+un+evento+sint%C3%A9tico+de+un+%60type%60+publicado+a+tu+URL+de+webhook%2C+para%0Aprobar+un+endpoint+sin+hacer+un+pedido.+La+respuesta+es+%60202%60%0Acon+el+evento+tal+como+\u0026amp;theme=77fcfc9066d8b9eb9850b729\u0026amp;signature=4be4f503216815b7e455dab4d626c03f1287eb1623d0d649b7576e066129f5f0\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/listo-c5a11a00/GMBEN5uWEX-r6cRJ/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Listo Partner API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#15171C\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.listo.delivery/es/api-reference/events/send-a-test-webhook\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/es/api-reference/events/send-a-test-webhook.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.listo.delivery/es/api-reference/events/send-a-test-webhook\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.listo.delivery/api-reference/events/send-a-test-webhook\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.listo.delivery/api-reference/events/send-a-test-webhook\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.listo.delivery/#organization\",\"name\":\"Listo Partner API\",\"url\":\"https://docs.listo.delivery\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/listo-c5a11a00/mreCwXzcEA2bSZog/logo/light.svg?fit=max\u0026auto=format\u0026n=mreCwXzcEA2bSZog\u0026q=85\u0026s=da2b28d464dc6987329dfd5971085dd7\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.listo.delivery#website\",\"name\":\"Listo Partner API\",\"url\":\"https://docs.listo.delivery\",\"publisher\":{\"@id\":\"https://docs.listo.delivery/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.listo.delivery/es/api-reference/events/send-a-test-webhook#webpage\",\"url\":\"https://docs.listo.delivery/es/api-reference/events/send-a-test-webhook\",\"name\":\"Envía un webhook de prueba\",\"description\":\"Envía un evento sintético de un type publicado a tu URL de webhook, para probar un endpoint sin hacer un pedido. La respuesta es 202 con el evento tal como lo recibe tu endpoint, y el intento aparece en GET /v1/webhook_deliveries como cualquier otro. - test: true va en el sobre del evento. Un evento real nunca trae el campo. Revísalo antes de hacer algo con consecuencias. - Sus ids no resuelven a nada. data es una muestra realista del tipo, pero el envío, la tienda, el retiro o la cotización que nombra no existen, así que leerlo después responde 404. - Cualquiera de los dos modos. Una llave de prueba envía a tu endpoint de prueba y una llave real al tuyo real. El endpoint real sí recibe el evento de prueba. - Treinta por hora y por modo. La trigésima primera es 429 test_webhook_limit_reached, que se puede reintentar cuando pase la hora. Retry-After indica cuántos segundos faltan para que puedas volver a enviar. Un type que no es un tipo de evento publicado es 422 validation_failed con param: \\\"type\\\". Si no hay URL de webhook configurada para el modo de la llave, la respuesta es 409 webhook_endpoint_not_configured.\",\"dateModified\":\"2026-11-07T01:48:56.286Z\",\"isPartOf\":{\"@id\":\"https://docs.listo.delivery#website\"},\"breadcrumb\":{\"@id\":\"https://docs.listo.delivery/es/api-reference/events/send-a-test-webhook#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.listo.delivery/es/api-reference/events/send-a-test-webhook#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Referencia\",\"item\":\"https://docs.listo.delivery/es/api-reference/balance/read-your-prepaid-balance\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Eventos\",\"item\":\"https://docs.listo.delivery/es/api-reference/events/list-your-webhook-events\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Envía un webhook de prueba\",\"item\":\"https://docs.listo.delivery/es/api-reference/events/send-a-test-webhook\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.listo.delivery/es/api-reference/events/send-a-test-webhook#apireference\",\"headline\":\"Envía un webhook de prueba\",\"name\":\"Envía un webhook de prueba\",\"description\":\"Envía un evento sintético de un type publicado a tu URL de webhook, para probar un endpoint sin hacer un pedido. La respuesta es 202 con el evento tal como lo recibe tu endpoint, y el intento aparece en GET /v1/webhook_deliveries como cualquier otro. - test: true va en el sobre del evento. Un evento real nunca trae el campo. Revísalo antes de hacer algo con consecuencias. - Sus ids no resuelven a nada. data es una muestra realista del tipo, pero el envío, la tienda, el retiro o la cotización que nombra no existen, así que leerlo después responde 404. - Cualquiera de los dos modos. Una llave de prueba envía a tu endpoint de prueba y una llave real al tuyo real. El endpoint real sí recibe el evento de prueba. - Treinta por hora y por modo. La trigésima primera es 429 test_webhook_limit_reached, que se puede reintentar cuando pase la hora. Retry-After indica cuántos segundos faltan para que puedas volver a enviar. Un type que no es un tipo de evento publicado es 422 validation_failed con param: \\\"type\\\". Si no hay URL de webhook configurada para el modo de la llave, la respuesta es 409 webhook_endpoint_not_configured.\",\"url\":\"https://docs.listo.delivery/es/api-reference/events/send-a-test-webhook\",\"mainEntityOfPage\":{\"@id\":\"https://docs.listo.delivery/es/api-reference/events/send-a-test-webhook#webpage\"},\"dateModified\":\"2026-11-07T01:48:56.286Z\",\"publisher\":{\"@id\":\"https://docs.listo.delivery/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.listo.delivery#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Listo Partner API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Listo Partner API","nav":{"global":null,"languages":[{"language":"en","default":true,"navbar":{"links":[{"href":"https://status.listo.delivery","label":"Status"}]},"pages":[{"title":"en","href":"/api-reference/events/send-a-test-webhook"}]},{"language":"es","navbar":{"links":[{"href":"https://status.listo.delivery","label":"Estado del servicio"}]},"groups":[{"group":"Primeros pasos","pages":[{"title":"Inicio rápido","href":"/es/quickstart"}]},{"group":"Guías","pages":[{"title":"Cotiza y crea un envío","href":"/es/guides/quote-and-create"},{"title":"Recibe y verifica webhooks","href":"/es/guides/webhooks"},{"title":"Depurar tu integración","href":"/es/guides/debugging"},{"title":"Construye con IA","href":"/es/guides/build-with-ai"},{"title":"Fondea tu saldo y retira","href":"/es/guides/balance-and-withdrawals"},{"title":"Sal a producción","href":"/es/guides/go-live"},{"title":"Conecta un restaurante que ya usa Listo","sidebarTitle":"Conecta una cuenta existente","href":"/es/guides/connect-existing-account"},{"title":"Plan y cobro","href":"/es/guides/plan-and-billing"},{"title":"Conecta Claude, Cursor o Codex","href":"/es/guides/connect-ai-client"}]},{"group":"Errores","expanded":false,"pages":[{"title":"Errores","href":"/es/errors/index"},{"title":"account_exists","href":"/es/errors/account_exists"},{"title":"address_not_found","href":"/es/errors/address_not_found"},{"title":"address_undeliverable","href":"/es/errors/address_undeliverable"},{"title":"cancel_failed","href":"/es/errors/cancel_failed"},{"title":"card_below_minimum","href":"/es/errors/card_below_minimum"},{"title":"card_not_ready","href":"/es/errors/card_not_ready"},{"title":"cash_over_cap","href":"/es/errors/cash_over_cap"},{"title":"charge_in_progress","href":"/es/errors/charge_in_progress"},{"title":"code_expired","href":"/es/errors/code_expired"},{"title":"console_access_required","href":"/es/errors/console_access_required"},{"title":"event_not_resendable","href":"/es/errors/event_not_resendable"},{"title":"idempotency_conflict","href":"/es/errors/idempotency_conflict"},{"title":"insufficient_balance","href":"/es/errors/insufficient_balance"},{"title":"internal_error","href":"/es/errors/internal_error"},{"title":"invalid_api_key","href":"/es/errors/invalid_api_key"},{"title":"no_couriers_available","href":"/es/errors/no_couriers_available"},{"title":"not_cancellable","href":"/es/errors/not_cancellable"},{"title":"not_editable","href":"/es/errors/not_editable"},{"title":"not_found","href":"/es/errors/not_found"},{"title":"not_reactivatable","href":"/es/errors/not_reactivatable"},{"title":"not_refundable","href":"/es/errors/not_refundable"},{"title":"not_reschedulable","href":"/es/errors/not_reschedulable"},{"title":"not_retriable","href":"/es/errors/not_retriable"},{"title":"order_too_large","href":"/es/errors/order_too_large"},{"title":"out_of_service_area","href":"/es/errors/out_of_service_area"},{"title":"payout_account_not_ready","href":"/es/errors/payout_account_not_ready"},{"title":"pickup_point_pending","href":"/es/errors/pickup_point_pending"},{"title":"plan_ended","href":"/es/errors/plan_ended"},{"title":"plan_required","href":"/es/errors/plan_required"},{"title":"provider_unavailable","href":"/es/errors/provider_unavailable"},{"title":"quote_consumed","href":"/es/errors/quote_consumed"},{"title":"quote_expired","href":"/es/errors/quote_expired"},{"title":"rate_limited","href":"/es/errors/rate_limited"},{"title":"read_only_key","href":"/es/errors/read_only_key"},{"title":"refund_amount_too_large","href":"/es/errors/refund_amount_too_large"},{"title":"resend_limit_reached","href":"/es/errors/resend_limit_reached"},{"title":"same_day_below_minimum","href":"/es/errors/same_day_below_minimum"},{"title":"same_day_cap_exceeded","href":"/es/errors/same_day_cap_exceeded"},{"title":"test_webhook_limit_reached","href":"/es/errors/test_webhook_limit_reached"},{"title":"unsupported_country","href":"/es/errors/unsupported_country"},{"title":"validation_failed","href":"/es/errors/validation_failed"},{"title":"webhook_endpoint_not_configured","href":"/es/errors/webhook_endpoint_not_configured"}]},{"group":"Referencia","pages":[{"group":"Saldo","pages":[{"title":"Consulta tu saldo prepagado","deprecated":null,"version":null,"sidebarTitle":"Consulta tu saldo prepagado","openapi":"/openapi/es.yaml get /v1/balance","href":"/es/api-reference/balance/read-your-prepaid-balance"},{"title":"Consulta el saldo de una tienda","deprecated":null,"version":null,"sidebarTitle":"Consulta el saldo de una tienda","openapi":"/openapi/es.yaml get /v1/stores/{store_id}/balance","href":"/es/api-reference/balance/read-a-stores-balance"}]},{"group":"Conexión de cuenta","pages":[{"title":"Pide a un restaurante que conecte la cuenta que ya tiene en Listo","deprecated":null,"version":null,"sidebarTitle":"Pide a un restaurante que conecte la cuenta que ya tiene en Listo","openapi":"/openapi/es.yaml post /v1/connect_requests","href":"/es/api-reference/account-connection/ask-a-restaurant-to-connect-its-account"},{"title":"Canjea una aprobación por la tienda","deprecated":null,"version":null,"sidebarTitle":"Canjea una aprobación por la tienda","openapi":"/openapi/es.yaml post /v1/connections","href":"/es/api-reference/account-connection/exchange-an-approval-for-the-store"}]},{"group":"Envíos","pages":[{"title":"Lista envíos","deprecated":null,"version":null,"sidebarTitle":"Lista envíos","openapi":"/openapi/es.yaml get /v1/deliveries","href":"/es/api-reference/deliveries/list-deliveries"},{"title":"Crea un envío","deprecated":null,"version":null,"sidebarTitle":"Crea un envío","openapi":"/openapi/es.yaml post /v1/deliveries","href":"/es/api-reference/deliveries/create-a-delivery"},{"title":"Cancela un envío","deprecated":null,"version":null,"sidebarTitle":"Cancela un envío","openapi":"/openapi/es.yaml post /v1/deliveries/{delivery_id}/cancellations","href":"/es/api-reference/deliveries/cancel-a-delivery"},{"title":"Reembolsa un envío","deprecated":null,"version":null,"sidebarTitle":"Reembolsa un envío","openapi":"/openapi/es.yaml post /v1/deliveries/{delivery_id}/refunds","href":"/es/api-reference/deliveries/refund-a-delivery"},{"title":"Reintenta un despacho fallido","deprecated":null,"version":null,"sidebarTitle":"Reintenta un despacho fallido","openapi":"/openapi/es.yaml post /v1/deliveries/{delivery_id}/retries","href":"/es/api-reference/deliveries/retry-a-failed-dispatch"},{"title":"Obtén un envío","deprecated":null,"version":null,"sidebarTitle":"Obtén un envío","openapi":"/openapi/es.yaml get /v1/deliveries/{id}","href":"/es/api-reference/deliveries/fetch-a-delivery"},{"title":"Actualiza un envío","deprecated":null,"version":null,"sidebarTitle":"Actualiza un envío","openapi":"/openapi/es.yaml patch /v1/deliveries/{id}","href":"/es/api-reference/deliveries/update-a-delivery"}]},{"group":"Eventos","pages":[{"title":"Lista tus eventos de webhook","deprecated":null,"version":null,"sidebarTitle":"Lista tus eventos de webhook","openapi":"/openapi/es.yaml get /v1/events","href":"/es/api-reference/events/list-your-webhook-events"},{"title":"Reenvía un evento de webhook","deprecated":null,"version":null,"sidebarTitle":"Reenvía un evento de webhook","openapi":"/openapi/es.yaml post /v1/events/{event_id}/resend","href":"/es/api-reference/events/send-a-webhook-event-again"},{"title":"Obtén un evento de webhook","description":"Un evento, con el sobre en el que lo recibe tu endpoint. Un evento que no es tuyo, o que pertenece al otro modo, es `404 not_found`.\n","deprecated":null,"version":null,"sidebarTitle":"Obtén un evento de webhook","openapi":"/openapi/es.yaml get /v1/events/{id}","href":"/es/api-reference/events/retrieve-a-webhook-event"},{"title":"Envía un webhook de prueba","deprecated":null,"version":null,"sidebarTitle":"Envía un webhook de prueba","openapi":"/openapi/es.yaml post /v1/test_webhooks","href":"/es/api-reference/events/send-a-test-webhook"}]},{"group":"Historial","pages":[{"title":"Lista tus movimientos del historial","description":"Cada movimiento de tu saldo, los más nuevos primero, paginado por keyset. Es la superficie de conciliación: cierra un periodo recorriéndolo en lugar de sumar eventos de webhook, de modo que un evento que se te escapó, o uno que reenviaste, no cambia nada de lo que puedes reconstruir.\n\n`amount_cents` tiene signo: los abonos son positivos y los cargos negativos, y por eso una página suma el movimiento de tu saldo a lo largo de ella. Lee la\ndirección por ese signo y nunca por `type`.\n\n`type` indica de dónde viene un movimiento. El par que conviene conocer es el\nque produce un viaje desperdiciado:\n\n- `provider_charge` es la tarifa de envío cobrada por una cancelación tardía\n o un viaje de regreso, una tarifa por cada tramo recorrido, menos tu propio\n recargo como tienda. Es negativo y está ligado al pedido que lo causó. **Este\n monto cambió el 2026-08-29**: antes era lo que le costaba a Listo el viaje\n desperdiciado, así que espera valores más altos en los mismos pedidos desde\n esa fecha en adelante. La fila en sí no cambió.\n- `provider_charge_reversal` es ese cargo devuelto por completo, cuando resulta que el costo no se debía. Es positivo y se registra como una fila propia contra el mismo `delivery_id`, en lugar de como una reducción del cargo original, así que lo que te cobraron y lo que regresó siguen siendo legibles. Puede llegar semanas después del cargo. Empareja las\n dos por `delivery_id` y espera montos iguales y opuestos.\n\nUn tercer valor puede aparecer en el mismo pedido y es un monto distinto bajo otro encabezado:\n\n- `order_value_reimbursement` es el valor de un pedido que un repartidor recogió y que no llegó a nadie, abonado después de que lo reclamamos. Es positivo, ligado al pedido al que pertenece, y NO se empareja con ningún cargo en este historial: el valor del pedido nunca pasó por tu saldo, así que no hay nada que compensar. Se decide caso por caso y no está garantizado, así que nunca lo derives del total del pedido ni esperes uno por incidente.\n- `listo_charge_correction` es un cargo que Listo hizo por error y devolvió: un `provider_charge` que no te correspondía pagar. Es positivo, ligado al pedido que corrige, y se registra como una fila propia junto al cargo original, nunca como una reducción de este. Empárejalo con el cargo por `delivery_id`; puede ser menor que el cargo, y un pedido puede tener más de uno. Se decide caso por caso, así que nunca lo derives de un cargo ni esperes uno por cada cargo.\n- `requote_adjustment` es la diferencia entre la tarifa que se le cobró al pedido y la tarifa que la red de repartidores registró para el viaje, cuando las dos no son iguales. Tiene signo: negativo cuando el viaje registrado costó más de lo que te cobramos, positivo cuando costó menos. Va ligado al pedido, se registra como una fila propia junto al cargo del pedido y nunca como una reescritura de este, y un reintento del mismo pedido lo ajusta al viaje finalmente registrado en lugar de sumar otro. No se empareja con ninguna otra fila, y es poco común.\n\nUno más es dinero que ganas, y es un abono:\n\n- `developer_share` es lo que ganas por un viaje entregado de tu propia tienda, abonado cuando el viaje se entrega. Es positivo, y está ligado al pedido al que pertenece. Un viaje cancelado o devuelto no genera nada.\n\nOtros dos son el Plan Listo de una tienda, pagados desde tu saldo:\n\n- `plan_charge` es un mes del plan de una tienda, con IVA incluido. Negativo.\n Un mes pagado con tarjeta no escribe fila, porque nunca tocó el saldo.\n- `plan_extra_charge` son las conversaciones del asistente de WhatsApp que pasan de lo que incluye el plan de una tienda `full`, cobradas a ti junto con el plan de esa tienda. Negativo.\n\n`store_id` indica a qué tienda pertenece un movimiento, en cada fila: la tienda del pedido, o la tienda cuyo plan se pagó. Es `null` cuando un movimiento no pertenece a una sola tienda, como una recarga o un retiro.\n\nEste vocabulario CRECE. Pueden aparecer valores nuevos en cualquier versión, porque v1 cambia de forma aditiva y un movimiento que todavía no sabes nombrar sigue siendo dinero que se movió. Así que ramifica según los valores que conoces y deja que el resto pase de largo: cuenta un `type` desconocido dentro del saldo, muéstralo, y no lo descartes ni lo rechaces. Las filas que descartas son la diferencia entre tus registros contables y `GET /v1/balance`.\n","deprecated":null,"version":null,"sidebarTitle":"Lista tus movimientos del historial","openapi":"/openapi/es.yaml get /v1/ledger","href":"/es/api-reference/ledger/list-your-ledger-entries"},{"title":"Lista los movimientos del historial de una tienda","deprecated":null,"version":null,"sidebarTitle":"Lista los movimientos del historial de una tienda","openapi":"/openapi/es.yaml get /v1/stores/{store_id}/ledger","href":"/es/api-reference/ledger/list-a-stores-ledger-entries"}]},{"group":"Autenticación","pages":[{"title":"Verifica que tu llave de API funciona","deprecated":null,"version":null,"sidebarTitle":"Verifica que tu llave de API funciona","openapi":"/openapi/es.yaml get /v1/ping","href":"/es/api-reference/authentication/check-that-your-api-key-works"}]},{"group":"Cotizaciones","pages":[{"title":"Cotiza un envío","deprecated":null,"version":null,"sidebarTitle":"Cotiza un envío","openapi":"/openapi/es.yaml post /v1/quotes","href":"/es/api-reference/quotes/price-a-delivery"}]},{"group":"Registro de solicitudes","pages":[{"title":"Lista tu registro de solicitudes","deprecated":null,"version":null,"sidebarTitle":"Lista tu registro de solicitudes","openapi":"/openapi/es.yaml get /v1/request_logs","href":"/es/api-reference/request-logs/list-your-request-log"},{"title":"Obtén una entrada del registro de solicitudes","deprecated":null,"version":null,"sidebarTitle":"Obtén una entrada del registro de solicitudes","openapi":"/openapi/es.yaml get /v1/request_logs/{id}","href":"/es/api-reference/request-logs/retrieve-a-request-log-entry"}]},{"group":"Tiendas","pages":[{"title":"Lista tus tiendas","deprecated":null,"version":null,"sidebarTitle":"Lista tus tiendas","openapi":"/openapi/es.yaml get /v1/stores","href":"/es/api-reference/stores/list-your-stores"},{"title":"Crea una tienda","deprecated":null,"version":null,"sidebarTitle":"Crea una tienda","openapi":"/openapi/es.yaml post /v1/stores","href":"/es/api-reference/stores/create-a-store"},{"title":"Obtén una tienda","deprecated":null,"version":null,"sidebarTitle":"Obtén una tienda","openapi":"/openapi/es.yaml get /v1/stores/{id}","href":"/es/api-reference/stores/fetch-a-store"},{"title":"Actualiza una tienda","deprecated":null,"version":null,"sidebarTitle":"Actualiza una tienda","openapi":"/openapi/es.yaml patch /v1/stores/{id}","href":"/es/api-reference/stores/update-a-store"},{"title":"Invita al dueño de una tienda","deprecated":null,"version":null,"sidebarTitle":"Invita al dueño de una tienda","openapi":"/openapi/es.yaml post /v1/stores/{store_id}/owner","href":"/es/api-reference/stores/invite-a-store-owner"},{"title":"Reactiva el plan de una tienda","deprecated":null,"version":null,"sidebarTitle":"Reactiva el plan de una tienda","openapi":"/openapi/es.yaml post /v1/stores/{store_id}/plan","href":"/es/api-reference/stores/reactivate-a-stores-plan"},{"title":"Cancela el plan de una tienda","deprecated":null,"version":null,"sidebarTitle":"Cancela el plan de una tienda","openapi":"/openapi/es.yaml post /v1/stores/{store_id}/plan_cancellation","href":"/es/api-reference/stores/cancel-a-stores-plan"},{"title":"Deshaz la cancelación del plan de una tienda","deprecated":null,"version":null,"sidebarTitle":"Deshaz la cancelación del plan de una tienda","openapi":"/openapi/es.yaml delete /v1/stores/{store_id}/plan_cancellation","href":"/es/api-reference/stores/undo-a-stores-plan-cancellation"}]},{"group":"Alta de cobros con tarjeta","pages":[{"title":"Inicia el alta para cobros con tarjeta de una tienda","deprecated":null,"version":null,"sidebarTitle":"Inicia el alta para cobros con tarjeta de una tienda","openapi":"/openapi/es.yaml post /v1/stores/{store_id}/stripe_onboarding","href":"/es/api-reference/card-onboarding/start-card-onboarding-for-a-store"},{"title":"Consulta la disponibilidad para cobrar con tarjeta de una tienda","deprecated":null,"version":null,"sidebarTitle":"Consulta la disponibilidad para cobrar con tarjeta de una tienda","openapi":"/openapi/es.yaml get /v1/stores/{store_id}/stripe_status","href":"/es/api-reference/card-onboarding/read-a-stores-card-readiness"},{"title":"Inicia el alta para cobros con tarjeta de tu empresa","deprecated":null,"version":null,"sidebarTitle":"Inicia el alta para cobros con tarjeta de tu empresa","openapi":"/openapi/es.yaml post /v1/stripe_onboarding","href":"/es/api-reference/card-onboarding/start-card-onboarding-for-your-company"},{"title":"Consulta la disponibilidad para cobrar con tarjeta de tu empresa","deprecated":null,"version":null,"sidebarTitle":"Consulta la disponibilidad para cobrar con tarjeta de tu empresa","openapi":"/openapi/es.yaml get /v1/stripe_status","href":"/es/api-reference/card-onboarding/read-your-companys-card-readiness"}]},{"group":"Entregas de webhook","pages":[{"title":"Lista los intentos de entrega de webhook","deprecated":null,"version":null,"sidebarTitle":"Lista los intentos de entrega de webhook","openapi":"/openapi/es.yaml get /v1/webhook_deliveries","href":"/es/api-reference/webhook-deliveries/list-webhook-delivery-attempts"}]},{"group":"Retiros","pages":[{"title":"Lista tus retiros","deprecated":null,"version":null,"sidebarTitle":"Lista tus retiros","openapi":"/openapi/es.yaml get /v1/withdrawals","href":"/es/api-reference/withdrawals/list-your-withdrawals"},{"title":"Solicita un retiro","deprecated":null,"version":null,"sidebarTitle":"Solicita un retiro","openapi":"/openapi/es.yaml post /v1/withdrawals","href":"/es/api-reference/withdrawals/request-a-withdrawal"},{"title":"Obtén un retiro","deprecated":null,"version":null,"sidebarTitle":"Obtén un retiro","openapi":"/openapi/es.yaml get /v1/withdrawals/{id}","href":"/es/api-reference/withdrawals/fetch-a-withdrawal"}]},{"group":"Webhooks","pages":[{"title":"A delivery reached a new status","version":null,"deprecated":null,"sidebarTitle":"Un envío llegó a un nuevo estado","openapi":"/openapi/es.yaml webhook delivery.status_changed","href":"/es/api-reference/webhooks/a-delivery-reached-a-new-status"},{"title":"A delivery changed without changing status","version":null,"deprecated":null,"sidebarTitle":"Un envío cambió sin cambiar de estado","openapi":"/openapi/es.yaml webhook delivery.updated","href":"/es/api-reference/webhooks/a-delivery-changed-without-changing-status"},{"title":"The courier moved","version":null,"deprecated":null,"sidebarTitle":"El repartidor se movió","openapi":"/openapi/es.yaml webhook delivery.courier_location","href":"/es/api-reference/webhooks/the-courier-moved"},{"title":"A withdrawal was settled","version":null,"deprecated":null,"sidebarTitle":"Un retiro se liquidó","openapi":"/openapi/es.yaml webhook withdrawal.updated","href":"/es/api-reference/webhooks/a-withdrawal-was-settled"},{"title":"A store changed","version":null,"deprecated":null,"sidebarTitle":"Una tienda cambió","openapi":"/openapi/es.yaml webhook store.updated","href":"/es/api-reference/webhooks/a-store-changed"},{"title":"A restaurant connected its existing account to you","version":null,"deprecated":null,"sidebarTitle":"Un restaurante conectó la cuenta de Listo que ya tenía contigo","openapi":"/openapi/es.yaml webhook store.connected","href":"/es/api-reference/webhooks/a-restaurant-connected-its-existing-account-to-you"}]}]},{"group":"Conceptos","pages":[{"title":"El modelo de dinero","href":"/es/concepts/money"},{"title":"De dónde viene un envío","href":"/es/concepts/delivery-origin"},{"title":"Modo de prueba","href":"/es/concepts/test-mode"},{"title":"Firmas","href":"/es/concepts/signing"},{"title":"Efectivo en la puerta","href":"/es/concepts/cash-at-the-door"}]},{"group":"Historial de cambios","pages":[{"title":"Historial de cambios","href":"/es/changelog"}]},{"group":"Legal","pages":[{"title":"Términos para Partners","url":"https://listo.delivery/terminos-partners","href":"/es/terms-for-partners"}]}]}]},"basePath":"","title":"Envía un webhook de prueba - Listo Partner API","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-i2a3QZ8E.js","utils-ChLwp8m0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DRktVTDc.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CA2pEs4T.js","snippetPresets-ClQ6XrKD.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-Ct_Lv36y.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Cn2PYw9e.js","shallow-rkyymjXQ.js","getApiPlaygroundDisplay-BB9vkXtE.js","CodeSnippet-Bm5RU7m1.js","CodeSnippets-BgU9Deuz.js","Page-BUDYNlhG.js","getPastedJson-BD-6NNum.js","icon-8Z6tud2e.js","MethodPill-Tuzr4g3V.js","DuplicateIcon-0ceWFYhN.js","createIcon-FBXow_ST.js","DynamicMarkdown-CD8713Yy.js","SectionHeading-7zgzQbH-.js","axios-vUo_bRtp.js","Markdown-D7Ofw1oz.js","clsx-eKJ4rcii.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CwjSCXIK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-9EK5IAXV.js"]}