# Catalog products

Trade catalog products: list, retrieve, create, update, and delete. A product describes a catalog item — name, active status, unit of measure, and sale flags. Sale prices are set separately, in [Catalog prices](/docs/entities/catalog-prices). [Catalog services](/docs/entities/catalog-services) have a separate section.

Bitrix24 API: `catalog.product.*`
Scope: `catalog`

## Operations

- [Create catalog product](./catalog-products/create.md) — `POST /v1/catalog-products`
- [List catalog products](./catalog-products/list.md) — `GET /v1/catalog-products`
- [Get catalog product](./catalog-products/get.md) — `GET /v1/catalog-products/:id`
- [Update catalog product](./catalog-products/update.md) — `PATCH /v1/catalog-products/:id`
- [Delete catalog product](./catalog-products/delete.md) — `DELETE /v1/catalog-products/:id`
- [Search catalog products](./catalog-products/search.md) — `POST /v1/catalog-products/search`
- [Catalog product fields](./catalog-products/fields.md) — `GET /v1/catalog-products/fields`
- [Aggregate catalog products](./catalog-products/aggregate.md) — `POST /v1/catalog-products/aggregate`
- [Upload product image](./catalog-products/images-create.md) — `POST /v1/catalog-products/:productId/images`
- [List product images](./catalog-products/images-list.md) — `GET /v1/catalog-products/:productId/images`
- [Get product image](./catalog-products/images-get.md) — `GET /v1/catalog-products/:productId/images/:imageId`
- [Delete product image](./catalog-products/images-delete.md) — `DELETE /v1/catalog-products/:productId/images/:imageId`

## Reference data

- [Catalog measures](/docs/entities/catalog-measures) — values for `measure`.
- [Catalog VAT rates](/docs/entities/catalog-vat-rates) — values for `vatId`.

## Key fields

| Field | Description |
|------|---------|
| `name` | Product name. A product has no separate `title` field |
| `iblockId` | Catalog ID. Required in the list and search filter. List: [`GET /v1/catalogs`](/docs/entities/catalogs) |
| `iblockSectionId` | Catalog section ID. List: [`GET /v1/catalog-sections`](/docs/entities/catalog-sections) |
| `active` | Whether the product is active |
| `measure` | Unit of measure ID |
| `purchasingPrice` | Purchase price. Currency is in `purchasingCurrency` |
| `quantity` | Stock balance |

## What to know before you start

**A product with variants** uses [catalog SKUs](/docs/entities/catalog-skus) for the parent item and [catalog offers](/docs/entities/catalog-offers) for individual variants. Use `/v1/catalog-products` for a product without that link. The offer catalog has its own `iblockId` and a `productIblockId` link to the product catalog.

1. **List and search require a catalog filter.** In `GET /v1/catalog-products` and `POST /v1/catalog-products/search`, the `filter[iblockId]` field is required — without it the request returns an error. The `iblockId` value comes from [`GET /v1/catalogs`](/docs/entities/catalogs).
2. **Field selection must include `iblockId`.** If a list or search request passes `select`, it must include `iblockId`. Without an explicit `select`, the response carries a reduced set of fields — some names in the field reference are returned only when listed explicitly, and [Catalog product fields](./catalog-products/fields.md) lists which ones.
3. **Creating a product requires at least two fields.** `name` and `iblockId` are required. The other fields are optional and take default values.
4. **Boolean flags use `true`/`false` values.** `active`, `vatIncluded`, `canBuyZero`, `quantityTrace`, `subscribe`, `barcodeMulti`, `withoutOrder` are returned and accepted as booleans. The `available` and `bundle` fields are computed by Bitrix24 and are read-only.
5. **Stock and purchase price depend on inventory management.** When inventory management is enabled on the Bitrix24 account, the `quantity`, `purchasingPrice`, and `purchasingCurrency` fields are not applied on create or update — stock and purchase prices are managed by inventory documents. Sale prices are set via [Catalog prices](/docs/entities/catalog-prices).
6. **The `get` response is more detailed than the `list` response.** A single record by `id` returns additional product fields — the symbolic code, dimensions, type, and custom catalog properties in the form `propertyNNN`. For list-type properties, the element comes with its label — in the `valueEnum` field next to `valueId` and `value`. The names and types of the `propertyNNN` properties themselves are in [Catalog product properties](/docs/entities/catalog-product-properties). List and search return a reduced set of fields, and a `propertyNNN` property when it is named in `select` by its own name.

## Typical scenario

1. Find the catalog and its `iblockId`: [`GET /v1/catalogs`](/docs/entities/catalogs).
2. View the catalog products: [`GET /v1/catalog-products?filter[iblockId]=25`](./catalog-products/list.md).
3. Create or update a product: [`POST /v1/catalog-products`](./catalog-products/create.md) / [`PATCH /v1/catalog-products/:id`](./catalog-products/update.md).
4. Set the product price: [`POST /v1/catalog-prices`](/docs/entities/catalog-prices/create).

## Limits

| Limit | Value |
|-------|----------|
| Maximum records per request | 5000 (`limit ≤ 5000`) |
| Auto-pagination | enabled when `limit > 50` |
| Batch requests | up to 50 operations in [`POST /v1/batch`](/docs/batch) |
| Rate limit | shared across the Vibecode API — see [Limits and optimization](/docs/optimization) |

## See also

- [Catalog prices](/docs/entities/catalog-prices)
- [Catalogs](/docs/entities/catalogs)
- [Catalog sections](/docs/entities/catalog-sections)
- [Catalog product properties](/docs/entities/catalog-product-properties)
- [List-property values](/docs/entities/catalog-product-property-enums)
- [Product images](/docs/entities/catalog-products/images)
- [Filtering syntax](/docs/filtering)
- [API reference](/docs/api-reference)
