{
"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": "not_found",
"message": "No resource with that id exists for this API key.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/not_found",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"error": {
"code": "pickup_point_pending",
"message": "This store's pickup point is not confirmed yet, so no courier can be requested from it. Retry the same request shortly.",
"param": null,
"retryable": true,
"doc_url": "https://docs.listo.delivery/en/errors/pickup_point_pending",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"error": {
"code": "cash_over_cap",
"message": "The cash amount is over the collection limit. Use card instead.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/cash_over_cap",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
Prices a trip and holds that price for you to bind. The price is set at
the moment you ask for the quote: bind its id on the delivery create
and the order is charged the fee_cents and the split you were shown.
The courier network books the trip when the delivery is created, and
what it books can differ slightly from the price quoted. We book the
very quote you were shown whenever it is still valid, so this is rare.
When it happens, the difference appears on your ledger as its own line
(requote_adjustment, see GET /v1/ledger), negative when the booked
trip cost more and positive when it cost less. It never changes the
fee_cents, the split or the total of the order your customer sees.
Quotes expire, and expires_at tells you when. Binding an expired or
already-spent quote is a 400; request a new one. Binding is optional,
and a create without one is priced inline at whatever the price is then.
cash_to_collect_cents is what the courier collects at the door on a
cash order: the goods value plus the customer’s share of the fee.
business_fee_share and business_fee_cap_cents say how the delivery
fee is split between you and your customer. A prepaid quote is
different: you have already collected from your customer, so the whole
fee is yours and the split is fixed at 100 with no ceiling. A quote
that names no payment_method is priced the same way, because the only
delivery that can bind it is a prepaid one. On either, a
business_fee_share other than 100 is refused with 422 validation_failed naming business_fee_share, a valid
business_fee_cap_cents is ignored (one that is not a number is refused
as a shape error first), and a quote that sends neither is priced at
100, whatever your store’s default split is. That is the split a
prepaid delivery create books, so a quote you want to bind to a
prepaid delivery either names payment_method: prepaid or names no
method. To split the fee with your customer, name cash or card.
vehicle is moto (the default) or car. A car is a sedan: we can
guarantee a car, never a van, and there are fewer cars than motorcycles,
so one can take longer to assign. A car adds a surcharge that is INSIDE
fee_cents and split like the rest of the fee, so the number you are
quoted is the whole price; there is no separate line for it.
manifest.items is optional and takes the same {name, quantity, size} items the delivery create does. size is one of small (the
default), medium, large or xlarge, and it is the one field on an
item that can change the price: an item sized xlarge makes the trip
a car even when vehicle says moto. Nothing else does, weight
included. The response’s vehicle says which trip the fee is for,
whatever made it one. Send the quote the same cart you will create
with: the create is held to the vehicle this quote was priced as.
A cart too large for one courier trip is refused with 422 order_too_large, naming manifest.items, before anything is priced.
Split it across two deliveries.
Listo prices in Mexican pesos and delivers in Mexico. A store that turns
out to be somewhere else is refused here with 422 unsupported_country, which is final: it is not the retryable
provider_unavailable, and no retry of the same store can succeed. You
will only meet it on a store you positioned yourself, with lat/lng,
since a store we located is refused when you create it.
A store whose pickup point we cannot currently vouch for is refused
with 409 pickup_point_pending, because until it is confirmed a courier
could be sent to the wrong place. Usually the store’s address has just
changed and the confirmation has not landed yet, but not always, so do
not read it as “the merchant moved”. This one IS retryable: nothing
about your request is wrong, and the identical call succeeds once the
pickup point is confirmed. It refuses the store rather than the trip, so
a different dropoff will not help.
Retry it on a minutes-scale backoff, for a bounded number of attempts,
and then put it in front of a human rather than keep polling. Most moves
land within minutes on their own; a few are held up by something only
our staff can clear and take considerably longer, and this response does
not tell the two apart. The restaurant can also unblock it themselves
from their own Listo console, which is usually the faster of the two.
When every courier near the trip is busy, the quote is refused with
409 no_couriers_available and nothing is priced. It is not an outage
and nothing about your request is wrong: it IS retryable, and the
identical call is priced once a courier is free, usually within
minutes. Retry it after a few minutes, for a bounded number of
attempts, and then tell whoever is waiting for the order rather than
keep polling. It is the same word a delivery that ended without a
courier carries in failure_reason.
A live store whose Plan Listo is not paid up is refused with 402 plan_required, because the create would refuse the delivery this
quote prices. error.message names the reason: no active plan, a
charge that is pending, a plan that ended on a given date, a plan whose
included deliveries for the cycle are all used, or a store that cannot
request couriers right now. It is not retryable: the identical call
fails until the plan is paid or restarted, or the cycle renews. See
Plan and billing.
{
"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": "not_found",
"message": "No resource with that id exists for this API key.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/not_found",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"error": {
"code": "pickup_point_pending",
"message": "This store's pickup point is not confirmed yet, so no courier can be requested from it. Retry the same request shortly.",
"param": null,
"retryable": true,
"doc_url": "https://docs.listo.delivery/en/errors/pickup_point_pending",
"request_id": "0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"
}
}
{
"error": {
"code": "cash_over_cap",
"message": "The cash amount is over the collection limit. Use card instead.",
"param": null,
"retryable": false,
"doc_url": "https://docs.listo.delivery/en/errors/cash_over_cap",
"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.
The descriptive item list for the courier. Money never comes from it;
its only effect on the trip is that an xlarge item makes it a car.
Absent, null, {} and {"items": null} all mean no cart.
Show child attributes
Response
Created.
A delivery priced and held for a short while. Hand id to
POST /v1/deliveries as quote_id to book at exactly this price.
The total delivery fee, in centavos, and the number a booking
against this quote is held to. business_fee_cents plus
customer_fee_cents always add back to it.
What the courier collects at the door on a cash order: the order
value plus the customer's share of the fee. Null on every quote
that is not a cash quote, which is not the same as 0 (a cash
order that collects nothing).
What this price was built for: car when you asked for one or an
item was sized xlarge, moto otherwise. Always present.
Available options:
moto,
car
Example:
"moto"
{"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/quotes/price-a-delivery","slug":"/api-reference/quotes/price-a-delivery","pageMetadata":{"title":"Price a delivery","description":"Prices a trip and holds that price for you to bind. The price is set at\nthe moment you ask for the quote: bind its `id` on the delivery create\nand the order is charged the `fee_cents` and the split you were shown.\n\nThe courier network books the trip when the delivery is created, and\nwhat it books can differ slightly from the price quoted. We book the\nvery quote you were shown whenever it is still valid, so this is rare.\nWhen it happens, the difference appears on your ledger as its own line\n(`requote_adjustment`, see `GET /v1/ledger`), negative when the booked\ntrip cost more and positive when it cost less. It never changes the\n`fee_cents`, the split or the total of the order your customer sees.\n\nQuotes expire, and `expires_at` tells you when. Binding an expired or\nalready-spent quote is a `400`; request a new one. Binding is optional,\nand a create without one is priced inline at whatever the price is then.\n\n`cash_to_collect_cents` is what the courier collects at the door on a\ncash order: the goods value plus the customer's share of the fee.\n\n`business_fee_share` and `business_fee_cap_cents` say how the delivery\nfee is split between you and your customer. A `prepaid` quote is\ndifferent: you have already collected from your customer, so the whole\nfee is yours and the split is fixed at 100 with no ceiling. A quote\nthat names no `payment_method` is priced the same way, because the only\ndelivery that can bind it is a `prepaid` one. On either, a\n`business_fee_share` other than 100 is refused with `422\nvalidation_failed` naming `business_fee_share`, a valid\n`business_fee_cap_cents` is ignored (one that is not a number is refused\nas a shape error first), and a quote that sends neither is priced at\n100, whatever your store's default split is. That is the split a\n`prepaid` delivery create books, so a quote you want to bind to a\n`prepaid` delivery either names `payment_method: prepaid` or names no\nmethod. To split the fee with your customer, name `cash` or `card`.\n\n`vehicle` is `moto` (the default) or `car`. A car is a sedan: we can\nguarantee a car, never a van, and there are fewer cars than motorcycles,\nso one can take longer to assign. A car adds a surcharge that is INSIDE\n`fee_cents` and split like the rest of the fee, so the number you are\nquoted is the whole price; there is no separate line for it.\n\n`manifest.items` is optional and takes the same `{name, quantity,\nsize}` items the delivery create does. `size` is one of `small` (the\ndefault), `medium`, `large` or `xlarge`, and it is the one field on an\nitem that can change the price: an item sized `xlarge` makes the trip\na car even when `vehicle` says `moto`. Nothing else does, weight\nincluded. The response's `vehicle` says which trip the fee is for,\nwhatever made it one. Send the quote the same cart you will create\nwith: the create is held to the vehicle this quote was priced as.\n\nA cart too large for one courier trip is refused with `422\norder_too_large`, naming `manifest.items`, before anything is priced.\nSplit it across two deliveries.\n\nListo prices in Mexican pesos and delivers in Mexico. A store that turns\nout to be somewhere else is refused here with `422\nunsupported_country`, which is final: it is not the retryable\n`provider_unavailable`, and no retry of the same store can succeed. You\nwill only meet it on a store you positioned yourself, with `lat`/`lng`,\nsince a store we located is refused when you create it.\n\nA store whose pickup point we cannot currently vouch for is refused\nwith `409 pickup_point_pending`, because until it is confirmed a courier\ncould be sent to the wrong place. Usually the store's address has just\nchanged and the confirmation has not landed yet, but not always, so do\nnot read it as \"the merchant moved\". This one IS retryable: nothing\nabout your request is wrong, and the identical call succeeds once the\npickup point is confirmed. It refuses the store rather than the trip, so\na different dropoff will not help.\n\nRetry it on a minutes-scale backoff, for a bounded number of attempts,\nand then put it in front of a human rather than keep polling. Most moves\nland within minutes on their own; a few are held up by something only\nour staff can clear and take considerably longer, and this response does\nnot tell the two apart. The restaurant can also unblock it themselves\nfrom their own Listo console, which is usually the faster of the two.\n\nWhen every courier near the trip is busy, the quote is refused with\n`409 no_couriers_available` and nothing is priced. It is not an outage\nand nothing about your request is wrong: it IS retryable, and the\nidentical call is priced once a courier is free, usually within\nminutes. Retry it after a few minutes, for a bounded number of\nattempts, and then tell whoever is waiting for the order rather than\nkeep polling. It is the same word a delivery that ended without a\ncourier carries in `failure_reason`.\n\nA live store whose Plan Listo is not paid up is refused with `402\nplan_required`, because the create would refuse the delivery this\nquote prices. `error.message` names the reason: no active plan, a\ncharge that is pending, a plan that ended on a given date, a plan whose\nincluded deliveries for the cycle are all used, or a store that cannot\nrequest couriers right now. It is not `retryable`: the identical call\nfails until the plan is paid or restarted, or the cycle renews. See\n[Plan and billing](https://docs.listo.delivery/en/guides/plan-and-billing).\n","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/quotes","href":"/api-reference/quotes/price-a-delivery","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: [\"Prices a trip and holds that price for you to bind. The price is set at\\nthe moment you ask for the quote: bind its \", _jsx(_components.code, {\n children: \"id\"\n }), \" on the delivery create\\nand the order is charged the \", _jsx(_components.code, {\n children: \"fee_cents\"\n }), \" and the split you were shown.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The courier network books the trip when the delivery is created, and\\nwhat it books can differ slightly from the price quoted. We book the\\nvery quote you were shown whenever it is still valid, so this is rare.\\nWhen it happens, the difference appears on your ledger as its own line\\n(\", _jsx(_components.code, {\n children: \"requote_adjustment\"\n }), \", see \", _jsx(_components.code, {\n children: \"GET /v1/ledger\"\n }), \"), negative when the booked\\ntrip cost more and positive when it cost less. It never changes the\\n\", _jsx(_components.code, {\n children: \"fee_cents\"\n }), \", the split or the total of the order your customer sees.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Quotes expire, and \", _jsx(_components.code, {\n children: \"expires_at\"\n }), \" tells you when. Binding an expired or\\nalready-spent quote is a \", _jsx(_components.code, {\n children: \"400\"\n }), \"; request a new one. Binding is optional,\\nand a create without one is priced inline at whatever the price is then.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"cash_to_collect_cents\"\n }), \" is what the courier collects at the door on a\\ncash order: the goods value plus the customer’s share of the fee.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"business_fee_share\"\n }), \" and \", _jsx(_components.code, {\n children: \"business_fee_cap_cents\"\n }), \" say how the delivery\\nfee is split between you and your customer. A \", _jsx(_components.code, {\n children: \"prepaid\"\n }), \" quote is\\ndifferent: you have already collected from your customer, so the whole\\nfee is yours and the split is fixed at 100 with no ceiling. A quote\\nthat names no \", _jsx(_components.code, {\n children: \"payment_method\"\n }), \" is priced the same way, because the only\\ndelivery that can bind it is a \", _jsx(_components.code, {\n children: \"prepaid\"\n }), \" one. On either, a\\n\", _jsx(_components.code, {\n children: \"business_fee_share\"\n }), \" other than 100 is refused with \", _jsx(_components.code, {\n children: \"422 validation_failed\"\n }), \" naming \", _jsx(_components.code, {\n children: \"business_fee_share\"\n }), \", a valid\\n\", _jsx(_components.code, {\n children: \"business_fee_cap_cents\"\n }), \" is ignored (one that is not a number is refused\\nas a shape error first), and a quote that sends neither is priced at\\n100, whatever your store’s default split is. That is the split a\\n\", _jsx(_components.code, {\n children: \"prepaid\"\n }), \" delivery create books, so a quote you want to bind to a\\n\", _jsx(_components.code, {\n children: \"prepaid\"\n }), \" delivery either names \", _jsx(_components.code, {\n children: \"payment_method: prepaid\"\n }), \" or names no\\nmethod. To split the fee with your customer, name \", _jsx(_components.code, {\n children: \"cash\"\n }), \" or \", _jsx(_components.code, {\n children: \"card\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"vehicle\"\n }), \" is \", _jsx(_components.code, {\n children: \"moto\"\n }), \" (the default) or \", _jsx(_components.code, {\n children: \"car\"\n }), \". A car is a sedan: we can\\nguarantee a car, never a van, and there are fewer cars than motorcycles,\\nso one can take longer to assign. A car adds a surcharge that is INSIDE\\n\", _jsx(_components.code, {\n children: \"fee_cents\"\n }), \" and split like the rest of the fee, so the number you are\\nquoted is the whole price; there is no separate line for it.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.code, {\n children: \"manifest.items\"\n }), \" is optional and takes the same \", _jsx(_components.code, {\n children: \"{name, quantity, size}\"\n }), \" items the delivery create does. \", _jsx(_components.code, {\n children: \"size\"\n }), \" is one of \", _jsx(_components.code, {\n children: \"small\"\n }), \" (the\\ndefault), \", _jsx(_components.code, {\n children: \"medium\"\n }), \", \", _jsx(_components.code, {\n children: \"large\"\n }), \" or \", _jsx(_components.code, {\n children: \"xlarge\"\n }), \", and it is the one field on an\\nitem that can change the price: an item sized \", _jsx(_components.code, {\n children: \"xlarge\"\n }), \" makes the trip\\na car even when \", _jsx(_components.code, {\n children: \"vehicle\"\n }), \" says \", _jsx(_components.code, {\n children: \"moto\"\n }), \". Nothing else does, weight\\nincluded. The response’s \", _jsx(_components.code, {\n children: \"vehicle\"\n }), \" says which trip the fee is for,\\nwhatever made it one. Send the quote the same cart you will create\\nwith: the create is held to the vehicle this quote was priced as.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A cart too large for one courier trip is refused with \", _jsx(_components.code, {\n children: \"422 order_too_large\"\n }), \", naming \", _jsx(_components.code, {\n children: \"manifest.items\"\n }), \", before anything is priced.\\nSplit it across two deliveries.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Listo prices in Mexican pesos and delivers in Mexico. A store that turns\\nout to be somewhere else is refused here with \", _jsx(_components.code, {\n children: \"422 unsupported_country\"\n }), \", which is final: it is not the retryable\\n\", _jsx(_components.code, {\n children: \"provider_unavailable\"\n }), \", and no retry of the same store can succeed. You\\nwill only meet it on a store you positioned yourself, with \", _jsx(_components.code, {\n children: \"lat\"\n }), \"/\", _jsx(_components.code, {\n children: \"lng\"\n }), \",\\nsince a store we located is refused when you create it.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A store whose pickup point we cannot currently vouch for is refused\\nwith \", _jsx(_components.code, {\n children: \"409 pickup_point_pending\"\n }), \", because until it is confirmed a courier\\ncould be sent to the wrong place. Usually the store’s address has just\\nchanged and the confirmation has not landed yet, but not always, so do\\nnot read it as “the merchant moved”. This one IS retryable: nothing\\nabout your request is wrong, and the identical call succeeds once the\\npickup point is confirmed. It refuses the store rather than the trip, so\\na different dropoff will not help.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Retry it on a minutes-scale backoff, for a bounded number of attempts,\\nand then put it in front of a human rather than keep polling. Most moves\\nland within minutes on their own; a few are held up by something only\\nour staff can clear and take considerably longer, and this response does\\nnot tell the two apart. The restaurant can also unblock it themselves\\nfrom their own Listo console, which is usually the faster of the two.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"When every courier near the trip is busy, the quote is refused with\\n\", _jsx(_components.code, {\n children: \"409 no_couriers_available\"\n }), \" and nothing is priced. It is not an outage\\nand nothing about your request is wrong: it IS retryable, and the\\nidentical call is priced once a courier is free, usually within\\nminutes. Retry it after a few minutes, for a bounded number of\\nattempts, and then tell whoever is waiting for the order rather than\\nkeep polling. It is the same word a delivery that ended without a\\ncourier carries in \", _jsx(_components.code, {\n children: \"failure_reason\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A live store whose Plan Listo is not paid up is refused with \", _jsx(_components.code, {\n children: \"402 plan_required\"\n }), \", because the create would refuse the delivery this\\nquote prices. \", _jsx(_components.code, {\n children: \"error.message\"\n }), \" names the reason: no active plan, a\\ncharge that is pending, a plan that ended on a given date, a plan whose\\nincluded deliveries for the cycle are all used, or a store that cannot\\nrequest couriers right now. It is not \", _jsx(_components.code, {\n children: \"retryable\"\n }), \": the identical call\\nfails until the plan is paid or restarted, or the cycle renews. See\\n\", _jsx(_components.a, {\n href: \"https://docs.listo.delivery/en/guides/plan-and-billing\",\n children: \"Plan and billing\"\n }), \".\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Price a delivery","description":"Prices a trip and holds that price for you to bind. The price is set at\nthe moment you ask for the quote: bind its `id` on the delivery create\nand the order is charged the `fee_cents` and the split you were shown.\n\nThe courier network books the trip when the delivery is created, and\nwhat it books can differ slightly from the price quoted. We book the\nvery quote you were shown whenever it is still valid, so this is rare.\nWhen it happens, the difference appears on your ledger as its own line\n(`requote_adjustment`, see `GET /v1/ledger`), negative when the booked\ntrip cost more and positive when it cost less. It never changes the\n`fee_cents`, the split or the total of the order your customer sees.\n\nQuotes expire, and `expires_at` tells you when. Binding an expired or\nalready-spent quote is a `400`; request a new one. Binding is optional,\nand a create without one is priced inline at whatever the price is then.\n\n`cash_to_collect_cents` is what the courier collects at the door on a\ncash order: the goods value plus the customer's share of the fee.\n\n`business_fee_share` and `business_fee_cap_cents` say how the delivery\nfee is split between you and your customer. A `prepaid` quote is\ndifferent: you have already collected from your customer, so the whole\nfee is yours and the split is fixed at 100 with no ceiling. A quote\nthat names no `payment_method` is priced the same way, because the only\ndelivery that can bind it is a `prepaid` one. On either, a\n`business_fee_share` other than 100 is refused with `422\nvalidation_failed` naming `business_fee_share`, a valid\n`business_fee_cap_cents` is ignored (one that is not a number is refused\nas a shape error first), and a quote that sends neither is priced at\n100, whatever your store's default split is. That is the split a\n`prepaid` delivery create books, so a quote you want to bind to a\n`prepaid` delivery either names `payment_method: prepaid` or names no\nmethod. To split the fee with your customer, name `cash` or `card`.\n\n`vehicle` is `moto` (the default) or `car`. A car is a sedan: we can\nguarantee a car, never a van, and there are fewer cars than motorcycles,\nso one can take longer to assign. A car adds a surcharge that is INSIDE\n`fee_cents` and split like the rest of the fee, so the number you are\nquoted is the whole price; there is no separate line for it.\n\n`manifest.items` is optional and takes the same `{name, quantity,\nsize}` items the delivery create does. `size` is one of `small` (the\ndefault), `medium`, `large` or `xlarge`, and it is the one field on an\nitem that can change the price: an item sized `xlarge` makes the trip\na car even when `vehicle` says `moto`. Nothing else does, weight\nincluded. The response's `vehicle` says which trip the fee is for,\nwhatever made it one. Send the quote the same cart you will create\nwith: the create is held to the vehicle this quote was priced as.\n\nA cart too large for one courier trip is refused with `422\norder_too_large`, naming `manifest.items`, before anything is priced.\nSplit it across two deliveries.\n\nListo prices in Mexican pesos and delivers in Mexico. A store that turns\nout to be somewhere else is refused here with `422\nunsupported_country`, which is final: it is not the retryable\n`provider_unavailable`, and no retry of the same store can succeed. You\nwill only meet it on a store you positioned yourself, with `lat`/`lng`,\nsince a store we located is refused when you create it.\n\nA store whose pickup point we cannot currently vouch for is refused\nwith `409 pickup_point_pending`, because until it is confirmed a courier\ncould be sent to the wrong place. Usually the store's address has just\nchanged and the confirmation has not landed yet, but not always, so do\nnot read it as \"the merchant moved\". This one IS retryable: nothing\nabout your request is wrong, and the identical call succeeds once the\npickup point is confirmed. It refuses the store rather than the trip, so\na different dropoff will not help.\n\nRetry it on a minutes-scale backoff, for a bounded number of attempts,\nand then put it in front of a human rather than keep polling. Most moves\nland within minutes on their own; a few are held up by something only\nour staff can clear and take considerably longer, and this response does\nnot tell the two apart. The restaurant can also unblock it themselves\nfrom their own Listo console, which is usually the faster of the two.\n\nWhen every courier near the trip is busy, the quote is refused with\n`409 no_couriers_available` and nothing is priced. It is not an outage\nand nothing about your request is wrong: it IS retryable, and the\nidentical call is priced once a courier is free, usually within\nminutes. Retry it after a few minutes, for a bounded number of\nattempts, and then tell whoever is waiting for the order rather than\nkeep polling. It is the same word a delivery that ended without a\ncourier carries in `failure_reason`.\n\nA live store whose Plan Listo is not paid up is refused with `402\nplan_required`, because the create would refuse the delivery this\nquote prices. `error.message` names the reason: no active plan, a\ncharge that is pending, a plan that ended on a given date, a plan whose\nincluded deliveries for the cycle are all used, or a store that cannot\nrequest couriers right now. It is not `retryable`: the identical call\nfails until the plan is paid or restarted, or the cycle renews. See\n[Plan and billing](https://docs.listo.delivery/en/guides/plan-and-billing).\n","deprecated":null,"version":null,"openapi":"/openapi/en.yaml post /v1/quotes","href":"/api-reference/quotes/price-a-delivery","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Price a delivery","description":"Prices a trip and holds that price for you to bind. The price is set at\nthe moment you ask for the quote: bind its `id` on the delivery create\nand the order is charged the `fee_cents` and the split you were shown.\n\nThe courier network books the trip when the delivery is created, and\nwhat it books can differ slightly from the price quoted. We book the\nvery quote you were shown whenever it is still valid, so this is rare.\nWhen it happens, the difference appears on your ledger as its own line\n(`requote_adjustment`, see `GET /v1/ledger`), negative when the booked\ntrip cost more and positive when it cost less. It never changes the\n`fee_cents`, the split or the total of the order your customer sees.\n\nQuotes expire, and `expires_at` tells you when. Binding an expired or\nalready-spent quote is a `400`; request a new one. Binding is optional,\nand a create without one is priced inline at whatever the price is then.\n\n`cash_to_collect_cents` is what the courier collects at the door on a\ncash order: the goods value plus the customer's share of the fee.\n\n`business_fee_share` and `business_fee_cap_cents` say how the delivery\nfee is split between you and your customer. A `prepaid` quote is\ndifferent: you have already collected from your customer, so the whole\nfee is yours and the split is fixed at 100 with no ceiling. A quote\nthat names no `payment_method` is priced the same way, because the only\ndelivery that can bind it is a `prepaid` one. On either, a\n`business_fee_share` other than 100 is refused with `422\nvalidation_failed` naming `business_fee_share`, a valid\n`business_fee_cap_cents` is ignored (one that is not a number is refused\nas a shape error first), and a quote that sends neither is priced at\n100, whatever your store's default split is. That is the split a\n`prepaid` delivery create books, so a quote you want to bind to a\n`prepaid` delivery either names `payment_method: prepaid` or names no\nmethod. To split the fee with your customer, name `cash` or `card`.\n\n`vehicle` is `moto` (the default) or `car`. A car is a sedan: we can\nguarantee a car, never a van, and there are fewer cars than motorcycles,\nso one can take longer to assign. A car adds a surcharge that is INSIDE\n`fee_cents` and split like the rest of the fee, so the number you are\nquoted is the whole price; there is no separate line for it.\n\n`manifest.items` is optional and takes the same `{name, quantity,\nsize}` items the delivery create does. `size` is one of `small` (the\ndefault), `medium`, `large` or `xlarge`, and it is the one field on an\nitem that can change the price: an item sized `xlarge` makes the trip\na car even when `vehicle` says `moto`. Nothing else does, weight\nincluded. The response's `vehicle` says which trip the fee is for,\nwhatever made it one. Send the quote the same cart you will create\nwith: the create is held to the vehicle this quote was priced as.\n\nA cart too large for one courier trip is refused with `422\norder_too_large`, naming `manifest.items`, before anything is priced.\nSplit it across two deliveries.\n\nListo prices in Mexican pesos and delivers in Mexico. A store that turns\nout to be somewhere else is refused here with `422\nunsupported_country`, which is final: it is not the retryable\n`provider_unavailable`, and no retry of the same store can succeed. You\nwill only meet it on a store you positioned yourself, with `lat`/`lng`,\nsince a store we located is refused when you create it.\n\nA store whose pickup point we cannot currently vouch for is refused\nwith `409 pickup_point_pending`, because until it is confirmed a courier\ncould be sent to the wrong place. Usually the store's address has just\nchanged and the confirmation has not landed yet, but not always, so do\nnot read it as \"the merchant moved\". This one IS retryable: nothing\nabout your request is wrong, and the identical call succeeds once the\npickup point is confirmed. It refuses the store rather than the trip, so\na different dropoff will not help.\n\nRetry it on a minutes-scale backoff, for a bounded number of attempts,\nand then put it in front of a human rather than keep polling. Most moves\nland within minutes on their own; a few are held up by something only\nour staff can clear and take considerably longer, and this response does\nnot tell the two apart. The restaurant can also unblock it themselves\nfrom their own Listo console, which is usually the faster of the two.\n\nWhen every courier near the trip is busy, the quote is refused with\n`409 no_couriers_available` and nothing is priced. It is not an outage\nand nothing about your request is wrong: it IS retryable, and the\nidentical call is priced once a courier is free, usually within\nminutes. Retry it after a few minutes, for a bounded number of\nattempts, and then tell whoever is waiting for the order rather than\nkeep polling. It is the same word a delivery that ended without a\ncourier carries in `failure_reason`.\n\nA live store whose Plan Listo is not paid up is refused with `402\nplan_required`, because the create would refuse the delivery this\nquote prices. `error.message` names the reason: no active plan, a\ncharge that is pending, a plan that ended on a given date, a plan whose\nincluded deliveries for the cycle are all used, or a store that cannot\nrequest couriers right now. It is not `retryable`: the identical call\nfails until the plan is paid or restarted, or the cycle renews. See\n[Plan and billing](https://docs.listo.delivery/en/guides/plan-and-billing).\n","tags":["Quotes"],"operationId":"createQuote","security":["dd3567f8-94f6-453d-a218-374608623bd9"],"requestBody":"64c1c3dd-6ca0-46c4-9415-cf70b8bd0321","responses":{"201":"e300254c-9ec9-4cde-9ffc-5d7276a07988","401":"0c3837a0-aaf3-42e7-bf3a-6ee3a2f8b097","403":"17d42aa8-4469-4d01-a207-9e53acb8c5fc","404":"5741a573-c9b8-4385-9a74-89c8f4c3ce36","409":"dd933c92-7f38-4709-979a-5032113185ed","422":"b2978301-a350-4ce5-a795-a59dced5cd7b","503":"9b5c9167-2c74-4b02-b972-e8a555631d5e"},"method":"post","type":"path","servers":["a658606d-cd78-44bb-b1d3-622847e198a1"],"path":"/v1/quotes","baseUrlOptions":["https://api.listo.delivery"],"title":"Price a delivery","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"The trip to price.","properties":{"store_id":{"type":"string","description":"The `st_` id of the store the courier collects from.","isRequired":true,"uniqueKey":"store_id","typeLabel":"string"},"dropoff":{"type":"object","description":"Where the order goes.","properties":{"street":{"type":"string","description":"The full street address, in one string.","isRequired":true,"uniqueKey":"dropoff.street","typeLabel":"string"},"apt_unit":{"type":"string","uniqueKey":"dropoff.apt_unit","typeLabel":"string"},"lat":{"type":"number","format":"double","minimum":-90,"maximum":90,"description":"Latitude. Send it together with `lng`, or neither.","uniqueKey":"dropoff.lat","typeLabel":"number\u003cdouble>"},"lng":{"type":"number","format":"double","minimum":-180,"maximum":180,"description":"Longitude. Send it together with `lat`, or neither.","uniqueKey":"dropoff.lng","typeLabel":"number\u003cdouble>"}},"required":["street"],"isRequired":true,"uniqueKey":"dropoff","typeLabel":"object"},"payment_method":{"type":"string","enum":["prepaid","cash","card"],"description":"How the customer pays.","uniqueKey":"payment_method","typeLabel":"enum\u003cstring>"},"order_value_cents":{"type":"integer","minimum":0,"description":"The value of the order, in centavos. Required for a `cash`\nquote, where it is what the courier collects.\n","uniqueKey":"order_value_cents","typeLabel":"integer"},"business_fee_share":{"type":"integer","minimum":0,"maximum":100,"description":"The percent of the delivery fee the store pays. Defaults to the store's own.","uniqueKey":"business_fee_share","typeLabel":"integer"},"business_fee_cap_cents":{"type":"integer","minimum":0,"description":"The most the store pays toward the fee, in centavos.","uniqueKey":"business_fee_cap_cents","typeLabel":"integer"},"pickup_ready_at":{"type":"string","format":"date-time","description":"When the order will be ready, ISO-8601 in UTC. Must be in the future.","uniqueKey":"pickup_ready_at","typeLabel":"string\u003cdate-time>"},"vehicle":{"type":"string","enum":["moto","car"],"description":"Defaults to `moto`.","uniqueKey":"vehicle","typeLabel":"enum\u003cstring>"},"manifest":{"oneOf":[{"type":"object","description":"The descriptive item list for the courier. Money never comes from it;\nits only effect on the trip is that an `xlarge` item makes it a car.\nAbsent, null, `{}` and `{\"items\": null}` all mean no cart.\n","properties":{"items":{"oneOf":[{"type":"array","items":{"type":"object","description":"One line of the descriptive item list sent to the courier.","properties":{"name":{"type":"string","description":"What the item is.","isRequired":true,"uniqueKey":"manifest.oneOf.0.\\items.oneOf.0.items.[INDEX].name","typeLabel":"string"},"quantity":{"type":"integer","minimum":1,"description":"How many of it. A positive whole number.","isRequired":true,"uniqueKey":"manifest.oneOf.0.\\items.oneOf.0.items.[INDEX].quantity","typeLabel":"integer"},"size":{"oneOf":[{"type":"string","enum":["small","medium","large","xlarge",null],"description":"How big the item is. Leave it out for `small`. An `xlarge` item\nmakes the trip a car.\n","uniqueKey":"manifest.oneOf.0.\\items.oneOf.0.items.[INDEX].size.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["small","medium","large","xlarge",null],"description":"How big the item is. Leave it out for `small`. An `xlarge` item\nmakes the trip a car.\n","uniqueKey":"manifest.oneOf.0.\\items.oneOf.0.items.[INDEX].size.oneOf.1","typeLabel":"null"}],"uniqueKey":"manifest.oneOf.0.\\items.oneOf.0.items.[INDEX].size","typeLabel":"enum\u003cstring> | null"}},"required":["name","quantity"],"uniqueKey":"manifest.oneOf.0.\\items.oneOf.0.items.[INDEX]","typeLabel":"object"},"uniqueKey":"manifest.oneOf.0.\\items.oneOf.0","typeLabel":"object[]"},{"type":"null","items":{"type":"object","description":"One line of the descriptive item list sent to the courier.","properties":{"name":{"type":"string","description":"What the item is."},"quantity":{"type":"integer","minimum":1,"description":"How many of it. A positive whole number."},"size":{"oneOf":[{"type":"string","enum":["small","medium","large","xlarge",null],"description":"How big the item is. Leave it out for `small`. An `xlarge` item\nmakes the trip a car.\n"},{"type":"null","enum":["small","medium","large","xlarge",null],"description":"How big the item is. Leave it out for `small`. An `xlarge` item\nmakes the trip a car.\n"}]}},"required":["name","quantity"]},"uniqueKey":"manifest.oneOf.0.\\items.oneOf.1","typeLabel":"null"}],"uniqueKey":"manifest.oneOf.0.\\items","typeLabel":"object[] | null"}},"uniqueKey":"manifest.oneOf.0","typeLabel":"object"},{"type":"null","description":"The descriptive item list for the courier. Money never comes from it;\nits only effect on the trip is that an `xlarge` item makes it a car.\nAbsent, null, `{}` and `{\"items\": null}` all mean no cart.\n","properties":{"items":{"oneOf":[{"type":"array","items":{"type":"object","description":"One line of the descriptive item list sent to the courier.","properties":{"name":{"type":"string","description":"What the item is."},"quantity":{"type":"integer","minimum":1,"description":"How many of it. A positive whole number."},"size":{"oneOf":[{"type":"string","enum":["small","medium","large","xlarge",null],"description":"How big the item is. Leave it out for `small`. An `xlarge` item\nmakes the trip a car.\n"},{"type":"null","enum":["small","medium","large","xlarge",null],"description":"How big the item is. Leave it out for `small`. An `xlarge` item\nmakes the trip a car.\n"}]}},"required":["name","quantity"]}},{"type":"null","items":{"type":"object","description":"One line of the descriptive item list sent to the courier.","properties":{"name":{"type":"string","description":"What the item is."},"quantity":{"type":"integer","minimum":1,"description":"How many of it. A positive whole number."},"size":{"oneOf":[{"type":"string","enum":["small","medium","large","xlarge",null],"description":"How big the item is. Leave it out for `small`. An `xlarge` item\nmakes the trip a car.\n"},{"type":"null","enum":["small","medium","large","xlarge",null],"description":"How big the item is. Leave it out for `small`. An `xlarge` item\nmakes the trip a car.\n"}]}},"required":["name","quantity"]}}]}},"uniqueKey":"manifest.oneOf.1","typeLabel":"null"}],"uniqueKey":"manifest","typeLabel":"object | null"}},"required":["store_id","dropoff"],"uniqueKey":"","typeLabel":"object"},"example":{"store_id":"st_4bR8kM2wQ7xT1nV5cZ9pLdYe","dropoff":{"street":"Blvd. Puerta de Hierro 4965, Zapopan, Jalisco 45116","lat":20.709395,"lng":-103.413393,"apt_unit":"Depto 4B"},"payment_method":"cash","order_value_cents":19600,"business_fee_share":100,"business_fee_cap_cents":3000,"vehicle":"car","manifest":{"items":[{"name":"Tacos al pastor","quantity":2},{"name":"Refrigerador","quantity":1,"size":"xlarge"}]},"pickup_ready_at":"2026-07-29T00:25:00Z"},"examples":{"Example":{"title":"Example","value":{"store_id":"st_4bR8kM2wQ7xT1nV5cZ9pLdYe","dropoff":{"street":"Blvd. Puerta de Hierro 4965, Zapopan, Jalisco 45116","lat":20.709395,"lng":-103.413393,"apt_unit":"Depto 4B"},"payment_method":"cash","order_value_cents":19600,"business_fee_share":100,"business_fee_cap_cents":3000,"vehicle":"car","manifest":{"items":[{"name":"Tacos al pastor","quantity":2},{"name":"Refrigerador","quantity":1,"size":"xlarge"}]},"pickup_ready_at":"2026-07-29T00:25:00Z"}}},"exampleType":"examples"}},"required":true,"exampleType":"examples"},"responses":{"e300254c-9ec9-4cde-9ffc-5d7276a07988":{"description":"Created.","content":{"application/json":{"schema":{"type":"object","description":"A delivery priced and held for a short while. Hand `id` to\n`POST /v1/deliveries` as `quote_id` to book at exactly this price.\n","properties":{"id":{"type":"string","description":"The quote id, `qt_` prefixed.","example":"qt_5nW3jP8vT2xQ6bM9cZ1sRdKe","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"fee_cents":{"type":"integer","description":"The total delivery fee, in centavos, and the number a booking\nagainst this quote is held to. `business_fee_cents` plus\n`customer_fee_cents` always add back to it.\n","isRequired":true,"uniqueKey":"fee_cents","typeLabel":"integer"},"business_fee_cents":{"type":"integer","description":"The part of the fee the store pays.","isRequired":true,"uniqueKey":"business_fee_cents","typeLabel":"integer"},"customer_fee_cents":{"type":"integer","description":"The part of the fee the customer pays.","isRequired":true,"uniqueKey":"customer_fee_cents","typeLabel":"integer"},"cash_to_collect_cents":{"oneOf":[{"type":"integer","description":"What the courier collects at the door on a cash order: the order\nvalue plus the customer's share of the fee. Null on every quote\nthat is not a cash quote, which is not the same as `0` (a cash\norder that collects nothing).\n","isRequired":true,"uniqueKey":"cash_to_collect_cents.oneOf.0","typeLabel":"integer"},{"type":"null","description":"What the courier collects at the door on a cash order: the order\nvalue plus the customer's share of the fee. Null on every quote\nthat is not a cash quote, which is not the same as `0` (a cash\norder that collects nothing).\n","isRequired":true,"uniqueKey":"cash_to_collect_cents.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"cash_to_collect_cents","typeLabel":"integer | null"},"currency":{"type":"string","enum":["MXN"],"description":"Always `MXN`; money is integer centavos.","isRequired":true,"uniqueKey":"currency","typeLabel":"enum\u003cstring>"},"pickup_duration_min":{"oneOf":[{"type":"integer","description":"Minutes until a courier is expected at the store, when the quote\ncame back with an estimate. Null otherwise.\n","isRequired":true,"uniqueKey":"pickup_duration_min.oneOf.0","typeLabel":"integer"},{"type":"null","description":"Minutes until a courier is expected at the store, when the quote\ncame back with an estimate. Null otherwise.\n","isRequired":true,"uniqueKey":"pickup_duration_min.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"pickup_duration_min","typeLabel":"integer | null"},"dropoff_eta_at":{"oneOf":[{"type":"string","format":"date-time","description":"When the order is expected at the door, when the quote came back with an estimate. Null otherwise.","isRequired":true,"uniqueKey":"dropoff_eta_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"When the order is expected at the door, when the quote came back with an estimate. Null otherwise.","isRequired":true,"uniqueKey":"dropoff_eta_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"dropoff_eta_at","typeLabel":"string\u003cdate-time> | null"},"expires_at":{"type":"string","format":"date-time","description":"The deadline for booking this price. Past it, a create answers\n`quote_expired` and you quote again.\n","isRequired":true,"uniqueKey":"expires_at","typeLabel":"string\u003cdate-time>"},"test":{"type":"boolean","description":"Whether the quote belongs to the sandbox world.","isRequired":true,"uniqueKey":"test","typeLabel":"boolean"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"vehicle":{"type":"string","enum":["moto","car"],"description":"What this price was built for: `car` when you asked for one or an\nitem was sized `xlarge`, `moto` otherwise. Always present.\n","example":"moto","isRequired":true,"uniqueKey":"vehicle","typeLabel":"enum\u003cstring>"}},"required":["id","fee_cents","business_fee_cents","customer_fee_cents","cash_to_collect_cents","vehicle","currency","pickup_duration_min","dropoff_eta_at","expires_at","test","created_at"],"uniqueKey":"","typeLabel":"object"},"example":{"id":"qt_5nW3jP8vT2xQ6bM9cZ1sRdKe","fee_cents":6844,"business_fee_cents":6844,"customer_fee_cents":0,"cash_to_collect_cents":null,"currency":"MXN","pickup_duration_min":12,"dropoff_eta_at":"2026-07-28T23:11:19Z","expires_at":"2026-07-28T22:36:55Z","test":true,"created_at":"2026-07-28T22:25:00Z","vehicle":"moto"},"examples":{"Example":{"title":"Example","value":{"id":"qt_5nW3jP8vT2xQ6bM9cZ1sRdKe","fee_cents":6844,"business_fee_cents":6844,"customer_fee_cents":0,"cash_to_collect_cents":null,"currency":"MXN","pickup_duration_min":12,"dropoff_eta_at":"2026-07-28T23:11:19Z","expires_at":"2026-07-28T22:36:55Z","test":true,"created_at":"2026-07-28T22:25:00Z","vehicle":"moto"}}},"exampleType":"examples"}},"exampleType":"examples"},"0c3837a0-aaf3-42e7-bf3a-6ee3a2f8b097":{"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"},"17d42aa8-4469-4d01-a207-9e53acb8c5fc":{"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"},"5741a573-c9b8-4385-9a74-89c8f4c3ce36":{"description":"No object with that id exists for this key (`not_found`). Another account's objects are indistinguishable from ones that never existed.","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":"not_found","message":"No resource with that id exists for this API key.","param":null,"retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/not_found","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"not_found","message":"No resource with that id exists for this API key.","param":null,"retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/not_found","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"dd933c92-7f38-4709-979a-5032113185ed":{"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":"pickup_point_pending","message":"This store's pickup point is not confirmed yet, so no courier can be requested from it. Retry the same request shortly.","param":null,"retryable":true,"doc_url":"https://docs.listo.delivery/en/errors/pickup_point_pending","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"pickup_point_pending","message":"This store's pickup point is not confirmed yet, so no courier can be requested from it. Retry the same request shortly.","param":null,"retryable":true,"doc_url":"https://docs.listo.delivery/en/errors/pickup_point_pending","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"b2978301-a350-4ce5-a795-a59dced5cd7b":{"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":"cash_over_cap","message":"The cash amount is over the collection limit. Use card instead.","param":null,"retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/cash_over_cap","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"cash_over_cap","message":"The cash amount is over the collection limit. Use card instead.","param":null,"retryable":false,"doc_url":"https://docs.listo.delivery/en/errors/cash_over_cap","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"9b5c9167-2c74-4b02-b972-e8a555631d5e":{"description":"Dispatch is temporarily unavailable (`provider_unavailable`). Retry shortly.","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":"provider_unavailable","message":"Dispatch is temporarily unavailable. Nothing was created. Retry.","param":null,"retryable":true,"doc_url":"https://docs.listo.delivery/en/errors/provider_unavailable","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"provider_unavailable","message":"Dispatch is temporarily unavailable. Nothing was created. Retry.","param":null,"retryable":true,"doc_url":"https://docs.listo.delivery/en/errors/provider_unavailable","request_id":"0b1f6c9a-7e2d-4c53-9a41-5d8e3f2a6b10"}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"dd3567f8-94f6-453d-a218-374608623bd9":{"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":"Price a delivery - Listo Partner API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/api-reference/quotes/price-a-delivery","matchLevel":0},"es":{"href":"/es/api-reference/quotes/price-a-delivery","matchLevel":1}}},"lastModified":"2026-11-07T01:48:55.301Z","originalFileLocation":"api-reference/quotes/price-a-delivery.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=\"Prices a trip and holds that price for you to bind. The price is set at the moment you ask for the quote: bind its id on the delivery create and the order is charged the fee_cents and the split you were shown. The courier network books the trip when the delivery is created, and what it books can differ slightly from the price quoted. We book the very quote you were shown whenever it is still valid, so this is rare. When it happens, the difference appears on your ledger as its own line (requote_adjustment, see GET /v1/ledger), negative when the booked trip cost more and positive when it cost less. It never changes the fee_cents, the split or the total of the order your customer sees. Quotes expire, and expires_at tells you when. Binding an expired or already-spent quote is a 400; request a new one. Binding is optional, and a create without one is priced inline at whatever the price is then. cash_to_collect_cents is what the courier collects at the door on a cash order: the goods value plus the customer\u0026#x27;s share of the fee. business_fee_share and business_fee_cap_cents say how the delivery fee is split between you and your customer. A prepaid quote is different: you have already collected from your customer, so the whole fee is yours and the split is fixed at 100 with no ceiling. A quote that names no payment_method is priced the same way, because the only delivery that can bind it is a prepaid one. On either, a business_fee_share other than 100 is refused with 422 validation_failed naming business_fee_share, a valid business_fee_cap_cents is ignored (one that is not a number is refused as a shape error first), and a quote that sends neither is priced at 100, whatever your store\u0026#x27;s default split is. That is the split a prepaid delivery create books, so a quote you want to bind to a prepaid delivery either names payment_method: prepaid or names no method. To split the fee with your customer, name cash or card. vehicle is moto (the default) or car. A car is a sedan: we can guarantee a car, never a van, and there are fewer cars than motorcycles, so one can take longer to assign. A car adds a surcharge that is INSIDE fee_cents and split like the rest of the fee, so the number you are quoted is the whole price; there is no separate line for it. manifest.items is optional and takes the same {name, quantity, size} items the delivery create does. size is one of small (the default), medium, large or xlarge, and it is the one field on an item that can change the price: an item sized xlarge makes the trip a car even when vehicle says moto. Nothing else does, weight included. The response\u0026#x27;s vehicle says which trip the fee is for, whatever made it one. Send the quote the same cart you will create with: the create is held to the vehicle this quote was priced as. A cart too large for one courier trip is refused with 422 order_too_large, naming manifest.items, before anything is priced. Split it across two deliveries. Listo prices in Mexican pesos and delivers in Mexico. A store that turns out to be somewhere else is refused here with 422 unsupported_country, which is final: it is not the retryable provider_unavailable, and no retry of the same store can succeed. You will only meet it on a store you positioned yourself, with lat/lng, since a store we located is refused when you create it. A store whose pickup point we cannot currently vouch for is refused with 409 pickup_point_pending, because until it is confirmed a courier could be sent to the wrong place. Usually the store\u0026#x27;s address has just changed and the confirmation has not landed yet, but not always, so do not read it as \u0026quot;the merchant moved\u0026quot;. This one IS retryable: nothing about your request is wrong, and the identical call succeeds once the pickup point is confirmed. It refuses the store rather than the trip, so a different dropoff will not help. Retry it on a minutes-scale backoff, for a bounded number of attempts, and then put it in front of a human rather than keep polling. Most moves land within minutes on their own; a few are held up by something only our staff can clear and take considerably longer, and this response does not tell the two apart. The restaurant can also unblock it themselves from their own Listo console, which is usually the faster of the two. When every courier near the trip is busy, the quote is refused with 409 no_couriers_available and nothing is priced. It is not an outage and nothing about your request is wrong: it IS retryable, and the identical call is priced once a courier is free, usually within minutes. Retry it after a few minutes, for a bounded number of attempts, and then tell whoever is waiting for the order rather than keep polling. It is the same word a delivery that ended without a courier carries in failure_reason. A live store whose Plan Listo is not paid up is refused with 402 plan_required, because the create would refuse the delivery this quote prices. error.message names the reason: no active plan, a charge that is pending, a plan that ended on a given date, a plan whose included deliveries for the cycle are all used, or a store that cannot request couriers right now. It is not retryable: the identical call fails until the plan is paid or restarted, or the cycle renews. See Plan and billing.\">\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=\"Price a delivery - Listo Partner API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Prices a trip and holds that price for you to bind. The price is set at the moment you ask for the quote: bind its id on the delivery create and the order is charged the fee_cents and the split you were shown. The courier network books the trip when the delivery is created, and what it books can differ slightly from the price quoted. We book the very quote you were shown whenever it is still valid, so this is rare. When it happens, the difference appears on your ledger as its own line (requote_adjustment, see GET /v1/ledger), negative when the booked trip cost more and positive when it cost less. It never changes the fee_cents, the split or the total of the order your customer sees. Quotes expire, and expires_at tells you when. Binding an expired or already-spent quote is a 400; request a new one. Binding is optional, and a create without one is priced inline at whatever the price is then. cash_to_collect_cents is what the courier collects at the door on a cash order: the goods value plus the customer\u0026#x27;s share of the fee. business_fee_share and business_fee_cap_cents say how the delivery fee is split between you and your customer. A prepaid quote is different: you have already collected from your customer, so the whole fee is yours and the split is fixed at 100 with no ceiling. A quote that names no payment_method is priced the same way, because the only delivery that can bind it is a prepaid one. On either, a business_fee_share other than 100 is refused with 422 validation_failed naming business_fee_share, a valid business_fee_cap_cents is ignored (one that is not a number is refused as a shape error first), and a quote that sends neither is priced at 100, whatever your store\u0026#x27;s default split is. That is the split a prepaid delivery create books, so a quote you want to bind to a prepaid delivery either names payment_method: prepaid or names no method. To split the fee with your customer, name cash or card. vehicle is moto (the default) or car. A car is a sedan: we can guarantee a car, never a van, and there are fewer cars than motorcycles, so one can take longer to assign. A car adds a surcharge that is INSIDE fee_cents and split like the rest of the fee, so the number you are quoted is the whole price; there is no separate line for it. manifest.items is optional and takes the same {name, quantity, size} items the delivery create does. size is one of small (the default), medium, large or xlarge, and it is the one field on an item that can change the price: an item sized xlarge makes the trip a car even when vehicle says moto. Nothing else does, weight included. The response\u0026#x27;s vehicle says which trip the fee is for, whatever made it one. Send the quote the same cart you will create with: the create is held to the vehicle this quote was priced as. A cart too large for one courier trip is refused with 422 order_too_large, naming manifest.items, before anything is priced. Split it across two deliveries. Listo prices in Mexican pesos and delivers in Mexico. A store that turns out to be somewhere else is refused here with 422 unsupported_country, which is final: it is not the retryable provider_unavailable, and no retry of the same store can succeed. You will only meet it on a store you positioned yourself, with lat/lng, since a store we located is refused when you create it. A store whose pickup point we cannot currently vouch for is refused with 409 pickup_point_pending, because until it is confirmed a courier could be sent to the wrong place. Usually the store\u0026#x27;s address has just changed and the confirmation has not landed yet, but not always, so do not read it as \u0026quot;the merchant moved\u0026quot;. This one IS retryable: nothing about your request is wrong, and the identical call succeeds once the pickup point is confirmed. It refuses the store rather than the trip, so a different dropoff will not help. Retry it on a minutes-scale backoff, for a bounded number of attempts, and then put it in front of a human rather than keep polling. Most moves land within minutes on their own; a few are held up by something only our staff can clear and take considerably longer, and this response does not tell the two apart. The restaurant can also unblock it themselves from their own Listo console, which is usually the faster of the two. When every courier near the trip is busy, the quote is refused with 409 no_couriers_available and nothing is priced. It is not an outage and nothing about your request is wrong: it IS retryable, and the identical call is priced once a courier is free, usually within minutes. Retry it after a few minutes, for a bounded number of attempts, and then tell whoever is waiting for the order rather than keep polling. It is the same word a delivery that ended without a courier carries in failure_reason. A live store whose Plan Listo is not paid up is refused with 402 plan_required, because the create would refuse the delivery this quote prices. error.message names the reason: no active plan, a charge that is pending, a plan that ended on a given date, a plan whose included deliveries for the cycle are all used, or a store that cannot request couriers right now. It is not retryable: the identical call fails until the plan is paid or restarted, or the cycle renews. See Plan and billing.\">\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/quotes/price-a-delivery\">\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=Price+a+delivery\u0026amp;description=Prices+a+trip+and+holds+that+price+for+you+to+bind.+The+price+is+set+at%0Athe+moment+you+ask+for+the+quote%3A+bind+its+%60id%60+on+the+delivery+create%0Aand+the+order+is+\u0026amp;theme=77fcfc9066d8b9eb9850b729\u0026amp;signature=08550eb40034008277e60ee804a02871e4188bf5ed787536298d98a539faaa6a\">\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=\"Price a delivery - Listo Partner API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Prices a trip and holds that price for you to bind. The price is set at the moment you ask for the quote: bind its id on the delivery create and the order is charged the fee_cents and the split you were shown. The courier network books the trip when the delivery is created, and what it books can differ slightly from the price quoted. We book the very quote you were shown whenever it is still valid, so this is rare. When it happens, the difference appears on your ledger as its own line (requote_adjustment, see GET /v1/ledger), negative when the booked trip cost more and positive when it cost less. It never changes the fee_cents, the split or the total of the order your customer sees. Quotes expire, and expires_at tells you when. Binding an expired or already-spent quote is a 400; request a new one. Binding is optional, and a create without one is priced inline at whatever the price is then. cash_to_collect_cents is what the courier collects at the door on a cash order: the goods value plus the customer\u0026#x27;s share of the fee. business_fee_share and business_fee_cap_cents say how the delivery fee is split between you and your customer. A prepaid quote is different: you have already collected from your customer, so the whole fee is yours and the split is fixed at 100 with no ceiling. A quote that names no payment_method is priced the same way, because the only delivery that can bind it is a prepaid one. On either, a business_fee_share other than 100 is refused with 422 validation_failed naming business_fee_share, a valid business_fee_cap_cents is ignored (one that is not a number is refused as a shape error first), and a quote that sends neither is priced at 100, whatever your store\u0026#x27;s default split is. That is the split a prepaid delivery create books, so a quote you want to bind to a prepaid delivery either names payment_method: prepaid or names no method. To split the fee with your customer, name cash or card. vehicle is moto (the default) or car. A car is a sedan: we can guarantee a car, never a van, and there are fewer cars than motorcycles, so one can take longer to assign. A car adds a surcharge that is INSIDE fee_cents and split like the rest of the fee, so the number you are quoted is the whole price; there is no separate line for it. manifest.items is optional and takes the same {name, quantity, size} items the delivery create does. size is one of small (the default), medium, large or xlarge, and it is the one field on an item that can change the price: an item sized xlarge makes the trip a car even when vehicle says moto. Nothing else does, weight included. The response\u0026#x27;s vehicle says which trip the fee is for, whatever made it one. Send the quote the same cart you will create with: the create is held to the vehicle this quote was priced as. A cart too large for one courier trip is refused with 422 order_too_large, naming manifest.items, before anything is priced. Split it across two deliveries. Listo prices in Mexican pesos and delivers in Mexico. A store that turns out to be somewhere else is refused here with 422 unsupported_country, which is final: it is not the retryable provider_unavailable, and no retry of the same store can succeed. You will only meet it on a store you positioned yourself, with lat/lng, since a store we located is refused when you create it. A store whose pickup point we cannot currently vouch for is refused with 409 pickup_point_pending, because until it is confirmed a courier could be sent to the wrong place. Usually the store\u0026#x27;s address has just changed and the confirmation has not landed yet, but not always, so do not read it as \u0026quot;the merchant moved\u0026quot;. This one IS retryable: nothing about your request is wrong, and the identical call succeeds once the pickup point is confirmed. It refuses the store rather than the trip, so a different dropoff will not help. Retry it on a minutes-scale backoff, for a bounded number of attempts, and then put it in front of a human rather than keep polling. Most moves land within minutes on their own; a few are held up by something only our staff can clear and take considerably longer, and this response does not tell the two apart. The restaurant can also unblock it themselves from their own Listo console, which is usually the faster of the two. When every courier near the trip is busy, the quote is refused with 409 no_couriers_available and nothing is priced. It is not an outage and nothing about your request is wrong: it IS retryable, and the identical call is priced once a courier is free, usually within minutes. Retry it after a few minutes, for a bounded number of attempts, and then tell whoever is waiting for the order rather than keep polling. It is the same word a delivery that ended without a courier carries in failure_reason. A live store whose Plan Listo is not paid up is refused with 402 plan_required, because the create would refuse the delivery this quote prices. error.message names the reason: no active plan, a charge that is pending, a plan that ended on a given date, a plan whose included deliveries for the cycle are all used, or a store that cannot request couriers right now. It is not retryable: the identical call fails until the plan is paid or restarted, or the cycle renews. See Plan and billing.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://listo-c5a11a00.mintlify.site/_mintlify/api/og/v2?title=Price+a+delivery\u0026amp;description=Prices+a+trip+and+holds+that+price+for+you+to+bind.+The+price+is+set+at%0Athe+moment+you+ask+for+the+quote%3A+bind+its+%60id%60+on+the+delivery+create%0Aand+the+order+is+\u0026amp;theme=77fcfc9066d8b9eb9850b729\u0026amp;signature=08550eb40034008277e60ee804a02871e4188bf5ed787536298d98a539faaa6a\">\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/quotes/price-a-delivery\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/quotes/price-a-delivery.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.listo.delivery/api-reference/quotes/price-a-delivery\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.listo.delivery/es/api-reference/quotes/price-a-delivery\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.listo.delivery/api-reference/quotes/price-a-delivery\">\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/quotes/price-a-delivery#webpage\",\"url\":\"https://docs.listo.delivery/api-reference/quotes/price-a-delivery\",\"name\":\"Price a delivery\",\"description\":\"Prices a trip and holds that price for you to bind. The price is set at the moment you ask for the quote: bind its id on the delivery create and the order is charged the fee_cents and the split you were shown. The courier network books the trip when the delivery is created, and what it books can differ slightly from the price quoted. We book the very quote you were shown whenever it is still valid, so this is rare. When it happens, the difference appears on your ledger as its own line (requote_adjustment, see GET /v1/ledger), negative when the booked trip cost more and positive when it cost less. It never changes the fee_cents, the split or the total of the order your customer sees. Quotes expire, and expires_at tells you when. Binding an expired or already-spent quote is a 400; request a new one. Binding is optional, and a create without one is priced inline at whatever the price is then. cash_to_collect_cents is what the courier collects at the door on a cash order: the goods value plus the customer's share of the fee. business_fee_share and business_fee_cap_cents say how the delivery fee is split between you and your customer. A prepaid quote is different: you have already collected from your customer, so the whole fee is yours and the split is fixed at 100 with no ceiling. A quote that names no payment_method is priced the same way, because the only delivery that can bind it is a prepaid one. On either, a business_fee_share other than 100 is refused with 422 validation_failed naming business_fee_share, a valid business_fee_cap_cents is ignored (one that is not a number is refused as a shape error first), and a quote that sends neither is priced at 100, whatever your store's default split is. That is the split a prepaid delivery create books, so a quote you want to bind to a prepaid delivery either names payment_method: prepaid or names no method. To split the fee with your customer, name cash or card. vehicle is moto (the default) or car. A car is a sedan: we can guarantee a car, never a van, and there are fewer cars than motorcycles, so one can take longer to assign. A car adds a surcharge that is INSIDE fee_cents and split like the rest of the fee, so the number you are quoted is the whole price; there is no separate line for it. manifest.items is optional and takes the same {name, quantity, size} items the delivery create does. size is one of small (the default), medium, large or xlarge, and it is the one field on an item that can change the price: an item sized xlarge makes the trip a car even when vehicle says moto. Nothing else does, weight included. The response's vehicle says which trip the fee is for, whatever made it one. Send the quote the same cart you will create with: the create is held to the vehicle this quote was priced as. A cart too large for one courier trip is refused with 422 order_too_large, naming manifest.items, before anything is priced. Split it across two deliveries. Listo prices in Mexican pesos and delivers in Mexico. A store that turns out to be somewhere else is refused here with 422 unsupported_country, which is final: it is not the retryable provider_unavailable, and no retry of the same store can succeed. You will only meet it on a store you positioned yourself, with lat/lng, since a store we located is refused when you create it. A store whose pickup point we cannot currently vouch for is refused with 409 pickup_point_pending, because until it is confirmed a courier could be sent to the wrong place. Usually the store's address has just changed and the confirmation has not landed yet, but not always, so do not read it as \\\"the merchant moved\\\". This one IS retryable: nothing about your request is wrong, and the identical call succeeds once the pickup point is confirmed. It refuses the store rather than the trip, so a different dropoff will not help. Retry it on a minutes-scale backoff, for a bounded number of attempts, and then put it in front of a human rather than keep polling. Most moves land within minutes on their own; a few are held up by something only our staff can clear and take considerably longer, and this response does not tell the two apart. The restaurant can also unblock it themselves from their own Listo console, which is usually the faster of the two. When every courier near the trip is busy, the quote is refused with 409 no_couriers_available and nothing is priced. It is not an outage and nothing about your request is wrong: it IS retryable, and the identical call is priced once a courier is free, usually within minutes. Retry it after a few minutes, for a bounded number of attempts, and then tell whoever is waiting for the order rather than keep polling. It is the same word a delivery that ended without a courier carries in failure_reason. A live store whose Plan Listo is not paid up is refused with 402 plan_required, because the create would refuse the delivery this quote prices. error.message names the reason: no active plan, a charge that is pending, a plan that ended on a given date, a plan whose included deliveries for the cycle are all used, or a store that cannot request couriers right now. It is not retryable: the identical call fails until the plan is paid or restarted, or the cycle renews. See Plan and billing.\",\"dateModified\":\"2026-11-07T01:48:55.301Z\",\"isPartOf\":{\"@id\":\"https://docs.listo.delivery#website\"},\"breadcrumb\":{\"@id\":\"https://docs.listo.delivery/api-reference/quotes/price-a-delivery#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.listo.delivery/api-reference/quotes/price-a-delivery#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\":\"Price a delivery\",\"item\":\"https://docs.listo.delivery/api-reference/quotes/price-a-delivery\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.listo.delivery/api-reference/quotes/price-a-delivery#apireference\",\"headline\":\"Price a delivery\",\"name\":\"Price a delivery\",\"description\":\"Prices a trip and holds that price for you to bind. The price is set at the moment you ask for the quote: bind its id on the delivery create and the order is charged the fee_cents and the split you were shown. The courier network books the trip when the delivery is created, and what it books can differ slightly from the price quoted. We book the very quote you were shown whenever it is still valid, so this is rare. When it happens, the difference appears on your ledger as its own line (requote_adjustment, see GET /v1/ledger), negative when the booked trip cost more and positive when it cost less. It never changes the fee_cents, the split or the total of the order your customer sees. Quotes expire, and expires_at tells you when. Binding an expired or already-spent quote is a 400; request a new one. Binding is optional, and a create without one is priced inline at whatever the price is then. cash_to_collect_cents is what the courier collects at the door on a cash order: the goods value plus the customer's share of the fee. business_fee_share and business_fee_cap_cents say how the delivery fee is split between you and your customer. A prepaid quote is different: you have already collected from your customer, so the whole fee is yours and the split is fixed at 100 with no ceiling. A quote that names no payment_method is priced the same way, because the only delivery that can bind it is a prepaid one. On either, a business_fee_share other than 100 is refused with 422 validation_failed naming business_fee_share, a valid business_fee_cap_cents is ignored (one that is not a number is refused as a shape error first), and a quote that sends neither is priced at 100, whatever your store's default split is. That is the split a prepaid delivery create books, so a quote you want to bind to a prepaid delivery either names payment_method: prepaid or names no method. To split the fee with your customer, name cash or card. vehicle is moto (the default) or car. A car is a sedan: we can guarantee a car, never a van, and there are fewer cars than motorcycles, so one can take longer to assign. A car adds a surcharge that is INSIDE fee_cents and split like the rest of the fee, so the number you are quoted is the whole price; there is no separate line for it. manifest.items is optional and takes the same {name, quantity, size} items the delivery create does. size is one of small (the default), medium, large or xlarge, and it is the one field on an item that can change the price: an item sized xlarge makes the trip a car even when vehicle says moto. Nothing else does, weight included. The response's vehicle says which trip the fee is for, whatever made it one. Send the quote the same cart you will create with: the create is held to the vehicle this quote was priced as. A cart too large for one courier trip is refused with 422 order_too_large, naming manifest.items, before anything is priced. Split it across two deliveries. Listo prices in Mexican pesos and delivers in Mexico. A store that turns out to be somewhere else is refused here with 422 unsupported_country, which is final: it is not the retryable provider_unavailable, and no retry of the same store can succeed. You will only meet it on a store you positioned yourself, with lat/lng, since a store we located is refused when you create it. A store whose pickup point we cannot currently vouch for is refused with 409 pickup_point_pending, because until it is confirmed a courier could be sent to the wrong place. Usually the store's address has just changed and the confirmation has not landed yet, but not always, so do not read it as \\\"the merchant moved\\\". This one IS retryable: nothing about your request is wrong, and the identical call succeeds once the pickup point is confirmed. It refuses the store rather than the trip, so a different dropoff will not help. Retry it on a minutes-scale backoff, for a bounded number of attempts, and then put it in front of a human rather than keep polling. Most moves land within minutes on their own; a few are held up by something only our staff can clear and take considerably longer, and this response does not tell the two apart. The restaurant can also unblock it themselves from their own Listo console, which is usually the faster of the two. When every courier near the trip is busy, the quote is refused with 409 no_couriers_available and nothing is priced. It is not an outage and nothing about your request is wrong: it IS retryable, and the identical call is priced once a courier is free, usually within minutes. Retry it after a few minutes, for a bounded number of attempts, and then tell whoever is waiting for the order rather than keep polling. It is the same word a delivery that ended without a courier carries in failure_reason. A live store whose Plan Listo is not paid up is refused with 402 plan_required, because the create would refuse the delivery this quote prices. error.message names the reason: no active plan, a charge that is pending, a plan that ended on a given date, a plan whose included deliveries for the cycle are all used, or a store that cannot request couriers right now. It is not retryable: the identical call fails until the plan is paid or restarted, or the cycle renews. See Plan and billing.\",\"url\":\"https://docs.listo.delivery/api-reference/quotes/price-a-delivery\",\"mainEntityOfPage\":{\"@id\":\"https://docs.listo.delivery/api-reference/quotes/price-a-delivery#webpage\"},\"dateModified\":\"2026-11-07T01:48:55.301Z\",\"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","description":"Confirms that a key is valid and tells you which world it acts in.\nBuild against this first: it exercises authentication, rate limiting\nand the error envelope without creating anything.\n\nA read-only key can call this and every other `GET`. Any call that\ncreates, changes or cancels something with a read-only key is refused\nwith `403 read_only_key`.\n","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","description":"Every call your keys made to this API, newest first, keyset-paginated\nlike every list here. Use it to answer \"what did my code send, and what\ndid Listo say?\" without asking anyone.\n\nA key only ever sees the calls of its own world: a live key reads live\ncalls and a test key reads test calls, and neither can read the other's.\n\nFilter by `status` (`failed` is every answer of 400 or more),\n`endpoint`, `created_after` and `created_before`. A filter narrows the\nwhole history, never only the page you are on.\n\nWhat is recorded: calls that identified a key. A call with no key or a\nwrong one is not yours and is not here, and neither is a call refused for\nrate limiting. Calls are kept indefinitely. Reading this list, one entry\nor your events or webhook deliveries is itself logged, but without\nbodies, so the log does not copy itself every time you read it.\n\nThe list carries no bodies. `GET /v1/request_logs/{id}` returns the call\nwith them.\n","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","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","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/quotes/price-a-delivery"}]}]},"basePath":"","title":"Price a delivery - 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"]}