{
"error": {
"code": "invalid_api_key",
"message": "The API key is missing, revoked, or not valid for this mode.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/invalid_api_key",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"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": "idempotency_conflict",
"message": "That idempotency key was already used with a different body.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/idempotency_conflict",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"error": {
"code": "validation_failed",
"message": "Markup cents must be less than or equal to 1000000",
"param": "markup_cents",
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/validation_failed",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
Stores
Create a store
Registers a pickup location. lat/lng are optional; send them when
you have them and we take them as given, otherwise we geocode street.
phone is E.164. A Mexican number is +52 followed by its 10 digits (+52 1 followed by 10 is accepted as WhatsApp writes it); a US or Canadian number is +1 followed by its 10 digits; a number from any other country is accepted with 8 to 15 digits in total. Anything else is refused with validation_failed.
timezone is derived from the store’s position, and you do not have to
send one. Mexico spans five zones, and the store’s own position is what
decides which one it keeps its hours in: its scheduled pickup windows,
its delivery timestamps and its settlement week are all read in it.
A timezone you do send is used only when the position cannot answer:
a store with no coordinates, or a position no zone claims. One that
disagrees with the position does not change the store and is not an
error: the store is created, everything else you sent is applied, and
the zone the position gives is what comes back.
We would rather correct that quietly than refuse it, because we cannot
tell the two cases apart from here: a zone sent by default out of a form
that never asked its user arrives looking exactly like a zone somebody
chose, and the first store provisioned against the old rule landed an
hour ahead of itself for a year of opening hours, delivery timestamps
and settlement weeks. Your store’s position is evidence about where it
is. If a store’s clock looks wrong, its coordinates are what to fix.
default_business_fee_share is the share of the delivery fee this store
covers by default, 0 to 100, with the rest charged to the customer.
Every cash or card delivery from the store inherits it unless the
create overrides it. A prepaid delivery, and a quote that names no
payment_method, always carry share 100 instead: the whole fee is yours.
A store can also split the fee by a fixed peso amount instead of a
percentage, which default_fee_split_mode on the store object tells you
and default_fee_split_amount_cents carries. Both are read-only: the
restaurant chooses the shape in its own Listo console, and there is no
field here to set one. Read the mode before you read the share, because
in an amount mode the share is not the split in force. Sending
default_business_fee_share moves the store back to percent, on this
endpoint and on the update.
owner_email is optional, and it is a precondition rather than an
attribute: send the address of whoever runs the location and we check it
against the restaurants that already have a Listo account of their own.
If one exists, nothing is created and you get 409 account_exists,
because a second account for a kitchen that already has one would split
its balance, its console and its history in two. Ask its owner to
connect the account they have instead, with POST /v1/connect_requests,
as Connect a restaurant that already uses Listo
describes.
Nothing stores the address and no store object echoes it. It does not
create a login either; that is POST /v1/stores/{id}/owner.
Listo delivers in Mexico, and a street that resolves to another
country is refused with 422 unsupported_country: nothing is created,
and no other address in that country will work either. An address we
cannot resolve at all is not refused. It is stored as you sent it and
located on the first delivery.
What a live create does about the store’s Plan Listo depends on who
pays it on your account (see
Plan and billing).
If you pay your stores’ plans, the store starts its Plan Listo and its
first month is charged to you in this same request, from your live
balance or from the card saved on your account. Fund one of them first,
and send an Idempotency-Key on every live create: a create that timed
out and is repeated without one makes a second store, and the second
store starts a second plan. A store whose first charge fails is still
created and still answers 201, with plan.statusawaiting_payment:
it has no plan yet, nothing is past due, and its deliveries are refused
with 402 plan_required until your balance or card covers the month,
which Listo then charges by itself.
If your account is set up so that each restaurant pays its own plan,
nothing is charged to you: the store is created with no plan (plan is
null) and the restaurant buys its own Plan Listo in its Listo console.
Its deliveries are refused with 402 plan_required until it does.
A test store has no plan.
POST
/
v1
/
stores
Create a store
curl --request POST \ --url https://api.listo.delivery/v1/stores \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "Sucursal Chapalita", "phone": "3312345678", "street": "Av. Juan Palomar y Arias 765", "apt_unit": "Local 4", "lat": 20.691145, "lng": -103.426885, "pickup_notes": "Toca el timbre del local, no la puerta principal", "timezone": "Guadalajara", "default_business_fee_share": 60, "access_tier": "api_only", "markup_cents": 800, "external_id": "pos-store-41", "owner_email": "rosa@lataqueria.mx"}'
{
"error": {
"code": "invalid_api_key",
"message": "The API key is missing, revoked, or not valid for this mode.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/invalid_api_key",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"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": "idempotency_conflict",
"message": "That idempotency key was already used with a different body.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/idempotency_conflict",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"error": {
"code": "validation_failed",
"message": "Markup cents must be less than or equal to 1000000",
"param": "markup_cents",
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/validation_failed",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
Your API key, sent as Authorization: Bearer <key>. Live and test keys are separate; the key you send decides which world the call acts in. To try calls, use a test key (it starts with lst_test_): no real courier is sent and no real money moves, but webhooks fire and the dropoff.phone you give can receive WhatsApp messages, so use your own number. A live key (it starts with lst_live_) books and charges real deliveries.
Optional. Send one to make a retry safe: generate a NEW key for each logical call (a UUID is a good one), at most 255 characters, and send the SAME key when you retry that call after a timeout or a dropped connection. The same key with the same body returns the ORIGINAL response, status code included, instead of doing the work again, for 24 hours. The same key with a different body is refused with 409 idempotency_conflict, and so is a retry that arrives while the first request is still being processed (try again shortly). Without the header nothing is remembered and a retry is a new request. A key belongs to your account and to the mode of the API key that sent it (live and test keys never meet), so the same text from two accounts, or from a live and a test key, is two different keys.
Your own reference for this location, if you sent one. Unique per
key world, and filterable on the list, so you can reconcile against
your own store book without storing our ids.
The name you gave the store; for a restaurant that connected an
account with several branches, the business and the branch, the way
its own customers read it (TorterÃa La Mera Mera, Zapopan). A
branch whose own name already begins with the business's name, such
as TorterÃa La Mera Mera Centro, is published as it is. When
you send a name, a value that begins with the store's business name
and a comma is read as that business plus the branch, so sending back
the name you read changes nothing.
The IANA zone the store keeps its hours in, normalized to one
spelling per zone. Derived from the store's coordinates, and
re-derived whenever the store's position moves. A zone you send
yourself is used only when the position cannot answer (a store with
no coordinates, or a position no zone claims), and one that
disagrees with the position is neither stored nor treated as an
error.
The share of the delivery fee this store covers by default, as a
percentage. The rest is charged to the customer. In force only when
default_fee_split_mode is percent; in either amount mode this is
the percentage the store keeps for when it goes back to one.
Which shape this store's default split has, and therefore which of
the two fields above and below is in force. percent splits the fee
by default_business_fee_share; business_amount means the store
covers up to default_fee_split_amount_cents of it and the customer
pays the rest; customer_amount is the mirror, the customer paying
up to that amount and the store covering the rest.
Read-only. It is set by the restaurant in its own Listo console, and
sending default_business_fee_share on a create or an update moves
the store back to percent.
How much of Listo the store itself uses. An api_only store's
deliveries spend your balance, and a wallet or full store's
spend its own; billing says which. Writable on create and update,
and always api_only on a test store. A live store of an account
whose restaurants pay their own Plan Listo cannot be api_only: it
has no console to buy a plan from, so a create or an update that
asks for it is refused with 422 validation_failed and
param: "access_tier".
Your own markup on every delivery of this store, in cents. It is
added to the delivery fee, split with the customer like the rest of
the fee, and credited to your balance when the delivery is
delivered. Writable on create and update.
Whose balance pays this store's deliveries, read off access_tier
so you never have to derive it: partner is yours, store is the
store's own. Read-only. It is not who pays the store's plan, which
is plan.paid_by.
The store's Plan Listo, or null when the store needs no plan: a
test store, or a live store created before Plan Listo existed, which
keeps requesting couriers without one. It is also null when the
store pays its own plan (every store of an account whose stores pay
their own Plan Listo) and the restaurant has not bought one yet: the
restaurant buys it in its own console, and there is nothing for you
to pay or to reactivate. It is also null for a store of a partner
on pricing with no Plan Listo, which needs no plan. When it is an
object every
key is present, and the ones that do not apply are null. See
Plan and billing.
Show child attributes
{"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":"api-reference/stores/create-a-store","slug":"/api-reference/stores/create-a-store","pageMetadata":{"title":"Create a store","description":"Registers a pickup location. `lat`/`lng` are optional; send them when\nyou have them and we take them as given, otherwise we geocode `street`.\n\n`phone` is E.164. A Mexican number is +52 followed by its 10 digits (+52 1 followed by 10 is accepted as WhatsApp writes it); a US or Canadian number is +1 followed by its 10 digits; a number from any other country is accepted with 8 to 15 digits in total. Anything else is refused with `validation_failed`.\n\n`timezone` is derived from the store's position, and you do not have to\nsend one. Mexico spans five zones, and the store's own position is what\ndecides which one it keeps its hours in: its scheduled pickup windows,\nits delivery timestamps and its settlement week are all read in it.\n\nA `timezone` you do send is used only when the position cannot answer:\na store with no coordinates, or a position no zone claims. One that\ndisagrees with the position does not change the store and is not an\nerror: the store is created, everything else you sent is applied, and\nthe zone the position gives is what comes back.\n\nWe would rather correct that quietly than refuse it, because we cannot\ntell the two cases apart from here: a zone sent by default out of a form\nthat never asked its user arrives looking exactly like a zone somebody\nchose, and the first store provisioned against the old rule landed an\nhour ahead of itself for a year of opening hours, delivery timestamps\nand settlement weeks. Your store's position is evidence about where it\nis. If a store's clock looks wrong, its coordinates are what to fix.\n\n`default_business_fee_share` is the share of the delivery fee this store\ncovers by default, 0 to 100, with the rest charged to the customer.\nEvery `cash` or `card` delivery from the store inherits it unless the\ncreate overrides it. A `prepaid` delivery, and a quote that names no\n`payment_method`, always carry share 100 instead: the whole fee is yours.\n\nA store can also split the fee by a fixed peso amount instead of a\npercentage, which `default_fee_split_mode` on the store object tells you\nand `default_fee_split_amount_cents` carries. Both are read-only: the\nrestaurant chooses the shape in its own Listo console, and there is no\nfield here to set one. Read the mode before you read the share, because\nin an amount mode the share is not the split in force. Sending\n`default_business_fee_share` moves the store back to `percent`, on this\nendpoint and on the update.\n\n`owner_email` is optional, and it is a precondition rather than an\nattribute: send the address of whoever runs the location and we check it\nagainst the restaurants that already have a Listo account of their own.\nIf one exists, nothing is created and you get `409 account_exists`,\nbecause a second account for a kitchen that already has one would split\nits balance, its console and its history in two. Ask its owner to\nconnect the account they have instead, with `POST /v1/connect_requests`,\nas [Connect a restaurant that already uses Listo](https://docs.listo.delivery/en/guides/connect-existing-account)\ndescribes.\n\nNothing stores the address and no store object echoes it. It does not\ncreate a login either; that is `POST /v1/stores/{id}/owner`.\n\nListo delivers in Mexico, and a `street` that resolves to another\ncountry is refused with `422 unsupported_country`: nothing is created,\nand no other address in that country will work either. An address we\ncannot resolve at all is not refused. It is stored as you sent it and\nlocated on the first delivery.\n\nWhat a live create does about the store's Plan Listo depends on who\npays it on your account (see\n[Plan and billing](https://docs.listo.delivery/en/guides/plan-and-billing)).\n\nIf you pay your stores' plans, the store starts its Plan Listo and its\nfirst month is charged to you in this same request, from your live\nbalance or from the card saved on your account. Fund one of them first,\nand send an `Idempotency-Key` on every live create: a create that timed\nout and is repeated without one makes a second store, and the second\nstore starts a second plan. A store whose first charge fails is still\ncreated and still answers `201`, with `plan.status` `awaiting_payment`:\nit has no plan yet, nothing is past due, and its deliveries are refused\nwith `402 plan_required` until your balance or card covers the month,\nwhich Listo then charges by itself.\n\nIf your account is set up so that each restaurant pays its own plan,\nnothing is charged to you: the store is created with no plan (`plan` is\n`null`) and the restaurant buys its own Plan Listo in its Listo console.\nIts deliveries are refused with `402 plan_required` until it does.\n\nA test store has no plan.\n","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/stores","href":"/api-reference/stores/create-a-store","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 a: \"a\",\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Registers a pickup location. \", _jsx(_components.code, {\n children: \"lat\"\n }), \"/\", _jsx(_components.code, {\n children: \"lng\"\n }), \" are optional; send them when\\nyou have them and we take them as given, otherwise we geocode \", _jsx(_components.code, {\n children: \"street\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"phone\"\n }), \" is E.164. A Mexican number is +52 followed by its 10 digits (+52 1 followed by 10 is accepted as WhatsApp writes it); a US or Canadian number is +1 followed by its 10 digits; a number from any other country is accepted with 8 to 15 digits in total. Anything else is refused with \", _jsx(_components.code, {\n children: \"validation_failed\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"timezone\"\n }), \" is derived from the store’s position, and you do not have to\\nsend one. Mexico spans five zones, and the store’s own position is what\\ndecides which one it keeps its hours in: its scheduled pickup windows,\\nits delivery timestamps and its settlement week are all read in it.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A \", _jsx(_components.code, {\n children: \"timezone\"\n }), \" you do send is used only when the position cannot answer:\\na store with no coordinates, or a position no zone claims. One that\\ndisagrees with the position does not change the store and is not an\\nerror: the store is created, everything else you sent is applied, and\\nthe zone the position gives is what comes back.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"We would rather correct that quietly than refuse it, because we cannot\\ntell the two cases apart from here: a zone sent by default out of a form\\nthat never asked its user arrives looking exactly like a zone somebody\\nchose, and the first store provisioned against the old rule landed an\\nhour ahead of itself for a year of opening hours, delivery timestamps\\nand settlement weeks. Your store’s position is evidence about where it\\nis. If a store’s clock looks wrong, its coordinates are what to fix.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"default_business_fee_share\"\n }), \" is the share of the delivery fee this store\\ncovers by default, 0 to 100, with the rest charged to the customer.\\nEvery \", _jsx(_components.code, {\n children: \"cash\"\n }), \" or \", _jsx(_components.code, {\n children: \"card\"\n }), \" delivery from the store inherits it unless the\\ncreate overrides it. A \", _jsx(_components.code, {\n children: \"prepaid\"\n }), \" delivery, and a quote that names no\\n\", _jsx(_components.code, {\n children: \"payment_method\"\n }), \", always carry share 100 instead: the whole fee is yours.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A store can also split the fee by a fixed peso amount instead of a\\npercentage, which \", _jsx(_components.code, {\n children: \"default_fee_split_mode\"\n }), \" on the store object tells you\\nand \", _jsx(_components.code, {\n children: \"default_fee_split_amount_cents\"\n }), \" carries. Both are read-only: the\\nrestaurant chooses the shape in its own Listo console, and there is no\\nfield here to set one. Read the mode before you read the share, because\\nin an amount mode the share is not the split in force. Sending\\n\", _jsx(_components.code, {\n children: \"default_business_fee_share\"\n }), \" moves the store back to \", _jsx(_components.code, {\n children: \"percent\"\n }), \", on this\\nendpoint and on the update.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"owner_email\"\n }), \" is optional, and it is a precondition rather than an\\nattribute: send the address of whoever runs the location and we check it\\nagainst the restaurants that already have a Listo account of their own.\\nIf one exists, nothing is created and you get \", _jsx(_components.code, {\n children: \"409 account_exists\"\n }), \",\\nbecause a second account for a kitchen that already has one would split\\nits balance, its console and its history in two. Ask its owner to\\nconnect the account they have instead, with \", _jsx(_components.code, {\n children: \"POST /v1/connect_requests\"\n }), \",\\nas \", _jsx(_components.a, {\n href: \"https://docs.listo.delivery/en/guides/connect-existing-account\",\n children: \"Connect a restaurant that already uses Listo\"\n }), \"\\ndescribes.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Nothing stores the address and no store object echoes it. It does not\\ncreate a login either; that is \", _jsx(_components.code, {\n children: \"POST /v1/stores/{id}/owner\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Listo delivers in Mexico, and a \", _jsx(_components.code, {\n children: \"street\"\n }), \" that resolves to another\\ncountry is refused with \", _jsx(_components.code, {\n children: \"422 unsupported_country\"\n }), \": nothing is created,\\nand no other address in that country will work either. An address we\\ncannot resolve at all is not refused. It is stored as you sent it and\\nlocated on the first delivery.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"What a live create does about the store’s Plan Listo depends on who\\npays it on your account (see\\n\", _jsx(_components.a, {\n href: \"https://docs.listo.delivery/en/guides/plan-and-billing\",\n children: \"Plan and billing\"\n }), \").\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"If you pay your stores’ plans, the store starts its Plan Listo and its\\nfirst month is charged to you in this same request, from your live\\nbalance or from the card saved on your account. Fund one of them first,\\nand send an \", _jsx(_components.code, {\n children: \"Idempotency-Key\"\n }), \" on every live create: a create that timed\\nout and is repeated without one makes a second store, and the second\\nstore starts a second plan. A store whose first charge fails is still\\ncreated and still answers \", _jsx(_components.code, {\n children: \"201\"\n }), \", with \", _jsx(_components.code, {\n children: \"plan.status\"\n }), \" \", _jsx(_components.code, {\n children: \"awaiting_payment\"\n }), \":\\nit has no plan yet, nothing is past due, and its deliveries are refused\\nwith \", _jsx(_components.code, {\n children: \"402 plan_required\"\n }), \" until your balance or card covers the month,\\nwhich Listo then charges by itself.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"If your account is set up so that each restaurant pays its own plan,\\nnothing is charged to you: the store is created with no plan (\", _jsx(_components.code, {\n children: \"plan\"\n }), \" is\\n\", _jsx(_components.code, {\n children: \"null\"\n }), \") and the restaurant buys its own Plan Listo in its Listo console.\\nIts deliveries are refused with \", _jsx(_components.code, {\n children: \"402 plan_required\"\n }), \" until it does.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"A test store has no plan.\"\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":"Create a store","description":"Registers a pickup location. `lat`/`lng` are optional; send them when\nyou have them and we take them as given, otherwise we geocode `street`.\n\n`phone` is E.164. A Mexican number is +52 followed by its 10 digits (+52 1 followed by 10 is accepted as WhatsApp writes it); a US or Canadian number is +1 followed by its 10 digits; a number from any other country is accepted with 8 to 15 digits in total. Anything else is refused with `validation_failed`.\n\n`timezone` is derived from the store's position, and you do not have to\nsend one. Mexico spans five zones, and the store's own position is what\ndecides which one it keeps its hours in: its scheduled pickup windows,\nits delivery timestamps and its settlement week are all read in it.\n\nA `timezone` you do send is used only when the position cannot answer:\na store with no coordinates, or a position no zone claims. One that\ndisagrees with the position does not change the store and is not an\nerror: the store is created, everything else you sent is applied, and\nthe zone the position gives is what comes back.\n\nWe would rather correct that quietly than refuse it, because we cannot\ntell the two cases apart from here: a zone sent by default out of a form\nthat never asked its user arrives looking exactly like a zone somebody\nchose, and the first store provisioned against the old rule landed an\nhour ahead of itself for a year of opening hours, delivery timestamps\nand settlement weeks. Your store's position is evidence about where it\nis. If a store's clock looks wrong, its coordinates are what to fix.\n\n`default_business_fee_share` is the share of the delivery fee this store\ncovers by default, 0 to 100, with the rest charged to the customer.\nEvery `cash` or `card` delivery from the store inherits it unless the\ncreate overrides it. A `prepaid` delivery, and a quote that names no\n`payment_method`, always carry share 100 instead: the whole fee is yours.\n\nA store can also split the fee by a fixed peso amount instead of a\npercentage, which `default_fee_split_mode` on the store object tells you\nand `default_fee_split_amount_cents` carries. Both are read-only: the\nrestaurant chooses the shape in its own Listo console, and there is no\nfield here to set one. Read the mode before you read the share, because\nin an amount mode the share is not the split in force. Sending\n`default_business_fee_share` moves the store back to `percent`, on this\nendpoint and on the update.\n\n`owner_email` is optional, and it is a precondition rather than an\nattribute: send the address of whoever runs the location and we check it\nagainst the restaurants that already have a Listo account of their own.\nIf one exists, nothing is created and you get `409 account_exists`,\nbecause a second account for a kitchen that already has one would split\nits balance, its console and its history in two. Ask its owner to\nconnect the account they have instead, with `POST /v1/connect_requests`,\nas [Connect a restaurant that already uses Listo](https://docs.listo.delivery/en/guides/connect-existing-account)\ndescribes.\n\nNothing stores the address and no store object echoes it. It does not\ncreate a login either; that is `POST /v1/stores/{id}/owner`.\n\nListo delivers in Mexico, and a `street` that resolves to another\ncountry is refused with `422 unsupported_country`: nothing is created,\nand no other address in that country will work either. An address we\ncannot resolve at all is not refused. It is stored as you sent it and\nlocated on the first delivery.\n\nWhat a live create does about the store's Plan Listo depends on who\npays it on your account (see\n[Plan and billing](https://docs.listo.delivery/en/guides/plan-and-billing)).\n\nIf you pay your stores' plans, the store starts its Plan Listo and its\nfirst month is charged to you in this same request, from your live\nbalance or from the card saved on your account. Fund one of them first,\nand send an `Idempotency-Key` on every live create: a create that timed\nout and is repeated without one makes a second store, and the second\nstore starts a second plan. A store whose first charge fails is still\ncreated and still answers `201`, with `plan.status` `awaiting_payment`:\nit has no plan yet, nothing is past due, and its deliveries are refused\nwith `402 plan_required` until your balance or card covers the month,\nwhich Listo then charges by itself.\n\nIf your account is set up so that each restaurant pays its own plan,\nnothing is charged to you: the store is created with no plan (`plan` is\n`null`) and the restaurant buys its own Plan Listo in its Listo console.\nIts deliveries are refused with `402 plan_required` until it does.\n\nA test store has no plan.\n","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/stores","href":"/api-reference/stores/create-a-store","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Create a store","description":"Registers a pickup location. `lat`/`lng` are optional; send them when\nyou have them and we take them as given, otherwise we geocode `street`.\n\n`phone` is E.164. A Mexican number is +52 followed by its 10 digits (+52 1 followed by 10 is accepted as WhatsApp writes it); a US or Canadian number is +1 followed by its 10 digits; a number from any other country is accepted with 8 to 15 digits in total. Anything else is refused with `validation_failed`.\n\n`timezone` is derived from the store's position, and you do not have to\nsend one. Mexico spans five zones, and the store's own position is what\ndecides which one it keeps its hours in: its scheduled pickup windows,\nits delivery timestamps and its settlement week are all read in it.\n\nA `timezone` you do send is used only when the position cannot answer:\na store with no coordinates, or a position no zone claims. One that\ndisagrees with the position does not change the store and is not an\nerror: the store is created, everything else you sent is applied, and\nthe zone the position gives is what comes back.\n\nWe would rather correct that quietly than refuse it, because we cannot\ntell the two cases apart from here: a zone sent by default out of a form\nthat never asked its user arrives looking exactly like a zone somebody\nchose, and the first store provisioned against the old rule landed an\nhour ahead of itself for a year of opening hours, delivery timestamps\nand settlement weeks. Your store's position is evidence about where it\nis. If a store's clock looks wrong, its coordinates are what to fix.\n\n`default_business_fee_share` is the share of the delivery fee this store\ncovers by default, 0 to 100, with the rest charged to the customer.\nEvery `cash` or `card` delivery from the store inherits it unless the\ncreate overrides it. A `prepaid` delivery, and a quote that names no\n`payment_method`, always carry share 100 instead: the whole fee is yours.\n\nA store can also split the fee by a fixed peso amount instead of a\npercentage, which `default_fee_split_mode` on the store object tells you\nand `default_fee_split_amount_cents` carries. Both are read-only: the\nrestaurant chooses the shape in its own Listo console, and there is no\nfield here to set one. Read the mode before you read the share, because\nin an amount mode the share is not the split in force. Sending\n`default_business_fee_share` moves the store back to `percent`, on this\nendpoint and on the update.\n\n`owner_email` is optional, and it is a precondition rather than an\nattribute: send the address of whoever runs the location and we check it\nagainst the restaurants that already have a Listo account of their own.\nIf one exists, nothing is created and you get `409 account_exists`,\nbecause a second account for a kitchen that already has one would split\nits balance, its console and its history in two. Ask its owner to\nconnect the account they have instead, with `POST /v1/connect_requests`,\nas [Connect a restaurant that already uses Listo](https://docs.listo.delivery/en/guides/connect-existing-account)\ndescribes.\n\nNothing stores the address and no store object echoes it. It does not\ncreate a login either; that is `POST /v1/stores/{id}/owner`.\n\nListo delivers in Mexico, and a `street` that resolves to another\ncountry is refused with `422 unsupported_country`: nothing is created,\nand no other address in that country will work either. An address we\ncannot resolve at all is not refused. It is stored as you sent it and\nlocated on the first delivery.\n\nWhat a live create does about the store's Plan Listo depends on who\npays it on your account (see\n[Plan and billing](https://docs.listo.delivery/en/guides/plan-and-billing)).\n\nIf you pay your stores' plans, the store starts its Plan Listo and its\nfirst month is charged to you in this same request, from your live\nbalance or from the card saved on your account. Fund one of them first,\nand send an `Idempotency-Key` on every live create: a create that timed\nout and is repeated without one makes a second store, and the second\nstore starts a second plan. A store whose first charge fails is still\ncreated and still answers `201`, with `plan.status` `awaiting_payment`:\nit has no plan yet, nothing is past due, and its deliveries are refused\nwith `402 plan_required` until your balance or card covers the month,\nwhich Listo then charges by itself.\n\nIf your account is set up so that each restaurant pays its own plan,\nnothing is charged to you: the store is created with no plan (`plan` is\n`null`) and the restaurant buys its own Plan Listo in its Listo console.\nIts deliveries are refused with `402 plan_required` until it does.\n\nA test store has no plan.\n","tags":["Stores"],"operationId":"createStore","security":["1faa47fe-be85-4ce6-93e5-020a3344f4f1"],"requestBody":"cd0edff2-a778-42ae-a380-d72aedd26ac0","responses":{"201":"43330e7a-e2de-4ed6-a77b-752692bae10e","401":"8bcc7637-36e8-47bc-ae08-6b55c818d7b2","403":"e6c9f369-1680-473c-83a1-1f959daf49a1","409":"43acdd6a-3dfb-49c6-980a-9bc01ebbe54f","422":"26127d99-d087-4c8e-9647-7f9d1e06062f"},"parameters":["a8bb4c23-7083-47c5-acd4-9d9381ce4819"],"method":"post","type":"path","servers":["a658606d-cd78-44bb-b1d3-622847e198a1"],"path":"/v1/stores","baseUrlOptions":["https://api.listo.delivery"],"title":"Create a store","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"a8bb4c23-7083-47c5-acd4-9d9381ce4819":{"name":"Idempotency-Key","in":"header","description":"Optional. Send one to make a retry safe: generate a NEW key for each logical call (a UUID is a good one), at most 255 characters, and send the SAME key when you retry that call after a timeout or a dropped connection. The same key with the same body returns the ORIGINAL response, status code included, instead of doing the work again, for 24 hours. The same key with a different body is refused with `409 idempotency_conflict`, and so is a retry that arrives while the first request is still being processed (try again shortly). Without the header nothing is remembered and a retry is a new request. A key belongs to your account and to the mode of the API key that sent it (live and test keys never meet), so the same text from two accounts, or from a live and a test key, is two different keys.","required":false,"schema":{"type":"string","isRequired":false,"description":"Optional. Send one to make a retry safe: generate a NEW key for each logical call (a UUID is a good one), at most 255 characters, and send the SAME key when you retry that call after a timeout or a dropped connection. The same key with the same body returns the ORIGINAL response, status code included, instead of doing the work again, for 24 hours. The same key with a different body is refused with `409 idempotency_conflict`, and so is a retry that arrives while the first request is still being processed (try again shortly). Without the header nothing is remembered and a retry is a new request. A key belongs to your account and to the mode of the API key that sent it (live and test keys never meet), so the same text from two accounts, or from a live and a test key, is two different keys.","uniqueKey":"","typeLabel":"string"},"example":"pos-store-41-attempt-1"}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"The pickup location to create.","properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"phone":{"type":"string","description":"A phone that resolves to an E.164 number.","isRequired":true,"uniqueKey":"phone","typeLabel":"string"},"street":{"type":"string","description":"The full street address, in one string.","isRequired":true,"uniqueKey":"street","typeLabel":"string"},"apt_unit":{"type":"string","uniqueKey":"apt_unit","typeLabel":"string"},"lat":{"type":"number","format":"double","minimum":-90,"maximum":90,"description":"Latitude. Send it together with `lng`, or neither.","uniqueKey":"lat","typeLabel":"number\u003cdouble>"},"lng":{"type":"number","format":"double","minimum":-180,"maximum":180,"description":"Longitude. Send it together with `lat`, or neither.","uniqueKey":"lng","typeLabel":"number\u003cdouble>"},"pickup_notes":{"type":"string","maxLength":280,"description":"Instructions for the courier at the store, up to 280 characters.","uniqueKey":"pickup_notes","typeLabel":"string"},"timezone":{"type":"string","description":"An IANA time zone name.","uniqueKey":"timezone","typeLabel":"string"},"default_business_fee_share":{"type":"integer","minimum":0,"maximum":100,"description":"The percent of the delivery fee the store pays by default.","uniqueKey":"default_business_fee_share","typeLabel":"integer"},"access_tier":{"type":"string","enum":["api_only","wallet","full"],"description":"What the store gets besides the API.","uniqueKey":"access_tier","typeLabel":"enum\u003cstring>"},"markup_cents":{"type":"integer","minimum":0,"maximum":1000000,"description":"Your markup on each delivery, in centavos, up to 1000000.","uniqueKey":"markup_cents","typeLabel":"integer"},"external_id":{"type":"string","maxLength":255,"description":"Your own reference for this location.","uniqueKey":"external_id","typeLabel":"string"},"owner_email":{"type":"string","description":"The restaurant owner to invite, for a store with a console.","uniqueKey":"owner_email","typeLabel":"string"}},"required":["name","phone","street"],"uniqueKey":"","typeLabel":"object"},"example":{"name":"Sucursal Chapalita","phone":"3312345678","street":"Av. Juan Palomar y Arias 765","apt_unit":"Local 4","lat":20.691145,"lng":-103.426885,"pickup_notes":"Toca el timbre del local, no la puerta principal","timezone":"Guadalajara","default_business_fee_share":60,"access_tier":"api_only","markup_cents":800,"external_id":"pos-store-41","owner_email":"rosa@lataqueria.mx"},"examples":{"Example":{"title":"Example","value":{"name":"Sucursal Chapalita","phone":"3312345678","street":"Av. Juan Palomar y Arias 765","apt_unit":"Local 4","lat":20.691145,"lng":-103.426885,"pickup_notes":"Toca el timbre del local, no la puerta principal","timezone":"Guadalajara","default_business_fee_share":60,"access_tier":"api_only","markup_cents":800,"external_id":"pos-store-41","owner_email":"rosa@lataqueria.mx"}}},"exampleType":"examples"}},"required":true,"exampleType":"examples"},"responses":{"43330e7a-e2de-4ed6-a77b-752692bae10e":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","description":"A pickup location. Card readiness is deliberately NOT a field here: it\nis its own endpoint, with its own outstanding-requirements detail.\n","properties":{"id":{"type":"string","description":"The store id, `st_` prefixed.","example":"st_4bR8kM2wQ7xT1nV5cZ9pLdYe","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"external_id":{"oneOf":[{"type":"string","description":"Your own reference for this location, if you sent one. Unique per\nkey world, and filterable on the list, so you can reconcile against\nyour own store book without storing our ids.\n","example":"pos-store-41","isRequired":true,"uniqueKey":"external_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Your own reference for this location, if you sent one. Unique per\nkey world, and filterable on the list, so you can reconcile against\nyour own store book without storing our ids.\n","example":"pos-store-41","isRequired":true,"uniqueKey":"external_id.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"external_id","typeLabel":"string | null"},"name":{"type":"string","description":"The name you gave the store; for a restaurant that connected an\naccount with several branches, the business and the branch, the way\nits own customers read it (`TorterÃa La Mera Mera, Zapopan`). A\nbranch whose own name already begins with the business's name, such\nas `TorterÃa La Mera Mera Centro`, is published as it is. When\nyou send a name, a value that begins with the store's business name\nand a comma is read as that business plus the branch, so sending back\nthe name you read changes nothing.\n","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"phone":{"type":"string","description":"E.164, normalized on the way in.","isRequired":true,"uniqueKey":"phone","typeLabel":"string"},"street":{"type":"string","isRequired":true,"uniqueKey":"street","typeLabel":"string"},"apt_unit":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"apt_unit.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"apt_unit.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"apt_unit","typeLabel":"string | null"},"lat":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"lat.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"lat.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"lat","typeLabel":"number\u003cdouble> | null"},"lng":{"oneOf":[{"type":"number","format":"double","isRequired":true,"uniqueKey":"lng.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","isRequired":true,"uniqueKey":"lng.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"lng","typeLabel":"number\u003cdouble> | null"},"pickup_notes":{"oneOf":[{"type":"string","description":"Standing instructions for the courier collecting here.","isRequired":true,"uniqueKey":"pickup_notes.oneOf.0","typeLabel":"string"},{"type":"null","description":"Standing instructions for the courier collecting here.","isRequired":true,"uniqueKey":"pickup_notes.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"pickup_notes","typeLabel":"string | null"},"timezone":{"type":"string","description":"The IANA zone the store keeps its hours in, normalized to one\nspelling per zone. Derived from the store's coordinates, and\nre-derived whenever the store's position moves. A zone you send\nyourself is used only when the position cannot answer (a store with\nno coordinates, or a position no zone claims), and one that\ndisagrees with the position is neither stored nor treated as an\nerror.\n","example":"America/Mexico_City","isRequired":true,"uniqueKey":"timezone","typeLabel":"string"},"default_business_fee_share":{"type":"integer","minimum":0,"maximum":100,"description":"The share of the delivery fee this store covers by default, as a\npercentage. The rest is charged to the customer. In force only when\n`default_fee_split_mode` is `percent`; in either amount mode this is\nthe percentage the store keeps for when it goes back to one.\n","isRequired":true,"uniqueKey":"default_business_fee_share","typeLabel":"integer"},"default_fee_split_mode":{"type":"string","enum":["percent","business_amount","customer_amount"],"description":"Which shape this store's default split has, and therefore which of\nthe two fields above and below is in force. `percent` splits the fee\nby `default_business_fee_share`; `business_amount` means the store\ncovers up to `default_fee_split_amount_cents` of it and the customer\npays the rest; `customer_amount` is the mirror, the customer paying\nup to that amount and the store covering the rest.\n\nRead-only. It is set by the restaurant in its own Listo console, and\nsending `default_business_fee_share` on a create or an update moves\nthe store back to `percent`.\n","isRequired":true,"uniqueKey":"default_fee_split_mode","typeLabel":"enum\u003cstring>"},"default_fee_split_amount_cents":{"oneOf":[{"type":"integer","minimum":0,"description":"The amount the two amount modes divide the fee by, in cents. Null in\n`percent` mode, and never null in either amount mode. Read-only.\n","isRequired":true,"uniqueKey":"default_fee_split_amount_cents.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"The amount the two amount modes divide the fee by, in cents. Null in\n`percent` mode, and never null in either amount mode. Read-only.\n","isRequired":true,"uniqueKey":"default_fee_split_amount_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"default_fee_split_amount_cents","typeLabel":"integer | null"},"access_tier":{"type":"string","enum":["api_only","wallet","full"],"description":"How much of Listo the store itself uses. An `api_only` store's\ndeliveries spend your balance, and a `wallet` or `full` store's\nspend its own; `billing` says which. Writable on create and update,\nand always `api_only` on a test store. A live store of an account\nwhose restaurants pay their own Plan Listo cannot be `api_only`: it\nhas no console to buy a plan from, so a create or an update that\nasks for it is refused with `422 validation_failed` and\n`param: \"access_tier\"`.\n","isRequired":true,"uniqueKey":"access_tier","typeLabel":"enum\u003cstring>"},"markup_cents":{"type":"integer","minimum":0,"description":"Your own markup on every delivery of this store, in cents. It is\nadded to the delivery fee, split with the customer like the rest of\nthe fee, and credited to your balance when the delivery is\ndelivered. Writable on create and update.\n","isRequired":true,"uniqueKey":"markup_cents","typeLabel":"integer"},"billing":{"type":"string","enum":["partner","store"],"description":"Whose balance pays this store's deliveries, read off `access_tier`\nso you never have to derive it: `partner` is yours, `store` is the\nstore's own. Read-only. It is not who pays the store's plan, which\nis `plan.paid_by`.\n","isRequired":true,"uniqueKey":"billing","typeLabel":"enum\u003cstring>"},"test":{"type":"boolean","isRequired":true,"uniqueKey":"test","typeLabel":"boolean"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"plan":{"oneOf":[{"description":"The store's Plan Listo, or `null` when the store needs no plan: a\ntest store, or a live store created before Plan Listo existed, which\nkeeps requesting couriers without one. It is also `null` when the\nstore pays its own plan (every store of an account whose stores pay\ntheir own Plan Listo) and the restaurant has not bought one yet: the\nrestaurant buys it in its own console, and there is nothing for you\nto pay or to reactivate. It is also `null` for a store of a partner\non pricing with no Plan Listo, which needs no plan. When it is an\nobject every\nkey is present, and the ones that do not apply are `null`. See\n[Plan and billing](https://docs.listo.delivery/en/guides/plan-and-billing).\n","type":"object","properties":{"status":{"type":"string","enum":["active","past_due","canceling","canceled","awaiting_payment"],"description":"`active` is paid up and renews on `next_charge_on` (null on a\nplan that is passing to the restaurant, see `pending_paid_by`). `past_due`\nhas an unpaid month, and its deliveries are refused with `402\nplan_required` until the charge goes through. `awaiting_payment`\nis a store whose first month your balance and card could not\ncover: it holds no plan yet, `price_cents` is the price it\nwill be charged before IVA (the amount needed to pay is that\nplus IVA), every date is null, its deliveries are refused with\n`402 plan_required`, and Listo charges it by itself as soon as\nyour balance or card covers it. `canceling` was\ncanceled and is served up to the day before `ends_on`.\n`canceled` has ended, and can be restarted.\n","isRequired":true,"uniqueKey":"plan.oneOf.0.status","typeLabel":"enum\u003cstring>"},"price_cents":{"type":"integer","description":"What one month of this store's plan costs you, before IVA: your\nprice, even while a restaurant that connected to you is still\npaying its own plan. When `paid_by` is `store` because the\nstore pays its own plan, it is the price of one `interval` of\nthe restaurant's own plan, which is not yours to pay.\n","example":199000,"isRequired":true,"uniqueKey":"plan.oneOf.0.price_cents","typeLabel":"integer"},"currency":{"type":"string","example":"MXN","isRequired":true,"uniqueKey":"plan.oneOf.0.currency","typeLabel":"string"},"interval":{"type":"string","description":"How long one period of this plan is, and the cycle `price_cents`\nis the price of. `month` for every plan you pay. A store that\npays its own plan reports the interval its restaurant bought,\nso `year` is a restaurant that paid twelve months at once.\n","example":"month","isRequired":true,"uniqueKey":"plan.oneOf.0.interval","typeLabel":"string"},"current_period_ends_on":{"oneOf":[{"type":"string","format":"date","description":"The last day of the current period, already paid unless\n`status` is `past_due`.\n","isRequired":true,"uniqueKey":"plan.oneOf.0.current_period_ends_on.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"The last day of the current period, already paid unless\n`status` is `past_due`.\n","isRequired":true,"uniqueKey":"plan.oneOf.0.current_period_ends_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"plan.oneOf.0.current_period_ends_on","typeLabel":"string\u003cdate> | null"},"next_charge_on":{"oneOf":[{"type":"string","format":"date","description":"The day you are charged next: the next renewal, or, while a\nrestaurant that connected to you still pays its own plan, your\nfirst charge. Null once the plan is ending or has ended, and\nnull while it is `past_due`: the month owed is charged the\nmoment your balance or saved card allows, and retried every\nday until it is paid. Null while `courtesy` is true, too. Null\nas well on a plan you pay that is passing to the restaurant\n(`pending_paid_by` is `store`): you pay the period you are in\nand nothing after it. When `paid_by` is `store` because the\nstore pays its own plan, it is the day the restaurant's own plan\nrenews, not a charge to you.\n","isRequired":true,"uniqueKey":"plan.oneOf.0.next_charge_on.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"The day you are charged next: the next renewal, or, while a\nrestaurant that connected to you still pays its own plan, your\nfirst charge. Null once the plan is ending or has ended, and\nnull while it is `past_due`: the month owed is charged the\nmoment your balance or saved card allows, and retried every\nday until it is paid. Null while `courtesy` is true, too. Null\nas well on a plan you pay that is passing to the restaurant\n(`pending_paid_by` is `store`): you pay the period you are in\nand nothing after it. When `paid_by` is `store` because the\nstore pays its own plan, it is the day the restaurant's own plan\nrenews, not a charge to you.\n","isRequired":true,"uniqueKey":"plan.oneOf.0.next_charge_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"plan.oneOf.0.next_charge_on","typeLabel":"string\u003cdate> | null"},"canceled_at":{"oneOf":[{"type":"string","format":"date-time","description":"When you canceled the plan.","isRequired":true,"uniqueKey":"plan.oneOf.0.canceled_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When you canceled the plan.","isRequired":true,"uniqueKey":"plan.oneOf.0.canceled_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"plan.oneOf.0.canceled_at","typeLabel":"string\u003cdate-time> | null"},"ends_on":{"oneOf":[{"type":"string","format":"date","description":"The day the plan stops serving the store, which is the day after\nthe last day paid, or the day a plan whose charge was pending was\ncanceled. Null unless the plan is ending or has ended.\n","isRequired":true,"uniqueKey":"plan.oneOf.0.ends_on.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"The day the plan stops serving the store, which is the day after\nthe last day paid, or the day a plan whose charge was pending was\ncanceled. Null unless the plan is ending or has ended.\n","isRequired":true,"uniqueKey":"plan.oneOf.0.ends_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"plan.oneOf.0.ends_on","typeLabel":"string\u003cdate> | null"},"paid_by":{"type":"string","enum":["partner","store"],"description":"Who pays this plan: `partner`, which is you, or `store`, the\nrestaurant itself. `store` is a restaurant that connected to you\nand still pays its own plan, and every store that pays its own\nPlan Listo because your account is set up that way; none of\nthose is yours to pay.\n","isRequired":true,"uniqueKey":"plan.oneOf.0.paid_by","typeLabel":"enum\u003cstring>"},"pending_paid_by":{"oneOf":[{"type":"string","description":"Who will pay it from `pending_paid_by_on`, when that is about to\nchange, or null. `partner` is you: a restaurant that connected to\nyou and still pays its own plan, until the renewal you pay from.\n`store` is the restaurant: a plan you pay that passes to the\nrestaurant at its next renewal because your account is set up so\nthat each restaurant pays its own plan. You pay the period you\nare in and nothing after it, so `next_charge_on` is null.\n","isRequired":true,"uniqueKey":"plan.oneOf.0.pending_paid_by.oneOf.0","typeLabel":"string"},{"type":"null","description":"Who will pay it from `pending_paid_by_on`, when that is about to\nchange, or null. `partner` is you: a restaurant that connected to\nyou and still pays its own plan, until the renewal you pay from.\n`store` is the restaurant: a plan you pay that passes to the\nrestaurant at its next renewal because your account is set up so\nthat each restaurant pays its own plan. You pay the period you\nare in and nothing after it, so `next_charge_on` is null.\n","isRequired":true,"uniqueKey":"plan.oneOf.0.pending_paid_by.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"plan.oneOf.0.pending_paid_by","typeLabel":"string | null"},"pending_paid_by_on":{"oneOf":[{"type":"string","format":"date","description":"The date that change lands (the day the new payer's first\nperiod starts), or null.\n","isRequired":true,"uniqueKey":"plan.oneOf.0.pending_paid_by_on.oneOf.0","typeLabel":"string\u003cdate>"},{"type":"null","format":"date","description":"The date that change lands (the day the new payer's first\nperiod starts), or null.\n","isRequired":true,"uniqueKey":"plan.oneOf.0.pending_paid_by_on.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"plan.oneOf.0.pending_paid_by_on","typeLabel":"string\u003cdate> | null"},"courtesy":{"type":"boolean","description":"`courtesy` is true while Listo waives this store's plan: nothing\nis charged and `next_charge_on` is null.\n","isRequired":true,"uniqueKey":"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":"plan.oneOf.0","typeLabel":"object"},{"description":"The store's Plan Listo, or `null` when the store needs no plan: a\ntest store, or a live store created before Plan Listo existed, which\nkeeps requesting couriers without one. It is also `null` when the\nstore pays its own plan (every store of an account whose stores pay\ntheir own Plan Listo) and the restaurant has not bought one yet: the\nrestaurant buys it in its own console, and there is nothing for you\nto pay or to reactivate. It is also `null` for a store of a partner\non pricing with no Plan Listo, which needs no plan. When it is an\nobject every\nkey is present, and the ones that do not apply are `null`. See\n[Plan and billing](https://docs.listo.delivery/en/guides/plan-and-billing).\n","type":"null","properties":{"status":{"type":"string","enum":["active","past_due","canceling","canceled","awaiting_payment"],"description":"`active` is paid up and renews on `next_charge_on` (null on a\nplan that is passing to the restaurant, see `pending_paid_by`). `past_due`\nhas an unpaid month, and its deliveries are refused with `402\nplan_required` until the charge goes through. `awaiting_payment`\nis a store whose first month your balance and card could not\ncover: it holds no plan yet, `price_cents` is the price it\nwill be charged before IVA (the amount needed to pay is that\nplus IVA), every date is null, its deliveries are refused with\n`402 plan_required`, and Listo charges it by itself as soon as\nyour balance or card covers it. `canceling` was\ncanceled and is served up to the day before `ends_on`.\n`canceled` has ended, and can be restarted.\n"},"price_cents":{"type":"integer","description":"What one month of this store's plan costs you, before IVA: your\nprice, even while a restaurant that connected to you is still\npaying its own plan. When `paid_by` is `store` because the\nstore pays its own plan, it is the price of one `interval` of\nthe restaurant's own plan, which is not yours to pay.\n","example":199000},"currency":{"type":"string","example":"MXN"},"interval":{"type":"string","description":"How long one period of this plan is, and the cycle `price_cents`\nis the price of. `month` for every plan you pay. A store that\npays its own plan reports the interval its restaurant bought,\nso `year` is a restaurant that paid twelve months at once.\n","example":"month"},"current_period_ends_on":{"oneOf":[{"type":"string","format":"date","description":"The last day of the current period, already paid unless\n`status` is `past_due`.\n"},{"type":"null","format":"date","description":"The last day of the current period, already paid unless\n`status` is `past_due`.\n"}]},"next_charge_on":{"oneOf":[{"type":"string","format":"date","description":"The day you are charged next: the next renewal, or, while a\nrestaurant that connected to you still pays its own plan, your\nfirst charge. Null once the plan is ending or has ended, and\nnull while it is `past_due`: the month owed is charged the\nmoment your balance or saved card allows, and retried every\nday until it is paid. Null while `courtesy` is true, too. Null\nas well on a plan you pay that is passing to the restaurant\n(`pending_paid_by` is `store`): you pay the period you are in\nand nothing after it. When `paid_by` is `store` because the\nstore pays its own plan, it is the day the restaurant's own plan\nrenews, not a charge to you.\n"},{"type":"null","format":"date","description":"The day you are charged next: the next renewal, or, while a\nrestaurant that connected to you still pays its own plan, your\nfirst charge. Null once the plan is ending or has ended, and\nnull while it is `past_due`: the month owed is charged the\nmoment your balance or saved card allows, and retried every\nday until it is paid. Null while `courtesy` is true, too. Null\nas well on a plan you pay that is passing to the restaurant\n(`pending_paid_by` is `store`): you pay the period you are in\nand nothing after it. When `paid_by` is `store` because the\nstore pays its own plan, it is the day the restaurant's own plan\nrenews, not a charge to you.\n"}]},"canceled_at":{"oneOf":[{"type":"string","format":"date-time","description":"When you canceled the plan."},{"type":"null","format":"date-time","description":"When you canceled the plan."}]},"ends_on":{"oneOf":[{"type":"string","format":"date","description":"The day the plan stops serving the store, which is the day after\nthe last day paid, or the day a plan whose charge was pending was\ncanceled. Null unless the plan is ending or has ended.\n"},{"type":"null","format":"date","description":"The day the plan stops serving the store, which is the day after\nthe last day paid, or the day a plan whose charge was pending was\ncanceled. Null unless the plan is ending or has ended.\n"}]},"paid_by":{"type":"string","enum":["partner","store"],"description":"Who pays this plan: `partner`, which is you, or `store`, the\nrestaurant itself. `store` is a restaurant that connected to you\nand still pays its own plan, and every store that pays its own\nPlan Listo because your account is set up that way; none of\nthose is yours to pay.\n"},"pending_paid_by":{"oneOf":[{"type":"string","description":"Who will pay it from `pending_paid_by_on`, when that is about to\nchange, or null. `partner` is you: a restaurant that connected to\nyou and still pays its own plan, until the renewal you pay from.\n`store` is the restaurant: a plan you pay that passes to the\nrestaurant at its next renewal because your account is set up so\nthat each restaurant pays its own plan. You pay the period you\nare in and nothing after it, so `next_charge_on` is null.\n"},{"type":"null","description":"Who will pay it from `pending_paid_by_on`, when that is about to\nchange, or null. `partner` is you: a restaurant that connected to\nyou and still pays its own plan, until the renewal you pay from.\n`store` is the restaurant: a plan you pay that passes to the\nrestaurant at its next renewal because your account is set up so\nthat each restaurant pays its own plan. You pay the period you\nare in and nothing after it, so `next_charge_on` is null.\n"}]},"pending_paid_by_on":{"oneOf":[{"type":"string","format":"date","description":"The date that change lands (the day the new payer's first\nperiod starts), or null.\n"},{"type":"null","format":"date","description":"The date that change lands (the day the new payer's first\nperiod starts), or null.\n"}]},"courtesy":{"type":"boolean","description":"`courtesy` is true while Listo waives this store's plan: nothing\nis charged and `next_charge_on` is 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":"plan.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"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"],"uniqueKey":"","typeLabel":"object"},"example":{"id":"st_4bR8kM2wQ7xT1nV5cZ9pLdYe","name":"Sucursal Chapalita","phone":"+523312345678","street":"Av. Juan Palomar y Arias 765","apt_unit":null,"lat":null,"lng":null,"pickup_notes":null,"timezone":"America/Mexico_City","default_business_fee_share":0,"test":false,"created_at":"2026-07-31T22:15:07Z","access_tier":"api_only","markup_cents":0,"billing":"partner","external_id":null,"default_fee_split_mode":"percent","default_fee_split_amount_cents":null,"plan":null},"examples":{"Example":{"title":"Example","value":{"id":"st_4bR8kM2wQ7xT1nV5cZ9pLdYe","name":"Sucursal Chapalita","phone":"+523312345678","street":"Av. Juan Palomar y Arias 765","apt_unit":null,"lat":null,"lng":null,"pickup_notes":null,"timezone":"America/Mexico_City","default_business_fee_share":0,"test":false,"created_at":"2026-07-31T22:15:07Z","access_tier":"api_only","markup_cents":0,"billing":"partner","external_id":null,"default_fee_split_mode":"percent","default_fee_split_amount_cents":null,"plan":null}}},"exampleType":"examples"}},"exampleType":"examples"},"8bcc7637-36e8-47bc-ae08-6b55c818d7b2":{"description":"The API key is missing, revoked, or not valid for this mode (`invalid_api_key`).","content":{"application/json":{"schema":{"type":"object","description":"The body of every 4xx and 5xx answer on this API.","properties":{"error":{"type":"object","description":"What every refusal and every failure looks like. `code` is the only\nfield to branch on; `message` is for a human reading a log and may\nchange wording or language without notice.\n","properties":{"code":{"type":"string","description":"A stable, machine-readable name for what went wrong, such as\n`validation_failed`, `not_found` or `insufficient_balance`. Branch\non this and never on `message`. The set grows additively: handle a\ncode you do not know as the generic failure its status code says it\nis. Every code has a page under `doc_url`.\n","example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A sentence for the person debugging. Free to change wording or\nlanguage, so never match on it.\n","example":"order_value_cents is required.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"The request field the refusal is about, when one applies, spelled\nas you sent it (`dropoff.street`, `manifest.items`). Null when the\nfailure is not about one field.\n","example":"order_value_cents","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"The request field the refusal is about, when one applies, spelled\nas you sent it (`dropoff.street`, `manifest.items`). Null when the\nfailure is not about one field.\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":"Whether sending the identical request again could succeed. `false`\nmeans it never will without a change on your side or in the world.\n","example":false,"isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"The documentation page for this `code`.","example":"https://docs.listo.delivery/en/errors/validation_failed","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Our id for this request, the same value as the `X-Request-Id`\nresponse header. Quote it to support, and filter\n`GET /v1/request_logs` by it.\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":"invalid_api_key","message":"The API key is missing, revoked, or not valid for this mode.","param":null,"retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/invalid_api_key","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_api_key","message":"The API key is missing, revoked, or not valid for this mode.","param":null,"retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/invalid_api_key","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"e6c9f369-1680-473c-83a1-1f959daf49a1":{"description":"The key is valid and is read-only (`read_only_key`), so it can read but not create, change or cancel anything. Use a key issued without the read-only setting.","content":{"application/json":{"schema":{"type":"object","description":"The body of every 4xx and 5xx answer on this API.","properties":{"error":{"type":"object","description":"What every refusal and every failure looks like. `code` is the only\nfield to branch on; `message` is for a human reading a log and may\nchange wording or language without notice.\n","properties":{"code":{"type":"string","description":"A stable, machine-readable name for what went wrong, such as\n`validation_failed`, `not_found` or `insufficient_balance`. Branch\non this and never on `message`. The set grows additively: handle a\ncode you do not know as the generic failure its status code says it\nis. Every code has a page under `doc_url`.\n","example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A sentence for the person debugging. Free to change wording or\nlanguage, so never match on it.\n","example":"order_value_cents is required.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"The request field the refusal is about, when one applies, spelled\nas you sent it (`dropoff.street`, `manifest.items`). Null when the\nfailure is not about one field.\n","example":"order_value_cents","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"The request field the refusal is about, when one applies, spelled\nas you sent it (`dropoff.street`, `manifest.items`). Null when the\nfailure is not about one field.\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":"Whether sending the identical request again could succeed. `false`\nmeans it never will without a change on your side or in the world.\n","example":false,"isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"The documentation page for this `code`.","example":"https://docs.listo.delivery/en/errors/validation_failed","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Our id for this request, the same value as the `X-Request-Id`\nresponse header. Quote it to support, and filter\n`GET /v1/request_logs` by it.\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"},"43acdd6a-3dfb-49c6-980a-9bc01ebbe54f":{"description":"The request conflicts with the state of the world. The object is no longer in a state that allows this (`not_cancellable`, `not_reschedulable`, `not_retriable`, `not_editable`, `not_refundable`, `not_reactivatable`, `plan_ended`), the cancellation did not go through (`cancel_failed`), the plan's charge is still with the bank (`charge_in_progress`), the idempotency key was reused with a different body (`idempotency_conflict`, which no retry fixes), the idempotency key is still held by the request that first sent it (`idempotency_conflict`, and once that request has answered the same call with the same key replays its answer), there is no webhook URL configured for the key's mode so there is nowhere to send (`webhook_endpoint_not_configured`), the event is a courier position, which is never sent again (`event_not_resendable`), the email already has a Listo account (`account_exists`), the store's pickup point is still being moved (`pickup_point_pending`), or no courier is free for this trip right now (`no_couriers_available`). Worth repeating unchanged after a few minutes: `cancel_failed`, `charge_in_progress`, `pickup_point_pending`, `no_couriers_available`, and a call refused because its idempotency key is still held (repeat it with the same key). Every other refusal here needs the request or the object to change first.","content":{"application/json":{"schema":{"type":"object","description":"The body of every 4xx and 5xx answer on this API.","properties":{"error":{"type":"object","description":"What every refusal and every failure looks like. `code` is the only\nfield to branch on; `message` is for a human reading a log and may\nchange wording or language without notice.\n","properties":{"code":{"type":"string","description":"A stable, machine-readable name for what went wrong, such as\n`validation_failed`, `not_found` or `insufficient_balance`. Branch\non this and never on `message`. The set grows additively: handle a\ncode you do not know as the generic failure its status code says it\nis. Every code has a page under `doc_url`.\n","example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A sentence for the person debugging. Free to change wording or\nlanguage, so never match on it.\n","example":"order_value_cents is required.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"The request field the refusal is about, when one applies, spelled\nas you sent it (`dropoff.street`, `manifest.items`). Null when the\nfailure is not about one field.\n","example":"order_value_cents","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"The request field the refusal is about, when one applies, spelled\nas you sent it (`dropoff.street`, `manifest.items`). Null when the\nfailure is not about one field.\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":"Whether sending the identical request again could succeed. `false`\nmeans it never will without a change on your side or in the world.\n","example":false,"isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"The documentation page for this `code`.","example":"https://docs.listo.delivery/en/errors/validation_failed","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Our id for this request, the same value as the `X-Request-Id`\nresponse header. Quote it to support, and filter\n`GET /v1/request_logs` by it.\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":"idempotency_conflict","message":"That idempotency key was already used with a different body.","param":null,"retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/idempotency_conflict","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"idempotency_conflict","message":"That idempotency key was already used with a different body.","param":null,"retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/idempotency_conflict","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"26127d99-d087-4c8e-9647-7f9d1e06062f":{"description":"The request was understood and refused. `error.code` says why and `error.param` names the offending field when one applies.","content":{"application/json":{"schema":{"type":"object","description":"The body of every 4xx and 5xx answer on this API.","properties":{"error":{"type":"object","description":"What every refusal and every failure looks like. `code` is the only\nfield to branch on; `message` is for a human reading a log and may\nchange wording or language without notice.\n","properties":{"code":{"type":"string","description":"A stable, machine-readable name for what went wrong, such as\n`validation_failed`, `not_found` or `insufficient_balance`. Branch\non this and never on `message`. The set grows additively: handle a\ncode you do not know as the generic failure its status code says it\nis. Every code has a page under `doc_url`.\n","example":"validation_failed","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A sentence for the person debugging. Free to change wording or\nlanguage, so never match on it.\n","example":"order_value_cents is required.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"The request field the refusal is about, when one applies, spelled\nas you sent it (`dropoff.street`, `manifest.items`). Null when the\nfailure is not about one field.\n","example":"order_value_cents","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"The request field the refusal is about, when one applies, spelled\nas you sent it (`dropoff.street`, `manifest.items`). Null when the\nfailure is not about one field.\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":"Whether sending the identical request again could succeed. `false`\nmeans it never will without a change on your side or in the world.\n","example":false,"isRequired":true,"uniqueKey":"error.retryable","typeLabel":"boolean"},"doc_url":{"type":"string","format":"uri","description":"The documentation page for this `code`.","example":"https://docs.listo.delivery/en/errors/validation_failed","isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Our id for this request, the same value as the `X-Request-Id`\nresponse header. Quote it to support, and filter\n`GET /v1/request_logs` by it.\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":"Markup cents must be less than or equal to 1000000","param":"markup_cents","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":"Markup cents must be less than or equal to 1000000","param":"markup_cents","retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/validation_failed","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"1faa47fe-be85-4ce6-93e5-020a3344f4f1":{"BearerAuth":{"type":"http","scheme":"bearer","description":"Your API key, sent as `Authorization: Bearer \u003ckey>`. Live and test keys are separate; the key you send decides which world the call acts in. To try calls, use a test key (it starts with `lst_test_`): no real courier is sent and no real money moves, but webhooks fire and the `dropoff.phone` you give can receive WhatsApp messages, so use your own number. A live key (it starts with `lst_live_`) books and charges real deliveries.","scopes":[],"schemeName":"BearerAuth"}}},"servers":{"a658606d-cd78-44bb-b1d3-622847e198a1":{"url":"https://api.listo.delivery"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Your API key, sent as `Authorization: Bearer \u003ckey>`. Live and test keys are separate; the key you send decides which world the call acts in. To try calls, use a test key (it starts with `lst_test_`): no real courier is sent and no real money moves, but webhooks fire and the `dropoff.phone` you give can receive WhatsApp messages, so use your own number. A live key (it starts with `lst_live_`) books and charges real deliveries.","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Your API key, sent as `Authorization: Bearer \u003ckey>`. Live and test keys are separate; the key you send decides which world the call acts in. To try calls, use a test key (it starts with `lst_test_`): no real courier is sent and no real money moves, but webhooks fire and the `dropoff.phone` you give can receive WhatsApp messages, so use your own number. A live key (it starts with `lst_live_`) books and charges real deliveries.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"}]},"originalFileLocation":"openapi/en.yaml"},"subdomain":"listo-c5a11a00","siteName":"Listo Partner API","title":"Create a store - Listo Partner API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/api-reference/stores/create-a-store","matchLevel":0},"es":{"href":"/es/api-reference/stores/create-a-store","matchLevel":1}}},"lastModified":"2026-11-07T01:48:55.365Z","originalFileLocation":"api-reference/stores/create-a-store.mdx","locale":"en"},"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=\"Registers a pickup location. lat/lng are optional; send them when you have them and we take them as given, otherwise we geocode street. phone is E.164. A Mexican number is +52 followed by its 10 digits (+52 1 followed by 10 is accepted as WhatsApp writes it); a US or Canadian number is +1 followed by its 10 digits; a number from any other country is accepted with 8 to 15 digits in total. Anything else is refused with validation_failed. timezone is derived from the store\u0026#x27;s position, and you do not have to send one. Mexico spans five zones, and the store\u0026#x27;s own position is what decides which one it keeps its hours in: its scheduled pickup windows, its delivery timestamps and its settlement week are all read in it. A timezone you do send is used only when the position cannot answer: a store with no coordinates, or a position no zone claims. One that disagrees with the position does not change the store and is not an error: the store is created, everything else you sent is applied, and the zone the position gives is what comes back. We would rather correct that quietly than refuse it, because we cannot tell the two cases apart from here: a zone sent by default out of a form that never asked its user arrives looking exactly like a zone somebody chose, and the first store provisioned against the old rule landed an hour ahead of itself for a year of opening hours, delivery timestamps and settlement weeks. Your store\u0026#x27;s position is evidence about where it is. If a store\u0026#x27;s clock looks wrong, its coordinates are what to fix. default_business_fee_share is the share of the delivery fee this store covers by default, 0 to 100, with the rest charged to the customer. Every cash or card delivery from the store inherits it unless the create overrides it. A prepaid delivery, and a quote that names no payment_method, always carry share 100 instead: the whole fee is yours. A store can also split the fee by a fixed peso amount instead of a percentage, which default_fee_split_mode on the store object tells you and default_fee_split_amount_cents carries. Both are read-only: the restaurant chooses the shape in its own Listo console, and there is no field here to set one. Read the mode before you read the share, because in an amount mode the share is not the split in force. Sending default_business_fee_share moves the store back to percent, on this endpoint and on the update. owner_email is optional, and it is a precondition rather than an attribute: send the address of whoever runs the location and we check it against the restaurants that already have a Listo account of their own. If one exists, nothing is created and you get 409 account_exists, because a second account for a kitchen that already has one would split its balance, its console and its history in two. Ask its owner to connect the account they have instead, with POST /v1/connect_requests, as Connect a restaurant that already uses Listo describes. Nothing stores the address and no store object echoes it. It does not create a login either; that is POST /v1/stores/{id}/owner. Listo delivers in Mexico, and a street that resolves to another country is refused with 422 unsupported_country: nothing is created, and no other address in that country will work either. An address we cannot resolve at all is not refused. It is stored as you sent it and located on the first delivery. What a live create does about the store\u0026#x27;s Plan Listo depends on who pays it on your account (see Plan and billing). If you pay your stores\u0026#x27; plans, the store starts its Plan Listo and its first month is charged to you in this same request, from your live balance or from the card saved on your account. Fund one of them first, and send an Idempotency-Key on every live create: a create that timed out and is repeated without one makes a second store, and the second store starts a second plan. A store whose first charge fails is still created and still answers 201, with plan.status awaiting_payment: it has no plan yet, nothing is past due, and its deliveries are refused with 402 plan_required until your balance or card covers the month, which Listo then charges by itself. If your account is set up so that each restaurant pays its own plan, nothing is charged to you: the store is created with no plan (plan is null) and the restaurant buys its own Plan Listo in its Listo console. Its deliveries are refused with 402 plan_required until it does. A test store has no plan.\">\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=\"Create a store - Listo Partner API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Registers a pickup location. lat/lng are optional; send them when you have them and we take them as given, otherwise we geocode street. phone is E.164. A Mexican number is +52 followed by its 10 digits (+52 1 followed by 10 is accepted as WhatsApp writes it); a US or Canadian number is +1 followed by its 10 digits; a number from any other country is accepted with 8 to 15 digits in total. Anything else is refused with validation_failed. timezone is derived from the store\u0026#x27;s position, and you do not have to send one. Mexico spans five zones, and the store\u0026#x27;s own position is what decides which one it keeps its hours in: its scheduled pickup windows, its delivery timestamps and its settlement week are all read in it. A timezone you do send is used only when the position cannot answer: a store with no coordinates, or a position no zone claims. One that disagrees with the position does not change the store and is not an error: the store is created, everything else you sent is applied, and the zone the position gives is what comes back. We would rather correct that quietly than refuse it, because we cannot tell the two cases apart from here: a zone sent by default out of a form that never asked its user arrives looking exactly like a zone somebody chose, and the first store provisioned against the old rule landed an hour ahead of itself for a year of opening hours, delivery timestamps and settlement weeks. Your store\u0026#x27;s position is evidence about where it is. If a store\u0026#x27;s clock looks wrong, its coordinates are what to fix. default_business_fee_share is the share of the delivery fee this store covers by default, 0 to 100, with the rest charged to the customer. Every cash or card delivery from the store inherits it unless the create overrides it. A prepaid delivery, and a quote that names no payment_method, always carry share 100 instead: the whole fee is yours. A store can also split the fee by a fixed peso amount instead of a percentage, which default_fee_split_mode on the store object tells you and default_fee_split_amount_cents carries. Both are read-only: the restaurant chooses the shape in its own Listo console, and there is no field here to set one. Read the mode before you read the share, because in an amount mode the share is not the split in force. Sending default_business_fee_share moves the store back to percent, on this endpoint and on the update. owner_email is optional, and it is a precondition rather than an attribute: send the address of whoever runs the location and we check it against the restaurants that already have a Listo account of their own. If one exists, nothing is created and you get 409 account_exists, because a second account for a kitchen that already has one would split its balance, its console and its history in two. Ask its owner to connect the account they have instead, with POST /v1/connect_requests, as Connect a restaurant that already uses Listo describes. Nothing stores the address and no store object echoes it. It does not create a login either; that is POST /v1/stores/{id}/owner. Listo delivers in Mexico, and a street that resolves to another country is refused with 422 unsupported_country: nothing is created, and no other address in that country will work either. An address we cannot resolve at all is not refused. It is stored as you sent it and located on the first delivery. What a live create does about the store\u0026#x27;s Plan Listo depends on who pays it on your account (see Plan and billing). If you pay your stores\u0026#x27; plans, the store starts its Plan Listo and its first month is charged to you in this same request, from your live balance or from the card saved on your account. Fund one of them first, and send an Idempotency-Key on every live create: a create that timed out and is repeated without one makes a second store, and the second store starts a second plan. A store whose first charge fails is still created and still answers 201, with plan.status awaiting_payment: it has no plan yet, nothing is past due, and its deliveries are refused with 402 plan_required until your balance or card covers the month, which Listo then charges by itself. If your account is set up so that each restaurant pays its own plan, nothing is charged to you: the store is created with no plan (plan is null) and the restaurant buys its own Plan Listo in its Listo console. Its deliveries are refused with 402 plan_required until it does. A test store has no plan.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Listo Partner API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.listo.delivery/api-reference/stores/create-a-store\">\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=Create+a+store\u0026amp;description=Registers+a+pickup+location.+%60lat%60%2F%60lng%60+are+optional%3B+send+them+when%0Ayou+have+them+and+we+take+them+as+given%2C+otherwise+we+geocode+%60street%60.%0A%0A%60phone%60+is+E.164.\u0026amp;theme=77fcfc9066d8b9eb9850b729\u0026amp;signature=62a14efc4a4bdcac24234557568cc05b0aa135b88d8090e161cddc9cd61eca43\">\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=\"Create a store - Listo Partner API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Registers a pickup location. lat/lng are optional; send them when you have them and we take them as given, otherwise we geocode street. phone is E.164. A Mexican number is +52 followed by its 10 digits (+52 1 followed by 10 is accepted as WhatsApp writes it); a US or Canadian number is +1 followed by its 10 digits; a number from any other country is accepted with 8 to 15 digits in total. Anything else is refused with validation_failed. timezone is derived from the store\u0026#x27;s position, and you do not have to send one. Mexico spans five zones, and the store\u0026#x27;s own position is what decides which one it keeps its hours in: its scheduled pickup windows, its delivery timestamps and its settlement week are all read in it. A timezone you do send is used only when the position cannot answer: a store with no coordinates, or a position no zone claims. One that disagrees with the position does not change the store and is not an error: the store is created, everything else you sent is applied, and the zone the position gives is what comes back. We would rather correct that quietly than refuse it, because we cannot tell the two cases apart from here: a zone sent by default out of a form that never asked its user arrives looking exactly like a zone somebody chose, and the first store provisioned against the old rule landed an hour ahead of itself for a year of opening hours, delivery timestamps and settlement weeks. Your store\u0026#x27;s position is evidence about where it is. If a store\u0026#x27;s clock looks wrong, its coordinates are what to fix. default_business_fee_share is the share of the delivery fee this store covers by default, 0 to 100, with the rest charged to the customer. Every cash or card delivery from the store inherits it unless the create overrides it. A prepaid delivery, and a quote that names no payment_method, always carry share 100 instead: the whole fee is yours. A store can also split the fee by a fixed peso amount instead of a percentage, which default_fee_split_mode on the store object tells you and default_fee_split_amount_cents carries. Both are read-only: the restaurant chooses the shape in its own Listo console, and there is no field here to set one. Read the mode before you read the share, because in an amount mode the share is not the split in force. Sending default_business_fee_share moves the store back to percent, on this endpoint and on the update. owner_email is optional, and it is a precondition rather than an attribute: send the address of whoever runs the location and we check it against the restaurants that already have a Listo account of their own. If one exists, nothing is created and you get 409 account_exists, because a second account for a kitchen that already has one would split its balance, its console and its history in two. Ask its owner to connect the account they have instead, with POST /v1/connect_requests, as Connect a restaurant that already uses Listo describes. Nothing stores the address and no store object echoes it. It does not create a login either; that is POST /v1/stores/{id}/owner. Listo delivers in Mexico, and a street that resolves to another country is refused with 422 unsupported_country: nothing is created, and no other address in that country will work either. An address we cannot resolve at all is not refused. It is stored as you sent it and located on the first delivery. What a live create does about the store\u0026#x27;s Plan Listo depends on who pays it on your account (see Plan and billing). If you pay your stores\u0026#x27; plans, the store starts its Plan Listo and its first month is charged to you in this same request, from your live balance or from the card saved on your account. Fund one of them first, and send an Idempotency-Key on every live create: a create that timed out and is repeated without one makes a second store, and the second store starts a second plan. A store whose first charge fails is still created and still answers 201, with plan.status awaiting_payment: it has no plan yet, nothing is past due, and its deliveries are refused with 402 plan_required until your balance or card covers the month, which Listo then charges by itself. If your account is set up so that each restaurant pays its own plan, nothing is charged to you: the store is created with no plan (plan is null) and the restaurant buys its own Plan Listo in its Listo console. Its deliveries are refused with 402 plan_required until it does. A test store has no plan.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://listo-c5a11a00.mintlify.site/_mintlify/api/og/v2?title=Create+a+store\u0026amp;description=Registers+a+pickup+location.+%60lat%60%2F%60lng%60+are+optional%3B+send+them+when%0Ayou+have+them+and+we+take+them+as+given%2C+otherwise+we+geocode+%60street%60.%0A%0A%60phone%60+is+E.164.\u0026amp;theme=77fcfc9066d8b9eb9850b729\u0026amp;signature=62a14efc4a4bdcac24234557568cc05b0aa135b88d8090e161cddc9cd61eca43\">\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/api-reference/stores/create-a-store\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/stores/create-a-store.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.listo.delivery/api-reference/stores/create-a-store\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.listo.delivery/es/api-reference/stores/create-a-store\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.listo.delivery/api-reference/stores/create-a-store\">\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/api-reference/stores/create-a-store#webpage\",\"url\":\"https://docs.listo.delivery/api-reference/stores/create-a-store\",\"name\":\"Create a store\",\"description\":\"Registers a pickup location. lat/lng are optional; send them when you have them and we take them as given, otherwise we geocode street. phone is E.164. A Mexican number is +52 followed by its 10 digits (+52 1 followed by 10 is accepted as WhatsApp writes it); a US or Canadian number is +1 followed by its 10 digits; a number from any other country is accepted with 8 to 15 digits in total. Anything else is refused with validation_failed. timezone is derived from the store's position, and you do not have to send one. Mexico spans five zones, and the store's own position is what decides which one it keeps its hours in: its scheduled pickup windows, its delivery timestamps and its settlement week are all read in it. A timezone you do send is used only when the position cannot answer: a store with no coordinates, or a position no zone claims. One that disagrees with the position does not change the store and is not an error: the store is created, everything else you sent is applied, and the zone the position gives is what comes back. We would rather correct that quietly than refuse it, because we cannot tell the two cases apart from here: a zone sent by default out of a form that never asked its user arrives looking exactly like a zone somebody chose, and the first store provisioned against the old rule landed an hour ahead of itself for a year of opening hours, delivery timestamps and settlement weeks. Your store's position is evidence about where it is. If a store's clock looks wrong, its coordinates are what to fix. default_business_fee_share is the share of the delivery fee this store covers by default, 0 to 100, with the rest charged to the customer. Every cash or card delivery from the store inherits it unless the create overrides it. A prepaid delivery, and a quote that names no payment_method, always carry share 100 instead: the whole fee is yours. A store can also split the fee by a fixed peso amount instead of a percentage, which default_fee_split_mode on the store object tells you and default_fee_split_amount_cents carries. Both are read-only: the restaurant chooses the shape in its own Listo console, and there is no field here to set one. Read the mode before you read the share, because in an amount mode the share is not the split in force. Sending default_business_fee_share moves the store back to percent, on this endpoint and on the update. owner_email is optional, and it is a precondition rather than an attribute: send the address of whoever runs the location and we check it against the restaurants that already have a Listo account of their own. If one exists, nothing is created and you get 409 account_exists, because a second account for a kitchen that already has one would split its balance, its console and its history in two. Ask its owner to connect the account they have instead, with POST /v1/connect_requests, as Connect a restaurant that already uses Listo describes. Nothing stores the address and no store object echoes it. It does not create a login either; that is POST /v1/stores/{id}/owner. Listo delivers in Mexico, and a street that resolves to another country is refused with 422 unsupported_country: nothing is created, and no other address in that country will work either. An address we cannot resolve at all is not refused. It is stored as you sent it and located on the first delivery. What a live create does about the store's Plan Listo depends on who pays it on your account (see Plan and billing). If you pay your stores' plans, the store starts its Plan Listo and its first month is charged to you in this same request, from your live balance or from the card saved on your account. Fund one of them first, and send an Idempotency-Key on every live create: a create that timed out and is repeated without one makes a second store, and the second store starts a second plan. A store whose first charge fails is still created and still answers 201, with plan.status awaiting_payment: it has no plan yet, nothing is past due, and its deliveries are refused with 402 plan_required until your balance or card covers the month, which Listo then charges by itself. If your account is set up so that each restaurant pays its own plan, nothing is charged to you: the store is created with no plan (plan is null) and the restaurant buys its own Plan Listo in its Listo console. Its deliveries are refused with 402 plan_required until it does. A test store has no plan.\",\"dateModified\":\"2026-11-07T01:48:55.365Z\",\"isPartOf\":{\"@id\":\"https://docs.listo.delivery#website\"},\"breadcrumb\":{\"@id\":\"https://docs.listo.delivery/api-reference/stores/create-a-store#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.listo.delivery/api-reference/stores/create-a-store#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Reference\",\"item\":\"https://docs.listo.delivery/api-reference/balance/read-your-prepaid-balance\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Stores\",\"item\":\"https://docs.listo.delivery/api-reference/stores/list-your-stores\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Create a store\",\"item\":\"https://docs.listo.delivery/api-reference/stores/create-a-store\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.listo.delivery/api-reference/stores/create-a-store#apireference\",\"headline\":\"Create a store\",\"name\":\"Create a store\",\"description\":\"Registers a pickup location. lat/lng are optional; send them when you have them and we take them as given, otherwise we geocode street. phone is E.164. A Mexican number is +52 followed by its 10 digits (+52 1 followed by 10 is accepted as WhatsApp writes it); a US or Canadian number is +1 followed by its 10 digits; a number from any other country is accepted with 8 to 15 digits in total. Anything else is refused with validation_failed. timezone is derived from the store's position, and you do not have to send one. Mexico spans five zones, and the store's own position is what decides which one it keeps its hours in: its scheduled pickup windows, its delivery timestamps and its settlement week are all read in it. A timezone you do send is used only when the position cannot answer: a store with no coordinates, or a position no zone claims. One that disagrees with the position does not change the store and is not an error: the store is created, everything else you sent is applied, and the zone the position gives is what comes back. We would rather correct that quietly than refuse it, because we cannot tell the two cases apart from here: a zone sent by default out of a form that never asked its user arrives looking exactly like a zone somebody chose, and the first store provisioned against the old rule landed an hour ahead of itself for a year of opening hours, delivery timestamps and settlement weeks. Your store's position is evidence about where it is. If a store's clock looks wrong, its coordinates are what to fix. default_business_fee_share is the share of the delivery fee this store covers by default, 0 to 100, with the rest charged to the customer. Every cash or card delivery from the store inherits it unless the create overrides it. A prepaid delivery, and a quote that names no payment_method, always carry share 100 instead: the whole fee is yours. A store can also split the fee by a fixed peso amount instead of a percentage, which default_fee_split_mode on the store object tells you and default_fee_split_amount_cents carries. Both are read-only: the restaurant chooses the shape in its own Listo console, and there is no field here to set one. Read the mode before you read the share, because in an amount mode the share is not the split in force. Sending default_business_fee_share moves the store back to percent, on this endpoint and on the update. owner_email is optional, and it is a precondition rather than an attribute: send the address of whoever runs the location and we check it against the restaurants that already have a Listo account of their own. If one exists, nothing is created and you get 409 account_exists, because a second account for a kitchen that already has one would split its balance, its console and its history in two. Ask its owner to connect the account they have instead, with POST /v1/connect_requests, as Connect a restaurant that already uses Listo describes. Nothing stores the address and no store object echoes it. It does not create a login either; that is POST /v1/stores/{id}/owner. Listo delivers in Mexico, and a street that resolves to another country is refused with 422 unsupported_country: nothing is created, and no other address in that country will work either. An address we cannot resolve at all is not refused. It is stored as you sent it and located on the first delivery. What a live create does about the store's Plan Listo depends on who pays it on your account (see Plan and billing). If you pay your stores' plans, the store starts its Plan Listo and its first month is charged to you in this same request, from your live balance or from the card saved on your account. Fund one of them first, and send an Idempotency-Key on every live create: a create that timed out and is repeated without one makes a second store, and the second store starts a second plan. A store whose first charge fails is still created and still answers 201, with plan.status awaiting_payment: it has no plan yet, nothing is past due, and its deliveries are refused with 402 plan_required until your balance or card covers the month, which Listo then charges by itself. If your account is set up so that each restaurant pays its own plan, nothing is charged to you: the store is created with no plan (plan is null) and the restaurant buys its own Plan Listo in its Listo console. Its deliveries are refused with 402 plan_required until it does. A test store has no plan.\",\"url\":\"https://docs.listo.delivery/api-reference/stores/create-a-store\",\"mainEntityOfPage\":{\"@id\":\"https://docs.listo.delivery/api-reference/stores/create-a-store#webpage\"},\"dateModified\":\"2026-11-07T01:48:55.365Z\",\"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"}]},"groups":[{"group":"Get started","pages":[{"title":"Quickstart","href":"/en/quickstart"}]},{"group":"Guides","pages":[{"title":"Quote and create a delivery","href":"/en/guides/quote-and-create"},{"title":"Receive and verify webhooks","href":"/en/guides/webhooks"},{"title":"Debugging your integration","href":"/en/guides/debugging"},{"title":"Build with AI","href":"/en/guides/build-with-ai"},{"title":"Fund your balance and withdraw","href":"/en/guides/balance-and-withdrawals"},{"title":"Go live","href":"/en/guides/go-live"},{"title":"Connect a restaurant that already uses Listo","sidebarTitle":"Connect an existing account","href":"/en/guides/connect-existing-account"},{"title":"Plan and billing","href":"/en/guides/plan-and-billing"},{"title":"Connect Claude, Cursor or Codex","href":"/en/guides/connect-ai-client"}]},{"group":"Errors","expanded":false,"pages":[{"title":"Errors","href":"/en/errors/index"},{"title":"account_exists","href":"/en/errors/account_exists"},{"title":"address_not_found","href":"/en/errors/address_not_found"},{"title":"address_undeliverable","href":"/en/errors/address_undeliverable"},{"title":"cancel_failed","href":"/en/errors/cancel_failed"},{"title":"card_below_minimum","href":"/en/errors/card_below_minimum"},{"title":"card_not_ready","href":"/en/errors/card_not_ready"},{"title":"cash_over_cap","href":"/en/errors/cash_over_cap"},{"title":"charge_in_progress","href":"/en/errors/charge_in_progress"},{"title":"code_expired","href":"/en/errors/code_expired"},{"title":"console_access_required","href":"/en/errors/console_access_required"},{"title":"event_not_resendable","href":"/en/errors/event_not_resendable"},{"title":"idempotency_conflict","href":"/en/errors/idempotency_conflict"},{"title":"insufficient_balance","href":"/en/errors/insufficient_balance"},{"title":"internal_error","href":"/en/errors/internal_error"},{"title":"invalid_api_key","href":"/en/errors/invalid_api_key"},{"title":"no_couriers_available","href":"/en/errors/no_couriers_available"},{"title":"not_cancellable","href":"/en/errors/not_cancellable"},{"title":"not_editable","href":"/en/errors/not_editable"},{"title":"not_found","href":"/en/errors/not_found"},{"title":"not_reactivatable","href":"/en/errors/not_reactivatable"},{"title":"not_refundable","href":"/en/errors/not_refundable"},{"title":"not_reschedulable","href":"/en/errors/not_reschedulable"},{"title":"not_retriable","href":"/en/errors/not_retriable"},{"title":"order_too_large","href":"/en/errors/order_too_large"},{"title":"out_of_service_area","href":"/en/errors/out_of_service_area"},{"title":"payout_account_not_ready","href":"/en/errors/payout_account_not_ready"},{"title":"pickup_point_pending","href":"/en/errors/pickup_point_pending"},{"title":"plan_ended","href":"/en/errors/plan_ended"},{"title":"plan_required","href":"/en/errors/plan_required"},{"title":"provider_unavailable","href":"/en/errors/provider_unavailable"},{"title":"quote_consumed","href":"/en/errors/quote_consumed"},{"title":"quote_expired","href":"/en/errors/quote_expired"},{"title":"rate_limited","href":"/en/errors/rate_limited"},{"title":"read_only_key","href":"/en/errors/read_only_key"},{"title":"refund_amount_too_large","href":"/en/errors/refund_amount_too_large"},{"title":"resend_limit_reached","href":"/en/errors/resend_limit_reached"},{"title":"same_day_below_minimum","href":"/en/errors/same_day_below_minimum"},{"title":"same_day_cap_exceeded","href":"/en/errors/same_day_cap_exceeded"},{"title":"test_webhook_limit_reached","href":"/en/errors/test_webhook_limit_reached"},{"title":"unsupported_country","href":"/en/errors/unsupported_country"},{"title":"validation_failed","href":"/en/errors/validation_failed"},{"title":"webhook_endpoint_not_configured","href":"/en/errors/webhook_endpoint_not_configured"}]},{"group":"Reference","pages":[{"group":"Balance","pages":[{"title":"Read your prepaid balance","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/balance","href":"/api-reference/balance/read-your-prepaid-balance"},{"title":"Read a store's balance","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/stores/{store_id}/balance","href":"/api-reference/balance/read-a-stores-balance"}]},{"group":"Account connection","pages":[{"title":"Ask a restaurant to connect its account","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/connect_requests","href":"/api-reference/account-connection/ask-a-restaurant-to-connect-its-account"},{"title":"Exchange an approval for the store","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/connections","href":"/api-reference/account-connection/exchange-an-approval-for-the-store"}]},{"group":"Deliveries","pages":[{"title":"List deliveries","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/deliveries","href":"/api-reference/deliveries/list-deliveries"},{"title":"Create a delivery","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/deliveries","href":"/api-reference/deliveries/create-a-delivery"},{"title":"Cancel a delivery","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/deliveries/{delivery_id}/cancellations","href":"/api-reference/deliveries/cancel-a-delivery"},{"title":"Refund a delivery","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/deliveries/{delivery_id}/refunds","href":"/api-reference/deliveries/refund-a-delivery"},{"title":"Retry a failed dispatch","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/deliveries/{delivery_id}/retries","href":"/api-reference/deliveries/retry-a-failed-dispatch"},{"title":"Fetch a delivery","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/deliveries/{id}","href":"/api-reference/deliveries/fetch-a-delivery"},{"title":"Update a delivery","deprecated":null,"version":null,"openapi":"/openapi/en.yaml patch /v1/deliveries/{id}","href":"/api-reference/deliveries/update-a-delivery"}]},{"group":"Events","pages":[{"title":"List your webhook events","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/events","href":"/api-reference/events/list-your-webhook-events"},{"title":"Send a webhook event again","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/events/{event_id}/resend","href":"/api-reference/events/send-a-webhook-event-again"},{"title":"Retrieve a webhook event","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/events/{id}","href":"/api-reference/events/retrieve-a-webhook-event"},{"title":"Send a test webhook","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/test_webhooks","href":"/api-reference/events/send-a-test-webhook"}]},{"group":"Ledger","pages":[{"title":"List your ledger entries","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/ledger","href":"/api-reference/ledger/list-your-ledger-entries"},{"title":"List a store's ledger entries","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/stores/{store_id}/ledger","href":"/api-reference/ledger/list-a-stores-ledger-entries"}]},{"group":"Authentication","pages":[{"title":"Check that your API key works","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/ping","href":"/api-reference/authentication/check-that-your-api-key-works"}]},{"group":"Quotes","pages":[{"title":"Price a delivery","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/quotes","href":"/api-reference/quotes/price-a-delivery"}]},{"group":"Request logs","pages":[{"title":"List your request log","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/request_logs","href":"/api-reference/request-logs/list-your-request-log"},{"title":"Retrieve a request log entry","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/request_logs/{id}","href":"/api-reference/request-logs/retrieve-a-request-log-entry"}]},{"group":"Stores","pages":[{"title":"List your stores","description":"Your stores, newest first, keyset-paginated. Pass the `cursor` from the\nprevious page to continue; `has_more` tells you when to stop. There is\nno total count, by design.\n\nA key only ever sees the stores of its own world: a test key cannot see\nor address live stores, and the reverse.\n","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/stores","href":"/api-reference/stores/list-your-stores"},{"title":"Create a store","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/stores","href":"/api-reference/stores/create-a-store"},{"title":"Fetch a store","description":"Fetches one store by its `st_` id.\n","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/stores/{id}","href":"/api-reference/stores/fetch-a-store"},{"title":"Update a store","deprecated":null,"version":null,"openapi":"/openapi/en.yaml patch /v1/stores/{id}","href":"/api-reference/stores/update-a-store"},{"title":"Invite a store owner","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/stores/{store_id}/owner","href":"/api-reference/stores/invite-a-store-owner"},{"title":"Reactivate a store's plan","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/stores/{store_id}/plan","href":"/api-reference/stores/reactivate-a-stores-plan"},{"title":"Cancel a store's plan","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/stores/{store_id}/plan_cancellation","href":"/api-reference/stores/cancel-a-stores-plan"},{"title":"Undo a store's plan cancellation","deprecated":null,"version":null,"openapi":"/openapi/en.yaml delete /v1/stores/{store_id}/plan_cancellation","href":"/api-reference/stores/undo-a-stores-plan-cancellation"}]},{"group":"Card onboarding","pages":[{"title":"Start card onboarding for a store","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/stores/{store_id}/stripe_onboarding","href":"/api-reference/card-onboarding/start-card-onboarding-for-a-store"},{"title":"Read a store's card readiness","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/stores/{store_id}/stripe_status","href":"/api-reference/card-onboarding/read-a-stores-card-readiness"},{"title":"Start card onboarding for your company","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/stripe_onboarding","href":"/api-reference/card-onboarding/start-card-onboarding-for-your-company"},{"title":"Read your company's card readiness","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/stripe_status","href":"/api-reference/card-onboarding/read-your-companys-card-readiness"}]},{"group":"Webhook deliveries","pages":[{"title":"List webhook delivery attempts","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/webhook_deliveries","href":"/api-reference/webhook-deliveries/list-webhook-delivery-attempts"}]},{"group":"Withdrawals","pages":[{"title":"List your withdrawals","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/withdrawals","href":"/api-reference/withdrawals/list-your-withdrawals"},{"title":"Request a withdrawal","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/withdrawals","href":"/api-reference/withdrawals/request-a-withdrawal"},{"title":"Fetch a withdrawal","deprecated":null,"version":null,"openapi":"/openapi/en.yaml get /v1/withdrawals/{id}","href":"/api-reference/withdrawals/fetch-a-withdrawal"}]},{"group":"Webhooks","pages":[{"title":"A delivery reached a new status","version":null,"deprecated":null,"openapi":"/openapi/en.yaml webhook delivery.status_changed","href":"/api-reference/webhooks/a-delivery-reached-a-new-status"},{"title":"A delivery changed without changing status","version":null,"deprecated":null,"openapi":"/openapi/en.yaml webhook delivery.updated","href":"/api-reference/webhooks/a-delivery-changed-without-changing-status"},{"title":"The courier moved","version":null,"deprecated":null,"openapi":"/openapi/en.yaml webhook delivery.courier_location","href":"/api-reference/webhooks/the-courier-moved"},{"title":"A withdrawal was settled","version":null,"deprecated":null,"openapi":"/openapi/en.yaml webhook withdrawal.updated","href":"/api-reference/webhooks/a-withdrawal-was-settled"},{"title":"A store changed","version":null,"deprecated":null,"openapi":"/openapi/en.yaml webhook store.updated","href":"/api-reference/webhooks/a-store-changed"},{"title":"A restaurant connected its existing account to you","version":null,"deprecated":null,"openapi":"/openapi/en.yaml webhook store.connected","href":"/api-reference/webhooks/a-restaurant-connected-its-existing-account-to-you"}]}]},{"group":"Concepts","pages":[{"title":"The money model","href":"/en/concepts/money"},{"title":"Where a delivery came from","href":"/en/concepts/delivery-origin"},{"title":"Test mode","href":"/en/concepts/test-mode"},{"title":"Signing","href":"/en/concepts/signing"},{"title":"Cash at the door","href":"/en/concepts/cash-at-the-door"}]},{"group":"Changelog","pages":[{"title":"Changelog","href":"/en/changelog"}]},{"group":"Legal","pages":[{"title":"Terms for Partners","url":"https://listo.delivery/terminos-partners","href":"/en/terms-for-partners"}]}]},{"language":"es","navbar":{"links":[{"href":"https://status.listo.delivery","label":"Estado del servicio"}]},"pages":[{"title":"es","href":"/es/api-reference/stores/create-a-store"}]}]},"basePath":"","title":"Create a store - 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"]}