[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-entities\u002Fpages":3,"docs-tabs-entities\u002Fpages":6},{"content":4,"lastmod":5},"\n# Страницы\n\nУправление страницами лендингов и интернет-магазинов на платформе Битрикс24: создание, получение, обновление, удаление. Страница всегда принадлежит сайту и наследует от него тип `PAGE` или `STORE`.\n\nБитрикс24 API: `landing.landing.*`\nСкоуп: `landing`\n\n## Операции\n\n- [Создать страницу](.\u002Fpages\u002Fcreate.md) — `POST \u002Fv1\u002Fpages`\n- [Список страниц](.\u002Fpages\u002Flist.md) — `GET \u002Fv1\u002Fpages`\n- [Получить страницу](.\u002Fpages\u002Fget.md) — `GET \u002Fv1\u002Fpages\u002F:id`\n- [Обновить страницу](.\u002Fpages\u002Fupdate.md) — `PATCH \u002Fv1\u002Fpages\u002F:id`\n- [Удалить страницу](.\u002Fpages\u002Fdelete.md) — `DELETE \u002Fv1\u002Fpages\u002F:id`\n- [Поиск страниц](.\u002Fpages\u002Fsearch.md) — `POST \u002Fv1\u002Fpages\u002Fsearch`\n- [Поля страницы](.\u002Fpages\u002Ffields.md) — `GET \u002Fv1\u002Fpages\u002Ffields`\n- [Агрегация страниц](.\u002Fpages\u002Faggregate.md) — `POST \u002Fv1\u002Fpages\u002Faggregate`\n\n## Ключевые поля\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | Идентификатор страницы (только чтение) |\n| `title` | string | Название страницы, до 255 символов. Обязательно при создании |\n| `code` | string | Символьный код страницы в URL. Если не передавать — генерируется из `title`. Не должен содержать `\u002F`. Внутри сайта или папки должен быть уникальным — иначе автоматически добавляется числовой суффикс |\n| `siteId` | number | Идентификатор сайта, которому принадлежит страница. Источник: [`GET \u002Fv1\u002Fsites`](\u002Fdocs\u002Fentities\u002Fsites\u002Flist). Обязательно при создании |\n| `active` | boolean | Активна ли страница. Управляется только в интерфейсе портала Битрикс24: новые страницы создаются неактивными, через API изменить нельзя |\n| `description` | string \\| null | Произвольное описание страницы. Приходит `null`, если не задано (в операционных доках [get](.\u002Fpages\u002Fget.md) \u002F [list](.\u002Fpages\u002Flist.md) тип уже `string \\| null` — здесь приведено к ним для единообразия) |\n| `createdById` | number | Идентификатор создавшего сотрудника (только чтение). Источник: [`GET \u002Fv1\u002Fusers`](\u002Fdocs\u002Fentities\u002Fusers) |\n| `dateCreate` | datetime | Дата создания (только чтение) |\n| `dateModify` | datetime | Дата последнего изменения (только чтение) |\n\n## Что нужно знать перед работой\n\n1. **Тело запроса плоское.** При создании и обновлении передавайте поля прямо в корне JSON: `{\"title\": \"...\", \"code\": \"...\", \"siteId\": 3}`. Обёртка `fields` не нужна.\n2. **Минимум для создания:** `title` + `siteId`. Остальные поля опциональны.\n3. **Поле `active` через API не управляется.** При создании страница получает `active: false`. Передача `active: true` в `POST` или `PATCH` принимается без ошибки, но значение не сохраняется. Активировать страницу можно в интерфейсе портала Битрикс24, в разделе «Сайты».\n4. **Полный список полей — [`GET \u002Fv1\u002Fpages\u002Ffields`](.\u002Fpages\u002Ffields.md).** Эндпоинт возвращает карту всех полей страницы с типом и признаком `readonly`. Ключевые поля приведены в разделе «Ключевые поля» выше, полный перечень из 27 полей — на странице [Поля страницы](.\u002Fpages\u002Ffields.md).\n5. **Ответ может содержать дополнительные поля Битрикс24 — в camelCase.** Помимо ключевых полей, по умолчанию возвращаются дополнительные — в **camelCase**, **не** в `UPPER_CASE`: `deleted`, `xmlId`, `tplId`, `sitemap`, `folder`, `folderId`, `searchContent`, `modifiedById`, `domainId`, `initiatorAppCode`, `rule`, `public`, `sys`, `views`, `tplCode`, `version`, `historyStep`, `datePublic` и другие. Чтение по документированному имени `data[].XML_ID` \u002F `MODIFIED_BY_ID` вернёт `undefined` — используйте camelCase. Чтобы получить только ключевые поля, передавайте параметр `select` в `GET \u002Fv1\u002Fpages`: `?select=id,title,code,siteId,active,description,createdById,dateCreate,dateModify`. См. примеры в [Списке страниц](.\u002Fpages\u002Flist.md). Для `GET \u002Fv1\u002Fpages\u002F:id` параметр `select` не применяется — отбор полей доступен только в списке.\n   - Недокументированное поле `datePublic` у неопубликованной страницы приходит пустым объектом `{}` (артефакт сериализации пустой даты Битрикс24), а не датой\u002F`null`.\n6. **`offset` для постраничного перехода не поддерживается.** Метод получения списка не принимает параметр смещения. Для больших выборок используйте `limit > 50` (Вайбкод запрашивает несколько страниц и собирает результат) или сужайте фильтр.\n7. **Сортировка поддерживается.** `?order[поле]=asc|desc` или короткая форма `?sort=-поле` (по убыванию), в теле [`POST \u002Fv1\u002Fpages\u002Fsearch`](.\u002Fpages\u002Fsearch.md) — поле `sort`. Без параметра выборка идёт по возрастанию `id`. Для подсчёта количества страниц используйте `meta.total` из [Списка страниц](.\u002Fpages\u002Flist.md): `GET \u002Fv1\u002Fpages?filter[siteId]=3&limit=1` вернёт `meta.total` без выгрузки записей.\n\n## Связанные сущности\n\n| Сущность | Эндпоинт | Назначение |\n|----------|----------|-----------|\n| Сайты | [`GET \u002Fv1\u002Fsites`](\u002Fdocs\u002Fentities\u002Fsites) | Контейнеры страниц. Источник `siteId` для создания страницы. Удалить сайт можно только после удаления всех его страниц. |\n\n## Типичный сценарий\n\n1. Найти сайт: [`GET \u002Fv1\u002Fsites`](\u002Fdocs\u002Fentities\u002Fsites\u002Flist).\n2. Посмотреть его страницы: [`GET \u002Fv1\u002Fpages?filter[siteId]=3`](.\u002Fpages\u002Flist.md).\n3. Создать новую или обновить существующую: [`POST \u002Fv1\u002Fpages`](.\u002Fpages\u002Fcreate.md) \u002F [`PATCH \u002Fv1\u002Fpages\u002F:id`](.\u002Fpages\u002Fupdate.md).\n4. Удалить ненужные: [`DELETE \u002Fv1\u002Fpages\u002F:id`](.\u002Fpages\u002Fdelete.md).\n\n## Лимиты\n\n| Лимит | Значение |\n|-------|----------|\n| Максимум записей на запрос | 5000 (`limit ≤ 5000`) |\n| Авто-пагинация | включается при `limit > 50` |\n| `offset` | не поддерживается на уровне Битрикс24 |\n| Batch-запросы | до 50 операций в [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) |\n| Rate limit | общий для API Вайбкод — см. [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) |\n\n## Смотрите также\n\n- [Сайты](\u002Fdocs\u002Fentities\u002Fsites) — управление сайтами, к которым относятся страницы\n- [Entity API](\u002Fdocs\u002Fentity-api) — общие принципы работы с сущностями\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch) — массовые операции\n- [Справочник сущностей](\u002Fdocs\u002Fentities-index)\n","2026-06-26",{"pages\u002Fcreate.md":7,"pages\u002Flist.md":8,"pages\u002Fget.md":9,"pages\u002Fupdate.md":10,"pages\u002Fdelete.md":11,"pages\u002Fsearch.md":12,"pages\u002Ffields.md":13,"pages\u002Faggregate.md":14},"\n## Создать страницу\n\n`POST \u002Fv1\u002Fpages`\n\nСоздаёт новую страницу на указанном сайте. Поля передаются плоско в корне JSON — без обёртки `fields`. Минимум для создания: `title` + `siteId`. Новая страница создаётся неактивной — `active: false`. Активировать её можно в интерфейсе портала Битрикс24, в разделе «Сайты».\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| `title` | string | да | Название страницы, до 255 символов |\n| `siteId` | number | да | Идентификатор сайта. Источник: [`GET \u002Fv1\u002Fsites`](\u002Fdocs\u002Fentities\u002Fsites\u002Flist) |\n| `code` | string | нет | Символьный код страницы в URL. Не должен содержать `\u002F`. Если оставить пустым или не передать — генерируется из `title`. Если код уже занят на сайте — добавляется числовой суффикс |\n| `description` | string | нет | Произвольное описание страницы |\n| `public` | string | нет | Публичность — `Y` \u002F `N` |\n| `sitemap` | string | нет | Включить в карту сайта — `Y` \u002F `N` |\n| `xmlId` | string | нет | Внешний код |\n| `folderId` | number | нет | ID папки-раздела сайта |\n| `tplId` | number | нет | ID шаблона |\n\n> Полный перечень полей — [`GET \u002Fv1\u002Fpages\u002Ffields`](.\u002Ffields.md): эндпоинт возвращает карту всех полей с типом и признаком `readonly`. Записывать можно поля, у которых `readonly` отсутствует. Перечисленные выше дополнительные поля применяются при создании наравне с `title`\u002F`siteId`\u002F`code`\u002F`description`.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Весенняя акция\",\n    \"code\": \"spring-sale\",\n    \"siteId\": 3,\n    \"description\": \"Лендинг сезонной акции на скидки\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Весенняя акция\",\n    \"code\": \"spring-sale\",\n    \"siteId\": 3,\n    \"description\": \"Лендинг сезонной акции на скидки\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    title: 'Весенняя акция',\n    code: 'spring-sale',\n    siteId: 3,\n    description: 'Лендинг сезонной акции на скидки',\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Page ID:', data.id)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages', {\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    title: 'Весенняя акция',\n    code: 'spring-sale',\n    siteId: 3,\n    description: 'Лендинг сезонной акции на скидки',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\nВозвращается полный объект созданной страницы.\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | Идентификатор созданной страницы |\n| `title` | string | Название страницы |\n| `code` | string | Фактический символьный код (с авто-суффиксом, если код запроса был занят) |\n| `siteId` | number | Идентификатор сайта |\n| `active` | boolean | Всегда `false` для только что созданной страницы |\n| `description` | string \\| null | Описание страницы |\n| `createdById` | number | Идентификатор создавшего сотрудника |\n| `dateCreate` | datetime | Дата создания |\n| `dateModify` | datetime | Дата последнего изменения |\n\nURL страницы в Битрикс24 строится из `id` и `siteId`:\n\n```\nhttps:\u002F\u002F\u003Cportal>.bitrix24.ru\u002Fsites\u002Fsite\u002F\u003CsiteId>\u002Fview\u002F\u003Cid>\u002F\n```\n\n`\u003CsiteId>` — ID сайта, которому принадлежит страница (поле `siteId` в ответе). `\u003Cportal>` — домен портала. Доступ ограничен правами сотрудника в Битрикс24.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 2295,\n    \"title\": \"Весенняя акция\",\n    \"code\": \"spring-sale\",\n    \"siteId\": 3,\n    \"active\": false,\n    \"description\": \"Лендинг сезонной акции на скидки\",\n    \"createdById\": 1,\n    \"dateCreate\": \"08.05.2026 11:49:33\",\n    \"dateModify\": \"08.05.2026 11:49:33\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n422 — не передано обязательное поле `title`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Не заполнено обязательное поле «Название страницы»\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | `error.code` | Маркер в `error.message` | Описание |\n|------|--------------|--------------------------|---------|\n| 422 | `BITRIX_ERROR` | `Не заполнено обязательное поле` | Пропущено `title` или `siteId` |\n| 422 | `BITRIX_ERROR` | `Слеш запрещен в адресе лендинга` | В `code` передан символ `\u002F` — слеши в коде запрещены |\n| 422 | `BITRIX_ERROR` | `Адрес страницы не может быть пустым` | В `code` передана пустая строка без указания, что создаётся папка |\n| 422 | `BITRIX_ERROR` | `Недопустимый адрес страницы` | В `code` передано значение в формате `__`, например `code_12_34` |\n| 404 | `ENTITY_NOT_FOUND` | `Сайт не найден` | В `siteId` передан несуществующий идентификатор сайта |\n| 403 | `BITRIX_ACCESS_DENIED` | — | У пользователя нет права «редактирование» для указанного сайта |\n| 403 | `SCOPE_DENIED` | — | API-ключ не имеет скоупа `landing` |\n| 401 | `TOKEN_MISSING` | — | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список страниц](\u002Fdocs\u002Fentities\u002Fpages\u002Flist) — посмотреть существующие страницы перед созданием\n- [Получить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fget) — данные созданной страницы по ID\n- [Обновить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fupdate) — изменить параметры созданной страницы\n- [Удалить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fdelete) — удалить страницу\n- [Сайты](\u002Fdocs\u002Fentities\u002Fsites) — родительские контейнеры страниц\n- [Batch](\u002Fdocs\u002Fbatch) — массовое создание\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Список страниц\n\n`GET \u002Fv1\u002Fpages`\n\nВозвращает список страниц лендингов и интернет-магазинов с поддержкой фильтрации и автопагинации. По умолчанию возвращаются только не удалённые страницы.\n\n## Параметры\n\n| Параметр | Тип | По умолч. | Описание |\n|----------|-----|-----------|---------|\n| `limit` | number | `50` | Количество записей (до 5000). При `limit > 50` Вайбкод запрашивает несколько страниц у Битрикс24 и собирает результат |\n| `select` | string | — | Выборка полей: `?select=id,title,code,siteId,active`. Без `select` ответ содержит полный набор полей страницы в camelCase (как в карточке) |\n| `filter` | object | — | Фильтрация по ключевым полям страницы.\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering). Пример: `?filter[siteId]=3`. Булево `active` принимается как `true`\u002F`false`, `1`\u002F`0` или `Y`\u002F`N` |\n| `scope` | string | — | Внутренняя область лендингов. Допустимые значения: `KNOWLEDGE` (страницы базы знаний), `GROUP` (страницы рабочих групп), `MAINPAGE` (главные страницы). Без параметра возвращаются страницы обычных сайтов-лендингов. Принимается как `?scope=KNOWLEDGE` или `?filter[scope]=KNOWLEDGE` — обе формы дают одинаковый запрос к Битрикс24 |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages?filter[siteId]=3&limit=10&select=id,title,code,siteId,active,dateCreate,dateModify\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages?filter[siteId]=3&limit=10&select=id,title,code,siteId,active,dateCreate,dateModify\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst params = new URLSearchParams({\n  'filter[siteId]': '3',\n  limit: '10',\n  select: 'id,title,code,siteId,active,dateCreate,dateModify',\n})\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages?${params}`, {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Найдено ${meta.total} страниц`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst params = new URLSearchParams({\n  'filter[siteId]': '3',\n  limit: '10',\n  select: 'id,title,code,siteId,active,dateCreate,dateModify',\n})\n\nconst res = await fetch(`https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages?${params}`, {\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## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив страниц |\n| `data[].id` | number | Идентификатор страницы |\n| `data[].title` | string | Название страницы |\n| `data[].code` | string | Символьный код страницы |\n| `data[].siteId` | number | Идентификатор сайта |\n| `data[].active` | boolean | Активна ли страница |\n| `data[].description` | string \\| null | Произвольное описание |\n| `data[].createdById` | number | Идентификатор создавшего сотрудника |\n| `data[].dateCreate` | datetime | Дата создания |\n| `data[].dateModify` | datetime | Дата последнего изменения |\n| `meta.total` | number | Общее количество записей, соответствующих фильтру |\n| `meta.hasMore` | boolean | Есть ли ещё записи за пределами `limit` |\n\nURL любой страницы из массива `data` строится из её `id` и `siteId`:\n\n```\nhttps:\u002F\u002F\u003Cportal>.bitrix24.ru\u002Fsites\u002Fsite\u002F\u003CsiteId>\u002Fview\u002F\u003Cid>\u002F\n```\n\n`\u003CsiteId>` — ID сайта, которому принадлежит страница (поле `siteId` каждого элемента). `\u003Cportal>` — домен портала. Доступ ограничен правами сотрудника в Битрикс24.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 9,\n      \"title\": \"Тест переноса страниц\",\n      \"code\": \"change1\",\n      \"siteId\": 3,\n      \"active\": true,\n      \"description\": null,\n      \"createdById\": 1,\n      \"dateCreate\": \"26.05.2020 17:24:02\",\n      \"dateModify\": \"10.10.2022 15:25:30\"\n    },\n    {\n      \"id\": 7,\n      \"title\": \"Test page\",\n      \"code\": \"test\",\n      \"siteId\": 3,\n      \"active\": true,\n      \"description\": null,\n      \"createdById\": 1,\n      \"dateCreate\": \"25.05.2020 17:34:17\",\n      \"dateModify\": \"10.10.2022 15:25:30\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 13,\n    \"hasMore\": true\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n403 — нет скоупа:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SCOPE_DENIED\",\n    \"message\": \"This endpoint requires 'landing' scope\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 422 | `BITRIX_ERROR` | Битрикс24 вернул ошибку — текст в `error.message` |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `landing` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Постраничный переход через `offset` поддерживается.** Вайбкод возвращает запрошенное окно `[offset, offset+limit)`, а `meta.total` \u002F `meta.hasMore` считает по числу строк (метод Битрикс24 отдаёт весь список за один вызов — окно применяется на стороне Вайбкода). Для больших выборок также работает `limit > 50` — Вайбкод собирает результат в одном ответе.\n\n**Сортировка.** Поддерживается через `?order[поле]=asc|desc` или короткую форму `?sort=-поле` (по убыванию). Без параметра выборка идёт по возрастанию `id`.\n\n**База знаний и другие внутренние области.** Параметр `scope` переключает источник: `KNOWLEDGE` — страницы базы знаний, `GROUP` — страницы рабочих групп, `MAINPAGE` — главные страницы. Без параметра возвращаются страницы обычных сайтов-лендингов (источник по умолчанию). Пример: `GET \u002Fv1\u002Fpages?scope=KNOWLEDGE` возвращает страницы базы знаний.\n\n## Смотрите также\n\n- [Получить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fget) — данные одной страницы по ID\n- [Поиск страниц](\u002Fdocs\u002Fentities\u002Fpages\u002Fsearch) — POST-аналог для сложных фильтров\n- [Создать страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fcreate) — создание новой страницы\n- [Обновить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fupdate) — изменение полей\n- [Удалить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fdelete) — удаление по ID\n- [Сайты](\u002Fdocs\u002Fentities\u002Fsites) — родительские контейнеры страниц\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Entity API](\u002Fdocs\u002Fentity-api) — select, пагинация\n- [Batch](\u002Fdocs\u002Fbatch) — объединение нескольких list-запросов\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Получить страницу\n\n`GET \u002Fv1\u002Fpages\u002F:id`\n\nВозвращает одну страницу по идентификатору. Удалённые страницы этим эндпоинтом не возвращаются — на запрос вернётся `404 ENTITY_NOT_FOUND`.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор страницы |\n| `scope` (query) | string | нет | Внутренняя область лендингов: `KNOWLEDGE` \u002F `GROUP` \u002F `MAINPAGE`. Указывайте, если страница принадлежит соответствующей области. Иначе возвращается `404 ENTITY_NOT_FOUND`. Пример: `GET \u002Fv1\u002Fpages\u002F9?scope=KNOWLEDGE` |\n| `select` (query) | string | нет | Выборка полей: `?select=id,title`. Поле `id` возвращается всегда |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002F9\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002F9\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002F9', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Страница:', data.title, '— сайт:', data.siteId)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\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()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | Идентификатор страницы |\n| `title` | string | Название страницы |\n| `code` | string | Символьный код страницы |\n| `siteId` | number | Идентификатор сайта |\n| `active` | boolean | Активна ли страница |\n| `description` | string \\| null | Произвольное описание |\n| `createdById` | number | Идентификатор создавшего сотрудника |\n| `dateCreate` | datetime | Дата создания. Формат Битрикс24 `ДД.ММ.ГГГГ ЧЧ:ММ:СС` (не ISO 8601) |\n| `dateModify` | datetime | Дата последнего изменения. Формат Битрикс24 `ДД.ММ.ГГГГ ЧЧ:ММ:СС` (не ISO 8601) |\n\n> **Формат дат — локаль-зависимый, НЕ ISO 8601.** Битрикс24 возвращает `dateCreate`\u002F`dateModify` строкой в локальном формате, и **конкретный шаблон зависит от региональных настроек портала**: на RU-локали это `ДД.ММ.ГГГГ ЧЧ:ММ:СС` (`30.12.2021 12:30:52`), на EN-локали — `MM\u002FDD\u002FYYYY hh:mm:ss am\u002Fpm` (`04\u002F22\u002F2020 02:39:17 pm`). Вайбкод отдаёт значение Битрикс24 как есть, без приведения к ISO. `new Date(value)` вернёт `Invalid Date` либо тихо перепутает день и месяц — **не разбирайте дату по фиксированному шаблону и не доверяйте `new Date()`**. Ориентируйтесь на региональные настройки конкретного портала.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 9,\n    \"title\": \"Тест переноса страниц\",\n    \"code\": \"change1\",\n    \"siteId\": 3,\n    \"active\": true,\n    \"description\": null,\n    \"createdById\": 1,\n    \"dateCreate\": \"30.12.2021 12:30:52\",\n    \"dateModify\": \"30.12.2021 12:30:53\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — страница не найдена:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"landingPage 999999999 not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 404 | `ENTITY_NOT_FOUND` | Страница с таким ID не найдена, удалена или недоступна пользователю |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `landing` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Список страниц](\u002Fdocs\u002Fentities\u002Fpages\u002Flist) — получить несколько страниц с фильтрами\n- [Обновить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fupdate) — изменение полей\n- [Удалить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fdelete) — удаление по ID\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Обновить страницу\n\n`PATCH \u002Fv1\u002Fpages\u002F:id`\n\nОбновляет поля существующей страницы. Передавайте только изменяемые поля плоско в корне JSON — без обёртки `fields`. Не переданные поля сохраняют текущие значения.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор страницы |\n\n## Поля для обновления (body)\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `title` | string | Название страницы, до 255 символов |\n| `code` | string | Символьный код страницы. Не должен содержать `\u002F`. Если код уже занят на сайте — добавляется числовой суффикс |\n| `description` | string | Произвольное описание |\n| `siteId` | number | ID сайта-владельца. Список: [`GET \u002Fv1\u002Fsites`](\u002Fdocs\u002Fentities\u002Fsites\u002Flist) |\n| `active` | boolean | Активность страницы. Принимается без ошибки, но значение не сохраняется — управляется в интерфейсе портала Битрикс24, в разделе «Сайты» |\n| `public` | string | Публичность — `Y` \u002F `N` |\n| `sitemap` | string | Включать в карту сайта — `Y` \u002F `N` |\n| `xmlId` | string | Внешний код |\n| `folderId` | number | ID папки-раздела сайта |\n| `tplId` | number | ID шаблона |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002F2295\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Весенняя акция — обновлено\",\n    \"description\": \"Скидки до 50%\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002F2295\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Весенняя акция — обновлено\",\n    \"description\": \"Скидки до 50%\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002F2295', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    title: 'Весенняя акция — обновлено',\n    description: 'Скидки до 50%',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002F2295', {\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    title: 'Весенняя акция — обновлено',\n    description: 'Скидки до 50%',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\nВозвращается полный объект обновлённой страницы.\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | Идентификатор страницы |\n| `title` | string | Название страницы |\n| `code` | string | Символьный код страницы |\n| `siteId` | number | Идентификатор сайта |\n| `active` | boolean | Активна ли страница |\n| `description` | string \\| null | Описание страницы |\n| `createdById` | number | Идентификатор создавшего сотрудника |\n| `dateCreate` | datetime | Дата создания |\n| `dateModify` | datetime | Дата последнего изменения (после обновления) |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 2295,\n    \"title\": \"Весенняя акция — обновлено\",\n    \"code\": \"spring-sale\",\n    \"siteId\": 3,\n    \"active\": false,\n    \"description\": \"Скидки до 50%\",\n    \"createdById\": 1,\n    \"dateCreate\": \"08.05.2026 11:49:33\",\n    \"dateModify\": \"08.05.2026 12:14:08\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n422 — слеш в `code`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Слеш запрещен в адресе лендинга.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | `error.code` | Маркер в `error.message` | Описание |\n|------|--------------|--------------------------|---------|\n| 401 | `TOKEN_MISSING` | — | API-ключ не имеет настроенных токенов |\n| 403 | `BITRIX_ACCESS_DENIED` | — | У пользователя нет права на изменение этой страницы |\n| 403 | `SCOPE_DENIED` | — | API-ключ не имеет скоупа `landing` |\n| 404 | `ENTITY_NOT_FOUND` | — | Страница с таким `id` не найдена или удалена |\n| 422 | `BITRIX_ERROR` | `Слеш запрещен в адресе лендинга` | В `code` передан символ `\u002F` |\n| 422 | `BITRIX_ERROR` | `Адрес страницы не может быть пустым` | В `code` передана пустая строка |\n| 422 | `BITRIX_ERROR` | `Недопустимый адрес страницы` | В `code` передано значение в формате `__` |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Получить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fget) — текущие значения полей\n- [Список страниц](\u002Fdocs\u002Fentities\u002Fpages\u002Flist) — найти страницу по фильтру\n- [Создать страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fcreate) — создание новой\n- [Удалить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fdelete) — удаление по ID\n- [Batch](\u002Fdocs\u002Fbatch) — массовое обновление\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Удалить страницу\n\n`DELETE \u002Fv1\u002Fpages\u002F:id`\n\nУдаляет страницу по идентификатору. Восстановить удалённую страницу через API нельзя — создавайте новую при необходимости.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор страницы |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002F2295\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002F2295\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002F2295', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nif (res.status === 204) {\n  console.log('Страница удалена')\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002F2295', {\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('Страница удалена')\n}\n```\n\n## Ответ\n\nПри успешном удалении возвращается HTTP-статус `204 No Content` с пустым телом — успех проверяется по статусу.\n\n## Пример ответа\n\n```http\nHTTP\u002F1.1 204 No Content\n```\n\n## Пример ответа при ошибке\n\n404 — страница не найдена или уже удалена:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"Лендинг не найден.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | `error.code` | Описание |\n|------|--------------|---------|\n| 404 | `ENTITY_NOT_FOUND` | Страница с таким ID не найдена или уже удалена |\n| 403 | `BITRIX_ACCESS_DENIED` | У пользователя нет права на удаление этой страницы |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `landing` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Удаление освобождает код страницы.** После удаления символьный код снова свободен — новую страницу с тем же `code` на том же сайте можно создать сразу.\n\n## Смотрите также\n\n- [Список страниц](\u002Fdocs\u002Fentities\u002Fpages\u002Flist) — найти ID нужной страницы перед удалением, в том числе через `?filter[siteId]=:id`\n- [Получить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fget) — проверить страницу перед удалением\n- [Удалить сайт](\u002Fdocs\u002Fentities\u002Fsites\u002Fdelete) — удаление сайта после очистки страниц\n- [Batch](\u002Fdocs\u002Fbatch) — массовое удаление страниц одного сайта\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Поиск страниц\n\n`POST \u002Fv1\u002Fpages\u002Fsearch`\n\nВозвращает список страниц по фильтру в теле запроса. По сравнению с [`GET \u002Fv1\u002Fpages`](.\u002Flist.md) удобнее для сложных условий: параметры передаются в JSON, можно использовать вложенные операторы (`>=`, `\u003C=`, `!`, `in`) в стиле MongoDB.\n\n## Поля запроса (body)\n\n| Поле | Тип | По умолч. | Описание |\n|------|-----|-----------|---------|\n| `filter` | object | — | Фильтр по ключевым полям страницы.\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering). Пример: `{\"filter\": {\"siteId\": 3}}` |\n| `select` | string[] | — | Список полей для возврата. Без `select` ответ содержит полный набор полей страницы в camelCase (как в карточке) |\n| `limit` | number | `50` | Количество записей (до 5000). При `limit > 50` Вайбкод запрашивает несколько страниц у Битрикс24 и собирает результат |\n| `scope` | string | — | Внутренняя область лендингов: `KNOWLEDGE` \u002F `GROUP` \u002F `MAINPAGE`. Без параметра возвращаются страницы обычных сайтов-лендингов. Принимается на верхнем уровне тела (`\"scope\": \"KNOWLEDGE\"`) или внутри `filter.scope` — обе формы дают одинаковый запрос к Битрикс24 |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"siteId\": 3 },\n    \"select\": [\"id\", \"title\", \"code\", \"siteId\", \"active\", \"dateModify\"],\n    \"limit\": 10\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\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\": { \"siteId\": 3 },\n    \"select\": [\"id\", \"title\", \"code\", \"siteId\", \"active\", \"dateModify\"],\n    \"limit\": 10\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\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: { siteId: 3 },\n    select: ['id', 'title', 'code', 'siteId', 'active', 'dateModify'],\n    limit: 10,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log(`Найдено ${meta.total} страниц за ${meta.durationMs} мс`)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\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: { siteId: 3 },\n    select: ['id', 'title', 'code', 'siteId', 'active', 'dateModify'],\n    limit: 10,\n  }),\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив найденных страниц |\n| `data[].id` | number | Идентификатор страницы |\n| `data[].title` | string | Название страницы |\n| `data[].code` | string | Символьный код страницы |\n| `data[].siteId` | number | Идентификатор сайта |\n| `data[].active` | boolean | Активна ли страница |\n| `data[].description` | string \\| null | Произвольное описание |\n| `data[].createdById` | number | Идентификатор создавшего сотрудника |\n| `data[].dateCreate` | datetime | Дата создания |\n| `data[].dateModify` | datetime | Дата последнего изменения |\n| `meta.total` | number | Общее количество записей, соответствующих фильтру |\n| `meta.hasMore` | boolean | Есть ли ещё записи за пределами `limit` |\n| `meta.durationMs` | number | Время выполнения запроса (мс) |\n\nURL любой страницы из массива `data` строится из её `id` и `siteId`:\n\n```\nhttps:\u002F\u002F\u003Cportal>.bitrix24.ru\u002Fsites\u002Fsite\u002F\u003CsiteId>\u002Fview\u002F\u003Cid>\u002F\n```\n\n`\u003CsiteId>` — ID сайта, которому принадлежит страница (поле `siteId` каждого элемента). `\u003Cportal>` — домен портала. Доступ ограничен правами сотрудника в Битрикс24.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 3,\n      \"title\": \"Смена названия\",\n      \"code\": \"promo-page\",\n      \"siteId\": 3,\n      \"active\": true,\n      \"description\": null,\n      \"createdById\": 1,\n      \"dateCreate\": \"22.04.2020 14:39:17\",\n      \"dateModify\": \"06.05.2024 15:43:27\"\n    },\n    {\n      \"id\": 7,\n      \"title\": \"Test page\",\n      \"code\": \"test\",\n      \"siteId\": 3,\n      \"active\": true,\n      \"description\": null,\n      \"createdById\": 1,\n      \"dateCreate\": \"25.05.2020 17:34:17\",\n      \"dateModify\": \"10.10.2022 15:25:30\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 13,\n    \"hasMore\": true,\n    \"durationMs\": 171\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n422 — несуществующее поле в фильтре:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Unknown field definition `nonsense` (nonsense) for \\\\Bitrix\\\\Landing\\\\Internals\\\\Landing Entity.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 422 | `BITRIX_ERROR` | Передан неизвестный филд в `filter` или иной параметр, не поддерживаемый Битрикс24 |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `landing` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Когда выбирать `search`, а когда `list`.** Оба эндпоинта возвращают одинаковый набор страниц по фильтру. Используйте `POST \u002Fv1\u002Fpages\u002Fsearch`, когда фильтр сложнее равенства (например, `id in [3, 7, 9]`) — JSON-тело удобнее экранирует вложенные операторы. Для простых `filter[field]=value` достаточно `GET \u002Fv1\u002Fpages`.\n\n**Формат дат в фильтре.** Даты в фильтре принимаются только в формате Битрикс24 `ДД.ММ.ГГГГ ЧЧ:ММ:СС`, **не** ISO 8601. `{\">=dateModify\": \"06.06.2026 00:00:00\"}` работает. ISO-значение `{\">=dateModify\": \"2026-06-06\"}` принимается без ошибки, но даёт неверный результат — Битрикс24 его не распознаёт. Тот же формат `ДД.ММ.ГГГГ ЧЧ:ММ:СС` возвращается и в ответе, см. поля `dateCreate`\u002F`dateModify`.\n\n**`meta.durationMs`.** В отличие от list, search всегда возвращает длительность запроса в миллисекундах — полезно при отладке производительности.\n\n**Постраничный переход через `offset` поддерживается.** Вайбкод применяет окно `[offset, offset+limit)` на своей стороне (метод Битрикс24 отдаёт весь список за один вызов), а `meta.total` \u002F `meta.hasMore` считает по числу строк.\n\n## Смотрите также\n\n- [Список страниц](\u002Fdocs\u002Fentities\u002Fpages\u002Flist) — `GET`-аналог для простых фильтров\n- [Получить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fget) — данные одной страницы по ID\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n","\n## Поля страницы\n\n`GET \u002Fv1\u002Fpages\u002Ffields`\n\nВозвращает карту всех полей страницы с типом и признаком только для чтения. Поля без этого признака доступны для записи при создании и обновлении.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\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).length)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\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## Поля ответа\n\nОбъект `data` содержит карту `fields` (имя поля → `{ type, readonly }`), список `batch` с операциями массового режима, список доступных `include` и набор `aggregatable` полей для группировки в [агрегации](.\u002Faggregate.md).\n\n| Поле | Битрикс24 | Тип | RO | Описание |\n|------|----------|-----|:--:|---------|\n| `id` | `ID` | number | да | Идентификатор страницы |\n| `title` | `TITLE` | string | | Название, до 255 символов |\n| `code` | `CODE` | string | | Символьный код в URL. Без `\u002F`, авто-генерация из `title` |\n| `siteId` | `SITE_ID` | number | | Сайт-владелец. Источник: `GET \u002Fv1\u002Fsites` |\n| `active` | `ACTIVE` | boolean | | Активна ли страница. Принимается при записи, но не сохраняется — управляется в интерфейсе портала |\n| `description` | `DESCRIPTION` | string \\| null | | Описание. `null`, если не задано |\n| `xmlId` | `XML_ID` | string \\| null | | Внешний код |\n| `deleted` | `DELETED` | string | да | Признак корзины: `\"Y\"` \u002F `\"N\"` |\n| `public` | `PUBLIC` | string | | Публичность: `\"Y\"` \u002F `\"N\"` |\n| `sys` | `SYS` | string | да | Системная страница Битрикс24: `\"Y\"` \u002F `\"N\"` |\n| `views` | `VIEWS` | number | да | Счётчик просмотров |\n| `tplId` | `TPL_ID` | number | | Идентификатор шаблона |\n| `tplCode` | `TPL_CODE` | string \\| null | да | Символьный код шаблона |\n| `sitemap` | `SITEMAP` | string | | Включать в карту сайта: `\"Y\"` \u002F `\"N\"` |\n| `folder` | `FOLDER` | string | | Является ли страница папкой-разделом: `\"Y\"` \u002F `\"N\"` |\n| `folderId` | `FOLDER_ID` | number | | Идентификатор папки-раздела сайта |\n| `searchContent` | `SEARCH_CONTENT` | string | да | Индексируемое содержимое страницы для поиска по сайту |\n| `version` | `VERSION` | number | да | Версия внутренней структуры страницы |\n| `historyStep` | `HISTORY_STEP` | number | да | Служебное поле истории изменений |\n| `modifiedById` | `MODIFIED_BY_ID` | number | да | Последний редактор. Поиск: `GET \u002Fv1\u002Fusers` |\n| `domainId` | `DOMAIN_ID` | number | да | Идентификатор домена сайта |\n| `initiatorAppCode` | `INITIATOR_APP_CODE` | string | да | Код приложения, создавшего страницу |\n| `rule` | `RULE` | string | да | Служебное поле Битрикс24 |\n| `createdById` | `CREATED_BY_ID` | number | да | Создатель. Поиск: `GET \u002Fv1\u002Fusers` |\n| `dateCreate` | `DATE_CREATE` | datetime | да | Дата создания. Формат локали Битрикс24, не ISO 8601 |\n| `dateModify` | `DATE_MODIFY` | datetime | да | Дата последнего изменения. Формат локали Битрикс24 |\n| `datePublic` | `DATE_PUBLIC` | datetime | да | Дата публикации. У неопубликованной страницы приходит пустым объектом `{}` |\n\n## Доступные include\n\nЭндпоинт возвращает список доступных include: `site` — сайт-владелец страницы. Подробнее: [Связанные данные](\u002Fdocs\u002Fincludes).\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"fields\": {\n      \"id\": { \"type\": \"number\", \"readonly\": true },\n      \"title\": { \"type\": \"string\", \"readonly\": false },\n      \"siteId\": { \"type\": \"number\", \"readonly\": false },\n      \"active\": { \"type\": \"boolean\", \"readonly\": false }\n    },\n    \"relations\": {\n      \"site\": { \"type\": \"one\", \"entity\": \"site\", \"includable\": true }\n    },\n    \"aggregatable\": [\"siteId\", \"active\", \"deleted\", \"public\", \"folderId\", \"tplId\", \"createdById\", \"modifiedById\"],\n    \"batch\": [\"create\", \"update\", \"delete\"],\n    \"include\": [\"site\"]\n  }\n}\n```\n\nПоказаны 4 из 27 полей. Полный список — в таблице выше.\n\n## Пример ответа при ошибке\n\n403 — нет скоупа:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SCOPE_DENIED\",\n    \"message\": \"This endpoint requires 'landing' scope\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `landing` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Создать страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fcreate)\n- [Обновить страницу](\u002Fdocs\u002Fentities\u002Fpages\u002Fupdate)\n- [Агрегация страниц](\u002Fdocs\u002Fentities\u002Fpages\u002Faggregate)\n- [Страницы](\u002Fdocs\u002Fentities\u002Fpages)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n","\n## Агрегация страниц\n\n`POST \u002Fv1\u002Fpages\u002Faggregate`\n\nПодсчёт количества страниц с учётом фильтра и группировка по категориальным полям. Поддерживает функцию `count` и группировку `groupBy`.\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `aggregate` | array | нет | Массив агрегаций. Для страниц осмысленна `{ \"field\": \"*\", \"function\": \"count\" }` — числовых полей для `sum`\u002F`avg`\u002F`min`\u002F`max` у сущности нет. Без параметра возвращается `count` записей с учётом фильтра |\n| `groupBy` | string \\| array | нет | Поле или поля для группировки. Допустимы только поля из `aggregatable`: `siteId`, `active`, `deleted`, `public`, `folderId`, `tplId`, `createdById`, `modifiedById`. До 5 полей |\n| `filter` | object | нет | Фильтрация по полям страницы.\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering). Пример: `{ \"siteId\": 12 }` |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002Faggregate\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"groupBy\": \"siteId\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002Faggregate\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"groupBy\": \"siteId\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002Faggregate', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    groupBy: 'siteId',\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Страниц по сайтам:', data.groups)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fpages\u002Faggregate', {\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    groupBy: 'siteId',\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Другие сценарии\n\nОбщее количество страниц в портале — без выгрузки записей:\n\n```json\n{}\n```\n\nКоличество страниц одного сайта:\n\n```json\n{ \"filter\": { \"siteId\": 12 } }\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.count` | number | Количество страниц, соответствующих фильтру |\n| `data.aggregates` | object | Результаты числовых агрегаций. Для страниц остаётся пустым — нет числовых полей |\n| `data.groups` | array | Присутствует при `groupBy`. Каждый элемент — значение измерения плюс `count` записей в группе |\n| `data.meta.totalRecords` | number | Общее количество записей |\n| `data.meta.recordsProcessed` | number | Сколько записей обработано |\n| `data.meta.truncated` | boolean | Был ли результат ограничен (`true` при более 5000 записей) |\n| `data.meta.groupTotal` | number | Присутствует при `groupBy` — количество групп |\n| `data.meta.groupsTruncated` | boolean | Присутствует при `groupBy`. `true`, если число групп превысило лимит и список групп усечён |\n\n## Пример ответа\n\nГруппировка по сайту (`groupBy: \"siteId\"`):\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"count\": 84,\n    \"aggregates\": {},\n    \"groups\": [\n      { \"siteId\": 12, \"count\": 9, \"aggregates\": {} },\n      { \"siteId\": 14, \"count\": 6, \"aggregates\": {} },\n      { \"siteId\": 27, \"count\": 11, \"aggregates\": {} }\n    ],\n    \"meta\": {\n      \"totalRecords\": 84,\n      \"recordsProcessed\": 84,\n      \"truncated\": false,\n      \"groupTotal\": 5,\n      \"groupsTruncated\": false\n    }\n  }\n}\n```\n\nПростой подсчёт без группировки (`{}`):\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"count\": 84,\n    \"aggregates\": {},\n    \"meta\": {\n      \"totalRecords\": 84,\n      \"recordsProcessed\": 0,\n      \"truncated\": false\n    }\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — поле вне списка `aggregatable`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"INVALID_PARAMS\",\n    \"message\": \"groupBy field 'title' is not aggregatable on this entity. Available: siteId, active, deleted, public, folderId, tplId, createdById, modifiedById.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `INVALID_PARAMS` | Поле `groupBy` вне списка `aggregatable` или неизвестная функция агрегации |\n| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `landing` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Группировка считается по выборке.** При более 5000 записей (`meta.truncated: true`) счётчики групп основаны на выборке из 5000 записей, а верхний `count` остаётся точным общим числом по фильтру.\n\n**Видимость по правам пользователя.** В подсчёт попадают только страницы, к которым у владельца API-ключа есть право «просмотр». Если ожидается ненулевой результат, но `count` равен нулю — проверьте права пользователя, под которым выпущен ключ.\n\n## Смотрите также\n\n- [Список страниц](\u002Fdocs\u002Fentities\u002Fpages\u002Flist)\n- [Поиск страниц](\u002Fdocs\u002Fentities\u002Fpages\u002Fsearch)\n- [Поля страницы](\u002Fdocs\u002Fentities\u002Fpages\u002Ffields)\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n"]