Bulk update products

Updates multiple products in a single request. Accepts up to 20 product updates and returns lists of successful and failed updates with detailed error reasons.

PATCH/api/v1/{team_slug}/{app_slug}/products/bulk
API
Management
Updated
Apr 26, 2026

management-api:PATCH:/api/v1/{team_slug}/{app_slug}/products/bulk

Updates multiple products in a single request. Accepts up to 20 product updates and returns lists of successful and failed updates with detailed error reasons.

API ownership

  • API family: Management API
  • Best for: Trusted back-office workflows that create, update, organize, or delete merchant-owned data.
  • Do not use from: Browser-only storefront code or public clients.
  • Guide route: /apis/management/latest

The OpenAPI contract defines the method, path, parameters, request body, and responses for this operation.

Operation

  • Method: PATCH
  • Path: /api/v1/\{team_slug\}/\{app_slug\}/products/bulk
  • Summary: Bulk update products
  • Description: Updates multiple products in a single request. Accepts up to 20 product updates and returns lists of successful and failed updates with detailed error reasons.
  • OpenAPI contract: management-api
  • Operation ID: Not documented in the OpenAPI contract.

Operation key uses API family, method, and path because this OpenAPI contract does not publish an operation ID.

Parameters2 parameters
NameInRequiredTypeDescription
app_slugpathYesstringApp slug
team_slugpathYesstringTeam slug
Request bodyDocumented body
  • Required: Yes
  • Description: Product data
  • Content: application/json (object)

Bulk Patch Product Payload

PropertyTypeRequiredDetails
productsobject[]YesmaxItems: 20

Bulk Patch Product Item

PropertyTypeRequiredDetails
brand_idstringNoBrand or series of a brand connected to product
customobjectNoCustom fields - null value removes the field, non-null merges with existing
descriptionstringNoDeprecated: read-only in write payloads. Derived from html_description.
exclude_from_feedsbooleanNoWhenever a product should exist in feeds or not
html_descriptionstringNoHTML description of the description fields. All of the fields which is not related to showing content, e.g or tags will be stripped from the input
html_short_descriptionstringNoHTML Shortdescription of the description fields. All of the fields which is not related to showing content, e.g or tags will be stripped from the input
idstringYes-
market_statusobject[]No-
meta_descriptionstringNoMeta description for SEO
meta_titlestringNoMeta title for SEO
package_dimensionsobjectNoThe package dimensions
product_dimensionsobjectNoThe products dimensions
product_namestringNoName of the product
product_typeenum("flexible", "simple")NoProduct type. Default 'simple'
short_descriptionstringNoDeprecated: read-only in write payloads. Derived from html_short_description.
slugstringNoSlug for the product
statusenum("active", "draft", "inactive", "archived")NoStatus of the product
tax_group_slugstringNominLength: 0 If provided will the product using the selected tax group. Otherwise will we use the default tax group for the app

Product Market Status

PropertyTypeRequiredDetails
market_idstringYes-
statusenum("active", "inactive", "draft", "incomplete", "archived")Yes-
store_group_idstringYes-

Dimensions

PropertyTypeRequiredDetails
capacity_milliliterintegerNomin: 0 the capacity in milliliter
depthintegerNomin: 0 The products depth in millimeter
diameterintegerNomin: 0 the products diameter in millimeter
heightintegerNomin: 0 The products height in millimeter
lengthintegerNomin: 0 The products length in millimeter
weightintegerNomin: 0 The products weight in grams
widthintegerNomin: 0 The products width in millimeter
{
  "products": [
    {
      "brand_id": "string",
      "custom": {},
      "description": "string",
      "exclude_from_feeds": false,
      "html_description": "string",
      "html_short_description": "string",
      "id": "string",
      "market_status": [
        {
          "market_id": null,
          "status": null,
          "store_group_id": null
        }
      ],
      "meta_description": "string",
      "meta_title": "string",
      "package_dimensions": {
        "capacity_milliliter": 0,
        "depth": 0,
        "diameter": 0,
        "height": 0,
        "length": 0,
        "weight": 0,
        "width": 0
      },
      "product_dimensions": {
        "capacity_milliliter": 0,
        "depth": 0,
        "diameter": 0,
        "height": 0,
        "length": 0,
        "weight": 0,
        "width": 0
      },
      "product_name": "string",
      "product_type": "flexible",
      "short_description": "string",
      "slug": "string",
      "status": "active",
      "tax_group_slug": "string"
    }
  ]
}
Responses4 statuses
StatusDescriptionContent
200Products updated successfullyapplication/json (object)
400Invalid request (e.g. bad UUID, validation error)application/json (object)
401Unauthorized accessapplication/json (object)
500Internal server errorapplication/json (object)

200 - object

Bulk Patch Products Response

PropertyTypeRequiredDetails
dataobjectNo-
detailsstring[]NoAdditional contextual information about the response. Used to provide supplementary details beyond the main data payload, such as validation warnings or processing notes
successbooleanNo-
Bulk Patch Products
PropertyTypeRequiredDetails
failedobject[]No-
successfulobject[]No-
Bulk Patch Failed Update
PropertyTypeRequiredDetails
idstringNo-
reasonstringNo-
Product
PropertyTypeRequiredDetails
attributesobject[]NoProduct attributes
brandobjectNoBrand of the product
categoriesobject[]NoAssociated categories
channel_statusesobject[]No-
collectionsobject[]NoAssociated collections
created_atstringNoCreation timestamp
customobjectNo-
descriptionstringNoDescription of the product
exclude_from_feedsbooleanNoIf the products should exist in feeds or not
filesobject[]NoProduct files
html_descriptionstringNoHtml description
html_short_descriptionstringNoHtml short description
idstringNoProduct ID
imagesobject[]NoImages of the product
market_statusobject[]No-
marketsobject[]NoAssociated markets
meta_descriptionstringNoMeta description for SEO
meta_titlestringNoMeta title for SEO
package_dimensionsobjectNoThe package dimensions
product_dimensionsobjectNoThe products dimensions
product_namestringNoVariantName of the product
product_numberstringNoProduct number
product_typestringNoProduct type
redirectsobject[]NoProduct redirects
relationsobject[]NoProduct relations
schedulesobject[]No-
short_descriptionstringNoShort description of the product
slugstringNoSlug for the product
source_app_idstringNo-
source_idstringNo-
statusstringNoStatus of the product
tagsobject[]NoProduct tags
tax_group_idstringNoThe id of the tax group
third_part_linksobject[]No-
translationsobjectNoProduct translations
updated_atstringNoLast updated timestamp
variant_groupsobject[]NoVariant groups with images, attributes, videos
variantsobject[]NoProduct variants
videosobject[]NoVideos of the product
{
  "data": {
    "failed": [
      {
        "id": "string",
        "reason": "string"
      }
    ],
    "successful": [
      {
        "attributes": [],
        "brand": {
          "address": null,
          "email": null,
          "id": null,
          "name": null,
          "series": null,
          "slug": null
        },
        "categories": [],
        "channel_statuses": [],
        "collections": [],
        "created_at": "string",
        "custom": {},
        "description": "string",
        "exclude_from_feeds": false,
        "files": [],
        "html_description": "string",
        "html_short_description": "string",
        "id": "string",
        "images": [],
        "market_status": [],
        "markets": [],
        "meta_description": "string",
        "meta_title": "string",
        "package_dimensions": {
          "capacity_milliliter": null,
          "depth": null,
          "diameter": null,
          "height": null,
          "length": null,
          "weight": null,
          "width": null
        },
        "product_dimensions": {
          "capacity_milliliter": null,
          "depth": null,
          "diameter": null,
          "height": null,
          "length": null,
          "weight": null,
          "width": null
        },
        "product_name": "string",
        "product_number": "string",
        "product_type": "string",
        "redirects": [],
        "relations": [],
        "schedules": [],
        "short_description": "string",
        "slug": "string",
        "source_app_id": "string",
        "source_id": "string",
        "status": "string",
        "tags": [],
        "tax_group_id": "string",
        "third_part_links": [],
        "translations": {
          "description": null,
          "html_description": null,
          "html_short_description": null,
          "meta_description": null,
          "meta_title": null,
          "name": null,
          "short_description": null,
          "slug": null
        },
        "updated_at": "string",
        "variant_groups": [],
        "variants": [],
        "videos": []
      }
    ]
  },
  "details": [
    "string"
  ],
  "success": false
}

400 - object

Error Message

PropertyTypeRequiredDetails
detailsstring[]No-
messagestringNo-
successbooleanNo-

Generated example (synthetic):

{
  "details": [
    "string"
  ],
  "message": "string",
  "success": false
}

401 - object

Error Message

PropertyTypeRequiredDetails
detailsstring[]No-
messagestringNo-
successbooleanNo-

Generated example (synthetic):

{
  "details": [
    "string"
  ],
  "message": "string",
  "success": false
}

500 - object

Error Message

PropertyTypeRequiredDetails
detailsstring[]No-
messagestringNo-
successbooleanNo-

Generated example (synthetic):

{
  "details": [
    "string"
  ],
  "message": "string",
  "success": false
}

Contract identity

Use these fields to confirm you are implementing the intended endpoint contract.

  • API family: Management API
  • Method: PATCH
  • Path: /api/v1/\{team_slug\}/\{app_slug\}/products/bulk
  • Operation ID: Not documented in the OpenAPI contract.
  • OpenAPI tag: Products, Bulk
  • OpenAPI summary: Bulk update products

Bulk update products

# Bulk update products Updates multiple products in a single request. Accepts up to 20 product updates and returns lists of successful and failed updates with detailed error reasons.
PATCH /api/v1/{team_slug}/{app_slug}/products/bulk
Purpose

Updates multiple products in a single request.

Required inputs

app_slug path team_slug path

Primary response

200 ยท Products updated successfully

Operation key

management-api:PATCH:/api/v1/{team_slug}/{app_slug}/products/bulk

## API ownership - API family: Management API - Best for: Trusted back-office workflows that create, update, organize, or delete merchant-owned data. - Do not use from: Browser-only storefront code or public clients. - Guide route: [/apis/management/latest](/apis/management/latest) The OpenAPI contract defines the method, path, parameters, request body, and responses for this operation. ## Operation - Method: `PATCH` - Path: `/api/v1/{team_slug}/{app_slug}/products/bulk` - Summary: Bulk update products - Description: Updates multiple products in a single request. Accepts up to 20 product updates and returns lists of successful and failed updates with detailed error reasons. - OpenAPI contract: management-api - Operation ID: Not documented in the OpenAPI contract. - Stable operation key: `management-api:PATCH:/api/v1/{team_slug}/{app_slug}/products/bulk` Operation key uses API family, method, and path because this OpenAPI contract does not publish an operation ID. ## Parameters | Name | In | Required | Type | Description | | --- | --- | --- | --- | --- | | app_slug | path | Yes | string | App slug | | team_slug | path | Yes | string | Team slug | ## Request body - Required: Yes - Description: Product data - Content: application/json (object) ### Bulk Patch Product Payload | Property | Type | Required | Details | | --- | --- | --- | --- | | `products` | object[] | Yes | maxItems: 20 | #### Bulk Patch Product Item | Property | Type | Required | Details | | --- | --- | --- | --- | | `brand_id` | string | No | Brand or series of a brand connected to product | | `custom` | object | No | Custom fields - null value removes the field, non-null merges with existing | | `description` | string | No | Deprecated: read-only in write payloads. Derived from html_description. | | `exclude_from_feeds` | boolean | No | Whenever a product should exist in feeds or not | | `html_description` | string | No | HTML description of the description fields. All of the fields which is not related to showing content, e.g <button> or <script> tags will be stripped from the input | | `html_short_description` | string | No | HTML Shortdescription of the description fields. All of the fields which is not related to showing content, e.g <button> or <script> tags will be stripped from the input | | `id` | string | Yes | - | | `market_status` | object[] | No | - | | `meta_description` | string | No | Meta description for SEO | | `meta_title` | string | No | Meta title for SEO | | `package_dimensions` | object | No | The package dimensions | | `product_dimensions` | object | No | The products dimensions | | `product_name` | string | No | Name of the product | | `product_type` | enum("flexible", "simple") | No | Product type. Default 'simple' | | `short_description` | string | No | Deprecated: read-only in write payloads. Derived from html_short_description. | | `slug` | string | No | Slug for the product | | `status` | enum("active", "draft", "inactive", "archived") | No | Status of the product | | `tax_group_slug` | string | No | minLength: 0 If provided will the product using the selected tax group. Otherwise will we use the default tax group for the app | #### Product Market Status | Property | Type | Required | Details | | --- | --- | --- | --- | | `market_id` | string | Yes | - | | `status` | enum("active", "inactive", "draft", "incomplete", "archived") | Yes | - | | `store_group_id` | string | Yes | - | #### Dimensions | Property | Type | Required | Details | | --- | --- | --- | --- | | `capacity_milliliter` | integer | No | min: 0 the capacity in milliliter | | `depth` | integer | No | min: 0 The products depth in millimeter | | `diameter` | integer | No | min: 0 the products diameter in millimeter | | `height` | integer | No | min: 0 The products height in millimeter | | `length` | integer | No | min: 0 The products length in millimeter | | `weight` | integer | No | min: 0 The products weight in grams | | `width` | integer | No | min: 0 The products width in millimeter |
Generated example (synthetic) ```json { "products": [ { "brand_id": "string", "custom": {}, "description": "string", "exclude_from_feeds": false, "html_description": "string", "html_short_description": "string", "id": "string", "market_status": [ { "market_id": null, "status": null, "store_group_id": null } ], "meta_description": "string", "meta_title": "string", "package_dimensions": { "capacity_milliliter": 0, "depth": 0, "diameter": 0, "height": 0, "length": 0, "weight": 0, "width": 0 }, "product_dimensions": { "capacity_milliliter": 0, "depth": 0, "diameter": 0, "height": 0, "length": 0, "weight": 0, "width": 0 }, "product_name": "string", "product_type": "flexible", "short_description": "string", "slug": "string", "status": "active", "tax_group_slug": "string" } ] } ```
## Responses | Status | Description | Content | | --- | --- | --- | | 200 | Products updated successfully | application/json (object) | | 400 | Invalid request (e.g. bad UUID, validation error) | application/json (object) | | 401 | Unauthorized access | application/json (object) | | 500 | Internal server error | application/json (object) | ### 200 - object #### Bulk Patch Products Response | Property | Type | Required | Details | | --- | --- | --- | --- | | `data` | object | No | - | | `details` | string[] | No | Additional contextual information about the response. Used to provide supplementary details beyond the main data payload, such as validation warnings or processing notes | | `success` | boolean | No | - | ##### Bulk Patch Products | Property | Type | Required | Details | | --- | --- | --- | --- | | `failed` | object[] | No | - | | `successful` | object[] | No | - | ##### Bulk Patch Failed Update | Property | Type | Required | Details | | --- | --- | --- | --- | | `id` | string | No | - | | `reason` | string | No | - | ##### Product | Property | Type | Required | Details | | --- | --- | --- | --- | | `attributes` | object[] | No | Product attributes | | `brand` | object | No | Brand of the product | | `categories` | object[] | No | Associated categories | | `channel_statuses` | object[] | No | - | | `collections` | object[] | No | Associated collections | | `created_at` | string | No | Creation timestamp | | `custom` | object | No | - | | `description` | string | No | Description of the product | | `exclude_from_feeds` | boolean | No | If the products should exist in feeds or not | | `files` | object[] | No | Product files | | `html_description` | string | No | Html description | | `html_short_description` | string | No | Html short description | | `id` | string | No | Product ID | | `images` | object[] | No | Images of the product | | `market_status` | object[] | No | - | | `markets` | object[] | No | Associated markets | | `meta_description` | string | No | Meta description for SEO | | `meta_title` | string | No | Meta title for SEO | | `package_dimensions` | object | No | The package dimensions | | `product_dimensions` | object | No | The products dimensions | | `product_name` | string | No | VariantName of the product | | `product_number` | string | No | Product number | | `product_type` | string | No | Product type | | `redirects` | object[] | No | Product redirects | | `relations` | object[] | No | Product relations | | `schedules` | object[] | No | - | | `short_description` | string | No | Short description of the product | | `slug` | string | No | Slug for the product | | `source_app_id` | string | No | - | | `source_id` | string | No | - | | `status` | string | No | Status of the product | | `tags` | object[] | No | Product tags | | `tax_group_id` | string | No | The id of the tax group | | `third_part_links` | object[] | No | - | | `translations` | object | No | Product translations | | `updated_at` | string | No | Last updated timestamp | | `variant_groups` | object[] | No | Variant groups with images, attributes, videos | | `variants` | object[] | No | Product variants | | `videos` | object[] | No | Videos of the product |
Generated example (synthetic) ```json { "data": { "failed": [ { "id": "string", "reason": "string" } ], "successful": [ { "attributes": [], "brand": { "address": null, "email": null, "id": null, "name": null, "series": null, "slug": null }, "categories": [], "channel_statuses": [], "collections": [], "created_at": "string", "custom": {}, "description": "string", "exclude_from_feeds": false, "files": [], "html_description": "string", "html_short_description": "string", "id": "string", "images": [], "market_status": [], "markets": [], "meta_description": "string", "meta_title": "string", "package_dimensions": { "capacity_milliliter": null, "depth": null, "diameter": null, "height": null, "length": null, "weight": null, "width": null }, "product_dimensions": { "capacity_milliliter": null, "depth": null, "diameter": null, "height": null, "length": null, "weight": null, "width": null }, "product_name": "string", "product_number": "string", "product_type": "string", "redirects": [], "relations": [], "schedules": [], "short_description": "string", "slug": "string", "source_app_id": "string", "source_id": "string", "status": "string", "tags": [], "tax_group_id": "string", "third_part_links": [], "translations": { "description": null, "html_description": null, "html_short_description": null, "meta_description": null, "meta_title": null, "name": null, "short_description": null, "slug": null }, "updated_at": "string", "variant_groups": [], "variants": [], "videos": [] } ] }, "details": [ "string" ], "success": false } ```
### 400 - object #### Error Message | Property | Type | Required | Details | | --- | --- | --- | --- | | `details` | string[] | No | - | | `message` | string | No | - | | `success` | boolean | No | - | **Generated example (synthetic):** ```json { "details": [ "string" ], "message": "string", "success": false } ``` ### 401 - object #### Error Message | Property | Type | Required | Details | | --- | --- | --- | --- | | `details` | string[] | No | - | | `message` | string | No | - | | `success` | boolean | No | - | **Generated example (synthetic):** ```json { "details": [ "string" ], "message": "string", "success": false } ``` ### 500 - object #### Error Message | Property | Type | Required | Details | | --- | --- | --- | --- | | `details` | string[] | No | - | | `message` | string | No | - | | `success` | boolean | No | - | **Generated example (synthetic):** ```json { "details": [ "string" ], "message": "string", "success": false } ``` ## Contract identity Use these fields to confirm you are implementing the intended endpoint contract. - API family: Management API - Method: `PATCH` - Path: `/api/v1/{team_slug}/{app_slug}/products/bulk` - Operation ID: Not documented in the OpenAPI contract. - Stable operation key: `management-api:PATCH:/api/v1/{team_slug}/{app_slug}/products/bulk` - OpenAPI tag: Products, Bulk - OpenAPI summary: Bulk update products