[{"data":1,"prerenderedAt":14},["ShallowReactive",2],{"docs-entities\u002Fcatalog-measures":3,"docs-tabs-entities\u002Fcatalog-measures":6},{"content":4,"lastmod":5},"# Catalog measures\n\nReference list of units of measure in the product catalog: pieces, kilograms, liters, and other units in which product quantity is specified. The unit identifier is passed in a product's `measure` field.\n\nBitrix24 API: `catalog.measure.*`\nScope: `catalog`\n\n## Operations\n\n- [Create a unit of measure](.\u002Fcatalog-measures\u002Fcreate.md) — `POST \u002Fv1\u002Fcatalog-measures`\n- [List units of measure](.\u002Fcatalog-measures\u002Flist.md) — `GET \u002Fv1\u002Fcatalog-measures`\n- [Get a unit of measure](.\u002Fcatalog-measures\u002Fget.md) — `GET \u002Fv1\u002Fcatalog-measures\u002F:id`\n- [Update a unit of measure](.\u002Fcatalog-measures\u002Fupdate.md) — `PATCH \u002Fv1\u002Fcatalog-measures\u002F:id`\n- [Delete a unit of measure](.\u002Fcatalog-measures\u002Fdelete.md) — `DELETE \u002Fv1\u002Fcatalog-measures\u002F:id`\n- [Search units of measure](.\u002Fcatalog-measures\u002Fsearch.md) — `POST \u002Fv1\u002Fcatalog-measures\u002Fsearch`\n- [Unit of measure fields](.\u002Fcatalog-measures\u002Ffields.md) — `GET \u002Fv1\u002Fcatalog-measures\u002Ffields`\n\n## Key fields\n\n| Field | Description |\n|------|---------|\n| `id` | Measure identifier. Pass it in a product's `measure` field |\n| `code` | Unit code from the Russian National Classifier of Units of Measurement (OKEI), an integer. Unique within the Bitrix24 account |\n| `measureTitle` | Measure name |\n| `symbol` | Short symbol |\n| `symbolIntl` | International symbol |\n| `symbolLetterIntl` | International letter symbol |\n| `isDefault` | Default measure: `Y` or `N` |\n\nFull field list: [`GET \u002Fv1\u002Fcatalog-measures\u002Ffields`](.\u002Fcatalog-measures\u002Ffields.md).\n\n## What to know before you start\n\n1. **The request body is flat.** On create and update, fields go in the JSON root: `{\"code\": 9001, \"measureTitle\": \"Package\"}`. No `fields` wrapper is needed.\n2. **Creation requires two fields:** `code` and `measureTitle`. The code is unique within the Bitrix24 account: reusing an existing `code` returns `422 BITRIX_ERROR` with the message `Duplicate entry for key [code]`.\n3. **The name can be empty.** For some measures `measureTitle` and `symbol` come back as `null`, and the symbol is filled only in `symbolIntl` and `symbolLetterIntl`. On the tested Bitrix24 account this applies to five standard measures: meter, liter, gram, kilogram, and piece. For display, use `measureTitle`, and fall back to `symbolIntl` when it is `null`.\n4. **There is one default measure.** The value `isDefault: \"Y\"` is set on exactly one measure in the Bitrix24 account.\n5. **Values are validated before the write.** A fractional `code` or an `isDefault` other than `Y` or `N` is rejected with `400 INVALID_PARAMS`, and no record is created or changed.\n6. **Batch writes do not accept `null`.** A field with the value `null` in a batch is rejected: `POST \u002Fv1\u002Fcatalog-measures\u002Fbatch` returns `400 BATCH_ITEM_VALIDATION`, and a call inside `POST \u002Fv1\u002Fbatch` is rejected with the code `INVALID_PARAMS` in `data.errors`. To clear `symbol`, `symbolIntl`, or `symbolLetterIntl`, send a single [`PATCH \u002Fv1\u002Fcatalog-measures\u002F:id`](.\u002Fcatalog-measures\u002Fupdate.md).\n\n## Typical scenario\n\nAdding a product in your own unit of measure:\n\n1. Check whether the measure exists: [`GET \u002Fv1\u002Fcatalog-measures?filter[code]=778`](.\u002Fcatalog-measures\u002Flist.md).\n2. If it does not, create it: [`POST \u002Fv1\u002Fcatalog-measures`](.\u002Fcatalog-measures\u002Fcreate.md) with `code` and `measureTitle`, and take `id` from the response.\n3. Pass this `id` in the `measure` field when creating the product: [`POST \u002Fv1\u002Fcatalog-products`](\u002Fdocs\u002Fentities\u002Fcatalog-products\u002Fcreate).\n\n## Limits\n\n| Limit | Value |\n|-------|----------|\n| Maximum records per request | 5000 (`limit ≤ 5000`) |\n| Automatic pagination | enabled when `limit > 50` |\n| Single-entity batch | [`POST \u002Fv1\u002Fcatalog-measures\u002Fbatch`](\u002Fdocs\u002Fentity-api) — write actions `create`, `update`, `delete` |\n| Batch requests | up to 50 operations in [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) |\n| Request rate | shared across the Vibecode API — see [Limits and optimization](\u002Fdocs\u002Foptimization) |\n\n## See also\n\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [CRM products](\u002Fdocs\u002Fentities\u002Fproducts)\n- [Catalog VAT rates](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n- [Filtering syntax](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [API reference](\u002Fdocs\u002Fapi-reference)\n","2026-10-08",{"catalog-measures\u002Fcreate.md":7,"catalog-measures\u002Flist.md":8,"catalog-measures\u002Fget.md":9,"catalog-measures\u002Fupdate.md":10,"catalog-measures\u002Fdelete.md":11,"catalog-measures\u002Fsearch.md":12,"catalog-measures\u002Ffields.md":13},"## Create a unit of measure\n\n`POST \u002Fv1\u002Fcatalog-measures`\n\nAdds a new unit of measure to the product catalog directory so that product quantities can be expressed in it. The request body is flat — no `fields` wrapper.\n\n## Request fields (body)\n\n| Field | Type | Required | Description |\n|------|-----|:-----:|---------|\n| `code` | number | yes | Unit code in the Russian National Classifier of Units of Measurement (OKEI), an integer. Unique within the Bitrix24 account. Codes already in use — see [`GET \u002Fv1\u002Fcatalog-measures`](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Flist) |\n| `measureTitle` | string | yes | Unit of measure name |\n| `symbol` | string | no | Short symbol, for example `pkg` |\n| `symbolIntl` | string | no | International symbol |\n| `symbolLetterIntl` | string | no | International letter code, for example `PCE` |\n| `isDefault` | string | no | Default unit: `Y` or `N`. If the field is omitted, the unit is created with `N` |\n\nFull field list — [`GET \u002Fv1\u002Fcatalog-measures\u002Ffields`](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Ffields).\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"code\": 9917,\n    \"measureTitle\": \"Documentation test\",\n    \"symbol\": \"dt\",\n    \"symbolIntl\": \"td\",\n    \"symbolLetterIntl\": \"TDC\"\n  }'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"code\": 9917,\n    \"measureTitle\": \"Documentation test\",\n    \"symbol\": \"dt\",\n    \"symbolIntl\": \"td\",\n    \"symbolLetterIntl\": \"TDC\"\n  }'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    code: 9917,\n    measureTitle: 'Documentation test',\n    symbol: 'dt',\n    symbolIntl: 'td',\n    symbolLetterIntl: 'TDC',\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Measure ID:', data.id)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures', {\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    code: 9917,\n    measureTitle: 'Documentation test',\n    symbol: 'dt',\n    symbolIntl: 'td',\n    symbolLetterIntl: 'TDC',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Response fields\n\nThe response comes with status `201` and contains the full created record.\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data.id` | number | ID of the created unit. Pass it in the product's `measure` field |\n| `data.code` | number | OKEI unit code |\n| `data.measureTitle` | string | Unit of measure name |\n| `data.symbol` | string \\| null | Short symbol. `null` if not provided |\n| `data.symbolIntl` | string \\| null | International symbol. `null` if not provided |\n| `data.symbolLetterIntl` | string \\| null | International letter code. `null` if not provided |\n| `data.isDefault` | string | `Y` — default unit, `N` — not default |\n| `meta.warnings` | array | Present only if the body contains a field that is not among the unit of measure fields. Each entry carries `code: \"UNRECOGNIZED_WRITE_FIELD\"`, `field` with the field name, and `message`. On a route that wraps the field map itself, an object under `fields` is rejected with `400 NESTED_FIELDS_ENVELOPE` when the schema does not declare `fields`; pass fields flat at the JSON root. |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"code\": 9917,\n    \"id\": 17,\n    \"isDefault\": \"N\",\n    \"measureTitle\": \"Documentation test\",\n    \"symbol\": \"dt\",\n    \"symbolIntl\": \"td\",\n    \"symbolLetterIntl\": \"TDC\"\n  }\n}\n```\n\n## Error response example\n\n400 — fractional unit code, the record is not created:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"Field \\\"code\\\" must be an integer; Bitrix24 silently truncates fractional values.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `MISSING_REQUIRED_FIELDS` | `code` or `measureTitle` is missing. The message names the first missing field, for example `Body field \"code\" is required to create catalogMeasure.` |\n| 400 | `NESTED_FIELDS_ENVELOPE` | The body contains an object under `fields` instead of root-level fields; the unit is not created |\n| 400 | `INVALID_PARAMS` | `code` is not an integer, for example `9917.5` |\n| 400 | `INVALID_PARAMS` | `isDefault` is neither `Y` nor `N` |\n| 422 | `BITRIX_ERROR` | A unit with this `code` already exists in the Bitrix24 account. The message is `Duplicate entry for key [code]`, and the response also carries `error.b24Code` |\n| 403 | `SCOPE_DENIED` | The API key does not have the `catalog` scope |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**An unknown scalar field does not stop creation.** If the body contains an unknown scalar field alongside `code` and `measureTitle`, the unit is created with status `201`, and a warning in `meta.warnings` reports that the field may not have been saved. An object under `fields` is rejected with `400 NESTED_FIELDS_ENVELOPE` before creation: send fields at the JSON root. Check field names against [`GET \u002Fv1\u002Fcatalog-measures\u002Ffields`](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Ffields), and verify the result by checking the values in `data`, not just `success`.\n\n## See also\n\n- [List units of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Flist)\n- [Get a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fget)\n- [Update a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fupdate)\n- [Delete a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fdelete)\n- [Unit of measure fields](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Ffields)\n- [Create a catalog product](\u002Fdocs\u002Fentities\u002Fcatalog-products\u002Fcreate)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Limits and optimization](\u002Fdocs\u002Foptimization)\n","## List units of measure\n\n`GET \u002Fv1\u002Fcatalog-measures`\n\nReturns the list of commercial catalog units of measure.\n\n## Parameters\n\n| Parameter | Type | Default | Description |\n|----------|-----|-----------|---------|\n| `limit` (query) | number | `50` | Number of records, from 1 to 5000. A non-numeric value is replaced with `50` |\n| `offset` (query) | number | `0` | Skip N records. The value does not have to be a multiple of the page size: `?offset=4` starts the output at the fifth record |\n| `select` (query) | string | — | Comma-separated field selection: `?select=id,code`. Field names come from [`GET \u002Fv1\u002Fcatalog-measures\u002Ffields`](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Ffields) |\n| `sort` (query) | string | `id` | Shorthand sorting: `?sort=-code`. A minus sign indicates descending order. Without the parameter, records are sorted by `id` ascending |\n| `order` (query) | object | — | Sorting in object form: `?order[code]=desc` |\n| `filter` (query) | object | — | Filtering by the fields of `GET \u002Fv1\u002Fcatalog-measures\u002Ffields`.\u003Cbr>[Filtering syntax](\u002Fdocs\u002Ffiltering). Example: `?filter[code]=796` |\n| `withTotal` (query) | string | — | Whether to return the record count: `true` or `false`. The parameter is accepted but does not affect the unit of measure output: `meta.total` is always returned. [Paging and counts](\u002Fdocs\u002Fentity-api#paging-and-record-counts) |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -g \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures?sort=-code&limit=3\" \\\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-measures?sort=-code&limit=3\" \\\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-measures?sort=-code&limit=3', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Found ${meta.total} units of measure`)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures?sort=-code&limit=3', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\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 units of measure |\n| `data[].id` | number | Unit identifier. It is passed in the product's `measure` field |\n| `data[].code` | number | Unit code in the Russian National Classifier of Units of Measurement (OKEI) |\n| `data[].measureTitle` | string \\| null | Unit of measure name |\n| `data[].symbol` | string \\| null | Short symbol |\n| `data[].symbolIntl` | string \\| null | International symbol |\n| `data[].symbolLetterIntl` | string \\| null | International letter symbol |\n| `data[].isDefault` | string | Default unit: `Y` or `N` |\n| `meta.total` | number | Number of records matching the filter. Always returned, including with `withTotal=false` |\n| `meta.hasMore` | boolean | Whether more records exist beyond `limit` |\n| `meta.warnings` | array | Request parsing warnings. Returned when `select` contains a name outside the schema — code `UNKNOWN_SELECT_FIELD`, with the field name in `field`. With `limit=0` — code `LIMIT_ZERO_IGNORED`: the value is not applied and the default page is returned |\n\n## Response example\n\nRequest `?sort=-code&limit=3`:\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"code\": 796,\n      \"id\": 9,\n      \"isDefault\": \"Y\",\n      \"measureTitle\": null,\n      \"symbol\": null,\n      \"symbolIntl\": \"pc. 1\",\n      \"symbolLetterIntl\": \"PCE. NMB\"\n    },\n    {\n      \"code\": 166,\n      \"id\": 7,\n      \"isDefault\": \"N\",\n      \"measureTitle\": null,\n      \"symbol\": null,\n      \"symbolIntl\": \"kg\",\n      \"symbolLetterIntl\": \"KGM\"\n    },\n    {\n      \"code\": 163,\n      \"id\": 5,\n      \"isDefault\": \"N\",\n      \"measureTitle\": null,\n      \"symbol\": null,\n      \"symbolIntl\": \"g\",\n      \"symbolLetterIntl\": \"GRM\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 6,\n    \"hasMore\": true\n  }\n}\n```\n\n## Error response example\n\n400 — a filter on a field that is not in the schema:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"UNKNOWN_FILTER_FIELD\",\n    \"message\": \"Unknown filter field 'nope' for entity 'catalog-measures'. Available: id, code, measureTitle, symbol, symbolIntl, symbolLetterIntl, isDefault\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `UNKNOWN_FILTER_FIELD` | A filter on a field that is not in the unit of measure schema. The message lists the available fields |\n| 400 | `UNKNOWN_SORT_FIELD` | Sorting by a field that is not in the schema. The message lists the available fields |\n| 400 | `INVALID_FILTER` | Two filter forms are mixed in one request — `filter[field]=…` and `filter={...}`. Pass all conditions in one form |\n| 400 | `INVALID_FILTER` | The `filter` value is neither bracket notation nor a JSON object, for example `?filter=notjson`. Such a filter cannot be applied, so the request is rejected |\n| 400 | `INVALID_FILTER_OPERATOR` | Unknown operator in a filter condition, for example `$foo`. The message lists the supported operators |\n| 400 | `INVALID_FILTER_OPERATOR` | A logical key `$or`, `$and` or `$not` in the filter. An OR condition on one field is expressed with the `$in` operator, across different fields — with parallel requests through [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) |\n| 403 | `SCOPE_DENIED` | The API key does not have the `catalog` scope |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |\n| 429 | `RATE_LIMITED` | Request limit exceeded: 300 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 interval given in the `Retry-After` header |\n\nFor the full list of common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**An unknown name in `select` does not reject the request.** Unlike `filter` and `sort`, the response comes with code `200`: the records keep only the schema fields, and `meta.warnings` gets an `UNKNOWN_SELECT_FIELD` warning. Check `meta.warnings` so that a typo in a field name does not go unnoticed.\n\n## See also\n\n- [Search units of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fsearch)\n- [Get a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fget)\n- [Create a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fcreate)\n- [Unit of measure fields](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Ffields)\n- [Filtering syntax](\u002Fdocs\u002Ffiltering)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n- [Limits and optimization](\u002Fdocs\u002Foptimization)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n","## Get a unit of measure\n\n`GET \u002Fv1\u002Fcatalog-measures\u002F:id`\n\nReturns a single catalog unit of measure by its ID.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | yes | Unit of measure identifier, a non-negative integer. List: [`GET \u002Fv1\u002Fcatalog-measures`](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Flist) |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\u002F9\" \\\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-measures\u002F9\" \\\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-measures\u002F9', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Measure:', data.measureTitle ?? data.symbolIntl, '— code', data.code)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\u002F9', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Measure:', data.measureTitle ?? data.symbolIntl, '— code', data.code)\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data.id` | number | Unit of measure identifier. Pass it in a product's `measure` field |\n| `data.code` | number | Unit code in the Russian National Classifier of Units of Measurement (OKEI), an integer. Unique within the Bitrix24 account |\n| `data.measureTitle` | string \\| null | Unit of measure name. Can be `null` — the designation is then set in `symbolIntl` and `symbolLetterIntl` |\n| `data.symbol` | string \\| null | Short designation |\n| `data.symbolIntl` | string \\| null | International designation |\n| `data.symbolLetterIntl` | string \\| null | International letter designation |\n| `data.isDefault` | string | Whether this is the default unit in the Bitrix24 account: `Y` or `N` |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"code\": 796,\n    \"id\": 9,\n    \"isDefault\": \"Y\",\n    \"measureTitle\": null,\n    \"symbol\": null,\n    \"symbolIntl\": \"pc. 1\",\n    \"symbolLetterIntl\": \"PCE. NMB\"\n  }\n}\n```\n\n## Error response example\n\n404 — no unit of measure with this `id`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"measure does not exist.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | No unit of measure with this `id` exists in the Bitrix24 account, including a deleted one |\n| 400 | `INVALID_PARAMS` | `id` is not a non-negative integer, for example `abc`. The request is rejected before execution, and no data in the Bitrix24 account changes |\n| 403 | `SCOPE_DENIED` | The API key lacks the `catalog` scope |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [List units of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Flist)\n- [Update a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fupdate)\n- [Delete a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fdelete)\n- [Unit of measure fields](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Ffields)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [Limits and optimization](\u002Fdocs\u002Foptimization)\n","## Update a unit of measure\n\n`PATCH \u002Fv1\u002Fcatalog-measures\u002F:id`\n\nPartially updates an existing unit of measure in the product catalog reference list. Send only the fields you change. The body is flat, with no `fields` wrapper.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | yes | Unit of measure ID. List: [`GET \u002Fv1\u002Fcatalog-measures`](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Flist) |\n\n## Request fields (body)\n\n| Field | Type | Required | Description |\n|------|-----|:-----:|---------|\n| `code` | number | no | Unit code from the Russian National Classifier of Units of Measurement (OKEI), an integer. Unique within the Bitrix24 account. `null` is not accepted |\n| `measureTitle` | string | no | Unit of measure name |\n| `symbol` | string \\| null | no | Short symbol. `null` clears the field |\n| `symbolIntl` | string \\| null | no | International symbol. `null` clears the field |\n| `symbolLetterIntl` | string \\| null | no | International letter symbol. `null` clears the field |\n| `isDefault` | string | no | Default unit: `Y` or `N`. `null` is not accepted |\n| `id` | number | no | `RO`. The ID is set in the path only. In the body it is rejected with `400 READONLY_FIELD` |\n\nClearing with `null` works only in a single request. For the batch write limitation, see [Catalog units of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures).\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\u002F17\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"measureTitle\": \"Documentation test 2\"\n  }'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\u002F17\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"measureTitle\": \"Documentation test 2\"\n  }'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\u002F17', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    measureTitle: 'Documentation test 2',\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Measure title:', data.measureTitle)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\u002F17', {\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    measureTitle: 'Documentation test 2',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Response fields\n\nThe response returns the full record after the update, including the fields that did not change.\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data.id` | number | Unit of measure ID |\n| `data.code` | number | OKEI unit code |\n| `data.measureTitle` | string \\| null | Unit of measure name |\n| `data.symbol` | string \\| null | Short symbol |\n| `data.symbolIntl` | string \\| null | International symbol |\n| `data.symbolLetterIntl` | string \\| null | International letter symbol |\n| `data.isDefault` | string | `Y` — default unit, `N` — not default |\n| `meta.warnings` | array | Present only if the body contains a field that is not among the unit of measure fields. Each element has `code: \"UNRECOGNIZED_WRITE_FIELD\"`, `field` with the field name, and `message`. On a route that wraps the field map itself, an object under `fields` is rejected with `400 NESTED_FIELDS_ENVELOPE` when the schema does not declare `fields`; pass fields flat at the JSON root. |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"code\": 9917,\n    \"id\": 17,\n    \"isDefault\": \"N\",\n    \"measureTitle\": \"Documentation test 2\",\n    \"symbol\": \"dt\",\n    \"symbolIntl\": \"td\",\n    \"symbolLetterIntl\": \"TDC\"\n  }\n}\n```\n\n## Error response example\n\n404 — no unit of measure with this `id`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"measure does not exist.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | No unit of measure with this `id` exists on the portal |\n| 400 | `INVALID_PARAMS` | The path `id` is not a non-negative integer. The message is `id must be a non-negative integer` |\n| 400 | `INVALID_PARAMS` | `code` is not an integer, for example `1.5` |\n| 400 | `INVALID_PARAMS` | `null` is passed in `code` or `isDefault` |\n| 400 | `INVALID_PARAMS` | `isDefault` is neither `Y` nor `N` |\n| 400 | `EMPTY_UPDATE_BODY` | The request body is empty. Pass at least one field |\n| 400 | `NESTED_FIELDS_ENVELOPE` | The body contains an object under `fields` instead of root-level fields; the unit is not updated |\n| 400 | `READONLY_FIELD` | `id` is passed in the body |\n| 422 | `BITRIX_ERROR` | The new `code` is already taken by another unit on the portal. The message is `Duplicate entry for key [code]`, and the response also contains `error.b24Code` |\n| 403 | `SCOPE_DENIED` | The API key does not have the `catalog` scope |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |\n\nFor the full list of common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**An unknown scalar field does not stop the request.** If the body contains only an unknown scalar field, the response comes back with status `200`, the record does not change, and a warning in `meta.warnings` reports the skipped field. An object under `fields` is rejected with `400 NESTED_FIELDS_ENVELOPE` before the update: pass fields at the JSON root. Check field names against [`GET \u002Fv1\u002Fcatalog-measures\u002Ffields`](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Ffields), and verify success by the values in `data`, not only by `success`.\n\n## See also\n\n- [Get a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fget)\n- [Create a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fcreate)\n- [List units of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Flist)\n- [Delete a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fdelete)\n- [Unit of measure fields](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Ffields)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Limits and optimization](\u002Fdocs\u002Foptimization)\n","## Delete a unit of measure\n\n`DELETE \u002Fv1\u002Fcatalog-measures\u002F:id`\n\nDeletes a commercial catalog unit of measure by its identifier. A deleted record cannot be restored through the API. Create a new one if needed.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | yes | Unit of measure identifier, a non-negative integer. List: [`GET \u002Fv1\u002Fcatalog-measures`](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Flist) |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\u002F17\" \\\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-measures\u002F17\" \\\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-measures\u002F17', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Unit of measure deleted')\n}\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\u002F17', {\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('Unit of measure deleted')\n}\n```\n\n## Response\n\nA successful deletion returns HTTP status `204 No Content` with an empty body. Success is indicated by the status code, not the body.\n\n## Response example\n\n```http\nHTTP\u002F1.1 204 No Content\n```\n\n## Error response example\n\n404 — no unit of measure with this `id` exists, for example when the same unit is deleted twice:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"measure does not exist.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | No unit of measure with this `id` exists on the Bitrix24 account, including one already deleted |\n| 400 | `INVALID_PARAMS` | `id` is not a non-negative integer, for example `abc`. The request is rejected before execution, and no data on the Bitrix24 account changes |\n| 403 | `SCOPE_DENIED` | The API key does not have the `catalog` scope |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |\n\nFull list of common API errors — [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [Create a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fcreate)\n- [Get a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fget)\n- [List units of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Flist)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [Batch](\u002Fdocs\u002Fbatch)\n","## Search units of measure\n\n`POST \u002Fv1\u002Fcatalog-measures\u002Fsearch`\n\nSearches product catalog units of measure by conditions passed in the request body as a JSON object.\n\n## Request fields (body)\n\n| Field | Type | Required | Description |\n|------|-----|-------|----------|\n| `filter` | object | no | Filtering by the fields from `GET \u002Fv1\u002Fcatalog-measures\u002Ffields`.\u003Cbr>[Filtering syntax](\u002Fdocs\u002Ffiltering). Example: `{\"isDefault\": \"N\"}` |\n| `sort` | string \\| object \\| array | no | Sorting as a string `\"-code\"`, where the minus means descending, as an object `{\"code\": \"desc\"}`, or as an array of strings `[\"-code\"]`. If omitted, records are sorted by `id` in ascending order |\n| `order` | object | no | Synonym of `sort` in object form: `{\"code\": \"desc\"}` |\n| `select` | string[] | no | Field selection: `[\"id\", \"code\"]`. A comma-separated string is also accepted: `\"id,code\"` |\n| `limit` | number | no | Number of records, from 1 to 5000. Default `50` |\n| `offset` | number | no | Skip N records. Default `0` |\n| `autoWindow` | boolean | no | Split the result set into date windows. The unit of measure schema has no date fields, so the value does not affect the result |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"isDefault\": \"N\" },\n    \"sort\": \"-code\",\n    \"limit\": 2\n  }'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\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\": { \"isDefault\": \"N\" },\n    \"sort\": \"-code\",\n    \"limit\": 2\n  }'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\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: { isDefault: 'N' },\n    sort: '-code',\n    limit: 2,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log('Found:', meta.total)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\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: { isDefault: 'N' },\n    sort: '-code',\n    limit: 2,\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 units of measure |\n| `data[].id` | number | Unit identifier. Pass it in the product's `measure` field |\n| `data[].code` | number | Unit code in the Russian National Classifier of Units of Measurement (OKEI) |\n| `data[].measureTitle` | string \\| null | Unit of measure name |\n| `data[].symbol` | string \\| null | Short symbol |\n| `data[].symbolIntl` | string \\| null | International symbol |\n| `data[].symbolLetterIntl` | string \\| null | International letter code |\n| `data[].isDefault` | string | Default unit: `Y` or `N` |\n| `meta.total` | number | Number of records matching the filter |\n| `meta.hasMore` | boolean | Whether there are more records beyond `limit` |\n| `meta.durationMs` | number | Request duration in milliseconds |\n| `meta.warnings` | array | Request parsing warnings. Present when `select` contains a name outside the schema (code `UNKNOWN_SELECT_FIELD`) or when `limit: 0` is passed (code `LIMIT_ZERO_IGNORED`: the value is ignored and the default page is returned) |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"code\": 166,\n      \"id\": 7,\n      \"isDefault\": \"N\",\n      \"measureTitle\": null,\n      \"symbol\": null,\n      \"symbolIntl\": \"kg\",\n      \"symbolLetterIntl\": \"KGM\"\n    },\n    {\n      \"code\": 163,\n      \"id\": 5,\n      \"isDefault\": \"N\",\n      \"measureTitle\": null,\n      \"symbol\": null,\n      \"symbolIntl\": \"g\",\n      \"symbolLetterIntl\": \"GRM\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 5,\n    \"hasMore\": true,\n    \"durationMs\": 192\n  }\n}\n```\n\n## Error response example\n\n400 — sorting by a field that is not in the schema:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"UNKNOWN_SORT_FIELD\",\n    \"message\": \"Unknown sort field 'nope' for entity 'catalog-measures'. Available: id, code, measureTitle, symbol, symbolIntl, symbolLetterIntl, isDefault\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 400 | `UNKNOWN_FILTER_FIELD` | Filtering by a field that is not in the unit of measure schema. The message lists the available fields |\n| 400 | `UNKNOWN_SORT_FIELD` | Sorting by a field that is not in the schema. The message lists the available fields |\n| 400 | `INVALID_FILTER_OPERATOR` | Unknown operator in a filter condition, for example `$foo`. The message lists the supported operators |\n| 400 | `INVALID_FILTER_OPERATOR` | A logical key `$or`, `$and`, or `$not` in the filter. For an OR condition on one field, use the `$in` operator. For an OR across different fields, send parallel requests via [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) |\n| 400 | `INVALID_SORT_TYPE` | `sort` is not a string, an object, or an array of strings |\n| 400 | `INVALID_SELECT_TYPE` | `select` is not a string or an array of strings |\n| 400 | `INVALID_LIMIT` | `limit` is not a number |\n| 403 | `SCOPE_DENIED` | The API key lacks the `catalog` scope |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing |\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 units of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Flist)\n- [Get a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fget)\n- [Unit of measure fields](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Ffields)\n- [Filtering syntax](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Limits and optimization](\u002Fdocs\u002Foptimization)\n","## Unit of measure fields\n\n`GET \u002Fv1\u002Fcatalog-measures\u002Ffields`\n\nReturns the field schema of a catalog unit of measure: use it to check types and allowed values before creating or updating a record.\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\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-measures\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-measures\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))\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-measures\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()\nconsole.log('Fields:', Object.keys(data.fields))\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|-----|---------|\n| `success` | boolean | Always `true` on success |\n| `data.fields` | object | Map of unit of measure fields. The key is the field name; the value is its description |\n| `data.batch` | array | Write actions available in batch mode via `POST \u002Fv1\u002Fcatalog-measures\u002Fbatch`: `create`, `update`, `delete` |\n\nEach field in the `fields` map is described by the keys `type` and `readonly`, a `label` and a `description`. The `required: true` key is set on the fields required to create a record: `code` and `measureTitle`. The `nullable: true` key is set on fields whose value can come back as `null`. The `isDefault` field has an `enum` list of allowed values, each with a `label`. The `label` and `description` of the fields themselves come back in English.\n\n| Field | Type | RO | Description |\n|------|-----|:--:|---------|\n| `id` | number | yes | Unit of measure identifier. Pass it in the product's `measure` field |\n| `code` | number | | Unit code in the Russian National Classifier of Units of Measurement (OKEI), an integer. Unique within the Bitrix24 account. Required on create |\n| `measureTitle` | string \\| null | | Unit of measure name. Required on create, but some existing units return `null` — their designation is then provided in `symbolIntl` and `symbolLetterIntl` |\n| `symbol` | string \\| null | | Short designation. `null` if not set |\n| `symbolIntl` | string \\| null | | International designation. `null` if not set |\n| `symbolLetterIntl` | string \\| null | | International letter designation. `null` if not set |\n| `isDefault` | string | | Default unit on the Bitrix24 account: `Y` or `N`. Other values are rejected |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"fields\": {\n      \"id\": {\n        \"type\": \"number\",\n        \"readonly\": true,\n        \"label\": \"ID\",\n        \"description\": \"Measure identifier.\"\n      },\n      \"code\": {\n        \"type\": \"number\",\n        \"readonly\": false,\n        \"required\": true,\n        \"label\": \"OKEI code\",\n        \"description\": \"Unique OKEI measure code.\"\n      },\n      \"measureTitle\": {\n        \"type\": \"string\",\n        \"readonly\": false,\n        \"required\": true,\n        \"nullable\": true,\n        \"label\": \"Measure name\",\n        \"description\": \"Measure name.\"\n      },\n      \"symbol\": {\n        \"type\": \"string\",\n        \"readonly\": false,\n        \"nullable\": true,\n        \"label\": \"Symbol\",\n        \"description\": \"Short symbol.\"\n      },\n      \"symbolIntl\": {\n        \"type\": \"string\",\n        \"readonly\": false,\n        \"nullable\": true,\n        \"label\": \"International symbol\",\n        \"description\": \"International symbol.\"\n      },\n      \"symbolLetterIntl\": {\n        \"type\": \"string\",\n        \"readonly\": false,\n        \"nullable\": true,\n        \"label\": \"International letter symbol\",\n        \"description\": \"International letter symbol.\"\n      },\n      \"isDefault\": {\n        \"type\": \"string\",\n        \"readonly\": false,\n        \"label\": \"Default measure\",\n        \"description\": \"Y if this is the portal default, N otherwise. Only one measure can be default.\",\n        \"enum\": [\n          { \"value\": \"Y\", \"label\": \"Default\" },\n          { \"value\": \"N\", \"label\": \"Not default\" }\n        ]\n      }\n    },\n    \"batch\": [\"create\", \"update\", \"delete\"]\n  }\n}\n```\n\n## Error response example\n\n401 — API key not provided:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_API_KEY\",\n    \"message\": \"API key required. Pass via X-Api-Key header.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|-----|---------|\n| 403 | `SCOPE_DENIED` | The API key does not have the `catalog` scope |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is not provided |\n| 401 | `TOKEN_MISSING` | The API key has no configured tokens |\n| 429 | `RATE_LIMITED` | Request limit exceeded: 300 per minute per Bitrix24 account. All API keys of the account share one limit. The current limit is returned in the `x-ratelimit-limit` header. Retry after the interval given in the `Retry-After` header |\n\nFor the full list of common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [Create a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fcreate)\n- [Update a unit of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Fupdate)\n- [List units of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures\u002Flist)\n- [Catalog units of measure](\u002Fdocs\u002Fentities\u002Fcatalog-measures)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n",1794739327455]