Skip to main content

Updating Items

Existing catalog items are updated with the same schema used to create them. Send only the fields you are changing — fields omitted from the payload keep their current values.

PATCH https://openapi.doordash.com/marketplace/api/v2/items

The request body takes a scope object and an items array, exactly as it does on create. Items are matched on merchant_supplied_item_id within the businesses listed in scope.business_ids. See the Catalog Management API Reference for the full field list.

Example​

Updating an item's name and marking it organic, leaving every other field untouched:

{
"scope": {
"business_ids": ["business-001"]
},
"items": [
{
"merchant_supplied_item_id": "item-1024",
"name": "Organic Whole Grain Bread",
"product_attributes": [
{
"attribute_name": "certification_and_production_details",
"attribute_value": {
"multi_select_string": ["Organic"]
}
}
]
}
]
}

Reading the Response​

A successful update returns 200 with operation_status: QUEUED:

{
"operation_id": "759aa941-573a-4737-80df-b95e5bf1c5e2",
"operation_status": "QUEUED",
"message": "Request queued."
}
warning

A 200 response does not mean every item was applied. Item-level validation errors are returned as text inside message while the HTTP status stays 200 and operation_status stays QUEUED.

{
"operation_id": "ab5c2d2f-6bd1-4e5b-bddf-c701ae7287e0",
"operation_status": "QUEUED",
"message": "Request queued. Item validation failed with following errors. Items with errors will be skipped.[item[0]: Item categorizations update using PATCH is not supported.]"
}

Errors are keyed by the item's position in the items array — item[0], item[1], and so on. An item flagged this way is skipped in full: every other field sent for that item is dropped with it. Other items in the same request are unaffected and are still processed.

Check message for item[<index>]: on every call, log it alongside the operation_id, and re-send the items that were skipped. An integration that checks only the HTTP status code will lose updates without any error surfacing.

Re-sending the same payload is safe. Each call is queued as a new job with a new operation_id and applies the same values.

What PATCH Cannot Update​

item_categorizations cannot be changed with PATCH. The item is skipped with:

[item[0]: Item categorizations update using PATCH is not supported.]

To change an item's category path, send the item through POST instead. POST accepts item_categorizations on an item that already exists, and applies the rest of the payload with it.

ChangeEndpoint
Name, description, images, brand, size, traits, product attributes, program eligibilityPATCH
Category path (item_categorizations)POST

Field Behavior​

  • Omitted fields are unchanged. Limit the payload to the fields you intend to change; there is no need to re-send the full item definition.

  • merchant_supplied_item_id identifies the item and cannot be renamed. Sending a different value creates a new item rather than renaming the existing one. The request succeeds either way, so a typo in the MSID becomes a duplicate SKU with no error.

  • PATCH does not check that the item exists. A PATCH against a merchant_supplied_item_id that was never created returns a clean 200. Nothing in the response distinguishes it from a successful update, so verify the MSID before relying on the result.

  • Unknown fields fail the whole request. A field that is not part of the item schema returns a 400 and nothing is ingested:

    [Path '/items/0'] Object instance has properties which are not allowed by the schema: ["not_a_real_field"]
  • Enum values are closed and case-sensitive. A lowercase program_eligibility value fails the entire request, not just the item that carries it:

    [Path '/items/0/program_eligibility/0'] Instance value ("snap") not found in enum (possible values: ["SNAP","HSA","FSA"])
  • Blank strings are rejected per item. "name": "" skips the item with Item name cannot be null or blank.

  • null is not accepted for array fields. "images": null returns a 400 with Instance type (null) does not match any allowed primitive type (allowed: ["array"]). Send an array instead.

  • product_attributes names and values are not validated. An attribute_name outside the supported list is accepted and silently discarded, so a rename that misses the canonical name looks like a success. See Supported Product Attribute.

Common Updates​

  • Correcting name or brand_info

  • Replacing outdated images

  • Adding or changing product_attributes — for example, adding a dietary or certification attribute

  • Adding program_eligibility, such as "SNAP"

  • Applying or removing the WEIGHTED trait together with weighted_item_info

  • Recategorizing an item — use POST rather than PATCH, as described above

Verifying an Update​

The Catalog API has no GET endpoint, so an item cannot be read back to confirm what was applied. Two things follow from that:

  • The response is the only record of what was accepted. Store the operation_id and the full message for every call. Once the response is discarded there is no way to reconstruct which items were skipped.

  • Updates are not immediate. Items are ingested asynchronously — see the Catalog Management overview FAQ for the current ingestion SLA, and confirm results with your DoorDash technical account manager.