[{"data":1,"prerenderedAt":14},["ShallowReactive",2],{"docs-entities\u002Fcatalog-product-property-enums":3,"docs-tabs-entities\u002Fcatalog-product-property-enums":6},{"content":4,"lastmod":5},"# Catalog list-property values\n\nDictionary of the options of a trade-catalog list property: create, read, update, delete, search, and inspect the field reference. Each record is one option of a dropdown — the element `id` and its readable text `value`. It is the companion to [Catalog product properties](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties): a property with `propertyType: \"L\"` describes the field, and this entity enumerates the options that can be selected in it.\n\nThis is the source of what no product endpoint provides: **all possible** values of a list property, not just the one selected on a particular product.\n\nBitrix24 API: `catalog.productPropertyEnum.*`\nScope: `catalog`\n\n## Operations\n\n- [Create a value](.\u002Fcatalog-product-property-enums\u002Fcreate.md) — `POST \u002Fv1\u002Fcatalog-product-property-enums`\n- [Update a value](.\u002Fcatalog-product-property-enums\u002Fupdate.md) — `PATCH \u002Fv1\u002Fcatalog-product-property-enums\u002F:id`\n- [Delete a value](.\u002Fcatalog-product-property-enums\u002Fdelete.md) — `DELETE \u002Fv1\u002Fcatalog-product-property-enums\u002F:id`\n- [List values](.\u002Fcatalog-product-property-enums\u002Flist.md) — `GET \u002Fv1\u002Fcatalog-product-property-enums`\n- [Get a value](.\u002Fcatalog-product-property-enums\u002Fget.md) — `GET \u002Fv1\u002Fcatalog-product-property-enums\u002F:id`\n- [Search values](.\u002Fcatalog-product-property-enums\u002Fsearch.md) — `POST \u002Fv1\u002Fcatalog-product-property-enums\u002Fsearch`\n- [Value fields](.\u002Fcatalog-product-property-enums\u002Ffields.md) — `GET \u002Fv1\u002Fcatalog-product-property-enums\u002Ffields`\n\n`POST \u002Faggregate` remains unavailable and answers `404`. Create and update require an existing list property of a product catalog.\n\n## Key fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `id` | number | Identifier of the enumeration element. This is the value a catalog product carries in `propertyNNN.value` |\n| `propertyId` | number | Identifier of the owning property. Required in the filter |\n| `value` | string | Readable text of the option — the same text a product returns in `propertyNNN.valueEnum` |\n| `def` | boolean | Whether this option is the property's default value |\n| `sort` | number | Sort index within the property |\n| `xmlId` | string | External code. Comes back as `null` when not set |\n\n## What to know before you start\n\n1. **`filter[propertyId]` is required.** The dictionary is read one property at a time. A request without this filter is rejected with `400 MISSING_REQUIRED_FILTER` before Bitrix24 is called — on both available surfaces: the list and [search](.\u002Fcatalog-product-property-enums\u002Fsearch.md). Take `propertyId` from [`GET \u002Fv1\u002Fcatalog-product-properties`](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties). The check looks at the **presence** of the key, not at the shape of its value, and does not extend to the sub-calls of a [batch request](\u002Fdocs\u002Fbatch) — it is a cost guard and a hint, not an access boundary: whatever a key with the `catalog` scope can reach, it can reach without this filter too.\n2. **Only `propertyType: \"L\"` has an enumeration.** Read the property type first: [`GET \u002Fv1\u002Fcatalog-product-properties\u002F:id`](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties\u002Fget). For a property of any other type (`S` string, `N` number, `F` file, `E`\u002F`G` bindings) the request returns an **empty list**, not an error.\n3. **The link to product fields goes through `id`.** A catalog product returns a list-property value in the field `propertyNNN`, where `NNN` is the property `id`. Inside are `value` (the enumeration element id, as a string), `valueEnum` (the ready-made readable text), and `valueId` (the value row id). Match with `String(element.id) === product.propertyNNN.value` — the product's `value` is a string while the dictionary `id` is a number.\n4. **The shape on the product side depends on the property's `listType`.** With `listType: \"L\"` (dropdown) an object with the three fields above arrives. With `listType: \"C\"` (checkbox) a bare `\"Y\"`\u002F`\"N\"` scalar arrives — that is the state of the checkbox, not an option identifier. Such a property still has a dictionary, and it returns a single record carrying the label of the checked state. It cannot be joined to the product by `id`: the product carries a flag, not an element id. When `multiple: true`, the same shape arrives as an array — expand every element.\n5. **Pagination is ordinary: `limit` + `offset`, end of data by `meta.hasMore`.** Bitrix24 reports the total, so `meta.total` and `meta.hasMore` are trustworthy. The ceiling is 5000 records per call, the default is 50. Rare edge case: if no total arrives, the platform substitutes the length of the received window into `meta.total`, so `hasMore` comes back `false` on a full page — compare `data.length` against the page size to be safe.\n6. **Only `id` is read-only.** Supply `propertyId`, `value`, and `xmlId` when creating an option. A partial update fills omitted `propertyId` and `xmlId` from the current row. `GET \u002Fv1\u002Fcatalog-product-property-enums\u002Ffields` advertises `create`, `update`, and `delete` in `data.batch`.\n\n## Typical scenario\n\nThe task: show the user a dropdown with **all** sizes and highlight the one selected on a product.\n\n1. Find the catalog `iblockId`: [`GET \u002Fv1\u002Fcatalogs`](\u002Fdocs\u002Fentities\u002Fcatalogs). Done once and cached.\n2. Read the catalog property schema: [`GET \u002Fv1\u002Fcatalog-product-properties?filter[iblockId]=26`](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties\u002Flist). Three property fields matter here — `propertyType` (only `L` has an enumeration), `listType` (an object or a bare scalar on the product), and `multiple` (a single object or an array). Cached together with step 1.\n3. Fetch the option dictionary: [`GET \u002Fv1\u002Fcatalog-product-property-enums?filter[propertyId]=166&limit=1000`](.\u002Fcatalog-product-property-enums\u002Flist.md). Build a `String(id) → value` map.\n4. Read the product: [`GET \u002Fv1\u002Fcatalog-products\u002F160`](\u002Fdocs\u002Fentities\u002Fcatalog-products\u002Fget) — `property166.value` carries `\"116\"`, and the map expands it into `L`.\n\nFor a single product step 3 is unnecessary: the text is already in `property166.valueEnum`. The dictionary is needed exactly when **all** options are required — a dropdown, a filter, an export.\n\nDictionaries for several properties are fetched at once with one [batch request](\u002Fdocs\u002Fbatch) — up to 50 sub-calls, one per `propertyId`. A sample body is in the \"Known specifics\" section of the [list values](.\u002Fcatalog-product-property-enums\u002Flist.md) page. Data cannot be passed between the sub-calls of one batch: that is why step 2 stays a separate cached call, while the batch saves N dictionary round-trips for **already known** `propertyId` values.\n\n## Limits\n\n| Limit | Value |\n|-------|----------|\n| Maximum records per request | 5000 (`limit ≤ 5000`) |\n| Default `limit` | 50 |\n| Auto-pagination | kicks in at `limit > 50` |\n| Batch requests | up to 50 operations in [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) |\n| Rate limit | shared across the Vibecode API — see [Limits and optimization](\u002Fdocs\u002Foptimization) |\n\n## See also\n\n- [Catalog product properties](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [Catalogs](\u002Fdocs\u002Fentities\u002Fcatalogs)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n- [Filtering syntax](\u002Fdocs\u002Ffiltering)\n- [API reference](\u002Fdocs\u002Fapi-reference)\n","2026-09-30",{"catalog-product-property-enums\u002Fcreate.md":7,"catalog-product-property-enums\u002Fupdate.md":8,"catalog-product-property-enums\u002Fdelete.md":9,"catalog-product-property-enums\u002Flist.md":10,"catalog-product-property-enums\u002Fget.md":11,"catalog-product-property-enums\u002Fsearch.md":12,"catalog-product-property-enums\u002Ffields.md":13},"## Create a list-property value\n\n`POST \u002Fv1\u002Fcatalog-product-property-enums`\n\nAdds a new option to a product catalog list property. Fields go at the root of the JSON, with no wrapper.\n\n## Request fields (body)\n\n| Field | Type | Required | Description |\n|------|-----|:-----:|---------|\n| `propertyId` | number | yes | Identifier of the list property. Take it from [List properties](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties\u002Flist). The property must have `propertyType: \"L\"` |\n| `value` | string | yes | Option text |\n| `xmlId` | string | yes | External code for imports and integrations |\n| `sort` | number | no | Sort order within the property |\n| `def` | boolean | no | Make the option the default value of the property |\n| `id` | number | no | RO. The identifier is assigned on creation and must not be sent |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"propertyId\":295,\"value\":\"Additional option\",\"xmlId\":\"EXTRA-20261013\",\"sort\":100,\"def\":false}'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"propertyId\":295,\"value\":\"Additional option\",\"xmlId\":\"EXTRA-20261013\",\"sort\":100,\"def\":false}'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    propertyId: 295,\n    value: 'Additional option',\n    xmlId: 'EXTRA-20261013',\n    sort: 100,\n    def: false,\n  }),\n})\n\nconst { data } = await res.json()\nconsole.log(data.id)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    propertyId: 295,\n    value: 'Additional option',\n    xmlId: 'EXTRA-20261013',\n    sort: 100,\n    def: false,\n  }),\n})\n\nconst { data } = await res.json()\nconsole.log(data.id)\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | `true` on a successful request |\n| `data` | object | List-property value |\n| `data.id` | number | Identifier of the value |\n| `data.propertyId` | number | Identifier of the owning property |\n| `data.value` | string | Option text |\n| `data.def` | boolean | Whether the option is the default value of the property |\n| `data.sort` | number | Sort order within the property |\n| `data.xmlId` | string \\| null | External code. `null` when the code is not set |\n| `meta` | object | Optional extra details |\n| `meta.warnings` | object[] | Warnings about request fields, when there are any |\n| `meta.warnings[].code` | string | Warning code |\n| `meta.warnings[].message` | string | Warning explanation |\n| `meta.warnings[].field` | string | Field the warning applies to |\n\n## Response example\n\n201 — the option is created:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"def\": false,\n    \"id\": 1769,\n    \"propertyId\": 295,\n    \"sort\": 100,\n    \"value\": \"Additional option\",\n    \"xmlId\": \"EXTRA-20261013\"\n  }\n}\n```\n\n## Error response example\n\n422 — an option with this external code already exists:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"The record with the \\\"External code\\\" value equal to \\\"EXTRA-20261013\\\" is already in the database\",\n    \"b24Code\": \"BX_INVALID_VALUE\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Invalid type or shape of a request field |\n| 400 | `MISSING_REQUIRED_FIELDS` | One of the required fields was not sent: `propertyId`, `value`, `xmlId` |\n| 400 | `READONLY_FIELD` | The body carries `id`, which is read-only |\n| 422 | `BITRIX_ERROR` | Bitrix24 refusal: a duplicate `xmlId`, a property of another type, or a property outside the product catalog. The reason is in `error.message` |\n| 403 | `SCOPE_DENIED` | The API key does not carry the `catalog` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The API key allows reading only |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header was not sent |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [List values](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Flist)\n- [Get a value](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fget)\n- [Value fields](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Ffields)\n- [List properties](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties\u002Flist)\n- [Update a list-property value](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fupdate)\n- [Delete a list-property value](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fdelete)\n","## Update a list-property value\n\n`PATCH \u002Fv1\u002Fcatalog-product-property-enums\u002F:id`\n\nUpdates individual fields of a catalog list-property option. Send the fields at the root of the JSON, with no wrapper.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | yes | Value identifier from the [list of values](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Flist) |\n\n## Request fields (body)\n\nSend at least one editable field.\n\n| Field | Type | Required | Description |\n|------|-----|:-----:|---------|\n| `propertyId` | number | no | Identifier of the property from the [list of catalog product properties](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties\u002Flist). The property must have `propertyType: \"L\"` |\n| `value` | string | no | New option text |\n| `xmlId` | string | no | External code for imports and integrations |\n| `sort` | number | no | Sort order within the property |\n| `def` | boolean | no | Make the option the default value of the property |\n| `id` | number | no | RO. The identifier cannot be changed |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002F1769\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"value\":\"Additional option 2\"}'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002F1769\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"value\":\"Additional option 2\"}'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002F1769', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    value: 'Additional option 2',\n  }),\n})\n\nconst { data } = await res.json()\nconsole.log(data.id)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002F1769', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    value: 'Additional option 2',\n  }),\n})\n\nconst { data } = await res.json()\nconsole.log(data.id)\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | `true` on a successful request |\n| `data` | object | List-property value |\n| `data.id` | number | Identifier of the value |\n| `data.propertyId` | number | Identifier of the owning property |\n| `data.value` | string | Option text |\n| `data.def` | boolean | Whether the option is the default value of the property |\n| `data.sort` | number | Sort order within the property |\n| `data.xmlId` | string \\| null | External code. `null` when the code is not set |\n| `meta` | object | Optional additional details |\n| `meta.warnings` | object[] | Warnings about the request fields, if there are any |\n| `meta.warnings[].code` | string | Warning code |\n| `meta.warnings[].message` | string | Explanation of the warning |\n| `meta.warnings[].field` | string | Field the warning refers to |\n\n## Response example\n\n200 — the option is updated:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"def\": false,\n    \"id\": 1769,\n    \"propertyId\": 295,\n    \"sort\": 100,\n    \"value\": \"Additional option 2\",\n    \"xmlId\": \"EXTRA-20261013\"\n  }\n}\n```\n\n## Error response example\n\n404 — the value has been deleted and the request included `propertyId` and `xmlId`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"productPropertyEnum does not exist.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Invalid type or shape of a request field or of `id` in the path |\n| 400 | `EMPTY_UPDATE_BODY` | The request body is empty |\n| 400 | `READONLY_FIELD` | The body carries `id`, which is read-only |\n| 404 | `ENTITY_NOT_FOUND` | There is no value with the given identifier |\n| 422 | `BITRIX_ERROR` | Bitrix24 refusal. For a deleted value sent without `propertyId` or `xmlId`, the message `Required fields` arrives with the list of missing fields |\n| 403 | `SCOPE_DENIED` | The API key does not have the `catalog` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The API key allows reading only |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header was not sent |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**Field substitution.** On a single update the API reads the current record and fills in `propertyId` and `xmlId` when they are not sent. Explicitly sent values take precedence.\n\nThere is no substitution in [batch requests](\u002Fdocs\u002Fbatch). In every update through `POST \u002Fv1\u002Fbatch` or `POST \u002Fv1\u002Fcatalog-product-property-enums\u002Fbatch`, send `propertyId` and `xmlId` explicitly. Otherwise the operation is rejected before Bitrix24 is called.\n\n## See also\n\n- [List values](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Flist)\n- [Get a value](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fget)\n- [Value fields](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Ffields)\n- [List properties](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties\u002Flist)\n- [Create a list-property value](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fcreate)\n- [Delete a list-property value](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fdelete)\n- [Batch](\u002Fdocs\u002Fbatch)\n","## Delete a list-property value\n\n`DELETE \u002Fv1\u002Fcatalog-product-property-enums\u002F:id`\n\nDeletes an option of a catalog list property by identifier. A deleted option cannot be restored via the API.\n\nBefore deleting, verify that products no longer use this value.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | yes | Value identifier from the [list of values](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Flist) |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002F1769\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002F1769\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002F1769', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Value deleted')\n}\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002F1769', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Value deleted')\n}\n```\n\n## Response\n\nOn successful deletion, HTTP status `204 No Content` is returned with an empty body. Success is checked by the response status.\n\n## Response example\n\n```http\nHTTP\u002F1.1 204 No Content\n```\n\n## Error response example\n\n404 — the value is already deleted:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"productPropertyEnum does not exist.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Invalid `id` in the path |\n| 404 | `ENTITY_NOT_FOUND` | No value with the specified identifier exists |\n| 422 | `BITRIX_ERROR` | Bitrix24 rejected the deletion. The reason is in `error.message` |\n| 403 | `SCOPE_DENIED` | The API key lacks the `catalog` scope |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | The API key allows read access only |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header was not passed |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [List values](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Flist)\n- [Get a value](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fget)\n- [Value fields](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Ffields)\n- [List properties](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties\u002Flist)\n- [Create a list-property value](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fcreate)\n- [Update a list-property value](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fupdate)\n","\n## List values\n\n`GET \u002Fv1\u002Fcatalog-product-property-enums`\n\nReturns the options of a single trade-catalog list property. The `filter[propertyId]` filter is required — the dictionary is read one property at a time.\n\n## Parameters\n\n| Parameter | Type | Required | Default | Description |\n|----------|-----|:-----:|-----------|---------|\n| `filter[propertyId]` | number | yes | — | Identifier of the owning property from [`GET \u002Fv1\u002Fcatalog-product-properties`](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties\u002Flist). Without it the request is rejected with `400 MISSING_REQUIRED_FILTER` before Bitrix24 is called |\n| `filter` | object | no | — | Other filtering conditions.\u003Cbr>[Filtering syntax](\u002Fdocs\u002Ffiltering). Example: `?filter[propertyId]=166&filter[def]=true` |\n| `select` | string | no | — | Field selection: `?select=id,value`. Without `select`, all element fields are returned |\n| `sort` | string | no | — | Sort field. The `-` prefix means descending: `?sort=-sort` |\n| `limit` | number | no | `50` | Number of records (up to 5000) |\n| `offset` | number | no | `0` | Offset from the start of the selection |\n| `withTotal` | string | no | — | Accepts `true` or `false`. For this entity the parameter is ignored: `meta.total` is returned even with `withTotal=false` |\n\nFor `limit > 50`, the response is automatically assembled from several pages on the server side. The maximum is 5000 records per call.\n\n**The end of the selection is signalled by `meta.hasMore`.** Bitrix24 reports the total, so `meta.total` and `meta.hasMore` are trustworthy — an ordinary `while (hasMore) { offset += limit }` loop works. If no total arrives, the platform substitutes the length of the received window into `meta.total`, and `hasMore` comes back `false` on a full page. To be safe, compare `data.length` against the page size.\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -g \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums?filter[propertyId]=166&limit=1000\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl -g \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums?filter[propertyId]=166&limit=1000\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst params = new URLSearchParams({ 'filter[propertyId]': '166', limit: '1000' })\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums?${params}`, {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconst byId = new Map(data.map(item => [String(item.id), item.value]))\nconsole.log(byId.get('116')) \u002F\u002F L\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst params = new URLSearchParams({ 'filter[propertyId]': '166', limit: '1000' })\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums?${params}`, {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data` | array | Array of options. For the element fields, see [Value fields](.\u002Ffields.md) |\n| `meta.total` | number | Number of records matching the filter. When Bitrix24 does not report it, the window length is returned |\n| `meta.hasMore` | boolean | Whether more records exist beyond `limit`. Unreliable at the window edge — see the warning above |\n\nThe `id` of each element is what a catalog product carries in `propertyNNN.value`:\n\n```\nproduct.propertyNNN.value  →  String(element.id)  →  element.value\n```\n\nA property that is not of the list type (`propertyType` other than `L`) has no enumeration: the request returns `200` with an empty `data`, not an error. Access is restricted by the employee's permissions in Bitrix24.\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    { \"id\": 110, \"propertyId\": 166, \"value\": \"XS\", \"def\": false, \"sort\": 100, \"xmlId\": null },\n    { \"id\": 112, \"propertyId\": 166, \"value\": \"S\",  \"def\": false, \"sort\": 200, \"xmlId\": null },\n    { \"id\": 114, \"propertyId\": 166, \"value\": \"M\",  \"def\": false, \"sort\": 300, \"xmlId\": null },\n    { \"id\": 116, \"propertyId\": 166, \"value\": \"L\",  \"def\": false, \"sort\": 400, \"xmlId\": null },\n    { \"id\": 118, \"propertyId\": 166, \"value\": \"XL\", \"def\": false, \"sort\": 500, \"xmlId\": null }\n  ],\n  \"meta\": {\n    \"total\": 5,\n    \"hasMore\": false\n  }\n}\n```\n\n## Error response example\n\n400 — the required filter is missing:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_REQUIRED_FILTER\",\n    \"message\": \"GET \u002Fv1\u002Fcatalog-product-property-enums requires filter fields: propertyId. Example: GET \u002Fv1\u002Fcatalog-product-property-enums?filter[propertyId]=...\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `MISSING_REQUIRED_FILTER` | The request carries no `filter[propertyId]` key. Bitrix24 is not called |\n| 400 | `UNKNOWN_FILTER_FIELD` | Filtering by a field the enumeration element does not have. The message lists the available fields |\n| 400 | `UNKNOWN_SORT_FIELD` | Sorting by a field the enumeration element does not have. The message lists the available fields |\n| 403 | `SCOPE_DENIED` | The API key does not carry the `catalog` scope |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header was not sent |\n| 429 | `RATE_LIMITED` | Rate limit exceeded: 300 requests per minute per portal. All API keys of the portal share one limit. The current limit is returned in the `x-ratelimit-limit` header. Retry after the delay in the `Retry-After` header |\n\nFor the full list of common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**Dictionaries for several properties are fetched with one batch request** — up to 50 sub-calls, one per `propertyId`:\n\n```json\n{\n  \"calls\": [\n    { \"id\": \"sizes\", \"entity\": \"catalog-product-property-enums\",\n      \"action\": \"list\", \"params\": { \"filter\": { \"propertyId\": 166 }, \"limit\": 1000 } },\n    { \"id\": \"colors\", \"entity\": \"catalog-product-property-enums\",\n      \"action\": \"list\", \"params\": { \"filter\": { \"propertyId\": 162 }, \"limit\": 1000 } }\n  ]\n}\n```\n\nA `list` sub-call with a `limit` above 50 leaves the native Bitrix24 batch and runs as a separate sequential request with its own rate-limit unit — see [Batch requests](\u002Fdocs\u002Fbatch). So the batch saves round-trips to the Vibecode API, not Bitrix24 quota units; the explicit `limit` is still required (see the completeness warning above).\n\nData cannot be passed between the sub-calls of one batch, so `propertyId` has to be known up front — from [`GET \u002Fv1\u002Fcatalog-product-properties`](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties\u002Flist). The required-filter check does not extend to batch sub-calls: the caller owns the `params` of each sub-call. Bitrix24 itself does not treat the filter as mandatory — a sub-call without `propertyId` returns the values of every list property of every trade catalog at once, a response with no size ceiling.\n\n## See also\n\n- [Get a value](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fget)\n- [Search values](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fsearch)\n- [Value fields](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Ffields)\n- [Catalog product properties](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [Filtering syntax](\u002Fdocs\u002Ffiltering)\n- [API reference](\u002Fdocs\u002Fapi-reference)\n","\n## Get a value\n\n`GET \u002Fv1\u002Fcatalog-product-property-enums\u002F:id`\n\nReturns one option of a list property by the enumeration element identifier. This is the same `id` a catalog product carries in `propertyNNN.value`.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | yes | Identifier of the enumeration element |\n\nNo `propertyId` filter is needed here: the element is addressed by its own identifier.\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002F116\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002F116\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002F116', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Value:', data.value)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002F116', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data` | object | The option object. The field set — see [Value fields](.\u002Ffields.md) |\n\n`xmlId` comes back as `null` when no external code is set.\n\nA single option is read directly when its `id` is already known — taken, for example, from a product's `propertyNNN.value`. To get **all** options of a property, use the [list](.\u002Flist.md) with `filter[propertyId]`.\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 116,\n    \"propertyId\": 166,\n    \"value\": \"L\",\n    \"def\": false,\n    \"sort\": 400,\n    \"xmlId\": null\n  }\n}\n```\n\n## Error response example\n\n404 — no element with that `id`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"catalogProductPropertyEnum 116 not found\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | No enumeration element with the given `id` exists |\n| 403 | `SCOPE_DENIED` | The API key does not carry the `catalog` scope |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header was not sent |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [List values](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Flist)\n- [Search values](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fsearch)\n- [Value fields](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Ffields)\n- [Catalog product properties](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [API reference](\u002Fdocs\u002Fapi-reference)\n","\n## Search values\n\n`POST \u002Fv1\u002Fcatalog-product-property-enums\u002Fsearch`\n\nSearches the options of a list property by conditions passed in the request body.\n\nUnlike [`GET \u002Fv1\u002Fcatalog-product-property-enums`](.\u002Flist.md), the `filter`, `select`, `sort`, `limit`, and `offset` parameters are passed in the JSON body rather than in the query string — which is more convenient for conditions across several fields. The filter requirement is the same: the `propertyId` key is required. The response format matches the list.\n\n## Request fields (body)\n\n| Parameter | Type | Required | Default | Description |\n|----------|-----|:-----:|-----------|---------|\n| `filter.propertyId` | number | **yes** | — | Identifier of the owning property from [`GET \u002Fv1\u002Fcatalog-product-properties`](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties\u002Flist). Without it the request is rejected with `400 MISSING_REQUIRED_FILTER` before Bitrix24 is called |\n| `filter` | object | no | — | Other filtering conditions.\u003Cbr>[Filtering syntax](\u002Fdocs\u002Ffiltering). Example: `{ \"propertyId\": 166, \"def\": true }` |\n| `select` | string[] | no | — | Field selection: `[\"id\", \"value\"]`. Without `select`, all element fields are returned |\n| `sort` | string | no | — | Sort field. The `-` prefix means descending: `\"-sort\"` |\n| `limit` | number | no | `50` | Number of records (up to 5000) |\n| `offset` | number | no | `0` | Offset from the start of the selection |\n\nAs in the list, the end of the selection is signalled by `meta.hasMore` — Bitrix24 reports the total, so `meta.total` and `meta.hasMore` are trustworthy.\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"propertyId\": 166 },\n    \"sort\": \"sort\",\n    \"limit\": 1000\n  }'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"propertyId\": 166 },\n    \"sort\": \"sort\",\n    \"limit\": 1000\n  }'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002Fsearch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    filter: { propertyId: 166 },\n    sort: 'sort',\n    limit: 1000,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Options: ${meta.total}`)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002Fsearch', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    filter: { propertyId: 166 },\n    sort: 'sort',\n    limit: 1000,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data` | array | Array of options. For the fields in each option, see [Value fields](.\u002Ffields.md) |\n| `meta.total` | number | How many records matched the filter. When Bitrix24 does not report it, the window length is returned |\n| `meta.hasMore` | boolean | Whether more records exist beyond `limit`. Unreliable at the window edge — see the warning above |\n| `meta.durationMs` | number | Request duration in milliseconds |\n\nThe `meta` fields sit next to `data`, not inside it.\n\nA property that is not of the list type (`propertyType` other than `L`) has no enumeration: the request returns `200` with an empty `data`, not an error. Access is restricted by the employee's permissions in Bitrix24.\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    { \"id\": 110, \"propertyId\": 166, \"value\": \"XS\", \"def\": false, \"sort\": 100, \"xmlId\": null },\n    { \"id\": 112, \"propertyId\": 166, \"value\": \"S\",  \"def\": false, \"sort\": 200, \"xmlId\": null },\n    { \"id\": 114, \"propertyId\": 166, \"value\": \"M\",  \"def\": false, \"sort\": 300, \"xmlId\": null },\n    { \"id\": 116, \"propertyId\": 166, \"value\": \"L\",  \"def\": false, \"sort\": 400, \"xmlId\": null },\n    { \"id\": 118, \"propertyId\": 166, \"value\": \"XL\", \"def\": false, \"sort\": 500, \"xmlId\": null }\n  ],\n  \"meta\": {\n    \"total\": 5,\n    \"hasMore\": false,\n    \"durationMs\": 148\n  }\n}\n```\n\n## Error response example\n\n400 — the required filter is missing:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_REQUIRED_FILTER\",\n    \"message\": \"POST \u002Fv1\u002Fcatalog-product-property-enums\u002Fsearch requires filter fields: propertyId. Example body: { \\\"filter\\\": {\\\"propertyId\\\":\\\"...\\\"} }\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `MISSING_REQUIRED_FILTER` | The body carries no `filter.propertyId` key. Bitrix24 is not called |\n| 400 | `UNKNOWN_FILTER_FIELD` | Filtering by a field the enumeration element does not have. The message lists the available fields |\n| 400 | `UNKNOWN_SORT_FIELD` | Sorting by a field the enumeration element does not have. The message lists the available fields |\n| 403 | `SCOPE_DENIED` | The API key does not carry the `catalog` scope |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header was not sent |\n| 429 | `RATE_LIMITED` | Rate limit exceeded: 300 requests per minute per portal. All API keys of the portal share one limit. The current limit is returned in the `x-ratelimit-limit` header. Retry after the delay in the `Retry-After` header |\n\nFor the full list of common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [List values](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Flist)\n- [Get a value](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fget)\n- [Value fields](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Ffields)\n- [Catalog product properties](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [Filtering syntax](\u002Fdocs\u002Ffiltering)\n- [API reference](\u002Fdocs\u002Fapi-reference)\n","\n## Value fields\n\n`GET \u002Fv1\u002Fcatalog-product-property-enums\u002Ffields`\n\nReturns the field reference of an enumeration element with types and field write permissions, plus the operations available in a batch request.\n\nThe response is assembled from the static entity schema — Bitrix24 is not called.\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth application\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Fields:', Object.keys(data.fields).length)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-product-property-enums\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\n```\n\n## Response fields\n\n`data.fields` is an object whose key matches the field name and whose value carries `type`, `readonly`, and the human-readable `label` and `description`. `data.batch` lists the **write** operations available in a [batch request](\u002Fdocs\u002Fbatch); for this entity it contains `create`, `update`, and `delete`. That does not rule out reads in a batch: the `list` and `get` sub-calls through [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) and `POST \u002Fv1\u002Fcatalog-product-property-enums\u002Fbatch` work. The `fields` sub-call is accepted in a batch too, but for this entity it answers `200` with an **empty object** — Bitrix24 is not called and the field reference cannot be obtained that way. Fetch it with a standalone `GET \u002Fv1\u002Fcatalog-product-property-enums\u002Ffields` request.\n\nThe `label` and `description` field captions are returned in English. Request headers do not switch the language.\n\n| Field | Type | RO | Description |\n|------|-----|:--:|---------|\n| `id` | number | yes | Identifier of the enumeration element. This is the value a [catalog product](\u002Fdocs\u002Fentities\u002Fcatalog-products) carries in `propertyNNN.value` |\n| `propertyId` | number | no | Identifier of the owning property. Required in the list and search filter |\n| `value` | string | no | Readable text of the option — the same text a product returns in `propertyNNN.valueEnum` |\n| `def` | boolean | no | Whether this option is the property's default value |\n| `sort` | number | no | Sort index within the property |\n| `xmlId` | string | no | External code. Comes back as `null` when not set |\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data.fields.\u003Cname>.type` | string | Field type: `number`, `string`, `boolean` |\n| `data.fields.\u003Cname>.readonly` | boolean | `true` for `id`; other fields are writable |\n| `data.fields.\u003Cname>.label` | string | Human-readable field name |\n| `data.fields.\u003Cname>.description` | string | Explanation of the field |\n| `data.batch` | string[] | Write operations available in a [batch request](\u002Fdocs\u002Fbatch). For this entity: `create`, `update`, `delete`; read sub-calls also work |\n\n## Response example\n\n`label` and `description` are shown for the first field only and omitted elsewhere for brevity.\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"fields\": {\n      \"id\": {\n        \"type\": \"number\",\n        \"readonly\": true,\n        \"label\": \"ID\",\n        \"description\": \"Identifier of the enumeration element. This is the value that a product's propertyNNN.value carries.\"\n      },\n      \"propertyId\": { \"type\": \"number\" },\n      \"value\": { \"type\": \"string\" },\n      \"def\": { \"type\": \"boolean\" },\n      \"sort\": { \"type\": \"number\" },\n      \"xmlId\": { \"type\": \"string\", \"nullable\": true }\n    },\n    \"batch\": [\"create\", \"update\", \"delete\"]\n  }\n}\n```\n\n## Error response example\n\n403 — no scope:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SCOPE_DENIED\",\n    \"message\": \"This endpoint requires 'catalog' scope\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 403 | `SCOPE_DENIED` | The API key does not carry the `catalog` scope |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header was not sent |\n| 429 | `RATE_LIMITED` | Rate limit exceeded: 300 requests per minute per portal. All API keys of the portal share one limit. The current limit is returned in the `x-ratelimit-limit` header. Retry after the delay in the `Retry-After` header |\n\nFor the full list of common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**Only `id` is read-only.** `POST`, `PATCH`, and `DELETE` are available; `POST \u002Faggregate` remains unavailable. `data.batch` contains the three write actions. Read sub-calls in a [batch request](\u002Fdocs\u002Fbatch) remain available.\n\n**Only properties of type `L` have an enumeration.** For a property of any other type (`S`, `N`, `F`, `E`, `G`) the option list is empty, and a write is rejected by Bitrix24. The property type is read from [`GET \u002Fv1\u002Fcatalog-product-properties\u002F:id`](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties\u002Fget) in the `propertyType` field.\n\n**Relation to product fields.** A list-property value arrives on a [catalog product](\u002Fdocs\u002Fentities\u002Fcatalog-products) in the field `propertyNNN`, where `NNN` is the property `id`. Inside are `value` (the enumeration element id, as a string), `valueEnum` (the ready-made text), and `valueId` (the value row id). Match with `String(element.id) === product.propertyNNN.value`.\n\n## See also\n\n- [List values](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Flist)\n- [Get a value](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fget)\n- [Search values](\u002Fdocs\u002Fentities\u002Fcatalog-product-property-enums\u002Fsearch)\n- [Catalog product properties](\u002Fdocs\u002Fentities\u002Fcatalog-product-properties)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [API reference](\u002Fdocs\u002Fapi-reference)\n",1794739332941]