DoorDash API
DoorDash checkouts as a REST API you fully control — accounts & OTP utilities coming next. Flat subscription, unlimited checkouts.
Overview
The API is plain HTTPS + JSON, so it works from any language — curl, Python,
Node, Go, anything that speaks HTTP. Access is a Mythic perk: generate your
key with /api_key in Discord, then send it on every request.
You source DoorDash accounts three ways: pool (auto-pulled from the shared
stock, billed from your balance), BYO (pass your own account — email +
password, or a JWT), or autogen (the engine mints a brand-new account on the
fly using your own hotmail007 + SMS provider keys, so the email/SMS cost is billed to
you, not your balance). Autogen can also run on inboxes you upload instead of buying
(autogen_source: "supplied"). Either way, checkouts themselves are unlimited.
Authentication
Send your key as a Bearer token in the Authorization header on every request.
Keys look like dk_live_…, are shown once, and re-running /api_key
revokes the previous one.
curl https://dashified.xyz/v1/me \
-H "Authorization: Bearer dk_live_your_key_here"
import requests
r = requests.get(
"https://dashified.xyz/v1/me",
headers={"Authorization": "Bearer dk_live_your_key_here"},
)
print(r.json())
Quickstart
- Buy Mythic in Discord, then run
/api_keyand copy your key. - Confirm it works:
GET /v1/mereturns your subscription + balance. POST /v1/checkout/previewwith a cart link (pool or BYO) — returns asession_id.- Poll
GET /v1/jobs/{id}untilready, thenPOST /v1/checkout/confirmto place it. - Poll again until
completed— theresultcarries the tracking link.
Error Codes
Standard HTTP statuses; bodies are {"detail": "…"}.
| Status | Meaning |
|---|---|
400 | Missing required field (e.g. cart_url, or address for a delivery) |
401 | Missing, invalid, or revoked API key |
403 | Key valid but no API access — requires an active Mythic tier |
404 | Session/job not found, or not yours |
409 | Order control called before the order was placed (no order_uuid yet) |
503 | API database not ready — retry shortly |
Account Snapshot live
Verify your key and read your subscription, balance, and capabilities. Free.
Response
{
"user_id": 123456789,
"key_prefix": "dk_live_abc123",
"subscription": {
"tier": "Mythic",
"lifetime": false,
"active": true,
"api_access": true,
"unlimited_checkouts": true,
"expires_at": "2026-07-09T00:00:00"
},
"balance": 42.50,
"account_modes": ["pool", "byo", "autogen"],
"autogen_sources": ["mint", "supplied"],
"blocked": false
}
Checkout live
Run a DoorDash checkout from a cart link (group-cart or bookmark link), with a pool account
(auto-pulled) or your own account (BYO). Everything is async: each call
returns 202 with a session_id; you poll
GET /v1/jobs/{id} until the status reaches the state you want.
Lifecycle
preview → (optional edit / slots) → confirm.
Statuses move queued → previewing → ready, then on confirm
placing → completed (or failed).
Preview request body
| Field | Type | Notes |
|---|---|---|
cart_url | string | Required. Group-cart / bookmark link |
address | string | Required for delivery. Delivery address (line 1 + zip). Omit only when is_pickup is true |
unit | string | Apt / unit (optional) |
tip_cents | int | Tip in cents (optional) |
dasher_instructions | string | Delivery note applied to the dropoff (optional) |
is_pickup | bool | Pickup instead of delivery. Default false. Pickup needs no address/dropoff |
dropoff_option | string | Delivery dropoff: "leave_at_door" (default), "hand_to_me", or "meet_outside" |
dashpass | bool | DashPass on/off. Omit = apply as usual. false = skip + cancel any active sub |
account_name | string | Name to put on the order (optional) |
account_mode | string | "pool" (default), "byo", or "autogen" |
use_ultra | bool | Check out via Ultra BP (auto-falls back to regular). Optional |
email / password / jwt_token | string | BYO only — your account's creds |
hotmail007_api_key | string | Autogen only — your hotmail007 key (buys the inbox; not needed with autogen_source: "supplied") |
autogen_source | string | Autogen — "mint" (default; the engine buys the inbox with your hotmail007 key) or "supplied" (the engine draws from your uploaded pool — see POST /v1/autogen/inboxes) |
public_sms_api_key / getatext_api_key | string | Autogen only — your SMS provider key(s); at least one required |
sms_provider_priority | string | Autogen — "list_sms_first" (default) or "getatext_first" |
sms_exclusive | bool | Autogen — only use the chosen provider (no fallback). Optional |
reuse_key | string | Autogen — a stable per-order key: reuses this key's already-minted account on a resubmit (and returns an unused one to a global pool via /v1/autogen/release) instead of minting again. Optional |
autogen_source: "supplied" the engine skips the inbox purchase entirely and uses
an inbox from your uploaded pool instead.# 1. Preview — returns {"session_id": "...", "status": "queued"}
curl -X POST https://dashified.xyz/v1/checkout/preview \
-H "Authorization: Bearer dk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"cart_url":"https://drd.sh/abc","address":"562 Broad St 07072","tip_cents":300}'
# 2. Poll until status == "ready"
curl https://dashified.xyz/v1/jobs/SESSION_ID \
-H "Authorization: Bearer dk_live_your_key_here"
# 3. Confirm to place the order
curl -X POST https://dashified.xyz/v1/checkout/confirm \
-H "Authorization: Bearer dk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"order_session_id":"SESSION_ID"}'
import requests, time
H = {"Authorization": "Bearer dk_live_your_key_here"}
B = "https://dashified.xyz"
sid = requests.post(f"{B}/v1/checkout/preview", headers=H, json={
"cart_url": "https://drd.sh/abc",
"address": "562 Broad St 07072",
"tip_cents": 300,
}).json()["session_id"]
while True:
job = requests.get(f"{B}/v1/jobs/{sid}", headers=H).json()
if job["status"] in ("ready", "failed"): break
time.sleep(2)
requests.post(f"{B}/v1/checkout/confirm", headers=H,
json={"order_session_id": sid})
Confirm request body
| Field | Type | Notes |
|---|---|---|
order_session_id | string | Required. The session_id from preview |
card | object | Card to add before placing (optional; else uses one already on the account). See fields below. |
scheduled_window | object | A slot from /slots to schedule delivery (optional) |
dashpass | bool | Last-chance DashPass on/off before placing (optional) |
The card object
All values are strings. Provide this to place on a caller-supplied card; omit it to use a card already on the account.
| Field | Type | Notes |
|---|---|---|
number | string | Required. Full card number, digits only (e.g. "5443171187277580") |
mm | string | Required. Expiry month, 2 digits (e.g. "07") |
yy | string | Required. Expiry year — 2 or 4 digits both accepted (e.g. "31" or "2031") |
cvv | string | Required. Card security code (e.g. "127") |
zip | string | Required. Billing ZIP / postal code (e.g. "07072") |
# Confirm with a caller-supplied card (values are examples — not real)
curl -X POST https://dashified.xyz/v1/checkout/confirm \
-H "Authorization: Bearer dk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"order_session_id": "SESSION_ID",
"card": {
"number": "4111111111111111",
"mm": "07",
"yy": "31",
"cvv": "123",
"zip": "07072"
}
}'
# After confirm, poll GET /v1/jobs/{session_id} until status is "completed".
# All money is in integer cents (1840 = $18.40); promo is negative.
{
"session_id": "a1b2c3d4e5f6...",
"status": "completed",
"store_name": "Arirang Korean Restaurant",
"items": [{ "name": "Bibimbap", "quantity": 1 }],
"pricing": {
"subtotal": 2400, "promo": -720, "delivery": 0,
"service_fee": 0, "tax": 160, "tip": 0,
"total": 1840, "is_dashpass": true
},
"slots": null,
"result": {
"order_uuid": "11111111-2222-3333-4444-555555555555",
"tracking_url": "https://ddtracker-production.up.railway.app/t/EXAMPLE",
"store_name": "Arirang Korean Restaurant",
"customer_name": "Alex Example",
"pricing": { /* final fee-inclusive pricing, same shape as above */ },
"card_charged_cents": 1840
},
"cancel_result": null,
"refund_result": null,
"refund_preview": null,
"dashpass_result": null,
"error": null,
"account_email": "account_used@example.com",
"account_password": "••••••••"
}
status: "completed" is the success signal; on failure it's
"failed" with a message in error and result: null.
result.card_charged_cents is the exact amount the card paid (fee-inclusive total + tip).
Only call confirm after you've collected payment from your buyer — it places the real order.Edit request body
Any subset of these fields re-prices the open preview (statuses go editing → ready).
Re-replication only happens when cart_url changes.
| Field | Type | Notes |
|---|---|---|
cart_url | string | Swap to a different cart (re-replicates) |
address | string | New delivery address |
tip_cents | int | New tip |
account_name | string | New name on the order |
dasher_instructions | string | New delivery note |
is_pickup | bool | Switch between delivery and pickup |
dropoff_option | string | "leave_at_door" (default), "hand_to_me", or "meet_outside" |
dashpass | bool | Turn DashPass on/off for this order |
Release an autogen account
When you're done with an autogen order (it was abandoned or you don't need the account),
release the reuse_key you minted under. An account that never placed an order is
returned to the global reuse pool (drained before the next mint); one that
already ordered is left spent.
| Field | Type | Notes |
|---|---|---|
reuse_key | string | Required. The key you passed to preview |
Supply your own inboxes (autogen v2)
Upload hotmail007 inboxes into your own supplied-inbox pool (never shared
across keys). Previews with autogen_source: "supplied" draw from this pool
instead of buying an inbox. Lines are email:password:refresh_token:client_id
(email + password required); pass them as a list of strings or one newline-separated string.
Re-uploading an email refreshes its creds without counting as added.
| Field | Type | Notes |
|---|---|---|
inboxes | array | string | Required. Lines of email:password:refresh_token:client_id |
curl -X POST https://dashified.xyz/v1/autogen/inboxes \
-H "Authorization: Bearer dk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"inboxes": ["box1@hotmail.com:pass1:refresh_tok:client_id", "box2@hotmail.com:pass2"]}'
{
"added": 2,
"skipped": 0,
"pool_size": 2
}
Check your supplied-inbox pool: {"available": …, "in_use": …, "spent": …}.
available inboxes are claimable by your next supplied-mode preview;
spent ones already backed an account.
Order Controls live
Act on an already-placed order (after confirm succeeded and the
job result carries an order_uuid). All four are async — they return
202; poll GET /v1/jobs/{id} for the outcome field. Calling any of
these before the order is placed returns 409.
Cancel a placed order
POST /v1/orders/{id}/cancel — cancels the placed order. Poll for
cancel_result; on success job status becomes order_cancelled.
| Field | Type | Notes |
|---|---|---|
reason | string | Cancellation reason (optional; default "consumer_requested") |
Request a refund
POST /v1/orders/{id}/refund — requests a refund on the placed order. Poll for
refund_result.
| Field | Type | Notes |
|---|---|---|
reason | string | Refund reason (optional; default "consumer_requested") |
items | array | Specific line items to refund (optional; omit for a whole-order refund) |
Preview a refund
POST /v1/orders/{id}/refund/preview — returns the would-be refund amount /
eligibility without committing. Poll for refund_preview.
| Field | Type | Notes |
|---|---|---|
items | array | Line items to price the preview against (optional) |
Toggle DashPass
POST /v1/orders/{id}/dashpass — turn DashPass on or off on the order's account.
Poll for dashpass_result. (You can also set dashpass on
preview / edit / confirm.)
| Field | Type | Notes |
|---|---|---|
enable | bool | Required. true = apply DashPass, false = cancel it |
Accounts coming soon
Utilities coming soon
Billing
Checkouts are unlimited under your subscription — you only pay for accounts.
| Account source | Rate | When charged |
|---|---|---|
| In-house (pool) | $1.50 |
once a checkout is attempted; refunded + returned to stock if you cancel |
| External (BYO) | $0.25 |
only on a successful checkout |
| Autogen | $0.00 |
no balance charge — you pay your own hotmail007 inbox + SMS provider costs |
!fetch → Purchase
Balance — the wallet is shared between the bot and the API.Async Jobs
Checkout endpoints return 202 with a session_id. Poll
GET /v1/jobs/{id}, which returns status plus
store_name, items, pricing, slots,
result, error, and — once priced —
account_email / account_password (the account the engine used for
this order, so you can record it).
pricing is {subtotal, promo, delivery, service_fee, tax, tip, total,
is_dashpass} in cents. Note total is the cart total before
tip — the tip is added at placement, so the buyer's amount due is
total + tip.
Statuses: queued → previewing → ready
(priced, awaiting confirm) → placing → completed, or
failed at any point. Once completed, result carries
order_uuid and tracking_url.
Order-control actions write their outcome to their own poll field:
cancel_result, refund_result, refund_preview, and
dashpass_result (each present only after the matching action runs).