# Catalog offers

Offers are a distinct Bitrix24 catalog subtype. Manage their prices through [catalog prices](/docs/entities/catalog-prices).

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

## Operations

- [List offers](./catalog-offers/list.md) — `GET /v1/catalog-offers`
- [Get an offer](./catalog-offers/get.md) — `GET /v1/catalog-offers/:id`
- [Create an offer](./catalog-offers/create.md) — `POST /v1/catalog-offers`
- [Update an offer](./catalog-offers/update.md) — `PATCH /v1/catalog-offers/:id`
- [Delete an offer](./catalog-offers/delete.md) — `DELETE /v1/catalog-offers/:id`
- [Offer fields](./catalog-offers/fields.md) — `GET /v1/catalog-offers/fields`
- [Search offers](./catalog-offers/search.md) — `POST /v1/catalog-offers/search`
- [Aggregate offers](./catalog-offers/aggregate.md) — `POST /v1/catalog-offers/aggregate`

List and search require the offer catalog's `filter.iblockId`: in [catalogs](/docs/entities/catalogs), this row has `productIblockId` (for example, `iblockId=27`, `productIblockId=25`; use your own catalog IDs). Creation needs `iblockId` and `name`. `parentId` links an offer to a [SKU](/docs/entities/catalog-skus): pass `{ "value": "<ID>" }`. Without it, Bitrix24 creates a free offer (`TYPE_FREE_OFFER`). The response contains a `parentId` object with `value` and `valueId`. `PATCH parentId` is rejected because Bitrix24 reports success without changing the link. An unknown parent, invalid parent type, or different product catalog returns `422`. `type` is read only. Portal properties such as `property295` depend on the catalog.
