Heads up: Our Discord server was banned. We've moved — join the new one to keep using the bots.Join New Server →

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.

Base URL

https://automunch.site/dd

Subscribers only

The DoorDash API requires an active DoorDash subscription (Tier I/II/III or Lifetime). Generate your key with /api_key in the AutoMunch Discord.

What's built in

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 Header
Authorization: Bearer am_live_your_key_here
Settings come from Discord

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.

Freshness

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

GET /v1/me Verify key, credits, scopes

Verify your API key and check your credit balance.

Request
curl -H "Authorization: Bearer am_live_..." \
  https://automunch.site/dd/v1/me
200 Response
{
  "user_id": 1306300782123159674,
  "credits": 42,
  "scopes": ["gen", "order", "accounts", "otp"],
  "key_prefix": "am_live_8Xk2aB9c..."
}

Generate a Batch

POST /v1/gen Create accounts into a batch + probe 90%

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.

FieldTypeRequiredNotes
batch_namestringYesBatch (chain) to create/append to. Shows in /view on Discord too.
amountintegerNo1–5. Default 1.
account_namestringNoName for the accounts. Random if omitted.
addressstringNoOptional address to attach.
Request
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
Python
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", ...}
202 Response
{
  "job_id": "2f1c...e7",
  "status": "queued",
  "batch_name": "june-run",
  "poll_url": "/v1/jobs/2f1c...e7"
}
Completed Job (poll /v1/jobs)
{
  "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

GET /v1/batches Your batches + counts

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.

Request
curl -H "Authorization: Bearer am_live_..." \
  https://automunch.site/dd/v1/batches
200 Response
{
  "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

GET /v1/batches/{name} Accounts in a batch

Accounts in a batch with their eligibility. No raw tokens are returned — has_jwt tells you a usable session exists.

Request
curl -H "Authorization: Bearer am_live_..." \
  https://automunch.site/dd/v1/batches/june-run
200 Response
{
  "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

GET /v1/eligible Accounts with the 90% deal

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 paramNotes
batchOnly this batch.
fresh_onlytrue drops accounts whose deal is stale (older than the cutoff).
Request
curl -H "Authorization: Bearer am_live_..." \
  "https://automunch.site/dd/v1/eligible?fresh_only=true"
200 Response
{
  "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

POST /v1/order/preview See the price before placing

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).

FieldRequiredNotes
account_idYes*From /v1/eligible. (*or a raw jwt_token)
cart_urlYesDoorDash group cart (https://drd.sh/cart/...) or a custom cart from the browser extension (automunch.site/cart/...)
addressYesDelivery address, e.g. "123 Main St, 30301" — set as the account default automatically
cardNoOptional at preview (card is needed at confirm). {number, exp_month, exp_year, cvv, zip}
tip_centsNoTip in cents (e.g. 200 = $2.00)
+ optionsNoAny order option also prices here: delivery_option, track, address_swap, gift, promo_codes
Request
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
Python
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"])
200 Response
{
  "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

POST /v1/order/preview/{id}/edit Change something and re-quote

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
Request — change the delivery address
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
Returns

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

POST /v1/order/confirm Place the previewed order

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, …).

Request
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
202 Response
{ "job_id": "9b7a...11", "status": "queued", "poll_url": "/v1/jobs/9b7a...11" }
Completed Job — full order result
{
  "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

POST /v1/order Preview + place in one call

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.

FieldNotes
account_id / jwt_tokenThe account (account_id preferred)
cart_url, address, cardRequired
tip_cents, is_pickup, promo_codesOrder options
delivery_optionSTANDARD (default) · PRIORITY (express) · SCHEDULE. With SCHEDULE, pass scheduled_time (ISO). The express_fee is echoed back in pricing.
trackDefault true — places as a gift so the order returns a public tracking link (no login). Set false for a plain order.
address_swapDeliver 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_coordsDelivery details (pin = "lat,lng")
giftOverride the default self-gift with a custom recipient: {enabled, recipient_name, recipient_phone, card_message}
account_nameChange the name on the account
cancel_dashpass_afterDefault true — cancels the DashPass trial after the order (and on hard failures only)
Request
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

POST /v1/check_90 Probe one account's 90% deal

Probe a single account's 90%-off (50% DashPass) eligibility without ordering. Synchronous.

Request
curl -X POST \
  -H "Authorization: Bearer am_live_..." \
  -H "Content-Type: application/json" \
  -d '{"jwt_token": "eyJhbG..."}' \
  https://automunch.site/dd/v1/check_90
200 Response
{ "checked": true, "eligible_90": true, "savings": "$12.65",
  "subtotal_cents": 2500, "reason": "ok" }

Poll a Job

GET /v1/jobs/{job_id} Status & result of a gen/order job

Poll until completed or failed.

Request
curl -H "Authorization: Bearer am_live_..." \
  https://automunch.site/dd/v1/jobs/9b7a...11
Python — gen → eligible → preview → confirm
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.

Tier90% order40% order
LifetimeFreeFree
Tier III1 credit1 credit
Tier II3 credits2 credits
Tier I6 credits3 credits
No subscription9 credits5 credits
ActionCost
Account gen (/v1/gen)Lifetime free · subscribers free within daily limit, then 1 credit/account · no-sub 3/account
Preview, eligibility, batch reads, /v1/meFree
Beta role1 free checkout / day
Shared wallet

Credits come from the same AutoMunch wallet as Discord. Check balance with /v1/me or /balance, top up with /buy on Discord.

Error Codes

StatusMeaning
400Missing/invalid field (e.g. batch_name required, no account_id/jwt_token).
401Missing, invalid, or revoked API key.
404Account, batch, job, or preview session not found (or not yours / expired).
409The deal lapsed between preview and confirm — re-preview.
429Too many active jobs (max 2).
500Engine error during a synchronous probe/preview.