Update product bundle

Updates the specified product bundle's status, discount type, discount percentage, and discount rules. Supports partial updates where only provided fields are modified.

PATCH/api/v1/{team_slug}/{app_slug}/bundle-groups/{bundle_group_id}/bundles/{bundle_id}
API
Management
Updated
Apr 26, 2026

management-api:PATCH:/api/v1/{team_slug}/{app_slug}/bundle-groups/{bundle_group_id}/bundles/{bundle_id}

Updates the specified product bundle's status, discount type, discount percentage, and discount rules. Supports partial updates where only provided fields are modified.

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\}/bundle-groups/\{bundle_group_id\}/bundles/\{bundle_id\}
  • Summary: Update product bundle
  • Description: Updates the specified product bundle's status, discount type, discount percentage, and discount rules. Supports partial updates where only provided fields are modified.
  • 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.

Parameters4 parameters
NameInRequiredTypeDescription
app_slugpathYesstringApp slug
team_slugpathYesstringTeam slug
product_bundle_group_idpathYesstringProduct bundle group UUID
bundle_idpathYesstringProduct bundle UUID
Request bodyDocumented body
  • Required: Yes
  • Description: Product bundle update data
  • Content: application/json (object)

Update Product Bundle Payload

PropertyTypeRequiredDetails
discount_percentageintegerNomin: 0, max: 100 Used if discount_type is relative. This will apply to all markets it's added to
discount_typeenum("relative", "fixed")No-
discountsobject[]Yes-
statusenum("active", "draft", "inactive")NoStatus of the bundle

Bundle Group Discount

PropertyTypeRequiredDetails
amount_centsintegerNomin: 0
currency_codestringNo-

Generated example (synthetic):

{
  "discount_percentage": 0,
  "discount_type": "relative",
  "discounts": [
    {
      "amount_cents": 0,
      "currency_code": "string"
    }
  ],
  "status": "active"
}
Responses4 statuses
StatusDescriptionContent
200Product bundle 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

Product Bundle 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-
Bundle
PropertyTypeRequiredDetails
attributesobject[]No-
compliantobjectNoCompliance level for the bundle
created_atstringNoCreation timestamp
discount_percentageintegerNoDiscount percentage [1-100]
discount_typestringNoDiscount type [fixed, relative]
discountsobjectNoDiscount for bundle. Amount is stored in cents
idstringNoID
rulesobject[]NoBundle rules
statusstringNoStatus of the bundle
updated_atstringNoLast updated timestamp
Attribute
PropertyTypeRequiredDetails
created_atstringNo-
descriptionstringNo-
filterablebooleanNo-
idstringNo-
keystringNo-
namestringNo-
template_keystringNo-
template_namestringNo-
translatablebooleanNo-
translationsobjectNo-
updated_atstringNo-
valuesobjectNo-
Compliance
PropertyTypeRequiredDetails
infostring[]NoExplanation of any issues with the bundle, it will be empty if the bundle is fully compliant
levelstringNoCompliance level for the bundle, "full" if all rules are valid, "partial" if some rules are valid but it can still be used as a bundle, "none" if no rules are valid
Bundle Rule
PropertyTypeRequiredDetails
bundle_idstringNoBundle ID
discount_percentageintegerNoDiscount percentage [1-100]
discount_typestringNoDiscount type [fixed, relative]
discountsobjectNoDiscount for bundle. Amount is stored in cents
exclude_discounted_pricebooleanNoIf products with discounted price should be excluded
exclude_full_pricebooleanNoIf products with full price should be excluded
idstringNoID
itemsobject[]NoProducts associated with the bundle rule
quantityintegerNoQuantity of products needed to trigger the bundle
tag_conditionsobjectNoConditions for discount tags
{
  "data": {
    "attributes": [
      {
        "created_at": "string",
        "description": "string",
        "filterable": false,
        "id": "string",
        "key": "string",
        "name": "string",
        "template_key": "string",
        "template_name": "string",
        "translatable": false,
        "translations": {
          "description": null,
          "name": null
        },
        "updated_at": "string",
        "values": {}
      }
    ],
    "compliant": {
      "info": [
        "string"
      ],
      "level": "string"
    },
    "created_at": "string",
    "discount_percentage": 0,
    "discount_type": "string",
    "discounts": {},
    "id": "string",
    "rules": [
      {
        "bundle_id": "string",
        "discount_percentage": 0,
        "discount_type": "string",
        "discounts": {},
        "exclude_discounted_price": false,
        "exclude_full_price": false,
        "id": "string",
        "items": [],
        "quantity": 0,
        "tag_conditions": {
          "brands": null,
          "categories": null,
          "collections": null,
          "series": null,
          "tags": null
        }
      }
    ],
    "status": "string",
    "updated_at": "string"
  },
  "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\}/bundle-groups/\{bundle_group_id\}/bundles/\{bundle_id\}
  • Operation ID: Not documented in the OpenAPI contract.
  • OpenAPI tag: Product Bundles
  • OpenAPI summary: Update product bundle

Update product bundle

# Update product bundle Updates the specified product bundle's status, discount type, discount percentage, and discount rules. Supports partial updates where only provided fields are modified.
PATCH /api/v1/{team_slug}/{app_slug}/bundle-groups/{bundle_group_id}/bundles/{bundle_id}
Purpose

Updates the specified product bundle's status, discount type, discount percentage, and discount rules.

Required inputs

app_slug path team_slug path product_bundle_group_id path bundle_id path

Primary response

200 ยท Product bundle updated successfully

Operation key

management-api:PATCH:/api/v1/{team_slug}/{app_slug}/bundle-groups/{bundle_group_id}/bundles/{bundle_id}

## 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}/bundle-groups/{bundle_group_id}/bundles/{bundle_id}` - Summary: Update product bundle - Description: Updates the specified product bundle's status, discount type, discount percentage, and discount rules. Supports partial updates where only provided fields are modified. - OpenAPI contract: management-api - Operation ID: Not documented in the OpenAPI contract. - Stable operation key: `management-api:PATCH:/api/v1/{team_slug}/{app_slug}/bundle-groups/{bundle_group_id}/bundles/{bundle_id}` 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 | | product_bundle_group_id | path | Yes | string | Product bundle group UUID | | bundle_id | path | Yes | string | Product bundle UUID | ## Request body - Required: Yes - Description: Product bundle update data - Content: application/json (object) ### Update Product Bundle Payload | Property | Type | Required | Details | | --- | --- | --- | --- | | `discount_percentage` | integer | No | min: 0, max: 100 Used if discount_type is relative. This will apply to all markets it's added to | | `discount_type` | enum("relative", "fixed") | No | - | | `discounts` | object[] | Yes | - | | `status` | enum("active", "draft", "inactive") | No | Status of the bundle | #### Bundle Group Discount | Property | Type | Required | Details | | --- | --- | --- | --- | | `amount_cents` | integer | No | min: 0 | | `currency_code` | string | No | - | **Generated example (synthetic):** ```json { "discount_percentage": 0, "discount_type": "relative", "discounts": [ { "amount_cents": 0, "currency_code": "string" } ], "status": "active" } ``` ## Responses | Status | Description | Content | | --- | --- | --- | | 200 | Product bundle 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 #### Product Bundle 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 | - | ##### Bundle | Property | Type | Required | Details | | --- | --- | --- | --- | | `attributes` | object[] | No | - | | `compliant` | object | No | Compliance level for the bundle | | `created_at` | string | No | Creation timestamp | | `discount_percentage` | integer | No | Discount percentage [1-100] | | `discount_type` | string | No | Discount type [fixed, relative] | | `discounts` | object | No | Discount for bundle. Amount is stored in cents | | `id` | string | No | ID | | `rules` | object[] | No | Bundle rules | | `status` | string | No | Status of the bundle | | `updated_at` | string | No | Last updated timestamp | ##### Attribute | Property | Type | Required | Details | | --- | --- | --- | --- | | `created_at` | string | No | - | | `description` | string | No | - | | `filterable` | boolean | No | - | | `id` | string | No | - | | `key` | string | No | - | | `name` | string | No | - | | `template_key` | string | No | - | | `template_name` | string | No | - | | `translatable` | boolean | No | - | | `translations` | object | No | - | | `updated_at` | string | No | - | | `values` | object | No | - | ##### Compliance | Property | Type | Required | Details | | --- | --- | --- | --- | | `info` | string[] | No | Explanation of any issues with the bundle, it will be empty if the bundle is fully compliant | | `level` | string | No | Compliance level for the bundle, "full" if all rules are valid, "partial" if some rules are valid but it can still be used as a bundle, "none" if no rules are valid | ##### Bundle Rule | Property | Type | Required | Details | | --- | --- | --- | --- | | `bundle_id` | string | No | Bundle ID | | `discount_percentage` | integer | No | Discount percentage [1-100] | | `discount_type` | string | No | Discount type [fixed, relative] | | `discounts` | object | No | Discount for bundle. Amount is stored in cents | | `exclude_discounted_price` | boolean | No | If products with discounted price should be excluded | | `exclude_full_price` | boolean | No | If products with full price should be excluded | | `id` | string | No | ID | | `items` | object[] | No | Products associated with the bundle rule | | `quantity` | integer | No | Quantity of products needed to trigger the bundle | | `tag_conditions` | object | No | Conditions for discount tags |
Generated example (synthetic) ```json { "data": { "attributes": [ { "created_at": "string", "description": "string", "filterable": false, "id": "string", "key": "string", "name": "string", "template_key": "string", "template_name": "string", "translatable": false, "translations": { "description": null, "name": null }, "updated_at": "string", "values": {} } ], "compliant": { "info": [ "string" ], "level": "string" }, "created_at": "string", "discount_percentage": 0, "discount_type": "string", "discounts": {}, "id": "string", "rules": [ { "bundle_id": "string", "discount_percentage": 0, "discount_type": "string", "discounts": {}, "exclude_discounted_price": false, "exclude_full_price": false, "id": "string", "items": [], "quantity": 0, "tag_conditions": { "brands": null, "categories": null, "collections": null, "series": null, "tags": null } } ], "status": "string", "updated_at": "string" }, "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}/bundle-groups/{bundle_group_id}/bundles/{bundle_id}` - Operation ID: Not documented in the OpenAPI contract. - Stable operation key: `management-api:PATCH:/api/v1/{team_slug}/{app_slug}/bundle-groups/{bundle_group_id}/bundles/{bundle_id}` - OpenAPI tag: Product Bundles - OpenAPI summary: Update product bundle