{
  "info": {
    "_postman_id": "c9968a5b-22bc-4574-9976-be0789e4973b",
    "name": "DoorDash Retail Marketplace \u2014 Third-Party Provider",
    "description": "Calls for building a **non-restaurant** DoorDash Marketplace integration as a third-party provider: catalog, inventory, store hours, inventory pull, promotions, self-serve store onboarding, and orders.\n\n## Setup\n\nImport this collection and fill **collection variables** (the Variables tab on the collection). You do not need a Postman environment. If `provider_type` is also set in an environment, that value wins: the pre-request script reads it with `pm.variables.get`. It writes `user_agent`, `epoch`, and `future_epoch` back to collection variables.\n\n1. `developer_id`, `key_id`, and `signing_secret` come from the credential in the Developer Portal. The signing secret is shown once and is **base64-encoded**. Collection auth is already set to treat it as base64.\n2. `provider_type` is your sandbox provider type, for example `example_pos_sandbox`. Before every request the pre-request script rewrites `user_agent` from it: each underscore-separated word is capitalized and `/1.0` is appended, so `example_pos_sandbox` becomes `ExamplePosSandbox/1.0`. Do not edit `user_agent` by hand. The next send replaces it.\n3. Business, store, item, order, and onboarding ids are not collection variables. On each request, open Params. A value in the URL is a path variable (`:location_id`). A value the API only accepts in the JSON body is listed on that same tab and left unchecked, so it is not sent as a query parameter. The pre-request script copies that value into the body.\n\nJWT `iat` / `exp` are minted in the pre-request script for 5 minutes. DoorDash rejects tokens whose `exp` is more than 30 minutes after `iat`.\n\n## Which API to call\n\n- **Marketplace v2** (`/marketplace/api/v2`): catalog, inventory, store hours, jobs, promotions, onboarding.\n- **Marketplace v1** (`/marketplace/api/v1`): orders, store temporary deactivation, store and menu reads. Order endpoints are not in the v2 reference.\n\n## Before you treat a 2xx as success\n\nCatalog, inventory, inventory-pull, promotion, and fulfillment-capacity writes return a **2xx** with `operation_status: QUEUED` when DoorDash accepted the batch. The HTTP status is not always 202. A 2xx does not mean the menu changed. This collection stores `operation_id` in `last_operation_id` when the body includes one.\n\nStore-hours update returns **200**.\n\n## Payload rules that are easy to get wrong\n\n- Catalog `scope.business_ids` must contain **exactly one** business id.\n- Availability on inventory is `item_availability`: `ACTIVE` or `INACTIVE`. The provider guide says `is_active`; that name is not a field on v2 inventory payloads.\n- `base_price` and `sale_price` live inside `price_info`. Send both for strikethrough pricing. Values in this collection are **integers in the smallest currency unit** (1699 = $16.99). Order money fields in the v1 reference are integers in the same way. Confirm the scale on the first sandbox push.\n- Do **not** send `extras` on inventory POST or PATCH. Items with modifiers are supported only through inventory pull. A pull job in this collection uses `PULL_STORE_ITEMS` only.\n- `size.pack_size_details` is the pack object. The older name `pack_item_size_details` is not in the current reference.\n- Omit `weighted_item_info` unless `product_traits` includes `WEIGHTED`.\n- Order adjustment in **sandbox** needs header `dd-tenant-id: doortest:default`. That header is on the adjustment request and disabled. Enable it for sandbox. Do not send it in production.\n- Temporary store deactivation must include an end time. An open-ended pause stays offline until someone turns it back on.\n\nCatalog pull, inventory pull, and store-hours pull are endpoints **you** host. This collection can trigger an inventory pull (`Create inventory pull job`). It cannot call your pull endpoints.\n\nCheckout and DoorDash Direct transaction APIs are a different product and are not in this collection.\n\n## Docs\n\n- https://developer.doordash.com/en-US/docs/marketplace/retail/how_to/third_party_providers_v3\n- https://developer.doordash.com/en-US/docs/marketplace/retail/how_to/nv_ssio\n- https://developer.doordash.com/en-US/docs/marketplace/retail/orders/overview\n- https://developer.doordash.com/en-US/api/marketplace_v2/\n- https://developer.doordash.com/en-US/api/marketplace",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "item": [
    {
      "name": "Catalog",
      "description": "Business-scoped item master. Push when a merchant adds an item or edits item details. One business id per request. At least one image is required. UPC goes in `other_identifiers`. Size is the nested `size` object, not a string. Age restriction is a `product_traits` value (`ALCOHOL`, `MEDICATION`), not a boolean.",
      "item": [
        {
          "name": "Create catalog items",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/items",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "items"
              ],
              "query": [
                {
                  "key": "business_id",
                  "value": "your_business_id",
                  "description": "Your business id. Same value as location_group_id when onboarding. A catalog request allows exactly one. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "merchant_supplied_item_id",
                  "value": "item_1001",
                  "description": "Your item id. Use the same id on catalog and inventory. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "POST /items. Expect a **2xx**. Sandbox returns 200.\n\nSends one alcohol item with the attributes certification and onboarding eligibility care about: name, merchant item id, UPC, size, extended size (`product_specific_size_definition`), image, brand, and a two-level category.\n\n`pack_size_details` is the current field name. Do not send `pack_item_size_details`.\n\n`weighted_item_info` is omitted because this item is not `WEIGHTED`. Add it, with `average_weight_per_each` and the measurement units, only when that trait is set.\n\n`product_attributes` is omitted. Use the supported-attributes page for the vertical before adding that array: https://developer.doordash.com/en-US/docs/marketplace/retail/catalog_management/supported_attribute",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"scope\": {\n    \"business_ids\": [\n      \"{{business_id}}\"\n    ]\n  },\n  \"items\": [\n    {\n      \"merchant_supplied_item_id\": \"{{merchant_supplied_item_id}}\",\n      \"name\": \"Modelo Especial Lager Beer - 12pk / 12 fl oz Cans\",\n      \"description\": \"Mexican pilsner beer. Replace this sample with the merchant's item name, description, image, UPC, and size.\",\n      \"product_traits\": [\n        \"ALCOHOL\"\n      ],\n      \"other_identifiers\": [\n        {\n          \"identifier_type\": \"UPC\",\n          \"identifier_value\": \"080660957159\"\n        }\n      ],\n      \"images\": [\n        {\n          \"url\": \"https://example.com/images/modelo-especial-12pk.jpg\",\n          \"sort_id\": 0\n        }\n      ],\n      \"size\": {\n        \"details\": {\n          \"dimensions\": {\n            \"length\": {\n              \"value\": 10.5,\n              \"unit\": \"inch\"\n            },\n            \"width\": {\n              \"value\": 7.75,\n              \"unit\": \"inch\"\n            },\n            \"height\": {\n              \"value\": 5,\n              \"unit\": \"inch\"\n            }\n          },\n          \"weight\": {\n            \"value\": 9.15,\n            \"unit\": \"lbs\"\n          },\n          \"volume\": {\n            \"value\": 144,\n            \"unit\": \"oz\"\n          },\n          \"product_specific_size_definition\": {\n            \"value\": \"12\",\n            \"description\": \"fl oz\"\n          }\n        },\n        \"pack_size_details\": {\n          \"count_per_pack\": 12,\n          \"per_item_size_details\": {\n            \"dimensions\": {\n              \"length\": {\n                \"value\": 4.83,\n                \"unit\": \"inch\"\n              },\n              \"width\": {\n                \"value\": 2.13,\n                \"unit\": \"inch\"\n              },\n              \"height\": {\n                \"value\": 2.6,\n                \"unit\": \"inch\"\n              }\n            },\n            \"weight\": {\n              \"value\": 0.78,\n              \"unit\": \"lbs\"\n            },\n            \"volume\": {\n              \"value\": 12,\n              \"unit\": \"oz\"\n            },\n            \"product_specific_size_definition\": {\n              \"value\": \"12\",\n              \"description\": \"fl oz\"\n            }\n          }\n        }\n      },\n      \"brand_info\": {\n        \"name\": \"Modelo\"\n      },\n      \"item_categorizations\": [\n        {\n          \"category\": {\n            \"name\": \"Beer\",\n            \"sub_category\": {\n              \"name\": \"Lager\"\n            }\n          }\n        }\n      ]\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 2xx\", function () {",
                  "    pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Update catalog items",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/items",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "items"
              ],
              "query": [
                {
                  "key": "business_id",
                  "value": "your_business_id",
                  "description": "Your business id. Same value as location_group_id when onboarding. A catalog request allows exactly one. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "merchant_supplied_item_id",
                  "value": "item_1001",
                  "description": "Your item id. Use the same id on catalog and inventory. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "PATCH /items. Expect **200**.\n\nSame identity as the create call (`merchant_supplied_item_id` plus the single business id). This sample changes the description so it is obviously an update.\n\nDo not send `item_categorizations` on PATCH. Sandbox accepts the call with **200** and `operation_status: QUEUED`, then skips the item: categorization updates are not supported on PATCH. Set the category on Create.\n\nRemoving an item from a later catalog push does **not** take it off the store menu. Send `item_availability: INACTIVE` through the inventory API.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"scope\": {\n    \"business_ids\": [\n      \"{{business_id}}\"\n    ]\n  },\n  \"items\": [\n    {\n      \"merchant_supplied_item_id\": \"{{merchant_supplied_item_id}}\",\n      \"name\": \"Modelo Especial Lager Beer - 12pk / 12 fl oz Cans\",\n      \"description\": \"Updated description. Mexican pilsner beer with orange-blossom and light herb notes.\",\n      \"product_traits\": [\n        \"ALCOHOL\"\n      ],\n      \"other_identifiers\": [\n        {\n          \"identifier_type\": \"UPC\",\n          \"identifier_value\": \"080660957159\"\n        }\n      ],\n      \"images\": [\n        {\n          \"url\": \"https://example.com/images/modelo-especial-12pk.jpg\",\n          \"sort_id\": 0\n        }\n      ],\n      \"size\": {\n        \"details\": {\n          \"dimensions\": {\n            \"length\": {\n              \"value\": 10.5,\n              \"unit\": \"inch\"\n            },\n            \"width\": {\n              \"value\": 7.75,\n              \"unit\": \"inch\"\n            },\n            \"height\": {\n              \"value\": 5,\n              \"unit\": \"inch\"\n            }\n          },\n          \"weight\": {\n            \"value\": 9.15,\n            \"unit\": \"lbs\"\n          },\n          \"volume\": {\n            \"value\": 144,\n            \"unit\": \"oz\"\n          },\n          \"product_specific_size_definition\": {\n            \"value\": \"12\",\n            \"description\": \"fl oz\"\n          }\n        },\n        \"pack_size_details\": {\n          \"count_per_pack\": 12,\n          \"per_item_size_details\": {\n            \"dimensions\": {\n              \"length\": {\n                \"value\": 4.83,\n                \"unit\": \"inch\"\n              },\n              \"width\": {\n                \"value\": 2.13,\n                \"unit\": \"inch\"\n              },\n              \"height\": {\n                \"value\": 2.6,\n                \"unit\": \"inch\"\n              }\n            },\n            \"weight\": {\n              \"value\": 0.78,\n              \"unit\": \"lbs\"\n            },\n            \"volume\": {\n              \"value\": 12,\n              \"unit\": \"oz\"\n            },\n            \"product_specific_size_definition\": {\n              \"value\": \"12\",\n              \"description\": \"fl oz\"\n            }\n          }\n        }\n      },\n      \"brand_info\": {\n        \"name\": \"Modelo\"\n      }\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Inventory",
      "description": "Store-scoped price and availability. This is what creates and updates the customer-facing menu. POST the first time an item is sold at a store (`base_price` and `item_availability` required). PATCH after that.\n\nDo not send `meta` (that block is only for the paginated pull workflow, which this collection does not use) and do not send `extras`. Both POST and PATCH return a **2xx** with `operation_status: QUEUED`. Sandbox returns 200 for a successful queue.",
      "item": [
        {
          "name": "Add store inventory",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/stores/:location_id/items",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "stores",
                ":location_id",
                "items"
              ],
              "variable": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store."
                }
              ],
              "query": [
                {
                  "key": "merchant_supplied_item_id",
                  "value": "item_1001",
                  "description": "Your item id. Use the same id on catalog and inventory. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "POST /stores/{location_id}/items. Expect a **2xx** with `operation_status: QUEUED` and an `operation_id`. Sandbox returns 200 for a successful queue.\n\nInteger prices: `base_price` 1699 and `sale_price` 1499 are $16.99 and $14.99. Sending both produces strikethrough pricing.\n\n`tax_rate` 6.5 follows the percent-style example used by integrators today. Confirm that scale on the first sandbox menu.\n\n`item_special_hours` is how you restrict selling inside store hours (alcohol rules are the usual case). `location` is required for Dasher Pick. `coordinates.x` and `coordinates.y` are integers.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"items\": [\n    {\n      \"merchant_supplied_item_id\": \"{{merchant_supplied_item_id}}\",\n      \"item_availability\": \"ACTIVE\",\n      \"balance_on_hand\": 17,\n      \"funding_source\": \"MERCHANT\",\n      \"last_sold_datetime\": \"2026-10-01T14:48:00.000Z\",\n      \"price_info\": {\n        \"base_price\": 1699,\n        \"sale_price\": 1499,\n        \"tax_rate\": 6.5,\n        \"bottle_fee_deposit\": 0\n      },\n      \"location\": {\n        \"aisle\": \"7\",\n        \"zone\": \"A\",\n        \"shelf\": \"2\",\n        \"side\": \"left\",\n        \"section\": \"beer\",\n        \"additional_details\": \"Cooler, eye level\",\n        \"raw_text\": \"Aisle 7, cooler, shelf 2\",\n        \"coordinates\": {\n          \"x\": 12,\n          \"y\": 3\n        }\n      },\n      \"item_special_hours\": [\n        {\n          \"day_index\": \"MON\",\n          \"start_time\": \"09:00:00\",\n          \"end_time\": \"21:00:00\",\n          \"start_date\": \"2026-01-01\",\n          \"end_date\": \"2026-12-31\"\n        }\n      ]\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 2xx\", function () {",
                  "    pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Update store inventory",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/stores/:location_id/items",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "stores",
                ":location_id",
                "items"
              ],
              "variable": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store."
                }
              ],
              "query": [
                {
                  "key": "merchant_supplied_item_id",
                  "value": "item_1001",
                  "description": "Your item id. Use the same id on catalog and inventory. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "PATCH /stores/{location_id}/items. Expect a **2xx** with `operation_status: QUEUED`. Sandbox returns 200 for a successful queue.\n\nThis sample marks the item `INACTIVE`, sets `balance_on_hand` to 0, and changes price in the same call. Certification also checks availability-only and price-only updates; send only the fields that changed for those cases.\n\nA merchant out-of-stock action in your fulfillment UI should call this endpoint. A nightly full refresh must keep honoring that override or the item comes back on sale.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"items\": [\n    {\n      \"merchant_supplied_item_id\": \"{{merchant_supplied_item_id}}\",\n      \"item_availability\": \"INACTIVE\",\n      \"balance_on_hand\": 0,\n      \"last_sold_datetime\": \"2026-10-08T14:48:00.000Z\",\n      \"price_info\": {\n        \"base_price\": 1799,\n        \"sale_price\": 1599\n      }\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 2xx\", function () {",
                  "    pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Update business-wide pricing",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/businesses/:business_id/items",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "businesses",
                ":business_id",
                "items"
              ],
              "variable": [
                {
                  "key": "business_id",
                  "value": "your_business_id",
                  "description": "Your business id. Same value as location_group_id when onboarding. A catalog request allows exactly one."
                }
              ],
              "query": [
                {
                  "key": "merchant_supplied_item_id",
                  "value": "item_1001",
                  "description": "Your item id. Use the same id on catalog and inventory. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "PATCH /businesses/{business_id}/items. Expect a **2xx** with `operation_status: QUEUED`.\n\nDoorDash has to enable universal pricing for the business first. Otherwise the call returns 403, `Universal pricing is not enabled for this business`.\n\nApplies a price change to every live store in the business. The reference says only basic pricing updates are supported and that **validation fails if unsupported fields are included**. This body sends `merchant_supplied_item_id` and `price_info` only, even though the published sample shows a full store item.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"items\": [\n    {\n      \"merchant_supplied_item_id\": \"{{merchant_supplied_item_id}}\",\n      \"price_info\": {\n        \"base_price\": 1699,\n        \"sale_price\": 1499\n      }\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 2xx\", function () {",
                  "    pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Store hours",
      "description": "PATCH hours after a menu exists. A hours push before the first successful inventory push has nothing to attach to. Resolve timezone and daylight saving per store. Empty hours block onboarding (`STORE_HOURS_NOT_POPULATED_FAILURE`).",
      "item": [
        {
          "name": "Update store hours",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/stores/:location_id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "stores",
                ":location_id"
              ],
              "variable": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store."
                }
              ]
            },
            "description": "PATCH /stores/{location_id}. Expect **200**.\n\n`open_hours` is required. Times are local store time as `HH:mm:ss`. Hours that cross midnight are two blocks: one ending at 23:59:59 and one starting at 00:00:00 on the next `day_index`.\n\n`special_hours` is a separate certification item. `closed: true` means the store is closed that date; when `closed` is false, send the special start and end.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"merchant_supplied_store_id\": \"{{location_id}}\",\n  \"open_hours\": [\n    {\n      \"day_index\": \"MON\",\n      \"start_time\": \"08:00:00\",\n      \"end_time\": \"21:00:00\"\n    },\n    {\n      \"day_index\": \"TUE\",\n      \"start_time\": \"08:00:00\",\n      \"end_time\": \"21:00:00\"\n    },\n    {\n      \"day_index\": \"WED\",\n      \"start_time\": \"08:00:00\",\n      \"end_time\": \"21:00:00\"\n    },\n    {\n      \"day_index\": \"THU\",\n      \"start_time\": \"08:00:00\",\n      \"end_time\": \"21:00:00\"\n    },\n    {\n      \"day_index\": \"FRI\",\n      \"start_time\": \"08:00:00\",\n      \"end_time\": \"22:00:00\"\n    },\n    {\n      \"day_index\": \"SAT\",\n      \"start_time\": \"09:00:00\",\n      \"end_time\": \"22:00:00\"\n    },\n    {\n      \"day_index\": \"SUN\",\n      \"start_time\": \"09:00:00\",\n      \"end_time\": \"20:00:00\"\n    }\n  ],\n  \"special_hours\": [\n    {\n      \"date\": \"2026-12-25\",\n      \"closed\": true,\n      \"start_time\": \"00:00:00\",\n      \"end_time\": \"00:00:00\"\n    },\n    {\n      \"date\": \"2026-12-31\",\n      \"closed\": false,\n      \"start_time\": \"10:00:00\",\n      \"end_time\": \"16:00:00\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Update fulfillment capacity",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/stores/:location_id/fulfillment_capacity",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "stores",
                ":location_id",
                "fulfillment_capacity"
              ],
              "variable": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store."
                }
              ]
            },
            "description": "PATCH /stores/{location_id}/fulfillment_capacity. Expect a **2xx** with `operation_status: QUEUED`.\n\nDoorDash has to enable hybrid fulfillment signal reception for the provider first. Otherwise the call returns 403, `hybrid fulfillment signal reception is not enabled`.\n\n`status` is `OVER_CAPACITY` or `AVAILABLE`. `status_timestamp` is when the store entered that status, ISO-8601.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"OVER_CAPACITY\",\n  \"status_timestamp\": \"2026-10-09T16:00:00Z\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 2xx\", function () {",
                  "    pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Jobs",
      "description": "Inventory pull is an endpoint you host. This call asks DoorDash to pull that store now, which is the fastest way to test the pull. Use `job_type` `PULL_STORE_ITEMS` and `pull_mode` `REPLACE`.\n\nDo not build `PULL_STORE_ITEMS_WITH_PAGINATION`. A provider registers one pull endpoint, and onboarding operations can only trigger the non-paginated pull. Your endpoint must return every item for the store in one response.",
      "item": [
        {
          "name": "Create inventory pull job",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/jobs",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "jobs"
              ],
              "query": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "POST /jobs. Expect **200**. The body still includes `operation_id` and `operation_status: QUEUED`.\n\n`store_location_id` is your store id, the same value as `location_id`. `merchant_supplied_page_size` is only for the paginated job type and is omitted here.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"job_type\": \"PULL_STORE_ITEMS\",\n  \"job_parameters\": {\n    \"store_location_id\": \"{{location_id}}\",\n    \"pull_mode\": \"REPLACE\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Promotions",
      "description": "Optional item-level promotions. Both calls return **202** with `operation_status: QUEUED`.\n\nSend `{ \"promotions\": [ ... ] }`. A bare promotion object is rejected: the schema requires `promotions` and does not allow the promotion fields at the top level.",
      "item": [
        {
          "name": "Create promotion",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/promotions/stores/:location_id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "promotions",
                "stores",
                ":location_id"
              ],
              "variable": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store."
                }
              ],
              "query": [
                {
                  "key": "promotion_id",
                  "value": "promo_1001",
                  "description": "Your promotion id. Reuse the same value on the update call. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "merchant_supplied_item_id",
                  "value": "item_1001",
                  "description": "Your item id. Use the same id on catalog and inventory. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "POST /promotions/stores/{location_id}. Expect **202** with `operation_status: QUEUED`. The body is `{ \"promotions\": [ ... ] }`.\n\nSample is `BUY_X_SAVE_Y`: buy 2, save $2.00 (`discount_price_off` 200), limited to 1 redemption per order. `start_time` and `end_time` are local store time with a numeric offset (`yyyy-MM-ddTHH:mm:ssXXX`).\n\n`promotion_type` is `BUY_X_FOR_Y`, `BUY_X_SAVE_Y`, or `BUY_X_GET_Y_Z_PERCENT_OFF`. Send only the discount fields that type uses.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"promotions\": [\n    {\n      \"promotion_id\": \"{{promotion_id}}\",\n      \"promotion_type\": \"BUY_X_SAVE_Y\",\n      \"funding_source\": \"MERCHANT\",\n      \"purchase_criteria\": {\n        \"purchase_items\": [\n          \"{{merchant_supplied_item_id}}\"\n        ],\n        \"purchase_quantity\": 2\n      },\n      \"redemption_limit\": {\n        \"limit_per_order\": 1\n      },\n      \"discount_options\": {\n        \"discount_price_off\": 200\n      },\n      \"promotion_options\": {\n        \"promotion_conditions\": [\n          \"MIX_AND_MATCH\"\n        ]\n      },\n      \"start_time\": \"2026-12-01T00:00:00-05:00\",\n      \"end_time\": \"2026-12-31T23:59:59-05:00\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 202\", function () {",
                  "    pm.response.to.have.status(202);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Update promotion",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/promotions/stores/:location_id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "promotions",
                "stores",
                ":location_id"
              ],
              "variable": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store."
                }
              ],
              "query": [
                {
                  "key": "promotion_id",
                  "value": "promo_1001",
                  "description": "Your promotion id. Reuse the same value on the update call. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "merchant_supplied_item_id",
                  "value": "item_1001",
                  "description": "Your item id. Use the same id on catalog and inventory. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "PATCH /promotions/stores/{location_id}. Expect **202** with `operation_status: QUEUED`. The body is `{ \"promotions\": [ ... ] }`.\n\nSame `promotion_id` as create. This sample changes the per-order redemption cap.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"promotions\": [\n    {\n      \"promotion_id\": \"{{promotion_id}}\",\n      \"promotion_type\": \"BUY_X_SAVE_Y\",\n      \"funding_source\": \"MERCHANT\",\n      \"purchase_criteria\": {\n        \"purchase_items\": [\n          \"{{merchant_supplied_item_id}}\"\n        ],\n        \"purchase_quantity\": 2\n      },\n      \"redemption_limit\": {\n        \"limit_per_order\": 2\n      },\n      \"discount_options\": {\n        \"discount_price_off\": 300\n      },\n      \"promotion_options\": {\n        \"promotion_conditions\": [\n          \"MIX_AND_MATCH\"\n        ]\n      },\n      \"start_time\": \"2026-12-01T00:00:00-05:00\",\n      \"end_time\": \"2026-12-31T23:59:59-05:00\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 202\", function () {",
                  "    pm.response.to.have.status(202);",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Store reads and temporary deactivation",
      "description": "Reads and the pause/resume calls live on Marketplace v1. Pausing a store is separate from inventory. Always send an end time on deactivation so the store comes back.",
      "item": [
        {
          "name": "Get store info",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v1/stores/:location_id/store_details",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v1",
                "stores",
                ":location_id",
                "store_details"
              ],
              "variable": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store."
                }
              ]
            },
            "description": "GET /stores/{location_id}/store_details. Expect **200**. Includes current deactivations when the store is paused."
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Get store menu details",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v1/stores/:location_id/menu_details",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v1",
                "stores",
                ":location_id",
                "menu_details"
              ],
              "variable": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store."
                }
              ]
            },
            "description": "GET /stores/{location_id}/menu_details. Expect **200**. Use this to see whether a queued inventory or hours write has landed."
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Get store menu",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v1/stores/:location_id/store_menu",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v1",
                "stores",
                ":location_id",
                "store_menu"
              ],
              "variable": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. The API names this path parameter merchant_supplied_id. It is the same id as :location_id on the other store calls."
                }
              ]
            },
            "description": "GET /stores/{merchant_supplied_id}/store_menu. Expect **200**.\n\nReturns the full menu JSON DoorDash is serving for the store: categories, items, prices, and hours.\n\n`store_details` is the store record (protocol, deactivations). `menu_details` is menu ids, update status, and hours. This call is the menu itself.\n\nThe reference names the path parameter `merchant_supplied_id`. Here it is `:location_id`, the same store id as the other store calls."
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});"
                ]
              }
            }
          ],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          }
        },
        {
          "name": "Deactivate store temporarily",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v1/stores/:location_id/status",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v1",
                "stores",
                ":location_id",
                "status"
              ],
              "variable": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store."
                }
              ]
            },
            "description": "PUT /stores/{location_id}/status. Expect **200**.\n\n`is_active: false` requires `reason`. `end_time` format is `YYYY-MM-DDTHH:MM:SS+HH:MM`. Replace the sample end time. Do not send a deactivation with no end time and no duration.\n\n`reason`: `out_of_business`, `operational_issues`, `delete_store`, `payment_issue`, `store_self_disabled_in_their_POS_portal`, `store_pos_connectivity_issues`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"is_active\": false,\n  \"reason\": \"operational_issues\",\n  \"notes\": \"Store paused by the merchant. Replace the end time.\",\n  \"merchant_supplied_id\": \"{{location_id}}\",\n  \"end_time\": \"2026-10-09T22:00:00-04:00\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Reactivate store",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v1/stores/:location_id/status",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v1",
                "stores",
                ":location_id",
                "status"
              ],
              "variable": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store."
                }
              ]
            },
            "description": "PUT /stores/{location_id}/status. Expect **200**.\n\n`reason` is not required when `is_active` is true.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"is_active\": true,\n  \"merchant_supplied_id\": \"{{location_id}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Onboarding",
      "description": "Self-serve merchant onboarding (SSIO). The merchant-facing button calls the single-store endpoint and then surfaces `managed_merchant_connect_url` until you receive `BUSINESS_ID_MAPPED`. If status becomes `ABANDONED`, that URL stops working and you must call the endpoint again.\n\nThe legacy `POST /webhooks/stores/onboarding` payload (`partner_store_id`, flat address fields) is retired. Do not send it.\n\nOne store per URL request. The batch endpoint accepts 1\u2013100 locations, returns no URL, and is for operator bulk initiation. Subscribe to onboarding-status webhooks; the GET in this folder is optional and is not a substitute.",
      "item": [
        {
          "name": "Create managed merchant onboarding URL",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/managed_merchant_connect_url",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "managed_merchant_connect_url"
              ],
              "query": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "business_id",
                  "value": "your_business_id",
                  "description": "Your business id. Same value as location_group_id when onboarding. A catalog request allows exactly one. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "POST /managed_merchant_connect_url. Expect **200** and `managed_merchant_connect_url`.\n\nEvery field must be copied from stored merchant data. `email` must be a Business Admin in the DoorDash Merchant Portal. `location_id` becomes the id you use on later API calls.\n\n`order_protocol`: `POS` or `TABLET`. `fulfillment_protocol`: `MERCHANT_PICK` or `DASHER_PICK`. `locale`: `en-US`.\n\n409 `STORE_ALREADY_EXISTS` means this location is already onboarded. For a conversion test, `store_name` and `address` must match the test store your technical account manager provisioned exactly.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"location_id\": \"{{location_id}}\",\n  \"location_group_id\": \"{{business_id}}\",\n  \"store_name\": \"Empanada Empire\",\n  \"location_name\": \"Candler\",\n  \"address\": {\n    \"line_1\": \"101 DoorDash St.\",\n    \"line_2\": \"Suite 5\",\n    \"city\": \"Atlanta\",\n    \"state\": \"GA\",\n    \"zip\": \"30312\"\n  },\n  \"first_name\": \"James\",\n  \"last_name\": \"Walnut\",\n  \"email\": \"merchant.admin@example.com\",\n  \"business_phone\": \"+14155550100\",\n  \"expected_go_live_date\": \"2026-12-15\",\n  \"merchant_decision_maker_email\": \"owner@example.com\",\n  \"order_protocol\": \"POS\",\n  \"fulfillment_protocol\": \"MERCHANT_PICK\",\n  \"locale\": \"en-US\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Submit multi-location onboarding intent",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/nv_multi_location_onboarding_intent",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "nv_multi_location_onboarding_intent"
              ],
              "query": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "business_id",
                  "value": "your_business_id",
                  "description": "Your business id. Same value as location_group_id when onboarding. A catalog request allows exactly one. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "location_id_2",
                  "value": "your_second_store_location_id",
                  "description": "Second store id, for the batch onboarding example only. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "POST /nv_multi_location_onboarding_intent. Expect **200**. Read the `results` array. One bad location does not fail the batch, and a top-level 200 does not mean every location was accepted.\n\nNo merchant URL is returned. Do not wire the merchant-facing button to this call. 1 to 100 locations.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"requests\": [\n    {\n      \"location_id\": \"{{location_id}}\",\n      \"location_group_id\": \"{{business_id}}\",\n      \"store_name\": \"Empanada Empire\",\n      \"location_name\": \"Candler\",\n      \"address\": {\n        \"line_1\": \"101 DoorDash St.\",\n        \"line_2\": \"Suite 5\",\n        \"city\": \"Atlanta\",\n        \"state\": \"GA\",\n        \"zip\": \"30312\"\n      },\n      \"first_name\": \"James\",\n      \"last_name\": \"Walnut\",\n      \"email\": \"merchant.admin@example.com\",\n      \"business_phone\": \"+14155550100\",\n      \"expected_go_live_date\": \"2026-12-15\",\n      \"merchant_decision_maker_email\": \"owner@example.com\",\n      \"order_protocol\": \"POS\",\n      \"fulfillment_protocol\": \"MERCHANT_PICK\",\n      \"locale\": \"en-US\"\n    },\n    {\n      \"location_id\": \"{{location_id_2}}\",\n      \"location_group_id\": \"{{business_id}}\",\n      \"store_name\": \"Empanada Empire\",\n      \"location_name\": \"Midtown\",\n      \"address\": {\n        \"line_1\": \"200 Peachtree St.\",\n        \"city\": \"Atlanta\",\n        \"state\": \"GA\",\n        \"zip\": \"30303\"\n      },\n      \"first_name\": \"James\",\n      \"last_name\": \"Walnut\",\n      \"email\": \"merchant.admin@example.com\",\n      \"business_phone\": \"+14155550100\",\n      \"expected_go_live_date\": \"2026-12-15\",\n      \"merchant_decision_maker_email\": \"owner@example.com\",\n      \"order_protocol\": \"POS\",\n      \"fulfillment_protocol\": \"MERCHANT_PICK\",\n      \"locale\": \"en-US\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Get onboarding status",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v2/store_onboarding/:onboarding_id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v2",
                "store_onboarding",
                ":onboarding_id"
              ],
              "variable": [
                {
                  "key": "onboarding_id",
                  "value": "onboarding-id-from-webhook",
                  "description": "onboarding_id from the store onboarding status webhook."
                }
              ]
            },
            "description": "GET /store_onboarding/{onboarding_id}. Expect **200**.\n\nOptional. `onboarding_id` arrives on the store onboarding status webhook, not on the create-URL response. Webhook subscription for event type \"Onboarding status\" is required.\n\nThis path is documented on the merchant onboarding guide. Treat `status` as an open set. Known values include `INTEGRATION_REQUESTED`, `STORE_CONNECTED`, `BUSINESS_ID_MAPPED`, `CATALOG_REQUESTED`, `CATALOG_DATA_RECEIVED`, `MENU_REQUESTED`, `MENU_IMPORTED`, `HOURS_SET`, `MENU_AUDIT`, `MENU_QUALIFIED`, `INTEGRATION_ACTIVATED`, `CATALOG_PULL_FAILED`, `MENU_BLOCK`, `ACTIVATION_BLOCK`, and `ABANDONED`. An older section of the same guide uses `CATALOG_RECEIVED` and `CATALOG_BLOCK`; store the raw string."
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Orders",
      "description": "Marketplace v1. Retail and restaurant share these order APIs.\n\nDoorDash POSTs new orders to a URL you register. Respond **200** to confirm synchronously or **202** to confirm asynchronously, then call Confirm order within about 3\u20138 minutes. Receipt of the Order Adjustment webhook is the success signal for an adjustment, not the 202 from the adjustment call itself.\n\n`consumer.id` on the inbound order is a 64-bit integer.",
      "item": [
        {
          "name": "Confirm order \u2014 success",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v1/orders/:order_id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v1",
                "orders",
                ":order_id"
              ],
              "variable": [
                {
                  "key": "order_id",
                  "value": "order-id-from-webhook",
                  "description": "DoorDash order id from the order webhook (order.id). Not your internal order id."
                }
              ],
              "query": [
                {
                  "key": "merchant_order_id",
                  "value": "merchant-order-1001",
                  "description": "Your order id. Sent as merchant_supplied_id on confirm, failure, and ready-for-pickup. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "PATCH /orders/{id}. Expect **202**.\n\n`merchant_supplied_id` is your order id. Omit `failure_reason` and `errors` on success.\n\n`prep_time` is optional, UTC, and only for a prep time you calculated. Do not copy `estimated_pickup_time` back into `prep_time`. `pickup_instructions` is optional and limited to 128 characters.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"merchant_supplied_id\": \"{{merchant_order_id}}\",\n  \"order_status\": \"success\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 202\", function () {",
                  "    pm.response.to.have.status(202);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Confirm order \u2014 failure",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v1/orders/:order_id",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v1",
                "orders",
                ":order_id"
              ],
              "variable": [
                {
                  "key": "order_id",
                  "value": "order-id-from-webhook",
                  "description": "DoorDash order id from the order webhook (order.id). Not your internal order id."
                }
              ],
              "query": [
                {
                  "key": "merchant_order_id",
                  "value": "merchant-order-1001",
                  "description": "Your order id. Sent as merchant_supplied_id on confirm, failure, and ready-for-pickup. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "merchant_supplied_item_id",
                  "value": "item_1001",
                  "description": "Your item id. Use the same id on catalog and inventory. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "PATCH /orders/{id}. Expect **202**.\n\nUse this when you accepted the webhook with HTTP 202 and later cannot fulfill. `failure_reason` is required on failure. `errors` is the structured item-level form. `code` is one of `INVALID_ORDER`, `ITEM_OUT_OF_STOCK`, `STORE_HOURS_ISSUE`, `INTERNAL_ERROR`, `OTHER`, `CONNECTIVITY_ISSUE`, `TIME_OUT`, `STORE_CLOSED`, `STORE_CLOSED_EARLY`, `POS_OFFLINE`, `CAPACITY_THROTTLING`, `STALE_PICKUP_TIME`, `ORDER_ONLINE_DISABLED`, `INVALID_ADDRESS`, `STORE_RENOVATION`, `STORE_TEMP_CLOSED`, `WEATHER_ISSUES`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"merchant_supplied_id\": \"{{merchant_order_id}}\",\n  \"order_status\": \"fail\",\n  \"failure_reason\": \"Item Unavailable - Modelo Especial 12pk - {{merchant_supplied_item_id}} - Out of stock\",\n  \"errors\": [\n    {\n      \"code\": \"ITEM_OUT_OF_STOCK\",\n      \"merchant_supplied_id\": \"{{merchant_supplied_item_id}}\",\n      \"message\": \"Item is currently unavailable\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 202\", function () {",
                  "    pm.response.to.have.status(202);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Adjust order items",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              },
              {
                "key": "dd-tenant-id",
                "value": "doortest:default",
                "type": "text",
                "disabled": true,
                "description": "Sandbox only. Enable for order adjustment against a test store. Do not send in production."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v1/orders/:order_id/adjustment",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v1",
                "orders",
                ":order_id",
                "adjustment"
              ],
              "variable": [
                {
                  "key": "order_id",
                  "value": "order-id-from-webhook",
                  "description": "DoorDash order id from the order webhook (order.id). Not your internal order id."
                }
              ],
              "query": [
                {
                  "key": "line_item_id",
                  "value": "line-item-from-order-webhook",
                  "description": "line_item_id from the order webhook for the item whose quantity changes. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "merchant_supplied_item_id",
                  "value": "item_1001",
                  "description": "Your item id. Use the same id on catalog and inventory. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "line_item_id_to_remove",
                  "value": "line-item-to-remove",
                  "description": "line_item_id from the order webhook for the item to remove. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "line_item_id_to_substitute",
                  "value": "line-item-to-substitute",
                  "description": "line_item_id from the order webhook for the item to substitute. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "substitute_item_id",
                  "value": "item_1002",
                  "description": "Item id of a substitute that is already in the catalog and on the store menu. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "PATCH /orders/{id}/adjustment. Expect **202**. That 202 means the request was received. Wait for the Order Adjustment webhook before you change the cart the merchant sees.\n\nThe sample shows the three `adjustment_type` values from the reference in one body: `ITEM_UPDATE` (quantity), `ITEM_REMOVE`, and `ITEM_SUBSTITUTE`. Replace each `line_item_id` with the id from the order webhook. Do not send `merchant_supplied_id` on the adjustment item. Sandbox rejects it as a property that is not allowed on `items[]`. The substitute id stays inside `substituted_item`.\n\nSubstitute `price` is an integer in the smallest currency unit, same as inventory `base_price`.\n\n**Sandbox:** enable the disabled `dd-tenant-id` header. Value must be `doortest:default`. Leave it disabled in production.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"items\": [\n    {\n      \"line_item_id\": \"{{line_item_id}}\",\n      \"adjustment_type\": \"ITEM_UPDATE\",\n      \"quantity\": 2,\n      \"options\": []\n    },\n    {\n      \"line_item_id\": \"{{line_item_id_to_remove}}\",\n      \"adjustment_type\": \"ITEM_REMOVE\"\n    },\n    {\n      \"line_item_id\": \"{{line_item_id_to_substitute}}\",\n      \"adjustment_type\": \"ITEM_SUBSTITUTE\",\n      \"substituted_item\": {\n        \"name\": \"Modelo Especial Lager Beer - Single 12 fl oz Can\",\n        \"merchant_supplied_id\": \"{{substitute_item_id}}\",\n        \"price\": 199,\n        \"quantity\": 1\n      },\n      \"options\": []\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 202\", function () {",
                  "    pm.response.to.have.status(202);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Cancel order",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v1/orders/:order_id/cancellation",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v1",
                "orders",
                ":order_id",
                "cancellation"
              ],
              "variable": [
                {
                  "key": "order_id",
                  "value": "order-id-from-webhook",
                  "description": "DoorDash order id from the order webhook (order.id). Not your internal order id."
                }
              ]
            },
            "description": "PATCH /orders/{id}/cancellation. Expect **202**.\n\nPartner-initiated cancellation after the order was confirmed. `cancel_reason`: `ITEM_OUT_OF_STOCK`, `STORE_CLOSED`, `KITCHEN_BUSY`, or `OTHER`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"cancel_reason\": \"STORE_CLOSED\",\n  \"cancel_details\": \"The store is closed and cannot fulfill the order\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 202\", function () {",
                  "    pm.response.to.have.status(202);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Mark order ready for pickup",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v1/orders/:order_id/events/order_ready_for_pickup",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v1",
                "orders",
                ":order_id",
                "events",
                "order_ready_for_pickup"
              ],
              "variable": [
                {
                  "key": "order_id",
                  "value": "order-id-from-webhook",
                  "description": "DoorDash order id from the order webhook (order.id). Not your internal order id."
                }
              ],
              "query": [
                {
                  "key": "merchant_order_id",
                  "value": "merchant-order-1001",
                  "description": "Your order id. Sent as merchant_supplied_id on confirm, failure, and ready-for-pickup. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "PATCH /orders/{id}/events/order_ready_for_pickup. Expect **202**.\n\nSend when the merchant marks the order ready. `merchant_supplied_id` is your order id. The path value `order_ready_for_pickup` is the only event type this endpoint documents.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"merchant_supplied_id\": \"{{merchant_order_id}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 202\", function () {",
                  "    pm.response.to.have.status(202);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Return order (retail)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{base_url}}/marketplace/api/v1/orders/:order_id/return",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "marketplace",
                "api",
                "v1",
                "orders",
                ":order_id",
                "return"
              ],
              "variable": [
                {
                  "key": "order_id",
                  "value": "order-id-from-webhook",
                  "description": "DoorDash order id from the order webhook (order.id). Not your internal order id."
                }
              ],
              "query": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "merchant_supplied_item_id",
                  "value": "item_1001",
                  "description": "Your item id. Use the same id on catalog and inventory. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "POST /orders/{id}/return. Expect **202**. Retail orders only, not restaurant orders.\n\n`return_items[].merchant_supplied_id` is the item id from the order. `reason` in the published sample is `incorrect_item_received`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"return_location_id\": \"{{location_id}}\",\n  \"return_items\": [\n    {\n      \"merchant_supplied_id\": \"{{merchant_supplied_item_id}}\",\n      \"quantity\": 1,\n      \"reason\": \"incorrect_item_received\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status is 202\", function () {",
                  "    pm.response.to.have.status(202);",
                  "});"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Inbound webhooks (examples \u2014 DoorDash calls you)",
      "description": "These are sample bodies DoorDash POSTs to endpoints you host and register in the Developer Portal. They are not calls you send to `openapi.doordash.com`. Auth on this folder is disabled so running one does not mint a DoorDash JWT.\n\nRegister subscriptions per provider type. They do not copy from sandbox to production. Return 2xx quickly and process asynchronously. Onboarding webhooks retry 3 times.\n\nRequired when you onboard stores: event type \"Onboarding status\". Required when orders are in scope: order create, order cancellation from DoorDash, and \"Order Adjustment\" (the success signal for a merchant adjustment). Dasher status is optional.",
      "item": [
        {
          "name": "Example \u2014 order create",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{partner_webhook_base_url}}/orders",
              "host": [
                "{{partner_webhook_base_url}}"
              ],
              "path": [
                "orders"
              ],
              "query": [
                {
                  "key": "order_id",
                  "value": "order-id-from-webhook",
                  "description": "DoorDash order id from the order webhook (order.id). Not your internal order id. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "merchant_supplied_item_id",
                  "value": "item_1001",
                  "description": "Your item id. Use the same id on catalog and inventory. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                },
                {
                  "key": "line_item_id",
                  "value": "line-item-from-order-webhook",
                  "description": "line_item_id from the order webhook for the item whose quantity changes. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "DoorDash POSTs this shape to your order webhook. The orders overview publishes `event.type` `OrderCreate` and `event.status` `NEW`. The `order` object matches the Marketplace v1 Order model. Money fields are integers. `consumer.id` must be stored as a 64-bit integer.\n\nRespond 200 to confirm in this response, or 202 and then call Confirm order. The URL below is your endpoint, not DoorDash.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event\": {\n    \"type\": \"OrderCreate\",\n    \"status\": \"NEW\"\n  },\n  \"order\": {\n    \"id\": \"{{order_id}}\",\n    \"consumer\": {\n      \"id\": 0,\n      \"email\": \"customer@example.com\",\n      \"first_name\": \"Alex\",\n      \"last_name\": \"Customer\",\n      \"phone\": \"+14155550199\"\n    },\n    \"store\": {\n      \"merchant_supplied_id\": \"{{location_id}}\",\n      \"provider_type\": \"{{provider_type}}\"\n    },\n    \"subtotal\": 1699,\n    \"tax\": 110,\n    \"estimated_pickup_time\": \"2026-10-09T18:15:00Z\",\n    \"is_pickup\": false,\n    \"categories\": [\n      {\n        \"name\": \"Beer\",\n        \"merchant_supplied_id\": \"beer\",\n        \"items\": [\n          {\n            \"name\": \"Modelo Especial Lager Beer - 12pk / 12 fl oz Cans\",\n            \"merchant_supplied_id\": \"{{merchant_supplied_item_id}}\",\n            \"price\": 1699,\n            \"quantity\": 1,\n            \"extras\": [],\n            \"special_instructions\": \"\",\n            \"line_item_id\": \"{{line_item_id}}\"\n          }\n        ]\n      }\n    ],\n    \"is_tax_remitted_by_doordash\": true,\n    \"tax_amount_remitted_by_doordash\": 110,\n    \"commission_type\": \"regular\",\n    \"delivery_short_code\": \"A12\",\n    \"fulfillment_type\": \"dx_delivery\",\n    \"merchant_tip_amount\": 300,\n    \"experience\": \"DOORDASH\",\n    \"is_plastic_ware_option_selected\": false,\n    \"tip_amount\": 0\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "auth": {
              "type": "noauth"
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          }
        },
        {
          "name": "Example \u2014 store onboarding status",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "auth-version",
                "value": "v2",
                "type": "text"
              },
              {
                "key": "User-Agent",
                "value": "{{user_agent}}",
                "type": "text",
                "description": "Overwritten before every request. Set provider_type. The pre-request script rewrites this as PascalCase(provider_type)/1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0."
              }
            ],
            "url": {
              "raw": "{{partner_webhook_base_url}}/onboarding-status",
              "host": [
                "{{partner_webhook_base_url}}"
              ],
              "path": [
                "onboarding-status"
              ],
              "query": [
                {
                  "key": "location_id",
                  "value": "your_store_location_id",
                  "description": "Your store id. Stable for the life of the store. Edit this on Params. Leave it unchecked so it is not sent as a query parameter. The pre-request script copies it into the JSON body.",
                  "disabled": true
                }
              ]
            },
            "description": "DoorDash POSTs this shape to the subscription you register for event type \"Onboarding status\".\n\nEnroll the store in real-time updates and scheduled refreshes when `status` is `INTEGRATION_ACTIVATED`. On `ABANDONED`, stop showing the old managed-merchant URL and let the merchant start onboarding again. Surface merchant-owned exclusion codes (missing hours, blank menu, duplicate location) to the merchant, and partner-owned ones (pull failures) to your support queue.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"onboarding_id\": \"9154103a-be82-48fc-978d-792171f7ee32\",\n  \"location_id\": \"{{location_id}}\",\n  \"doordash_store_uuid\": \"f1c7f43b-64ca-4586-b990-171aaafbca2d\",\n  \"status\": \"INTEGRATION_ACTIVATED\",\n  \"exclusion_code\": \"\",\n  \"details\": \"\",\n  \"menus\": [\n    {\n      \"menu_uuid\": \"949e6d70-371a-4250-8fe7-2d13b141e07g\",\n      \"menu_preview_link\": \"https://www.doordash.com/menu/example\",\n      \"menu_error\": \"\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "auth": {
              "type": "noauth"
            }
          },
          "response": [],
          "protocolProfileBehavior": {
            "disabledSystemHeaders": {
              "user-agent": true
            }
          }
        }
      ]
    }
  ],
  "auth": {
    "type": "jwt",
    "jwt": [
      {
        "key": "algorithm",
        "value": "HS256",
        "type": "string"
      },
      {
        "key": "secret",
        "value": "{{signing_secret}}",
        "type": "string"
      },
      {
        "key": "isSecretBase64Encoded",
        "value": true,
        "type": "boolean"
      },
      {
        "key": "payload",
        "value": "{\n  \"aud\": \"doordash\",\n  \"iss\": \"{{developer_id}}\",\n  \"kid\": \"{{key_id}}\",\n  \"iat\": {{epoch}},\n  \"exp\": {{future_epoch}}\n}",
        "type": "string"
      },
      {
        "key": "header",
        "value": "{\n  \"alg\": \"HS256\",\n  \"typ\": \"JWT\",\n  \"dd-ver\": \"DD-JWT-V1\"\n}",
        "type": "string"
      },
      {
        "key": "addTokenTo",
        "value": "header",
        "type": "string"
      },
      {
        "key": "headerPrefix",
        "value": "Bearer",
        "type": "string"
      },
      {
        "key": "queryParamKey",
        "value": "",
        "type": "string"
      }
    ]
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "if (pm.request && pm.request.url) {",
          "    var url = pm.request.url;",
          "    if (url.variables && url.variables.each) {",
          "        url.variables.each(function (v) {",
          "            if (v && v.key) pm.variables.set(v.key, v.value);",
          "        });",
          "    }",
          "    if (url.query && url.query.each) {",
          "        url.query.each(function (q) {",
          "            if (q && q.disabled && q.key) pm.variables.set(q.key, q.value);",
          "        });",
          "    }",
          "}",
          "",
          "var now = Math.floor(Date.now() / 1000);",
          "pm.collectionVariables.set('epoch', now);",
          "pm.collectionVariables.set('future_epoch', now + 300);",
          "",
          "var providerType = pm.variables.get('provider_type') || '';",
          "var userAgent = providerType",
          "    .split('_')",
          "    .filter(function (part) { return part.length > 0; })",
          "    .map(function (part) {",
          "        return part.charAt(0).toUpperCase() + part.slice(1);",
          "    })",
          "    .join('') + '/1.0';",
          "if (userAgent !== '/1.0') {",
          "    pm.collectionVariables.set('user_agent', userAgent);",
          "}"
        ]
      }
    },
    {
      "listen": "test",
      "script": {
        "type": "text/javascript",
        "exec": [
          "var body = {};",
          "try { body = pm.response.json(); } catch (e) { body = {}; }",
          "if (body && body.operation_id) {",
          "    pm.collectionVariables.set('last_operation_id', body.operation_id);",
          "    console.log('operation_id=' + body.operation_id + ' operation_status=' + body.operation_status);",
          "}",
          "if (body && body.managed_merchant_connect_url) {",
          "    pm.collectionVariables.set('managed_merchant_connect_url', body.managed_merchant_connect_url);",
          "    console.log('managed_merchant_connect_url saved to collection variables');",
          "}"
        ]
      }
    }
  ],
  "variable": [
    {
      "key": "base_url",
      "value": "https://openapi.doordash.com",
      "type": "string",
      "description": "DoorDash OpenAPI host. No trailing slash."
    },
    {
      "key": "developer_id",
      "value": "",
      "type": "string",
      "description": "Developer ID from the Developer Portal credential. Sent as the JWT iss claim."
    },
    {
      "key": "key_id",
      "value": "",
      "type": "string",
      "description": "Key ID from the same credential. Sent as the JWT kid claim."
    },
    {
      "key": "signing_secret",
      "value": "",
      "type": "string",
      "description": "Base64 signing secret from the credential. Shown once at creation. Collection JWT auth decodes it before signing. Do not commit a filled-in secret."
    },
    {
      "key": "provider_type",
      "value": "example_pos_sandbox",
      "type": "string",
      "description": "Your provider type, for example example_pos_sandbox. Sandbox and production are different provider types. The pre-request script builds User-Agent from this value before every request."
    },
    {
      "key": "user_agent",
      "value": "ExamplePosSandbox/1.0",
      "type": "string",
      "description": "Overwritten before every request by the collection pre-request script. Set provider_type, not this value. The script capitalizes the first letter of each underscore-separated word and appends /1.0. example_pos_sandbox becomes ExamplePosSandbox/1.0. A value typed here is replaced on the next send."
    },
    {
      "key": "epoch",
      "value": "0",
      "type": "string",
      "description": "JWT iat. Overwritten by the pre-request script. Do not edit."
    },
    {
      "key": "future_epoch",
      "value": "0",
      "type": "string",
      "description": "JWT exp (iat + 300 seconds). Overwritten by the pre-request script. Must stay within 30 minutes of iat."
    },
    {
      "key": "last_operation_id",
      "value": "",
      "type": "string",
      "description": "Filled by the collection test script when a response includes operation_id. 202 QUEUED is acceptance, not proof the menu updated."
    },
    {
      "key": "managed_merchant_connect_url",
      "value": "",
      "type": "string",
      "description": "Filled when Create managed merchant onboarding URL returns 200. Cache it and keep showing it to the merchant until BUSINESS_ID_MAPPED. Mint a new one after ABANDONED."
    },
    {
      "key": "partner_webhook_base_url",
      "value": "https://example.com/webhooks/doordash",
      "type": "string",
      "description": "Your public webhook base URL. Used only by the inbound examples."
    }
  ]
}
