---
title: "Add or remove products in a collection"
method: POST
path: "/v1/commerce/collections/{collectionId}/products"
tags: ["Commerce"]
---

# Add or remove products in a collection

`POST /v1/commerce/collections/{collectionId}/products`

Adds and/or removes hand-picked products. Products a collection
includes through its own rules are not affected. `pending` is true
when the platform finishes the change in the background; the product
count then catches up a few seconds later.

## Path parameters

- `collectionId` string, required

## Request body

- object — At least one product id in add or remove.
  - `accountId` string, required
  - `add` string[]
  - `remove` string[]

## Response `200`

Membership changed

- object
  - `collection` CommerceCollection — A product collection on a connected store.
    - `id` string — Platform-native collection id.
    - `accountId` string
    - `platform` 'shopify' | 'woocommerce'
    - `title` string
    - `handle` string, nullable
    - `descriptionHtml` string, nullable
    - `image` CommerceImage
      - `id` string, nullable — Media id, used to reorder or remove images. Null for collection images.
      - `url` string
      - `altText` string, nullable
    - `sortOrder` 'manual' | 'best_selling' | 'alpha_asc' | 'alpha_desc' | 'price_asc' | 'price_desc' | 'created' | 'created_desc' | 'most_relevant'
    - `productCount` integer, nullable — Updates a few seconds after a membership change.
    - `seo` object
      - `title` string, nullable
      - `description` string, nullable
    - `updatedAt` string, date-time, nullable
    - `platformData` object, nullable
  - `pending` boolean

## Other responses

- `400` — Invalid request
- `401` — Unauthorized
- `403` — The platform rejected the request (code insufficient_permissions). Reconnect the store.
- `404` — Account not found (code account_not_found) or collection not found (code resource_not_found).
- `429` — Rate limited, either by Zernio or by the platform. Retry later.

## Changes

- **2026-09-30** `16a7b9d5373e` — 1 info
  - removed the `platform` enum value from the `details/budgetScope` response property for the response status `400`
- **2026-09-29** `69bbe3da3a18` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/commerce/collections/:collectionId/products/post.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/16a7b9d5373e?raw)
