# Catalog services

Services of the product catalog: list, get, create, update, and delete. A service is a catalog record of type `7` for work and service jobs, such as installation or delivery. A service has no warehouse fields — stock, weight, and purchase price; sale prices are set in [Catalog prices](/docs/entities/catalog-prices).

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

## Operations

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

## Key fields

| Field | Description |
|------|---------|
| `name` | Service name |
| `iblockId` | Product catalog ID — the catalog whose `productIblockId` is empty. Required when creating and in the list, search, and aggregation filter. List: [`GET /v1/catalogs`](/docs/entities/catalogs/list) |
| `iblockSectionId` | Catalog section ID. List: [`GET /v1/catalog-sections`](/docs/entities/catalog-sections/list) |
| `type` | Record type, always `7` for a service. Set by Bitrix24 |
| `active` | Whether the service is active |
| `available` | Whether the service is available for purchase. If the field is not passed on creation, the service is created with `false` |
| `measure` | Unit of measure ID. List: [`GET /v1/catalog-measures`](/docs/entities/catalog-measures/list) |
| `vatIncluded` | Whether VAT is included in the price |

Full list of fields — [`GET /v1/catalog-services/fields`](./catalog-services/fields.md).

## What to know before you start

1. **Services are stored in the product catalog.** In [`GET /v1/catalogs`](/docs/entities/catalogs/list), it is the record without `productIblockId`. Its `id` is passed in `iblockId` when creating a service and in the list, search, and aggregation filter. With the `iblockId` of an offer catalog, list and create return `422 BITRIX_ERROR` with the text `productType is not allowed for this catalog`.
2. **List, search, and aggregation require a catalog filter.** Without `filter[iblockId]`, the request is rejected with `400 MISSING_REQUIRED_FILTER` before Bitrix24 is called.
3. **Only services are returned.** Each record comes with `type: 7`; regular catalog products are not included in the list. A `type` filter does not change the result set.
4. **Field selection is strict.** If `select` is passed in a list or search, it must include `iblockId` and `id`, and an unknown name is rejected with `400 UNKNOWN_SELECT_FIELD`. Without `select`, the list returns a reduced set of fields, while a request for a single record by `id` returns the full set together with catalog properties of the form `propertyNNN`.
5. **The minimum to create a service is `name` and `iblockId`.** Without `name`, the request is rejected with `422 BITRIX_ERROR` and the text `Required fields: name`; without `iblockId`, with the text `iblock is not catalog`.
6. **Update and delete check that the `id` belongs to a service.** With the `id` of a regular product, `PATCH` and `DELETE` return `404 ENTITY_NOT_FOUND`, and the product stays unchanged.
7. **Catalog properties in the field reference require `iblockId`.** On a successful Bitrix24 response, [`GET /v1/catalog-services/fields?iblockId=25`](./catalog-services/fields.md) returns the 28 static fields together with the catalog properties `propertyNNN`, and the `fields_partial` warning is absent. Without the parameter, only the 28 static fields and the `fields_partial` warning come back. Property values come in the response for a single service; their names and types are also available in [`GET /v1/catalog-product-properties`](/docs/entities/catalog-product-properties/list).

## Typical scenario

1. Find the product catalog and its `id`: [`GET /v1/catalogs`](/docs/entities/catalogs/list) — the record without `productIblockId`.
2. Choose a section for the service: [`GET /v1/catalog-sections?filter[iblockId]=25`](/docs/entities/catalog-sections/list).
3. Create a service: [`POST /v1/catalog-services`](./catalog-services/create.md).
4. Set the service price — pass the service `id` in `productId`: [`POST /v1/catalog-prices`](/docs/entities/catalog-prices/create).
5. View the services of a section: [`GET /v1/catalog-services?filter[iblockId]=25&filter[iblockSectionId]=281`](./catalog-services/list.md).

## 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 products](/docs/entities/catalog-products)
- [Catalog prices](/docs/entities/catalog-prices)
- [Catalogs](/docs/entities/catalogs)
- [Catalog sections](/docs/entities/catalog-sections)
- [Catalog measures](/docs/entities/catalog-measures)
- [Catalog product properties](/docs/entities/catalog-product-properties)
- [Filtering syntax](/docs/filtering)
- [API reference](/docs/api-reference)
