[{"data":1,"prerenderedAt":14},["ShallowReactive",2],{"docs-entities\u002Fcatalog-vat-rates":3,"docs-tabs-entities\u002Fcatalog-vat-rates":6},{"content":4,"lastmod":5},"# Catalog VAT rates\n\nReference data for product catalog VAT rates: names, percentages, status, and sort order. Pass a rate's identifier as the product's `vatId`.\n\nBitrix24 API: `catalog.vat.*`\nScope: `catalog`\n\n## Operations\n\n- [Create a VAT rate](.\u002Fcatalog-vat-rates\u002Fcreate.md) — `POST \u002Fv1\u002Fcatalog-vat-rates`\n- [List VAT rates](.\u002Fcatalog-vat-rates\u002Flist.md) — `GET \u002Fv1\u002Fcatalog-vat-rates`\n- [Get a VAT rate](.\u002Fcatalog-vat-rates\u002Fget.md) — `GET \u002Fv1\u002Fcatalog-vat-rates\u002F:id`\n- [Update a VAT rate](.\u002Fcatalog-vat-rates\u002Fupdate.md) — `PATCH \u002Fv1\u002Fcatalog-vat-rates\u002F:id`\n- [Delete a VAT rate](.\u002Fcatalog-vat-rates\u002Fdelete.md) — `DELETE \u002Fv1\u002Fcatalog-vat-rates\u002F:id`\n- [Search VAT rates](.\u002Fcatalog-vat-rates\u002Fsearch.md) — `POST \u002Fv1\u002Fcatalog-vat-rates\u002Fsearch`\n- [VAT rate fields](.\u002Fcatalog-vat-rates\u002Ffields.md) — `GET \u002Fv1\u002Fcatalog-vat-rates\u002Ffields`\n\n## Key fields\n\n| Field | Description |\n|------|------|\n| `id` | VAT rate identifier. List: [`GET \u002Fv1\u002Fcatalog-vat-rates`](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist). Pass it as the product's `vatId`. |\n| `name` | VAT rate name. |\n| `rate` | VAT percentage. For an existing \"No VAT\" rate, this field may be `null`. |\n| `active` | Rate status: `Y` — active, `N` — inactive. |\n| `sort` | Sort order. |\n| `timestampX` | Modification date and time in ISO 8601 format. Set by Bitrix24. |\n\n## Before you start\n\n1. **The request body is flat.** On creation and update, send fields at the JSON root without a `fields` wrapper.\n2. **Creation requires `name` and `rate`.** The percentage may be fractional or `0`. Creating a rate with `rate: null` returns `400 MISSING_REQUIRED_FIELDS`.\n3. **A No VAT rate may have `rate: null`.** This occurs in existing records and differs from a numeric rate of `0`. PATCH with `rate: null` returns `422 BITRIX_ERROR` with `Required fields: rate`.\n4. **A single PATCH accepts only the fields to change.** Omitted `name` and `rate` are supplied from the current record. In a batch update, provide both fields in every item.\n5. **Values are validated before writing.** `active` accepts `Y` or `N`; `sort` must be an integer of at least `1`. `id` and `timestampX` are read-only. Sending them in the body returns `400 READONLY_FIELD`.\n6. **Before deleting a rate, check products that use it.** Find them by `vatId` in the [catalog product list](\u002Fdocs\u002Fentities\u002Fcatalog-products\u002Flist). To retain a record whose current `rate` is numeric, deactivate it with `active: \"N\"`. For an existing \"No VAT\" rate with `rate: null`, this PATCH is rejected with `422 BITRIX_ERROR` and `Required fields: rate`. The record remains active. An `active`-only PATCH cannot deactivate it while `rate` remains `null`.\n\n## Typical workflow\n\nSet up a rate for a product:\n\n1. Find a rate with [`GET \u002Fv1\u002Fcatalog-vat-rates?filter[active]=Y`](.\u002Fcatalog-vat-rates\u002Flist.md) or [search](.\u002Fcatalog-vat-rates\u002Fsearch.md).\n2. If the rate does not exist, [create it](.\u002Fcatalog-vat-rates\u002Fcreate.md).\n3. Pass the returned `id` as `vatId` when [creating a catalog product](\u002Fdocs\u002Fentities\u002Fcatalog-products\u002Fcreate).\n4. To change the name or percentage, [PATCH the rate](.\u002Fcatalog-vat-rates\u002Fupdate.md), then [read it](.\u002Fcatalog-vat-rates\u002Fget.md) to verify the result.\n\n## Limits\n\nList and search accept `limit` from 1 to 5000, with a default of `50`. Use `offset` and `meta.hasMore` to paginate. Vibecode fetches additional pages automatically when `limit > 50`.\n\nBatch writes are available through `POST \u002Fv1\u002Fcatalog-vat-rates\u002Fbatch` and the universal `POST \u002Fv1\u002Fbatch`. See [Batch calls](\u002Fdocs\u002Fbatch) for the procedure. Aggregation is not available for this reference entity.\n\n## See also\n\n- [VAT rate fields](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Ffields)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n- [Filtering syntax](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Limits and optimization](\u002Fdocs\u002Foptimization)\n","2026-10-09",{"catalog-vat-rates\u002Fcreate.md":7,"catalog-vat-rates\u002Flist.md":8,"catalog-vat-rates\u002Fget.md":9,"catalog-vat-rates\u002Fupdate.md":10,"catalog-vat-rates\u002Fdelete.md":11,"catalog-vat-rates\u002Fsearch.md":12,"catalog-vat-rates\u002Ffields.md":13},"## Create a VAT rate\n\n`POST \u002Fv1\u002Fcatalog-vat-rates`\n\nAdds a VAT rate to the product catalog's list of VAT rates. The request body is flat, without a `fields` wrapper.\n\n## Request body fields\n\n| Field | Type | Required | Description |\n|------|------|------|------|\n| `name` | string | yes | VAT rate name. |\n| `rate` | number | yes | VAT percentage. Fractional numbers and `0` are accepted. `null` is not accepted. |\n| `active` | string | no | Status: `Y` or `N`. Other values and `null` are rejected. |\n| `sort` | number | no | Sort order, an integer of at least `1`. `null` is not accepted. |\n\n`id` and `timestampX` are read-only. See [VAT rate fields](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Ffields) for the full list.\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n  \"name\": \"Docs VAT 2026-10-08\",\n  \"rate\": 7.5,\n  \"active\": \"N\",\n  \"sort\": 900\n}'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n  \"name\": \"Docs VAT 2026-10-08\",\n  \"rate\": 7.5,\n  \"active\": \"N\",\n  \"sort\": 900\n}'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    \"name\": \"Docs VAT 2026-10-08\",\n    \"rate\": 7.5,\n    \"active\": \"N\",\n    \"sort\": 900\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('ID:', data.id)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates', {\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    \"name\": \"Docs VAT 2026-10-08\",\n    \"rate\": 7.5,\n    \"active\": \"N\",\n    \"sort\": 900\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('ID:', data.id)\n```\n\n## Response fields\n\nThe response has status `201` and contains the complete created record.\n\n| Field | Type | Description |\n|------|------|------|\n| `success` | boolean | Always `true` on success. |\n| `data` | object | VAT rate object. |\n| `data.id` | number | VAT rate identifier. List: [`GET \u002Fv1\u002Fcatalog-vat-rates`](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist). Pass it as the product's `vatId`. |\n| `data.name` | string | VAT rate name. |\n| `data.rate` | number \\| null | VAT percentage. For an existing \"No VAT\" rate, this field may be `null`. |\n| `data.active` | string | Rate status: `Y` — active, `N` — inactive. |\n| `data.sort` | number | Sort order. |\n| `data.timestampX` | string | Modification date and time in ISO 8601 format. Set by Bitrix24. |\n| `meta.warnings` | array | For an unknown field name, contains an `UNRECOGNIZED_WRITE_FIELD` warning with `code`, `field`, and `message` keys. 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    \"active\": \"N\",\n    \"id\": 25,\n    \"name\": \"Docs VAT 2026-10-08\",\n    \"rate\": 7.5,\n    \"sort\": 900,\n    \"timestampX\": \"2026-10-08T18:49:59.000Z\"\n  }\n}\n```\n\n## Error response example\n\n400 — `rate` is missing. No record is created:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_REQUIRED_FIELDS\",\n    \"message\": \"Body field \\\"rate\\\" is required to create catalogVatRate.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|------|------|\n| 400 | `MISSING_REQUIRED_FIELDS` | `name` or `rate` is missing, `null`, or an empty string. The message names the first missing field. |\n| 400 | `INVALID_PARAMS` | An invalid field type, `active` outside `Y`\u002F`N`, or a fractional or non-positive `sort`. `active` and `sort` cannot be `null`. |\n| 400 | `READONLY_FIELD` | The body contains `id` or `timestampX`. Remove the field from the request. |\n| 422 | `BITRIX_ERROR` | Bitrix24 rejected the request. See `error.message` for the reason and `error.b24Code` for the original code. |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | Writes are blocked: the key is read-only. |\n| 403 | `SCOPE_DENIED` | The key does not have the `catalog` scope. |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing. |\n| 401 | `TOKEN_MISSING` | The key has no configured Bitrix24 tokens. For an OAuth application key, check the user session. |\n\nFor all common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**An unknown scalar field may not be saved.** It does not bypass required-field validation. The response may contain `meta.warnings` with `UNRECOGNIZED_WRITE_FIELD`. Check names against [VAT rate fields](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Ffields) and verify the values in `data`.\n\n## See also\n\n- [List VAT rates](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist)\n- [Get a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fget)\n- [Update a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fupdate)\n- [Delete a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fdelete)\n- [VAT rate fields](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Ffields)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Limits and optimization](\u002Fdocs\u002Foptimization)\n","## List VAT rates\n\n`GET \u002Fv1\u002Fcatalog-vat-rates`\n\nReturns VAT rates from the product catalog with filtering and sorting.\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. `?offset=1` starts with the second record. Multiples of 50 are not required. |\n| `select` (query) | string | — | Comma-separated fields to return: `?select=id,name,rate`. See [VAT rate fields](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Ffields) for names. |\n| `sort` (query) | string | `id` | Sort order: `?sort=-rate`, where minus means descending. Separate multiple fields with commas: `?sort=sort,id`. |\n| `order` (query) | object | — | Object-form sort order: `?order[rate]=desc`. If `sort` is also provided, it takes precedence. |\n| `filter` (query) | object | — | Filter by fields from `GET \u002Fv1\u002Fcatalog-vat-rates\u002Ffields`.\u003Cbr>[Filtering syntax](\u002Fdocs\u002Ffiltering). Example: `?filter[active]=Y`. |\n| `withTotal` (query) | string | — | Request the record count: `true` or `false`. For this reference entity, `false` does not suppress `meta.total`. [Pagination and record counts](\u002Fdocs\u002Fentity-api). |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -g \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates?filter[id]=25&limit=1&withTotal=true\" \\\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-vat-rates?filter[id]=25&limit=1&withTotal=true\" \\\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-vat-rates?filter[id]=25&limit=1&withTotal=true', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(data, meta.hasMore)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates?filter[id]=25&limit=1&withTotal=true', {\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()\nconsole.log(data, meta.hasMore)\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|------|------|\n| `success` | boolean | Always `true` on success. |\n| `data` | array | Array of VAT rates. |\n| `data[].id` | number | VAT rate identifier. List: [`GET \u002Fv1\u002Fcatalog-vat-rates`](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist). Pass it as the product's `vatId`. |\n| `data[].name` | string | VAT rate name. |\n| `data[].rate` | number \\| null | VAT percentage. For an existing \"No VAT\" rate, this field may be `null`. |\n| `data[].active` | string | Rate status: `Y` — active, `N` — inactive. |\n| `data[].sort` | number | Sort order. |\n| `data[].timestampX` | string | Modification date and time in ISO 8601 format. Set by Bitrix24. |\n| `meta.total` | number | Number of rates matching the filter. Returned even with `withTotal=false`. |\n| `meta.hasMore` | boolean | Whether more rates exist beyond `limit`. |\n| `meta.warnings` | array | Present when there are warnings: `UNKNOWN_SELECT_FIELD` for an unknown name in `select`, `LIMIT_ZERO_IGNORED` when `limit` is `0` and the default is used. |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"active\": \"N\",\n      \"id\": 25,\n      \"name\": \"Docs VAT 2026-10-08\",\n      \"rate\": 7.5,\n      \"sort\": 900,\n      \"timestampX\": \"2026-10-08T18:49:59.000Z\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 1,\n    \"hasMore\": false\n  }\n}\n```\n\n## Error response example\n\n400 — the filter references `nope`, which 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-vat-rates'. Available: id, name, rate, active, sort, timestampX\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|------|------|\n| 400 | `UNKNOWN_FILTER_FIELD` | The filter references a field outside the schema. The message lists available fields. |\n| 400 | `UNKNOWN_SORT_FIELD` | The sort order references a field outside the schema. |\n| 400 | `INVALID_FILTER` | `filter` is not a JSON object, or `filter[field]=…` and `filter={...}` are mixed. Use one form. |\n| 400 | `INVALID_FILTER_OPERATOR` | An unknown operator or a logical key `$or`, `$and`, `$not`. Use `$in` for multiple values of one field. |\n| 403 | `SCOPE_DENIED` | The key does not have the `catalog` scope. |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing. |\n| 401 | `TOKEN_MISSING` | The key has no configured Bitrix24 tokens. For an OAuth application key, check the user session. |\n\nFor all common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**An unknown name in `select` does not stop the request.** The response is `200`, records retain the available fields, and `meta.warnings` contains `UNKNOWN_SELECT_FIELD`. Check warnings to catch typos.\n\n**A No VAT rate may have `rate: null`.** This differs from a numeric rate of `0`. Handle it explicitly when displaying rates or calculating totals.\n\n## See also\n\n- [Search VAT rates](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fsearch)\n- [Get a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fget)\n- [Create a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fcreate)\n- [VAT rate fields](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Ffields)\n- [Filtering syntax](\u002Fdocs\u002Ffiltering)\n- [Limits and optimization](\u002Fdocs\u002Foptimization)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n","## Get a VAT rate\n\n`GET \u002Fv1\u002Fcatalog-vat-rates\u002F:id`\n\nReturns a single VAT rate from the product catalog by its identifier.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|------|------|------|------|\n| `id` (path) | number | yes | VAT rate identifier, a non-negative integer. List: [`GET \u002Fv1\u002Fcatalog-vat-rates`](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist). |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\u002F25\" \\\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-vat-rates\u002F25\" \\\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-vat-rates\u002F25', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log(data.name, data.rate)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\u002F25', {\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(data.name, data.rate)\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|------|------|\n| `success` | boolean | Always `true` on success. |\n| `data` | object | VAT rate object. |\n| `data.id` | number | VAT rate identifier. List: [`GET \u002Fv1\u002Fcatalog-vat-rates`](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist). Pass it as the product's `vatId`. |\n| `data.name` | string | VAT rate name. |\n| `data.rate` | number \\| null | VAT percentage. For an existing \"No VAT\" rate, this field may be `null`. |\n| `data.active` | string | Rate status: `Y` — active, `N` — inactive. |\n| `data.sort` | number | Sort order. |\n| `data.timestampX` | string | Modification date and time in ISO 8601 format. Set by Bitrix24. |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"active\": \"N\",\n    \"id\": 25,\n    \"name\": \"Docs VAT 2026-10-08\",\n    \"rate\": 7.5,\n    \"sort\": 900,\n    \"timestampX\": \"2026-10-08T18:49:59.000Z\"\n  }\n}\n```\n\n## Error response example\n\n404 — no rate exists with this `id`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"vat does not exist.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|------|------|\n| 404 | `ENTITY_NOT_FOUND` | No VAT rate exists with this `id`, including after deletion. |\n| 400 | `INVALID_PARAMS` | `id` is not a non-negative integer, for example `abc`. |\n| 403 | `SCOPE_DENIED` | The key does not have the `catalog` scope. |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing. |\n| 401 | `TOKEN_MISSING` | The key has no configured Bitrix24 tokens. For an OAuth application key, check the user session. |\n\nFor all common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## See also\n\n- [List VAT rates](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist)\n- [Update a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fupdate)\n- [Delete a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fdelete)\n- [VAT rate fields](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Ffields)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [Limits and optimization](\u002Fdocs\u002Foptimization)\n","## Update a VAT rate\n\n`PATCH \u002Fv1\u002Fcatalog-vat-rates\u002F:id`\n\nPartially updates a VAT rate in the product catalog. Send only the fields to change in a flat body, without a `fields` wrapper.\n\n## Parameters\n\n| Parameter | Type | Required | Description |\n|------|------|------|------|\n| `id` (path) | number | yes | VAT rate identifier, a non-negative integer. List: [`GET \u002Fv1\u002Fcatalog-vat-rates`](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist). |\n\n## Request body fields\n\n| Field | Type | Required | Description |\n|------|------|------|------|\n| `name` | string | no | VAT rate name. |\n| `rate` | number | no | VAT percentage. Fractional numbers and `0` are accepted. `null` is not accepted. |\n| `active` | string | no | Status: `Y` or `N`. Other values and `null` are rejected. |\n| `sort` | number | no | Sort order, an integer of at least `1`. `null` is not accepted. |\n| `id` | number | no | `RO`. Set only in the path. Passing it in the body returns `400 READONLY_FIELD`. |\n| `timestampX` | string | no | `RO`. The modification time is set by Bitrix24. Passing it in the body returns `400 READONLY_FIELD`. |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\u002F25\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n  \"name\": \"Docs VAT updated 2026-10-08\"\n}'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\u002F25\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n  \"name\": \"Docs VAT updated 2026-10-08\"\n}'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\u002F25', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    \"name\": \"Docs VAT updated 2026-10-08\"\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log(data)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\u002F25', {\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    \"name\": \"Docs VAT updated 2026-10-08\"\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log(data)\n```\n\n## Response fields\n\nOn success, returns `200` and the complete updated record.\n\n| Field | Type | Description |\n|------|------|------|\n| `success` | boolean | Always `true` on success. |\n| `data` | object | VAT rate object. |\n| `data.id` | number | VAT rate identifier. List: [`GET \u002Fv1\u002Fcatalog-vat-rates`](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist). Pass it as the product's `vatId`. |\n| `data.name` | string | VAT rate name. |\n| `data.rate` | number \\| null | VAT percentage. For an existing \"No VAT\" rate, this field may be `null`. |\n| `data.active` | string | Rate status: `Y` — active, `N` — inactive. |\n| `data.sort` | number | Sort order. |\n| `data.timestampX` | string | Modification date and time in ISO 8601 format. Set by Bitrix24. |\n| `meta.warnings` | array | For an unknown field name, contains an `UNRECOGNIZED_WRITE_FIELD` warning with `code`, `field`, and `message` keys. 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    \"active\": \"N\",\n    \"id\": 25,\n    \"name\": \"Docs VAT updated 2026-10-08\",\n    \"rate\": 7.5,\n    \"sort\": 900,\n    \"timestampX\": \"2026-10-08T18:50:04.000Z\"\n  }\n}\n```\n\n## Error response example\n\n422 — `rate` is `null`. The rate is not changed:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Required fields: rate\",\n    \"b24Code\": \"0\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|------|------|\n| 404 | `ENTITY_NOT_FOUND` | No VAT rate exists with this `id`, including after deletion. |\n| 400 | `INVALID_PARAMS` | `id` is not a non-negative integer, for example `abc`. |\n| 400 | `EMPTY_UPDATE_BODY` | The body is empty or is not a JSON object. Provide at least one field. |\n| 400 | `INVALID_PARAMS` | An invalid field type, `active` outside `Y`\u002F`N`, or a fractional or non-positive `sort`. `active` and `sort` cannot be `null`. |\n| 400 | `READONLY_FIELD` | The body contains `id` or `timestampX`. Remove the field from the request. |\n| 422 | `BITRIX_ERROR` | `rate: null` is rejected with `Required fields: rate`. For other errors returned by Bitrix24, see `error.message` and `error.b24Code`. |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | Writes are blocked: the key is read-only. |\n| 403 | `SCOPE_DENIED` | The key does not have the `catalog` scope. |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing. |\n| 401 | `TOKEN_MISSING` | The key has no configured Bitrix24 tokens. For an OAuth application key, check the user session. |\n\nFor all common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**A single PATCH does not require repeating `name` and `rate`.** If a field is omitted, Vibecode supplies the rate's current value before updating it. An explicit `null` is not replaced. If an existing rate has `rate: null`, provide a numeric `rate`; otherwise Bitrix24 may reject a change to another field.\n\n**An unknown scalar field may not be saved.** It does not bypass required-field validation. The response may contain `meta.warnings` with `UNRECOGNIZED_WRITE_FIELD`. Check names against [VAT rate fields](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Ffields) and verify the values in `data`.\n\n## See also\n\n- [Get a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fget)\n- [Create a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fcreate)\n- [List VAT rates](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist)\n- [Delete a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fdelete)\n- [VAT rate fields](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Ffields)\n- [Batch](\u002Fdocs\u002Fbatch)\n- [Limits and optimization](\u002Fdocs\u002Foptimization)\n","## Delete a VAT rate\n\n`DELETE \u002Fv1\u002Fcatalog-vat-rates\u002F:id`\n\nDeletes a VAT rate from the product catalog. 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 | VAT rate identifier, a non-negative integer. List: [`GET \u002Fv1\u002Fcatalog-vat-rates`](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist). |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\u002F25\" \\\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-vat-rates\u002F25\" \\\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-vat-rates\u002F25', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nif (res.status === 204) {\n  console.log('VAT rate deleted')\n}\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\u002F25', {\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('VAT rate deleted')\n}\n```\n\n## Response\n\nSuccessful deletion returns HTTP status `204 No Content` with an empty body. Check the status code to confirm success.\n\n## Response example\n\n```http\nHTTP\u002F1.1 204 No Content\n```\n\n## Error response example\n\n404 — the rate does not exist, for example on repeated deletion:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"vat does not exist.\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|------|------|\n| 404 | `ENTITY_NOT_FOUND` | No VAT rate exists with this `id`, including after deletion. |\n| 400 | `INVALID_PARAMS` | `id` is not a non-negative integer, for example `abc`. |\n| 422 | `BITRIX_ERROR` | Bitrix24 rejected the request. See `error.message` for the reason and `error.b24Code` for the original code. |\n| 403 | `WRITE_BLOCKED_READONLY_KEY` | Writes are blocked: the key is read-only. |\n| 403 | `SCOPE_DENIED` | The key does not have the `catalog` scope. |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing. |\n| 401 | `TOKEN_MISSING` | The key has no configured Bitrix24 tokens. For an OAuth application key, check the user session. |\n\nFor all common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**Before deleting a rate, check the products that use it.** Find them with [`GET \u002Fv1\u002Fcatalog-products?filter[vatId]=25`](\u002Fdocs\u002Fentities\u002Fcatalog-products\u002Flist) and assign another rate if needed.\n\nTo deactivate a rate while retaining its record, first check its current `rate`. If `rate` is numeric, send [`PATCH \u002Fv1\u002Fcatalog-vat-rates\u002F:id`](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fupdate) with `{\"active\": \"N\"}`. For an existing \"No VAT\" rate with `rate: null`, this PATCH is rejected with `422 BITRIX_ERROR` and `Required fields: rate`. The record remains active. An `active`-only PATCH cannot deactivate it while `rate` remains `null`.\n\n## See also\n\n- [Create a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fcreate)\n- [Get a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fget)\n- [List VAT rates](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist)\n- [Update a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fupdate)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [Batch](\u002Fdocs\u002Fbatch)\n","## Search VAT rates\n\n`POST \u002Fv1\u002Fcatalog-vat-rates\u002Fsearch`\n\nSearches VAT rates in the product catalog using conditions in the JSON request body. Conditions on multiple fields are specified as a nested structure in the request body.\n\n## Request body fields\n\n| Field | Type | Required | Description |\n|------|------|------|------|\n| `filter` | object | no | Filter by fields from `GET \u002Fv1\u002Fcatalog-vat-rates\u002Ffields`.\u003Cbr>[Filtering syntax](\u002Fdocs\u002Ffiltering). Example: `{\"active\": \"Y\"}`. |\n| `sort` | string \\| object \\| array | no | A string `\"-rate\"`, an object `{\"rate\": \"desc\"}`, or an array of strings `[\"-rate\", \"id\"]`. Defaults to ascending `id`. |\n| `order` | object | no | Object-form alias for `sort`. If both are provided, `sort` takes precedence. |\n| `select` | string[] | no | Fields to return: `[\"id\", \"name\", \"rate\"]`. The string `\"id,name,rate\"` is also accepted. |\n| `limit` | number | no | Number of records, from 1 to 5000. Defaults to `50`. |\n| `offset` | number | no | Skip N records. Defaults to `0`. |\n| `withTotal` | boolean | no | Request the record count. For this reference entity, `false` does not suppress `meta.total`. |\n| `autoWindow` | boolean | no | Automatically split large result sets into date windows. Enabled by default. Use regular `limit` and `offset` for a small reference list. |\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n  \"filter\": {\n    \"id\": 25\n  },\n  \"sort\": \"-rate\",\n  \"limit\": 2\n}'\n```\n\n### curl — OAuth application\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\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\": {\n    \"id\": 25\n  },\n  \"sort\": \"-rate\",\n  \"limit\": 2\n}'\n```\n\n### JavaScript — personal key\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\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\": {\n      \"id\": 25\n    },\n    \"sort\": \"-rate\",\n    \"limit\": 2\n  }),\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(data, meta.hasMore)\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\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\": {\n      \"id\": 25\n    },\n    \"sort\": \"-rate\",\n    \"limit\": 2\n  }),\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(data, meta.hasMore)\n```\n\n## Response fields\n\n| Field | Type | Description |\n|------|------|------|\n| `success` | boolean | Always `true` on success. |\n| `data` | array | Array of VAT rates. |\n| `data[].id` | number | VAT rate identifier. List: [`GET \u002Fv1\u002Fcatalog-vat-rates`](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist). Pass it as the product's `vatId`. |\n| `data[].name` | string | VAT rate name. |\n| `data[].rate` | number \\| null | VAT percentage. For an existing \"No VAT\" rate, this field may be `null`. |\n| `data[].active` | string | Rate status: `Y` — active, `N` — inactive. |\n| `data[].sort` | number | Sort order. |\n| `data[].timestampX` | string | Modification date and time in ISO 8601 format. Set by Bitrix24. |\n| `meta.total` | number | Number of rates matching the filter. Returned even with `withTotal=false`. |\n| `meta.hasMore` | boolean | Whether more rates exist beyond `limit`. |\n| `meta.durationMs` | number | Request duration in milliseconds. |\n| `meta.warnings` | array | Present when there are warnings: `UNKNOWN_SELECT_FIELD` for an unknown name in `select`, `LIMIT_ZERO_IGNORED` when `limit` is `0` and the default is used. |\n\n## Response example\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"active\": \"N\",\n      \"id\": 25,\n      \"name\": \"Docs VAT 2026-10-08\",\n      \"rate\": 7.5,\n      \"sort\": 900,\n      \"timestampX\": \"2026-10-08T18:49:59.000Z\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 1,\n    \"hasMore\": false,\n    \"durationMs\": 80\n  }\n}\n```\n\n## Error response example\n\n400 — sorting by `nope`, which 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-vat-rates'. Available: id, name, rate, active, sort, timestampX\"\n  }\n}\n```\n\n## Errors\n\n| HTTP | Code | Description |\n|------|------|------|\n| 400 | `UNKNOWN_FILTER_FIELD` | The filter references a field outside the schema. The message lists available fields. |\n| 400 | `UNKNOWN_SORT_FIELD` | The sort order references a field outside the schema. |\n| 400 | `INVALID_FILTER_OPERATOR` | An unknown operator or a logical key `$or`, `$and`, `$not`. Use `$in` for multiple values of one field. |\n| 400 | `INVALID_FILTER` | `filter` is not an object of conditions. |\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 key does not have the `catalog` scope. |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing. |\n| 401 | `TOKEN_MISSING` | The key has no configured Bitrix24 tokens. For an OAuth application key, check the user session. |\n\nFor all common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**An empty object `{}` is valid.** With no conditions, search returns the regular list of rates.\n\n**An unknown name in `select` does not stop the request.** Check `meta.warnings`: `UNKNOWN_SELECT_FIELD` identifies a field that may be absent from the results.\n\n## See also\n\n- [List VAT rates](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist)\n- [Get a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fget)\n- [VAT rate fields](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Ffields)\n- [Filtering syntax](\u002Fdocs\u002Ffiltering)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n- [Limits and optimization](\u002Fdocs\u002Foptimization)\n","## VAT rate fields\n\n`GET \u002Fv1\u002Fcatalog-vat-rates\u002Ffields`\n\nReturns metadata for VAT rate fields in the product catalog. Use it to check names, types, and allowed values before writing.\n\n## Examples\n\n### curl — personal key\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\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-vat-rates\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-vat-rates\u002Ffields', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log(Object.keys(data.fields))\n```\n\n### JavaScript — OAuth application\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.com\u002Fv1\u002Fcatalog-vat-rates\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(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 | Metadata map. Each key is a field name and its value describes that field. |\n| `data.batch` | array | Write actions supported through `POST \u002Fv1\u002Fcatalog-vat-rates\u002Fbatch`: `create`, `update`, `delete`. |\n| `meta.warnings` | array | If full metadata is unavailable, contains a `fields_partial` warning. Static fields remain available in `data.fields`. |\n\nEach entry in `fields` contains `type` and `readonly`. When available, it also includes `label`, `description`, `required`, `nullable`, and `enum`. `required: true` on `name` and `rate` means they are required on creation. `nullable: true` on `rate` describes responses, not permission to write `null`. The `active` enum lists `Y` and `N` with `label` captions.\n\nFields of the VAT rate object:\n\n| Field | Type | RO | Description |\n|------|------|------|------|\n| `id` | number | yes | VAT rate identifier. List: [`GET \u002Fv1\u002Fcatalog-vat-rates`](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist). Pass it as the product's `vatId`. |\n| `name` | string |  | VAT rate name. Required on creation. |\n| `rate` | number \\| null |  | VAT percentage. Required on creation. Writes do not accept `null`; existing rates may return `null`. |\n| `active` | string |  | Rate status: `Y` — active, `N` — inactive. |\n| `sort` | number |  | Sort order, an integer of at least `1`. |\n| `timestampX` | datetime | yes | Modification date and time in ISO 8601 format. Set by Bitrix24. |\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\": \"VAT rate identifier.\"\n      },\n      \"name\": {\n        \"type\": \"string\",\n        \"readonly\": false,\n        \"required\": true,\n        \"label\": \"Name\",\n        \"description\": \"VAT rate name.\"\n      },\n      \"rate\": {\n        \"type\": \"number\",\n        \"readonly\": false,\n        \"required\": true,\n        \"nullable\": true,\n        \"label\": \"Rate\",\n        \"description\": \"VAT percentage. Existing No VAT rows may return null; Bitrix24 rejects null on create and update.\"\n      },\n      \"active\": {\n        \"type\": \"string\",\n        \"readonly\": false,\n        \"label\": \"Active\",\n        \"description\": \"Y if active, N otherwise.\",\n        \"enum\": [\n          {\n            \"value\": \"Y\",\n            \"label\": \"Active\"\n          },\n          {\n            \"value\": \"N\",\n            \"label\": \"Inactive\"\n          }\n        ]\n      },\n      \"sort\": {\n        \"type\": \"number\",\n        \"readonly\": false,\n        \"label\": \"Sort\",\n        \"description\": \"Sort order.\"\n      },\n      \"timestampX\": {\n        \"type\": \"datetime\",\n        \"readonly\": true,\n        \"label\": \"Modified at\",\n        \"description\": \"Bitrix24 sets this timestamp; submitted values are ignored.\"\n      },\n      \"vat\": {\n        \"type\": \"string\",\n        \"readonly\": false,\n        \"label\": \"vat\"\n      }\n    },\n    \"batch\": [\n      \"create\",\n      \"update\",\n      \"delete\"\n    ]\n  }\n}\n```\n\n## Error response example\n\n401 — no API key was 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 key does not have the `catalog` scope. |\n| 401 | `MISSING_API_KEY` | The `X-Api-Key` header is missing. |\n| 401 | `TOKEN_MISSING` | The key has no configured Bitrix24 tokens. For an OAuth application key, check the user session. |\n\nFor all common API errors, see [Errors](\u002Fdocs\u002Ferrors).\n\n## Known specifics\n\n**Metadata may contain an additional `vat` entry.** In the verified response it has `type: \"string\"` and `label: \"vat\"`. It is not one of the six VAT rate object fields listed above. Use the VAT rate object fields for filtering and sorting.\n\n**The `readonly` flag determines whether a field can be written.** The `timestampX` description may say that submitted values are ignored. A Vibecode request with `id` or `timestampX` in the body is rejected with `400 READONLY_FIELD`.\n\n## See also\n\n- [Create a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fcreate)\n- [Update a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fupdate)\n- [List VAT rates](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Flist)\n- [Get a VAT rate](\u002Fdocs\u002Fentities\u002Fcatalog-vat-rates\u002Fget)\n- [Catalog products](\u002Fdocs\u002Fentities\u002Fcatalog-products)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n",1794739339522]