DoorDash API
Everything the Discord bot does — account generation, the 90%-off deal, preview, and ordering — exposed as a REST API you fully control. Build your own bot, website, dashboard, or automation on the same engine, and customize every detail of every order.
Overview
The DoorDash API lets you build your own tools on top of AutoMunch's DoorDash engine. You generate
accounts into named batches, the API automatically flags which ones have the
90%-off deal, and you place orders against them. Orders are session-based: order by
account_id
and the server uses the account's stored login — you never handle raw tokens.
https://automunch.site/dd
The DoorDash API requires an active DoorDash subscription (Tier I/II/III or Lifetime). Generate your key with /api_key in the AutoMunch Discord.
50% + 40% deal stacking, price-before-you-charge previews, Express & Scheduled delivery, an automatic public tracking link on every order, optional address-swap, and custom carts from the browser extension (automunch.site/cart/...). Failed orders never charge credits.
Authentication
Every request needs a Bearer token in the Authorization header.
DoorDash API keys are prefixed with am_live_ and created with /api_key on Discord. One active key per user.
Authorization: Bearer am_live_your_key_here
Your SMS key, email domain, and List tier are read from your /settings on Discord (linked to your key). Run /settings once before using /v1/gen.
The 90% Deal
"90% off" is two stacked discounts: a 50% DashPass deal (a free-trial offer DoorDash
shows to some accounts) plus a 40% promo code (which works on almost any account).
The hard part is the 50% — only some accounts get it. When you generate an account, the API probes it
and, if the deal shows, subscribes the free DashPass trial automatically and marks the
account is_90_eligible: true.
The free-trial deal can lapse as an account ages, so every eligible account carries a checked_at timestamp and a stale flag (default cutoff 12h). Stale accounts are re-verified for real at order time.
Async Jobs
Generating accounts and placing orders take time, so they run as background jobs. Those endpoints return
202 with a
job_id — poll
GET /v1/jobs/{id} until completed or failed. Up to 2 active jobs at once. The preview endpoints are synchronous (they return pricing directly).
Quickstart
1 · Get a key
Run /api_key on Discord and configure /settings.
2 · Generate a batch
POST /v1/gen with a batch_name. Accounts are probed for the 90% deal.
3 · Find eligible
GET /v1/eligible returns the accounts that have the deal, with their account_id.
4 · Preview & confirm
POST /v1/order/preview to see the price, then POST /v1/order/confirm to place it.
Account Snapshot
Verify your API key and check your credit balance.
curl -H "Authorization: Bearer am_live_..." \ https://automunch.site/dd/v1/me
{
"user_id": 1306300782123159674,
"credits": 42,
"scopes": ["gen", "order", "accounts", "otp"],
"key_prefix": "am_live_8Xk2aB9c..."
}
Generate a Batch
Creates accounts into the named batch and probes each for the 90% deal. SMS key, domain, and List tier come from your Discord /settings. Async — poll the job.
| Field | Type | Required | Notes |
|---|---|---|---|
batch_name | string | Yes | Batch (chain) to create/append to. Shows in /view on Discord too. |
amount | integer | No | 1–5. Default 1. |
account_name | string | No | Name for the accounts. Random if omitted. |
address | string | No | Optional address to attach. |
curl -X POST \
-H "Authorization: Bearer am_live_..." \
-H "Content-Type: application/json" \
-d '{"batch_name": "june-run", "amount": 2}' \
https://automunch.site/dd/v1/gen
import requests
API_KEY = "am_live_..."
BASE = "https://automunch.site/dd"
headers = {"Authorization": f"Bearer {API_KEY}"}
resp = requests.post(f"{BASE}/v1/gen", headers=headers,
json={"batch_name": "june-run", "amount": 2})
print(resp.json()) # {"job_id": "...", "status": "queued", ...}
{
"job_id": "2f1c...e7",
"status": "queued",
"batch_name": "june-run",
"poll_url": "/v1/jobs/2f1c...e7"
}
{
"status": "completed",
"result": {
"batch": "june-run",
"successful": 2,
"accounts": [
{
"account_id": 8801,
"email": "johns4d2@outlook.com",
"password": "Pass123!",
"first_name": "John", "last_name": "Smith",
"phone_number": "+11234567890",
"is_90_eligible": true
},
{
"account_id": 8802,
"email": "maria9xk@outlook.com",
"password": "Pass456!",
"first_name": "Maria", "last_name": "K",
"phone_number": "+11234500000",
"is_90_eligible": false
}
]
}
}
List Batches
Your batches with totals and how many accounts are still eligible. Mirrors /view on Discord. The auto "Placed Orders" batch (used accounts) is flagged with is_placed_orders.
curl -H "Authorization: Bearer am_live_..." \ https://automunch.site/dd/v1/batches
{
"batches": [
{ "id": 12, "name": "june-run", "total": 10,
"eligible_90": 7, "is_placed_orders": false,
"created_at": "2026-06-06 04:22:11" },
{ "id": 19, "name": "Placed Orders", "total": 23,
"eligible_90": 0, "is_placed_orders": true,
"created_at": "2026-06-05 18:03:44" }
]
}
View a Batch
Accounts in a batch with their eligibility. No raw tokens are returned — has_jwt tells you a usable session exists.
curl -H "Authorization: Bearer am_live_..." \ https://automunch.site/dd/v1/batches/june-run
{
"batch": "june-run", "chain_id": 12, "total": 10,
"accounts": [
{ "account_id": 8801, "account_number": 1,
"email": "johns4d2@outlook.com", "phone": "+11234567890",
"is_90_eligible": true, "checked_at": "2026-06-07 06:40:12",
"stale": false, "has_jwt": true },
{ "account_id": 8803, "account_number": 3,
"email": "alex7p@outlook.com", "phone": "",
"is_90_eligible": null, "checked_at": null,
"stale": null, "has_jwt": true }
]
}
Eligible Accounts
Every account that currently has the 90% deal, across all batches (excludes already-used "Placed Orders"). Use the account_id to place an order.
| Query param | Notes |
|---|---|
batch | Only this batch. |
fresh_only | true drops accounts whose deal is stale (older than the cutoff). |
curl -H "Authorization: Bearer am_live_..." \ "https://automunch.site/dd/v1/eligible?fresh_only=true"
{
"count": 2,
"stale_cutoff_hours": 12,
"accounts": [
{ "account_id": 8801, "email": "johns4d2@outlook.com",
"batch": "june-run", "checked_at": "2026-06-07 06:40:12",
"stale": false },
{ "account_id": 8815, "email": "kayla2v@outlook.com",
"batch": "june-run", "checked_at": "2026-06-06 09:12:00",
"stale": true }
]
}
Preview a Checkout
Prepares and prices the order without placing it — nothing is charged. It loads the account, resolves the cart + address, subscribes the free DashPass trial if the 50% deal shows, and returns the real discounted price plus an order_session_id you confirm later. Synchronous (no job).
| Field | Required | Notes |
|---|---|---|
account_id | Yes* | From /v1/eligible. (*or a raw jwt_token) |
cart_url | Yes | DoorDash group cart (https://drd.sh/cart/...) or a custom cart from the browser extension (automunch.site/cart/...) |
address | Yes | Delivery address, e.g. "123 Main St, 30301" — set as the account default automatically |
card | No | Optional at preview (card is needed at confirm). {number, exp_month, exp_year, cvv, zip} |
tip_cents | No | Tip in cents (e.g. 200 = $2.00) |
| + options | No | Any order option also prices here: delivery_option, track, address_swap, gift, promo_codes… |
curl -X POST \
-H "Authorization: Bearer am_live_..." \
-H "Content-Type: application/json" \
-d '{
"account_id": 8801,
"cart_url": "https://drd.sh/cart/abc",
"address": "123 Main St, 30301",
"tip_cents": 200
}' \
https://automunch.site/dd/v1/order/preview
import requests
BASE = "https://automunch.site/dd"
headers = {"Authorization": "Bearer am_live_..."}
r = requests.post(f"{BASE}/v1/order/preview", headers=headers, json={
"account_id": 8801,
"cart_url": "https://drd.sh/cart/abc",
"address": "123 Main St, 30301",
"tip_cents": 200,
})
preview = r.json()
print(preview["pricing"]["total"], preview["order_session_id"])
{
"order_session_id": "os_7Fk2aB...",
"expires_at": "2026-06-07T07:51:00Z",
"store": { "store_id": "44321", "store_name": "Chipotle" },
"cart": { "items": [ { "name": "Burrito Bowl", "quantity": 1, "price_cents": 1095 } ],
"item_count": 1 },
"dashpass": { "has_50_off": true, "subscribed": true, "already_active": false },
"pricing": {
"subtotal": 1095, "fees_and_tax": 311, "discount": 985, "tip": 200,
"delivery_option": "STANDARD", "express_fee": 0,
"total_before_discount": 1606,
"total_after_discount": 621,
"total": 621,
"total_savings": 985,
"is_dashpass_applied": true,
"is_prediction": false,
"note": "Live price — DashPass active, 50% deal applied."
}
}
Edit a Preview
Change any field on an open preview session and get a new quote — just like the edit buttons on the Discord checkout. Send only the fields you want to change.
| Editable fields |
|---|
address, cart_url (swap the group link), tip_cents, promo_codes, gift, is_pickup, dasher_instructions, gate_code, unit, building_name, pin_coords, account_name |
curl -X POST \
-H "Authorization: Bearer am_live_..." \
-H "Content-Type: application/json" \
-d '{"address": "55 Oak Ave, 30305", "tip_cents": 500}' \
https://automunch.site/dd/v1/order/preview/os_7Fk2aB.../edit
The same shape as /v1/order/preview (updated pricing, cart, etc.) for the same order_session_id. Changing cart_url is the heavy edit — it's a new cart, so the deal is re-checked.
Confirm & Place
Places the previewed order. Re-verifies the deal is still good, charges the card, fetches tracking, and moves the account to "Placed Orders". Async — poll the job for the full result. You can pass last-second overrides (tip_cents, dasher_instructions, …).
curl -X POST \
-H "Authorization: Bearer am_live_..." \
-H "Content-Type: application/json" \
-d '{"order_session_id": "os_7Fk2aB..."}' \
https://automunch.site/dd/v1/order/confirm
{ "job_id": "9b7a...11", "status": "queued", "poll_url": "/v1/jobs/9b7a...11" }
{
"status": "completed",
"credits_charged": 3,
"result": {
"order": { "order_uuid": "a1b2c3d4-...",
"verified": { "confirmed": true, "status": "scheduled" } },
"account": { "account_id": 8801, "email": "johns4d2@outlook.com",
"consumer_id": "987654321" },
"store": { "store_id": "44321", "store_name": "Chipotle" },
"pricing": {
"subtotal": 1095, "fees_and_tax": 311, "discount": 985, "tip": 200,
"delivery_option": "STANDARD", "express_fee": 0,
"total_before_discount": 1606, "total_after_discount": 621,
"total": 621, "total_savings": 985, "is_dashpass_applied": true
},
"dashpass": { "has_50_off": true, "verified_50_off": true,
"cancelled_after": true },
"gift": { "tracking_url": "https://www.doordash.com/orders/a1b2c3d4-.../gift",
"doomdash_tracking_url": "https://doomdash.online/track/X7K2" },
"consume": { "eligibility_used": true, "moved_to_batch": "Placed Orders",
"got_90": true },
"credits_charged": 3
}
}
One-Shot Order
Skips the preview step — prepares and places in one async job. Use this when you don't need a confirmation screen. Same body as preview, plus the full order options below; card is required.
| Field | Notes |
|---|---|
account_id / jwt_token | The account (account_id preferred) |
cart_url, address, card | Required |
tip_cents, is_pickup, promo_codes | Order options |
delivery_option | STANDARD (default) · PRIORITY (express) · SCHEDULE. With SCHEDULE, pass scheduled_time (ISO). The express_fee is echoed back in pricing. |
track | Default true — places as a gift so the order returns a public tracking link (no login). Set false for a plain order. |
address_swap | Deliver to a random nearby (~500m) address instead of the exact one — anti-ban. address_swap_radius tunes the distance. |
dasher_instructions, gate_code, unit, building_name, pin_coords | Delivery details (pin = "lat,lng") |
gift | Override the default self-gift with a custom recipient: {enabled, recipient_name, recipient_phone, card_message} |
account_name | Change the name on the account |
cancel_dashpass_after | Default true — cancels the DashPass trial after the order (and on hard failures only) |
curl -X POST \
-H "Authorization: Bearer am_live_..." \
-H "Content-Type: application/json" \
-d '{
"account_id": 8801,
"cart_url": "https://drd.sh/cart/abc",
"address": "123 Main St, 30301",
"card": { "number": "4242424242424242", "exp_month": "12",
"exp_year": "27", "cvv": "123", "zip": "30301" },
"tip_cents": 200,
"gift": { "enabled": true, "recipient_name": "Jane",
"recipient_phone": "+15551234567" }
}' \
https://automunch.site/dd/v1/order
Returns 202 with a job_id; the completed job has the same full order result as Confirm above.
Check Eligibility
Probe a single account's 90%-off (50% DashPass) eligibility without ordering. Synchronous.
curl -X POST \
-H "Authorization: Bearer am_live_..." \
-H "Content-Type: application/json" \
-d '{"jwt_token": "eyJhbG..."}' \
https://automunch.site/dd/v1/check_90
{ "checked": true, "eligible_90": true, "savings": "$12.65",
"subtotal_cents": 2500, "reason": "ok" }
Poll a Job
Poll until completed or failed.
curl -H "Authorization: Bearer am_live_..." \ https://automunch.site/dd/v1/jobs/9b7a...11
import time, requests
BASE = "https://automunch.site/dd"
H = {"Authorization": "Bearer am_live_..."}
def wait(job_id):
while True:
j = requests.get(f"{BASE}/v1/jobs/{job_id}", headers=H).json()
if j["status"] in ("completed", "failed"):
return j
time.sleep(3)
# 1) generate a batch
job = requests.post(f"{BASE}/v1/gen", headers=H,
json={"batch_name": "june-run", "amount": 2}).json()
wait(job["job_id"])
# 2) find an eligible account
elig = requests.get(f"{BASE}/v1/eligible?fresh_only=true", headers=H).json()
acct = elig["accounts"][0]["account_id"]
# 3) preview
prev = requests.post(f"{BASE}/v1/order/preview", headers=H, json={
"account_id": acct,
"cart_url": "https://drd.sh/cart/abc",
"address": "123 Main St, 30301",
"card": {"number": "4242424242424242", "exp_month": "12",
"exp_year": "27", "cvv": "123", "zip": "30301"},
}).json()
print("You pay:", prev["pricing"]["total"])
# 4) confirm
conf = requests.post(f"{BASE}/v1/order/confirm", headers=H,
json={"order_session_id": prev["order_session_id"]}).json()
result = wait(conf["job_id"])
print(result["result"]["order"]["order_uuid"])
Credits & pricing
A subscription unlocks the API; credits are then spent per checkout, scaled by your tier — Lifetime is free, higher tiers cost less. Failed orders never charge. Full tiers + credit packs are on the pricing page.
| Tier | 90% order | 40% order |
|---|---|---|
| Lifetime | Free | Free |
| Tier III | 1 credit | 1 credit |
| Tier II | 3 credits | 2 credits |
| Tier I | 6 credits | 3 credits |
| No subscription | 9 credits | 5 credits |
| Action | Cost |
|---|---|
Account gen (/v1/gen) | Lifetime free · subscribers free within daily limit, then 1 credit/account · no-sub 3/account |
Preview, eligibility, batch reads, /v1/me | Free |
| Beta role | 1 free checkout / day |
Credits come from the same AutoMunch wallet as Discord. Check balance with /v1/me or /balance, top up with /buy on Discord.
Error Codes
| Status | Meaning |
|---|---|
400 | Missing/invalid field (e.g. batch_name required, no account_id/jwt_token). |
401 | Missing, invalid, or revoked API key. |
404 | Account, batch, job, or preview session not found (or not yours / expired). |
409 | The deal lapsed between preview and confirm — re-preview. |
429 | Too many active jobs (max 2). |
500 | Engine error during a synchronous probe/preview. |
