Bulk Edit Products (Apply to All)
POST/api/v2/products/bulk-edit
Apply the same set of changes to all selected products.
products:writeGrant this scope to your token under Settings → Developer → Personal Access Tokens.
Authentication: Requires Bearer token.
Fields:
- product_ids (required, array, max 500): Product IDs to update
- changes (required, array): List of changes, each with:
- field (required, string): Field name to change. Supports scalar product fields (e.g. weight, weight_unit, unit_cost, brand_id, product_type_id — 'set' with an active leaf product type id, or 'clear'), 'pricing' (customer pricing tiers), 'supplier_pricing' (per-supplier pricing tiers — applies to ALL suppliers of each product), 'attribute' (custom attributes), and 'supplier' (link suppliers).
- operation (required, string): Operation type. Scalars use 'set' / 'clear'; boolean fields (is_dropshippable, is_taxable, is_lot_tracked) use 'set_true' / 'set_false'. Numeric/pricing/supplier_pricing also accept 'increase_by_amount', 'decrease_by_amount', 'increase_by_percent', 'decrease_by_percent'.
- value (nullable): New value
- tier_id (nullable, integer): Required for 'pricing' (references product_pricing_tiers) and 'supplier_pricing' (references supplier_pricing_tiers). Validation routes to the correct table based on the sibling 'field' value.
- attribute_id (nullable, integer): Required for attribute field changes
- supplier_id (nullable, integer): Required for supplier field changes
Lot tracking:
- is_lot_tracked with 'set_true' switches lot tracking on for every selected product. A product that has no lot_tracking_method yet receives the tenant default from the Serial & Lot Tracking settings; a method the product already has is kept.
- lot_tracking_method with 'set' and value fifo | fefo changes the consumption order; 'clear' removes it. Any other value returns 422.
Requires permission: products.update
Request
Responses
- 200
- 401
- 403
- 422
- 429
OK
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
Unprocessable Entity
Response Headers
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.