Beta
Not authenticated — log in first
VendorBulk Operations

Bulk Update

POST /vendor/products/bulk-update — Update multiple products by product_id or code.

POST/vendor/products/bulk-updateVendor bearer token required

Bulk Update

Update multiple products at once, including price, stock, manufacturer fields, and more.

What this means in plain English

Bulk update allows you to update multiple products at once. Match by product_id (UUID) or code (SKU). If product_id is provided it is used first; otherwise code must uniquely identify the product within your vendor catalog.

When to use this

  • Syncing price and stock from an ERP or PIM.
  • Updating compliance fields (AbilityOne, ECCN, UNSPSC) in batch.

Request body

NameTypeRequiredDescription
product_idstring (UUID)NoProduct ID. Used as primary reference when provided.
codestringNoProduct SKU or variant SKU. Used when product_id is omitted.
vendor_pricenumberNoVendor/cost price (USD). Applied to the default variant. The customer retail price is recomputed from it as `vendor_price × (1 + your commission %)`.
amountintegerNoAbsolute stock on the default variant. 0 for out of stock is accepted.
abilityonestringNoAbilityOne metaobject: Y for Yes, N for No. Product-level.
unit_of_measurestringNoUnit of measure. Applied to the default variant.
manufacturer_namestringNoManufacturer name. Product-level.
manufacturer_part_numberstringNoManufacturer part number. Applied to the default variant.
country_of_originstringNoCountry of origin. Product-level.
lead_timeintegerNoLead time in days. Product-level.
upcstring | numberNoUniversal Product Code (UPC). Applied to the default variant.
unspscstring | numberNoUNSPSC code. Product-level.
commodity_codestring | numberNoCommodity / HS-style code (max 28 characters). Product-level.
eccnstring | numberNoExport Control Classification Number (ECCN). Product-level.

Request example

curl -X POST 'https://api.next.gcommerce.glass/api/v1/vendor/products/bulk-update' \
  -H 'Content-Type: application/json'

Response examples

200Success
[
  {
    "product_id": "550e8400-e29b-41d4-a716-446655440020",
    "code": "B1224059",
    "updates": {
      "prices": true,
      "amount": true,
      "abilityone": true,
      "unit_of_measure": true,
      "manufacturer_name": true,
      "manufacturer_part_number": true,
      "country_of_origin": true,
      "lead_time": true,
      "upc": true,
      "unspsc": true,
      "commodity_code": true,
      "eccn": true
    }
  }
]

Status codes

200

OK

Request succeeded.

401

Unauthorized

Missing or invalid bearer token.

403

Forbidden

Insufficient permissions for this action.

400

Bad Request

Validation failed or invalid parameters.

404

Not Found

Resource not found.

429

Too Many Requests

Global rate limit exceeded (10,000 requests per 10 minutes per IP).

500

Internal Server Error

Unexpected server error.

403

Forbidden

No vendor membership, or insufficient vendor role (requires OWNER, ADMIN, or EDITOR for write operations).

All bulk-update fields apply immediately, including on `PUBLISHED` products — bulk update does not use `pendingRevision` and does not change product status.
Only `name`, `shortDescription`, `description`, and `images` require admin approval, and only via [Update Product](/docs/v1/vendor/products/update) or [Replace Product Images](/docs/v1/vendor/products/replace-images).
Request body is a JSON **array** of product objects (not wrapped in `{ items: [...] }`).
Each row must include product_id or code.
`code` can match the product SKU or a variant SKU within your vendor catalog.
Variant-scoped fields (`vendor_price`, `amount`, `unit_of_measure`, `manufacturer_part_number`, `upc`) apply to the **default variant**: variant whose SKU matches the product SKU, else first active variant, else first variant.
You set the cost via `vendor_price`; the customer retail price is always derived server-side as `vendor_price × (1 + your commission %)` and cannot be set directly.
The product must exist in your vendor catalog.
Only 1,000 products can be updated at a time.
Updates are best-effort per row; failures on one product do not roll back others.
`commodity_code` values longer than 28 characters are trimmed and truncated to 28.

Try it

Uses your saved session from login. Edit values and send a live request, or copy the cURL command.