Se envía cuando cambia una de tus tiendas, incluidos los cambios que nadie pidió. El caso principal es que cambie la disponibilidad para cobrar con tarjeta una vez que se revisa el alta alojada. Un cambio en el Plan Listo de una tienda real también envía uno, con el plan: un plan que inicia, se renueva, falla o limpia un cobro, se cancela o se deshace esa cancelación, termina, se reinicia, cambia de precio, o pasa a ti desde un restaurante que se conectó. Una acción envía un evento, que lleva el estado en que terminó el plan, y los cambios que caen muy juntos pueden llegar como un solo evento con el estado más reciente. Un evento cuyo objeto de tienda sería exactamente el que te enviamos por última vez para esa tienda no se envía.
data es el objeto de tienda, que NO trae ningún campo de disponibilidad: este evento es la señal, y GET /v1/stores/{id}/stripe_status es la respuesta.
Comprueba que el evento vino de nosotros. El valor es t=<unix seconds>,v1=<hex>,
donde el hex es un HMAC-SHA256, con tu secreto de firma como llave, sobre la
cadena "<t>.<raw request body>".
Para verificarlo: separa el encabezado por la coma, reconstruye "<t>.<body>" a
partir de los bytes CRUDOS que recibiste (nunca un objeto parseado y vuelto a serializar,
porque los espacios en blanco y las secuencias de escape cambiarían la firma), calcula el
HMAC y compáralo con v1 en tiempo constante. Rechaza todo lo que no coincida.
Después revisa el reloj. Rechaza un evento cuyo t esté a más de 5 minutos de distancia de ahora en CUALQUIERA de las dos direcciones: un t muy en el pasado es el replay que este esquema existe para detener, y uno muy en el futuro es el mismo ataque con un reloj que nadie revisó.
Pueden estar activos dos secretos a la vez para que puedas rotar sin tiempo de inactividad: agrega el nuevo, acepta cualquiera de los dos, promuévelo y luego elimina el anterior. Siempre firmamos con el primario.
Los campos que comparten todos los eventos. La entrega es al menos una vez y sin orden
por diseño: deduplica por id, y ordena por created_at o por las marcas de tiempo
propias del objeto, no por orden de llegada. type y data los agrega
cada evento, porque sus valores dependen de cuál evento sea.
Un punto de recolección. La disponibilidad para cobrar con tarjeta NO es un
campo aquí a propósito: tiene endpoint propio, con detalle propio de requisitos pendientes.
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
Respuesta
200
Responde con cualquier 2xx para confirmar el evento.
{"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/webhooks/a-store-changed","slug":"/es/api-reference/webhooks/a-store-changed","pageMetadata":{"title":"A store changed","description":"Se envía cuando cambia una de tus tiendas, incluidos los cambios que nadie pidió. El caso principal es que cambie la disponibilidad para cobrar con tarjeta una vez que se revisa el alta alojada. Un cambio en el Plan Listo de una tienda real también envía uno, con el `plan`: un plan que inicia, se renueva, falla o limpia un cobro, se cancela o se deshace esa cancelación, termina, se reinicia, cambia de precio, o pasa a ti desde un restaurante que se conectó. Una acción envía un evento, que lleva el estado en que terminó el plan, y los cambios que caen muy juntos pueden llegar como un solo evento con el estado más reciente. Un evento cuyo objeto de tienda sería exactamente el que te enviamos por última vez para esa tienda no se envía.\n\n`data` es el objeto de tienda, que NO trae ningún campo de disponibilidad: este evento es la señal, y `GET /v1/stores/{id}/stripe_status` es la respuesta.\n","version":null,"deprecated":null,"sidebarTitle":"Una tienda cambió","openapi":"/openapi/es.yaml webhook store.updated","href":"/es/api-reference/webhooks/a-store-changed","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 p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Se envía cuando cambia una de tus tiendas, incluidos los cambios que nadie pidió. El caso principal es que cambie la disponibilidad para cobrar con tarjeta una vez que se revisa el alta alojada. Un cambio en el Plan Listo de una tienda real también envía uno, con el \", _jsx(_components.code, {\n children: \"plan\"\n }), \": un plan que inicia, se renueva, falla o limpia un cobro, se cancela o se deshace esa cancelación, termina, se reinicia, cambia de precio, o pasa a ti desde un restaurante que se conectó. Una acción envía un evento, que lleva el estado en que terminó el plan, y los cambios que caen muy juntos pueden llegar como un solo evento con el estado más reciente. Un evento cuyo objeto de tienda sería exactamente el que te enviamos por última vez para esa tienda no se envía.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"data\"\n }), \" es el objeto de tienda, que NO trae ningún campo de disponibilidad: este evento es la señal, y \", _jsx(_components.code, {\n children: \"GET /v1/stores/{id}/stripe_status\"\n }), \" es la respuesta.\"]\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":"A store changed","description":"Se envía cuando cambia una de tus tiendas, incluidos los cambios que nadie pidió. El caso principal es que cambie la disponibilidad para cobrar con tarjeta una vez que se revisa el alta alojada. Un cambio en el Plan Listo de una tienda real también envía uno, con el `plan`: un plan que inicia, se renueva, falla o limpia un cobro, se cancela o se deshace esa cancelación, termina, se reinicia, cambia de precio, o pasa a ti desde un restaurante que se conectó. Una acción envía un evento, que lleva el estado en que terminó el plan, y los cambios que caen muy juntos pueden llegar como un solo evento con el estado más reciente. Un evento cuyo objeto de tienda sería exactamente el que te enviamos por última vez para esa tienda no se envía.\n\n`data` es el objeto de tienda, que NO trae ningún campo de disponibilidad: este evento es la señal, y `GET /v1/stores/{id}/stripe_status` es la respuesta.\n","version":null,"deprecated":null,"sidebarTitle":"Una tienda cambió","openapi":"/openapi/es.yaml webhook store.updated","href":"/es/api-reference/webhooks/a-store-changed","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Una tienda cambió","operationId":"storeUpdated","description":"Se envía cuando cambia una de tus tiendas, incluidos los cambios que nadie pidió. El caso principal es que cambie la disponibilidad para cobrar con tarjeta una vez que se revisa el alta alojada. Un cambio en el Plan Listo de una tienda real también envía uno, con el `plan`: un plan que inicia, se renueva, falla o limpia un cobro, se cancela o se deshace esa cancelación, termina, se reinicia, cambia de precio, o pasa a ti desde un restaurante que se conectó. Una acción envía un evento, que lleva el estado en que terminó el plan, y los cambios que caen muy juntos pueden llegar como un solo evento con el estado más reciente. Un evento cuyo objeto de tienda sería exactamente el que te enviamos por última vez para esa tienda no se envía.\n\n`data` es el objeto de tienda, que NO trae ningún campo de disponibilidad: este evento es la señal, y `GET /v1/stores/{id}/stripe_status` es la respuesta.\n","tags":["Webhooks"],"security":[],"parameters":["372412a5-ab51-4c20-95b0-33b708cad648"],"requestBody":"3a31d282-5f10-4bab-be95-cf617a8e831a","responses":{"200":"bce3b3e8-bc67-43e3-b31f-de5cd518be13"},"x-mint":{"href":"/es/api-reference/webhooks/a-store-changed","metadata":{"sidebarTitle":"Una tienda cambió"}},"method":"post","type":"webhook","servers":["f399fc83-7e7d-462b-bf3b-3042989289cb"],"path":"store.updated","baseUrlOptions":["https://api.listo.delivery"],"title":"Una tienda cambió","codeSamples":[],"requiredOnlyExamples":false,"requestExamples":[{"language":"json","filename":"Example","code":"{\n \"id\": \"evt_9pQ2vX7mKdR4tYb1nZ3sLwCe\",\n \"created_at\": \"2026-07-28T18:41:03Z\",\n \"type\": \"store.updated\",\n \"data\": {\n \"id\": \"st_4bR8kM2wQ7xT1nV5cZ9pLdYe\",\n \"external_id\": \"pos-store-41\",\n \"name\": \"\u003cstring>\",\n \"phone\": \"\u003cstring>\",\n \"street\": \"\u003cstring>\",\n \"apt_unit\": \"\u003cstring>\",\n \"lat\": 123,\n \"lng\": 123,\n \"pickup_notes\": \"\u003cstring>\",\n \"timezone\": \"America/Mexico_City\",\n \"default_business_fee_share\": 50,\n \"default_fee_split_amount_cents\": 1,\n \"markup_cents\": 1,\n \"test\": true,\n \"created_at\": \"2023-11-07T05:31:56Z\",\n \"plan\": {\n \"price_cents\": 199000,\n \"currency\": \"MXN\",\n \"interval\": \"month\",\n \"current_period_ends_on\": \"2023-12-25\",\n \"next_charge_on\": \"2023-12-25\",\n \"canceled_at\": \"2023-11-07T05:31:56Z\",\n \"ends_on\": \"2023-12-25\",\n \"pending_paid_by\": \"\u003cstring>\",\n \"pending_paid_by_on\": \"2023-12-25\",\n \"courtesy\": true\n }\n },\n \"test\": true\n}"}],"requestExampleType":"webhook","responseExampleType":"generated"},"dependencies":{"parameters":{"372412a5-ab51-4c20-95b0-33b708cad648":{"name":"X-Listo-Signature","in":"header","required":true,"description":"Comprueba que el evento vino de nosotros. El valor es `t=\u003cunix seconds>,v1=\u003chex>`,\ndonde el hex es un HMAC-SHA256, con tu secreto de firma como llave, sobre la\ncadena `\"\u003ct>.\u003craw request body>\"`.\n\nPara verificarlo: separa el encabezado por la coma, reconstruye `\"\u003ct>.\u003cbody>\"` a\npartir de los bytes CRUDOS que recibiste (nunca un objeto parseado y vuelto a serializar,\nporque los espacios en blanco y las secuencias de escape cambiarían la firma), calcula el\nHMAC y compáralo con `v1` en tiempo constante. Rechaza todo lo que no coincida.\n\nDespués revisa el reloj. Rechaza un evento cuyo `t` esté a más de 5 minutos de distancia de ahora en CUALQUIERA de las dos direcciones: un `t` muy en el pasado es el replay que este esquema existe para detener, y uno muy en el futuro es el mismo ataque con un reloj que nadie revisó.\n\nPueden estar activos dos secretos a la vez para que puedas rotar sin tiempo de inactividad: agrega el nuevo, acepta cualquiera de los dos, promuévelo y luego elimina el anterior. Siempre firmamos con el primario.\n","schema":{"type":"string","example":"t=1753728063,v1=8d2f4a1b6c7e9f0a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f607182","isRequired":true,"description":"Comprueba que el evento vino de nosotros. El valor es `t=\u003cunix seconds>,v1=\u003chex>`,\ndonde el hex es un HMAC-SHA256, con tu secreto de firma como llave, sobre la\ncadena `\"\u003ct>.\u003craw request body>\"`.\n\nPara verificarlo: separa el encabezado por la coma, reconstruye `\"\u003ct>.\u003cbody>\"` a\npartir de los bytes CRUDOS que recibiste (nunca un objeto parseado y vuelto a serializar,\nporque los espacios en blanco y las secuencias de escape cambiarían la firma), calcula el\nHMAC y compáralo con `v1` en tiempo constante. Rechaza todo lo que no coincida.\n\nDespués revisa el reloj. Rechaza un evento cuyo `t` esté a más de 5 minutos de distancia de ahora en CUALQUIERA de las dos direcciones: un `t` muy en el pasado es el replay que este esquema existe para detener, y uno muy en el futuro es el mismo ataque con un reloj que nadie revisó.\n\nPueden estar activos dos secretos a la vez para que puedas rotar sin tiempo de inactividad: agrega el nuevo, acepta cualquiera de los dos, promuévelo y luego elimina el anterior. Siempre firmamos con el primario.\n","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Los campos que comparten todos los eventos. La entrega es al menos una vez y sin orden\npor diseño: deduplica por `id`, y ordena por `created_at` o por las marcas de tiempo\npropias del objeto, no por orden de llegada. `type` y `data` los agrega\ncada evento, porque sus valores dependen de cuál evento sea.\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":"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":"created_at","typeLabel":"string\u003cdate-time>"},"type":{"type":"string","description":"Qué evento es este.","enum":["store.updated"],"isRequired":true,"uniqueKey":"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":"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":"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":"data.external_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"data.name","typeLabel":"string"},"phone":{"type":"string","description":"E.164, normalizado al recibirlo.","isRequired":true,"uniqueKey":"data.phone","typeLabel":"string"},"street":{"type":"string","isRequired":true,"uniqueKey":"data.street","typeLabel":"string"},"apt_unit":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"data.apt_unit.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"data.apt_unit.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.apt_unit","typeLabel":"string | null"},"lat":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"data.lat.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"data.lat.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.lat","typeLabel":"number\u003cdouble> | null"},"lng":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"data.lng.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"data.lng.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"data.lng","typeLabel":"number\u003cdouble> | null"},"pickup_notes":{"oneOf":[{"type":"string","description":"Instrucciones permanentes para el repartidor que recoge aquí.","isRequired":true,"uniqueKey":"data.pickup_notes.oneOf.0","typeLabel":"string"},{"type":"null","description":"Instrucciones permanentes para el repartidor que recoge aquí.","isRequired":true,"uniqueKey":"data.pickup_notes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"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":"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":"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":"data.default_fee_split_amount_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"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":"data.billing","typeLabel":"enum\u003cstring>"},"test":{"type":"boolean","isRequired":true,"uniqueKey":"data.test","typeLabel":"boolean"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"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":"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":"data.plan.oneOf.0.price_cents","typeLabel":"integer"},"currency":{"type":"string","example":"MXN","isRequired":true,"uniqueKey":"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":"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":"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":"data.plan.oneOf.0.current_period_ends_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"data.plan.oneOf.0.next_charge_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"data.plan.oneOf.0.canceled_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"data.plan.oneOf.0.ends_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"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":"data.plan.oneOf.0.pending_paid_by.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"data.plan.oneOf.0.pending_paid_by_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"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":"data.plan.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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":"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":"test","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"evt_9pQ2vX7mKdR4tYb1nZ3sLwCe","created_at":"2026-07-28T18:41:03Z","type":"store.updated","data":{"id":"st_4bR8kM2wQ7xT1nV5cZ9pLdYe","external_id":"pos-store-41","name":"\u003cstring>","phone":"\u003cstring>","street":"\u003cstring>","apt_unit":"\u003cstring>","lat":123,"lng":123,"pickup_notes":"\u003cstring>","timezone":"America/Mexico_City","default_business_fee_share":50,"default_fee_split_amount_cents":1,"markup_cents":1,"test":true,"created_at":"2023-11-07T05:31:56Z","plan":{"price_cents":199000,"currency":"MXN","interval":"month","current_period_ends_on":"2023-12-25","next_charge_on":"2023-12-25","canceled_at":"2023-11-07T05:31:56Z","ends_on":"2023-12-25","pending_paid_by":"\u003cstring>","pending_paid_by_on":"2023-12-25","courtesy":true}},"test":true}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"bce3b3e8-bc67-43e3-b31f-de5cd518be13":{"description":"Responde con cualquier 2xx para confirmar el evento.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{},"servers":{"f399fc83-7e7d-462b-bf3b-3042989289cb":{"url":"https://api.listo.delivery"}}},"originalFileLocation":"openapi/es.yaml"},"subdomain":"listo-c5a11a00","siteName":"Listo Partner API","title":"A store changed - Listo Partner API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/api-reference/webhooks/a-store-changed","matchLevel":1},"es":{"href":"/es/api-reference/webhooks/a-store-changed","matchLevel":0}}},"lastModified":"2026-11-07T01:48:56.431Z","originalFileLocation":"es/api-reference/webhooks/a-store-changed.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=\"Se envía cuando cambia una de tus tiendas, incluidos los cambios que nadie pidió. El caso principal es que cambie la disponibilidad para cobrar con tarjeta una vez que se revisa el alta alojada. Un cambio en el Plan Listo de una tienda real también envía uno, con el plan: un plan que inicia, se renueva, falla o limpia un cobro, se cancela o se deshace esa cancelación, termina, se reinicia, cambia de precio, o pasa a ti desde un restaurante que se conectó. Una acción envía un evento, que lleva el estado en que terminó el plan, y los cambios que caen muy juntos pueden llegar como un solo evento con el estado más reciente. Un evento cuyo objeto de tienda sería exactamente el que te enviamos por última vez para esa tienda no se envía. data es el objeto de tienda, que NO trae ningún campo de disponibilidad: este evento es la señal, y GET /v1/stores/{id}/stripe_status es la respuesta.\">\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=\"A store changed - Listo Partner API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Se envía cuando cambia una de tus tiendas, incluidos los cambios que nadie pidió. El caso principal es que cambie la disponibilidad para cobrar con tarjeta una vez que se revisa el alta alojada. Un cambio en el Plan Listo de una tienda real también envía uno, con el plan: un plan que inicia, se renueva, falla o limpia un cobro, se cancela o se deshace esa cancelación, termina, se reinicia, cambia de precio, o pasa a ti desde un restaurante que se conectó. Una acción envía un evento, que lleva el estado en que terminó el plan, y los cambios que caen muy juntos pueden llegar como un solo evento con el estado más reciente. Un evento cuyo objeto de tienda sería exactamente el que te enviamos por última vez para esa tienda no se envía. data es el objeto de tienda, que NO trae ningún campo de disponibilidad: este evento es la señal, y GET /v1/stores/{id}/stripe_status es la respuesta.\">\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/webhooks/a-store-changed\">\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=A+store+changed\u0026amp;description=Se+env%C3%ADa+cuando+cambia+una+de+tus+tiendas%2C+incluidos+los+cambios+que+nadie+pidi%C3%B3.+El+caso+principal+es+que+cambie+la+disponibilidad+para+cobrar+con+tarjeta+una+\u0026amp;theme=77fcfc9066d8b9eb9850b729\u0026amp;signature=252ac80cbbbf3016161b54435681c5e6cff82892db33e96769c957a42a72ca9c\">\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=\"A store changed - Listo Partner API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Se envía cuando cambia una de tus tiendas, incluidos los cambios que nadie pidió. El caso principal es que cambie la disponibilidad para cobrar con tarjeta una vez que se revisa el alta alojada. Un cambio en el Plan Listo de una tienda real también envía uno, con el plan: un plan que inicia, se renueva, falla o limpia un cobro, se cancela o se deshace esa cancelación, termina, se reinicia, cambia de precio, o pasa a ti desde un restaurante que se conectó. Una acción envía un evento, que lleva el estado en que terminó el plan, y los cambios que caen muy juntos pueden llegar como un solo evento con el estado más reciente. Un evento cuyo objeto de tienda sería exactamente el que te enviamos por última vez para esa tienda no se envía. data es el objeto de tienda, que NO trae ningún campo de disponibilidad: este evento es la señal, y GET /v1/stores/{id}/stripe_status es la respuesta.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://listo-c5a11a00.mintlify.site/_mintlify/api/og/v2?title=A+store+changed\u0026amp;description=Se+env%C3%ADa+cuando+cambia+una+de+tus+tiendas%2C+incluidos+los+cambios+que+nadie+pidi%C3%B3.+El+caso+principal+es+que+cambie+la+disponibilidad+para+cobrar+con+tarjeta+una+\u0026amp;theme=77fcfc9066d8b9eb9850b729\u0026amp;signature=252ac80cbbbf3016161b54435681c5e6cff82892db33e96769c957a42a72ca9c\">\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/webhooks/a-store-changed\">\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/webhooks/a-store-changed.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.listo.delivery/es/api-reference/webhooks/a-store-changed\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.listo.delivery/api-reference/webhooks/a-store-changed\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.listo.delivery/api-reference/webhooks/a-store-changed\">\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/webhooks/a-store-changed#webpage\",\"url\":\"https://docs.listo.delivery/es/api-reference/webhooks/a-store-changed\",\"name\":\"A store changed\",\"description\":\"Se envía cuando cambia una de tus tiendas, incluidos los cambios que nadie pidió. El caso principal es que cambie la disponibilidad para cobrar con tarjeta una vez que se revisa el alta alojada. Un cambio en el Plan Listo de una tienda real también envía uno, con el plan: un plan que inicia, se renueva, falla o limpia un cobro, se cancela o se deshace esa cancelación, termina, se reinicia, cambia de precio, o pasa a ti desde un restaurante que se conectó. Una acción envía un evento, que lleva el estado en que terminó el plan, y los cambios que caen muy juntos pueden llegar como un solo evento con el estado más reciente. Un evento cuyo objeto de tienda sería exactamente el que te enviamos por última vez para esa tienda no se envía. data es el objeto de tienda, que NO trae ningún campo de disponibilidad: este evento es la señal, y GET /v1/stores/{id}/stripe_status es la respuesta.\",\"dateModified\":\"2026-11-07T01:48:56.431Z\",\"isPartOf\":{\"@id\":\"https://docs.listo.delivery#website\"},\"breadcrumb\":{\"@id\":\"https://docs.listo.delivery/es/api-reference/webhooks/a-store-changed#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.listo.delivery/es/api-reference/webhooks/a-store-changed#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\":\"Webhooks\",\"item\":\"https://docs.listo.delivery/es/api-reference/webhooks/a-delivery-reached-a-new-status\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"A store changed\",\"item\":\"https://docs.listo.delivery/es/api-reference/webhooks/a-store-changed\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.listo.delivery/es/api-reference/webhooks/a-store-changed#apireference\",\"headline\":\"A store changed\",\"name\":\"A store changed\",\"description\":\"Se envía cuando cambia una de tus tiendas, incluidos los cambios que nadie pidió. El caso principal es que cambie la disponibilidad para cobrar con tarjeta una vez que se revisa el alta alojada. Un cambio en el Plan Listo de una tienda real también envía uno, con el plan: un plan que inicia, se renueva, falla o limpia un cobro, se cancela o se deshace esa cancelación, termina, se reinicia, cambia de precio, o pasa a ti desde un restaurante que se conectó. Una acción envía un evento, que lleva el estado en que terminó el plan, y los cambios que caen muy juntos pueden llegar como un solo evento con el estado más reciente. Un evento cuyo objeto de tienda sería exactamente el que te enviamos por última vez para esa tienda no se envía. data es el objeto de tienda, que NO trae ningún campo de disponibilidad: este evento es la señal, y GET /v1/stores/{id}/stripe_status es la respuesta.\",\"url\":\"https://docs.listo.delivery/es/api-reference/webhooks/a-store-changed\",\"mainEntityOfPage\":{\"@id\":\"https://docs.listo.delivery/es/api-reference/webhooks/a-store-changed#webpage\"},\"dateModified\":\"2026-11-07T01:48:56.431Z\",\"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/webhooks/a-store-changed"}]},{"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","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","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","description":"Se envía cuando un retiro deja de ser una solicitud: se pagó o falló. Un retiro que sigue `pending` no anuncia nada, porque ya tienes ese estado con la respuesta de creación.\n\nEsta es la única forma de enterarte del resultado. Lo resuelve una persona horas o días después, sin ninguna solicitud tuya en curso que lo responda.\n","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","description":"Se envía cuando el dueño de una cuenta de Listo existente aprueba tu solicitud de conexión. `data` es el objeto de tienda completo, así que esto es todo lo que te habría dicho `POST /v1/connections`.\n\nEs un evento distinto de `store.updated` a propósito. Ese significa \"una tienda que ya tienes cambió\", y esta tienda es una que nunca has visto: puede llegar ANTES de que canjees tu código, así que un `store.updated` con un `id` que no reconoces sería un payload que tendrías que descartar.\n\nTambién es tu ruta de recuperación. La redirección que lleva el código pasa por el navegador del dueño, y los navegadores se cierran; este evento no depende de eso. Trata la tienda como conectada cuando llegue cualquiera de los dos, el que llegue primero, y deduplica por el `id` del evento.\n\nEl `plan` es el Plan Listo de la tienda tal como estaba cuando el dueño aprobó, que es el del propio restaurante. Si tu cuenta paga los planes de las tiendas, Listo entonces pasa el plan a ti, y un `store.updated` llega en unos momentos con el resultado: un restaurante que ya paga el plan propio se lee con `paid_by: \"store\"` con `pending_paid_by: \"partner\"` y la fecha en que el plan pasa a ti, y uno sin plan vigente inicia el tuyo, cobrado ese día. Listo emite el `store.connected` de una tienda conectada antes de cualquier `store.updated` de ella, pero los webhooks no llegan en orden, así que ordénalos por el `created_at` del evento y no por el orden de llegada.\n","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":"A store changed - 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"]}