Local services & SaaS
Faire
Orders, inventory, reorders and messages for wholesale brands.
12 endpoints
Connect DoorDash saved addresses, meal options and order records to your own workflow. Use an AI agent through MCP or REST from automation tools and scripts.
14 tools Read and write
DoorDash has no public API for ordering as a consumer (checked 27 Oct 2026). Its Drive and Marketplace APIs are for merchants and delivery partners. DoorDash has its own agent routes, but both need approval. Cotlet runs 14 DoorDash tools hosted, over MCP for agents and REST for scripts.
| What you need | dd-cli | DoorDash MCP | Cotlet |
|---|---|---|---|
| Search stores and build a cart | After approval | Corporate only | Yes |
| Preview the total with fees | After approval | Corporate only | Yes |
| Place the order | After approval | Corporate only | Yes, after your OK |
| Use from a chat app, n8n or a script | Terminal and coding agents | Not for consumer products | Yes |
| Open to anyone today | Waitlist | Private beta | Free 7-day trial |
| Allowed by DoorDash's terms | Yes, official | Yes, official | Uses the web app |
Checked 27 Oct 2026. Sources: DoorDash Developer: About DoorDash MCP · DoorDash CLI (dd-cli) on GitHub · DoorDash Developer: Drive FAQs · TechCrunch: DoorDash CLI launch, 16 Jul 2026
Use your own account in its Cotlet Cloud Browser.
Connect your agent or create a Cotlet API key.
Ask your agent or send an HTTP request.
We never keep your DoorDash password, and no order is placed or charged until you approve it. Who can see your session
Use MCP with your AI agent, or HTTP requests in n8n, Make, Zapier and scripts. Follow the MCP setup below or jump to the REST guide.
Enable DoorDash for agents. Sign up, log in to DoorDash in its Cloud Browser, then press Enable for agents.
Paste the Cotlet address. Add https://cotlet.dev/mcp/v1 as an MCP server or connector in your agent.
Approve the connection. Chat apps ask you to sign in to Cotlet. Editors, n8n and scripts use an API key from the console.
One shared address, https://cotlet.dev/mcp/v1, also carries DoorDash next to your other apps. If you enable DoorDash after connecting, refresh the connector so the new tools show up.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-doordash \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-doordash": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-doordash]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: doordash_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: doordash_write Create a Cotlet API key with access to DoorDash and its read operations. Store it as COTLET_API_KEY in your environment or automation platform's credential store.
Sign in to DoorDash in its Cotlet Cloud Browser and enable the app for agents. Use your consumer account with saved addresses; these reads do not submit an order or charge a card.
curl https://cotlet.dev/api/v1/doordash/addresses \
-H "Authorization: Bearer $COTLET_API_KEY" A successful REST call puts the tool output in result. This illustrative response excerpt omits call IDs, messages and credit details.
{
"status": "success",
"app": "doordash",
"tool": "list_addresses",
"result": {
"addresses": [
{
"address_id": "addr_1042",
"label": "Home",
"street": "221 Example Street, Springfield",
"default": true
}
]
}
} Read result.addresses and use a returned address_id for store search. Address listing has no pagination inputs and does not add an address.
Store search and order listing accept limits without a cursor or a documented numeric maximum. Do not invent a pagination loop or promise an exhaustive order export.
Keep prices and totals in their returned account context. Read workflows do not submit orders, change delivery addresses or charge a payment method.
| Tool | Connect through | Example workflow |
|---|---|---|
| n8n | HTTP Request | Read saved addresses, store search and menus to prepare meal options without adding items or ordering. |
| Make | HTTP > Make a request | Read orders and receipts into your private spending report, retaining returned totals. |
| Python or Node.js | REST API | Read order status into a personal delivery digest without changing an order. |
Send Authorization: Bearer <your Cotlet API key> in request headers. You configure the schedule, destination and record comparisons.
Cotlet reads DoorDash; your workflow steps write to your chosen destination. These HTTP workflows do not require a native Cotlet connector or a prebuilt template.
Python and Node.js can use the same HTTP requests without an AI agent. Keep access keys in credentials, outside shared workflow exports.
The API and MCP reference lists operations and inputs. The REST API guide explains authentication, errors and approvals.
Read only. Cuisine, rating and delivery time are what the app shows; fees are not final until preview_order.
Returns stores in the order DoorDash ranks them for the address, each with its name, cuisine, rating, whether it is open and the delivery time estimate DoorDash shows. It searches the same catalog as the app, so restaurants, grocery and convenience stores all show up. The fees DoorDash shows on a store card are not final: use preview_order for the total.
MCP calldoordash_read → search_stores
REST endpointGET https://cotlet.dev/api/v1/doordash/stores/search
| Name | Type | Description |
|---|---|---|
| query string required | string | Free-form search, for example "pad thai", "pizza" or "groceries". |
| address_id string | string | A saved address from list_addresses. Defaults to your default address. |
| fulfillment string | string | delivery or pickup. Defaults to delivery. |
| limit integer | integer | How many stores to return. |
{
"query": "query"
} {
"address_id": "addr_1042",
"stores": [
{
"store_id": "st_88123",
"name": "Basil Thai Kitchen",
"cuisine": "Thai",
"rating": 4.7,
"open": true,
"eta_minutes": 32
},
{
"store_id": "st_55871",
"name": "Noodle Corner",
"cuisine": "Thai",
"rating": 4.5,
"open": true,
"eta_minutes": 40
}
]
} Returns the item's description, price and option groups, each marked required or optional, with the choices and any extra price. Read it before add_to_cart so the required choices are not missed. It changes nothing in your cart.
MCP calldoordash_read → get_item
REST endpointGET https://cotlet.dev/api/v1/doordash/stores/{store_id}/items/{item_id}
| Name | Type | Description |
|---|---|---|
| store_id string required | string | A store_id from search_stores. |
| item_id string required | string | An item_id from get_store_menu. |
{
"store_id": "store_8c41d2",
"item_id": "item_8c41d2"
} {
"item_id": "it_3021",
"name": "Pad Thai",
"price": 14.5,
"option_groups": [
{
"name": "Protein",
"required": true,
"choices": [
{
"choice_id": "ch_1",
"name": "Chicken",
"extra": 0
},
{
"choice_id": "ch_2",
"name": "Shrimp",
"extra": 2
}
]
},
{
"name": "Spice level",
"required": false,
"choices": [
{
"choice_id": "ch_7",
"name": "Mild",
"extra": 0
},
{
"choice_id": "ch_8",
"name": "Hot",
"extra": 0
}
]
}
]
} Returns each saved address with its label, street and whether it is the default. The agent uses one of them for search_stores and submit_order. It cannot add an address; only addresses already saved in DoorDash can be chosen.
MCP calldoordash_read → list_addresses
REST endpointGET https://cotlet.dev/api/v1/doordash/addresses
No parameters.
{
"addresses": [
{
"address_id": "addr_1042",
"label": "Home",
"street": "221 Example Street, Springfield",
"default": true
},
{
"address_id": "addr_1043",
"label": "Work",
"street": "90 Sample Avenue, Springfield",
"default": false
}
]
} A cart belongs to one store. Carts spend nothing and reach no one, so they run without asking.
Returns the cart with the new item and its subtotal. A cart reaches no one and spends nothing, and remove_from_cart undoes it, so it runs without asking you. A missing required choice fails the call and lists what is missing. Nothing is ordered until submit_order.
MCP calldoordash_write → add_to_cart
REST endpointPOST https://cotlet.dev/api/v1/doordash/stores/{store_id}/carts
| Name | Type | Description |
|---|---|---|
| store_id string required | string | A store_id from search_stores. |
| item_id string required | string | An item_id from get_store_menu. |
| quantity integer | integer | How many. Defaults to 1. |
| choice_ids array | array | choice_id values from get_item. All required choices must be given. |
| note string | string | A special instruction for the store. |
{
"store_id": "st_88123",
"item_id": "it_3021",
"quantity": 2,
"choice_ids": [
"ch_1",
"ch_8"
]
} {
"cart_id": "cart_7781",
"store": "Basil Thai Kitchen",
"items": [
{
"item_id": "it_3021",
"name": "Pad Thai",
"quantity": 2,
"choices": [
"Chicken",
"Hot"
]
}
],
"subtotal": 29
} Returns each cart's store, items with their choices, quantities and the subtotal. A cart is per store, so two stores mean two carts. The subtotal does not include fees, tax or tip: use preview_order for the amount you would pay.
MCP calldoordash_read → get_cart
REST endpointGET https://cotlet.dev/api/v1/doordash/cart
| Name | Type | Description |
|---|---|---|
| cart_id string | string | One cart. Leave out to list all open carts. |
{
"carts": [
{
"cart_id": "cart_7781",
"store": "Basil Thai Kitchen",
"items": [
{
"item_id": "it_3021",
"name": "Pad Thai",
"quantity": 2,
"choices": [
"Chicken",
"Hot"
]
}
],
"subtotal": 29
}
]
} Returns the cart as it is after the change, or deleted. It touches only the cart, reaches no one and costs nothing, so it runs without asking you. Never use it on a cart you want to keep: a deleted cart has to be built again.
MCP calldoordash_write → remove_from_cart
REST endpointDELETE https://cotlet.dev/api/v1/doordash/carts/{cart_id}
| Name | Type | Description |
|---|---|---|
| cart_id string required | string | A cart_id from get_cart. |
| item_id string | string | The item to remove. Leave out to delete the whole cart. |
{
"cart_id": "cart_8c41d2"
} {
"cart_id": "cart_7781",
"status": "deleted"
} Returns a new cart with the items of that order, at today's prices. Items the store no longer sells are listed as unavailable. It only fills a cart, so it reaches no one and runs without asking you; call preview_order and then submit_order to buy.
MCP calldoordash_write → reorder
REST endpointPOST https://cotlet.dev/api/v1/doordash/orders/{order_id}/reorder/reorder
| Name | Type | Description |
|---|---|---|
| order_id string required | string | An order_id from list_orders. |
{
"order_id": "order_8c41d2"
} {
"cart_id": "cart_7790",
"store": "Basil Thai Kitchen",
"items": [
{
"item_id": "it_3021",
"name": "Pad Thai",
"quantity": 2
}
],
"unavailable": [],
"subtotal": 30
} Returns each saved method with its type, brand, last four digits and whether it is the default. Full card numbers are never returned. It cannot add or change a method; to pay with another one, add it in DoorDash first.
MCP calldoordash_read → list_payment_methods
REST endpointGET https://cotlet.dev/api/v1/doordash/payment-methods
No parameters.
{
"payment_methods": [
{
"payment_method_id": "pm_201",
"type": "card",
"brand": "Visa",
"last4": "4242",
"default": true
}
]
} Returns the lines DoorDash shows at checkout: subtotal, delivery fee, service fee, tax, tip, any discount or credit, and the total, plus the delivery time. Nothing is charged and the order is not placed. Fees change with the store, address, time and your DashPass status, so preview again right before submit_order.
MCP calldoordash_read → preview_order
REST endpointGET https://cotlet.dev/api/v1/doordash/carts/{cart_id}/orders/preview
| Name | Type | Description |
|---|---|---|
| cart_id string required | string | A cart_id from get_cart or add_to_cart. |
| fulfillment string | string | delivery or pickup. Defaults to delivery. |
| delivery_speed string | string | standard or priority. Defaults to standard. |
| tip number | number | Tip in dollars. |
| promo_code string | string | A promo code to try on this cart. |
{
"cart_id": "cart_8c41d2"
} {
"cart_id": "cart_7781",
"fulfillment": "delivery",
"delivery_speed": "standard",
"lines": {
"subtotal": 29,
"delivery_fee": 2.99,
"service_fee": 4.35,
"tax": 2.61,
"tip": 5,
"discount": 0
},
"total": 43.95,
"eta_minutes": 34
} Only submit_order spends money, and it waits for your OK. No tool cancels an order or changes a card.
Places a real order and charges your payment method, so the call waits for your approval, with the cart and the total shown to you. It fails without charging when the total is higher than expected_total. DoorDash decides about changes and cancellations after the order is placed, and Cotlet has no tool to cancel it. Returns the order_id and the estimated arrival. By default you confirm each call; you can switch that off for this tool.
MCP calldoordash_write → submit_order
REST endpointPOST https://cotlet.dev/api/v1/doordash/carts/{cart_id}/order/submit
| Name | Type | Description |
|---|---|---|
| cart_id string required | string | A cart_id from get_cart. |
| expected_total number required | number | The total from preview_order in dollars. The call fails if the total is now higher. |
| address_id string | string | A saved address from list_addresses. Defaults to your default address. |
| payment_method_id string | string | A saved method from list_payment_methods. Defaults to your default method. |
| fulfillment string | string | delivery or pickup. Defaults to delivery. |
| delivery_speed string | string | standard or priority. Defaults to standard. |
| tip number | number | Tip in dollars. |
{
"cart_id": "cart_8c41d2",
"expected_total": 1
} {
"order_id": "ord_90121",
"status": "placed",
"store": "Basil Thai Kitchen",
"total_charged": 43.95,
"eta": "2026-10-27T19:12:00-05:00"
} Returns each order with its order_id, store, date, number of items, total and status. Use an order_id with get_order_status, get_order_receipt or reorder. It reads the history your account shows in the app.
MCP calldoordash_read → list_orders
REST endpointGET https://cotlet.dev/api/v1/doordash/orders
| Name | Type | Description |
|---|---|---|
| status string | string | open for orders still on their way, past for delivered or cancelled ones. Defaults to all. |
| limit integer | integer | How many orders to return. |
{
"orders": [
{
"order_id": "ord_90114",
"store": "Basil Thai Kitchen",
"placed_at": "2026-10-24T18:42:00-05:00",
"items": 4,
"total": 52.4,
"status": "delivered"
},
{
"order_id": "ord_90102",
"store": "Slice House Pizza",
"placed_at": "2026-10-21T19:05:00-05:00",
"items": 2,
"total": 31.2,
"status": "delivered"
}
]
} Returns the status DoorDash shows for the order, such as being prepared or on its way, and the estimated arrival time. A delivered order returns its delivery time. It does not message the Dasher or the store.
MCP calldoordash_read → get_order_status
REST endpointGET https://cotlet.dev/api/v1/doordash/orders/{order_id}/status
| Name | Type | Description |
|---|---|---|
| order_id string required | string | An order_id from list_orders or submit_order. |
{
"order_id": "order_8c41d2"
} {
"order_id": "ord_90121",
"status": "on_the_way",
"eta": "2026-10-27T19:12:00-05:00",
"store": "Basil Thai Kitchen"
} Returns the items, fees, tax, tip, discounts and the total charged, the same lines the receipt in the app shows. It does not download a PDF. Open orders have no final receipt until they are delivered.
MCP calldoordash_read → get_order_receipt
REST endpointGET https://cotlet.dev/api/v1/doordash/orders/{order_id}/receipt
| Name | Type | Description |
|---|---|---|
| order_id string required | string | An order_id from list_orders. |
{
"order_id": "order_8c41d2"
} {
"order_id": "ord_90114",
"store": "Basil Thai Kitchen",
"items": [
{
"name": "Pad Thai",
"quantity": 2,
"price": 29
},
{
"name": "Spring Rolls",
"quantity": 2,
"price": 12
}
],
"lines": {
"subtotal": 41,
"delivery_fee": 2.99,
"service_fee": 6.15,
"tax": 3.26,
"tip": 5
},
"total_charged": 58.4
} Your logged-in DoorDash profile, encrypted with AES-256-GCM, in Finland. Not the password.
The 14 DoorDash tools. Never the cookie or a card number.
Your account: addresses, saved cards, past orders, receipts.
Adding or changing cards, DashPass, password, two-factor and deleting the account.
A new sign-in can ask for a code by SMS or email. You type it in, we never do.
Disable for agents, reset the browser, or sign out of all devices in DoorDash.
Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
"You will not deep-link to the Website or Software, or access the Website or Software manually or with any robot, spider, web crawler, extraction software, automated process and/or device to scrape, copy or monitor any portion of the Website or Software, or any content on the Website or Software, unless the Company has given you permission to do so in writing."
The same sentence stands in DoorDash's online-ordering consumer terms, and the Dasher deactivation policy lists scraping under abusing the platform. DoorDash's US consumer terms did not load for us on 27 Oct 2026, so we cannot quote them. Cotlet acts in your own account through the web app, but DoorDash could read that as an automated process. We found no public case of a customer account closed for using an AI agent (checked 27 Oct 2026).
Keep it to what you would do by hand: a few orders a week, never a stream of carts across dozens of stores.
When DoorDash moves a button or renames a field, the fix happens on our side and your prompts keep working. status.cotlet.dev watches the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Add an item to a cart | remove_from_cart, one call |
| Reorder a past order | It only fills a cart; delete the cart |
| Preview the total | Nothing to undo, nothing is charged |
| Submit an order | No Cotlet tool. Change or cancel it in DoorDash; DoorDash decides |
1 of 14 tools asks first: submit_order, the only one that spends money. It carries the total you saw and fails if the total is now higher. Carts reach nobody, so they run at once. Switching the wait off is your choice, per tool.
Cotlet has no tool to cancel an order. Check the cart in the approval screen, not after.
{
"name": "add_to_cart",
"arguments": {
"store_id": "st_88123",
"item_id": "it_3021",
"quantity": 2,
"choice_ids": [
"ch_1",
"ch_8"
]
}
} curl -X POST https://cotlet.dev/api/v1/doordash/stores/st_88123/carts \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"item_id":"it_3021","quantity":2,"choice_ids":["ch_1","ch_8"]}' {
"cart_id": "cart_7781",
"store": "Basil Thai Kitchen",
"items": [
{
"item_id": "it_3021",
"name": "Pad Thai",
"quantity": 2,
"choices": [
"Chicken",
"Hot"
]
}
],
"subtotal": 29
} Scripts and cron jobs reach the same tools over REST at /api/v1/doordash, with the same key and price. A failed call costs nothing. The tools table lists the REST path of each tool.
About $14 a monthfor about 8 orders a month, 2,480 credits. DoorDash charges you for the food, fees and DashPass as before.
| Job | Calls | Credits |
|---|---|---|
| Order dinner after a fee check | 7 × 4 | 280 |
| Compare three stores first | 13 × 2 | 260 |
| Reorder the usual | 4 × 4 | 160 |
| Track an order | 2 × 8 | 160 |
| Weekly receipts and spend | 3 × 4 | 120 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 2,480 |
The month is our example: 4 new orders, 2 of them compared across three stores first, and 4 reorders. DoorDash publishes no orders-per-customer figure, so the volume is our assumption. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| doordash-oss/doordash-cli | DoorDash's own command-line tool: search, menus, carts, previews, checkout, history. 324 stars, last commit 23 Sep 2026. | Waitlist-only, macOS Apple Silicon and Linux x86_64, a local binary you run yourself. |
| CydVilla/peckish | MCP server, terminal chat and local web app on top of dd-cli. Compares totals with fees and asks before every order. MIT, last commit 25 Sep 2026. | Needs approved dd-cli access, runs on your computer, no stars yet. |
| markswendsen-code/mcp-doordash | Community MCP server that drives the DoorDash website with a script. MIT, 9 stars. | Last commit 21 Apr 2026. A script on the site, so it breaks when the page changes. |
| Bright Data DoorDash MCP | Paid scraping for public DoorDash data: menus, prices, reviews. | Reads public data only. It does not log in or order. |
| DoorDash MCP | DoorDash's own server with an OAuth sign-in, for corporate ordering platforms. | Private beta, not open to consumer products. |
If you are on the dd-cli waitlist and live in a terminal, the official tool is the safest route. Cotlet is for the rest: a chat app, n8n or a script, hosted, without waiting for approval. A script on the website is quick to write and breaks when DoorDash changes the page.
Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), working since 2019, founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Write to contact@cotlet.dev with questions about the DoorDash tools.
Yes. Call Cotlet's REST API from a script or an HTTP step in n8n, Make or Zapier with your Cotlet key. MCP is the alternative for AI agents; you do not need to connect an agent to use REST.
Create a free account at https://cotlet.dev, open DoorDash under Integrations in the console and log in to DoorDash in its Cloud Browser. The trial starts with your first app, no card asked.
Only if you switch the approval off. submit_order charges your saved payment method, so by default every call waits for your OK in the Cotlet console, with the cart and the total in front of you. Building a cart and previewing the total never wait, because they spend nothing.
preview_order returns the lines DoorDash shows at checkout: subtotal, delivery fee, service fee, tax, tip and total. DoorDash says fees vary by store and market, and that DashPass lowers the delivery and service fees on eligible orders (DoorDash Help: What fees do I pay on Caviar and DoorDash?). submit_order takes an expected_total and fails if the total went up.
For some people, yes. DoorDash's dd-cli lets a developer order from a terminal or coding agent and needs approval from DoorDash. DoorDash MCP is a private beta for corporate ordering and is not open to consumer products (DoorDash Developer docs, checked 27 Oct 2026). Cotlet works on your own consumer account and in any MCP client, without that approval.
We found no webhooks for consumer accounts. Nothing tells an agent when your order changes, so ask get_order_status when you want to know.
Cotlet works in your own DoorDash account. DoorDash's own dd-cli beta is for developers in the US and Canada (TechCrunch, 16 Jul 2026), and DoorDash's DashPass order minimums differ between the US and Canada.
No. list_payment_methods returns the brand and the last four digits. Orders use a method already saved in DoorDash.
Only the door is different. Both expose the same 14 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and HTTP steps use REST.
No. Cotlet is independent and not affiliated with DoorDash, Inc.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy