[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-entities\u002Fsites":3,"docs-tabs-entities\u002Fsites":6},{"content":4,"lastmod":5},"\n# Сайты\n\nУправление сайтами на платформе Битрикс24: создание, получение, обновление, удаление, поиск, агрегация. Сайт — это контейнер страниц одного типа: `PAGE` — лендинг, `STORE` — интернет-магазин, `KNOWLEDGE` — база знаний 2.0. У каждого сайта свой домен или поддомен на портале, символьный код, шаблон и набор страниц.\n\nБаза знаний 2.0 создаётся и управляется через те же методы с дополнительным параметром `scope: \"KNOWLEDGE\"` (см. [создание](.\u002Fsites\u002Fcreate.md)).\n\nБитрикс24 API: `landing.site.*`\nСкоуп: `landing`\n\n## Операции\n\n- [Создать сайт](.\u002Fsites\u002Fcreate.md) — `POST \u002Fv1\u002Fsites`\n- [Список сайтов](.\u002Fsites\u002Flist.md) — `GET \u002Fv1\u002Fsites`\n- [Получить сайт](.\u002Fsites\u002Fget.md) — `GET \u002Fv1\u002Fsites\u002F:id`\n- [Обновить сайт](.\u002Fsites\u002Fupdate.md) — `PATCH \u002Fv1\u002Fsites\u002F:id`\n- [Удалить сайт](.\u002Fsites\u002Fdelete.md) — `DELETE \u002Fv1\u002Fsites\u002F:id`\n- [Поиск сайтов](.\u002Fsites\u002Fsearch.md) — `POST \u002Fv1\u002Fsites\u002Fsearch`\n- [Поля сайта](.\u002Fsites\u002Ffields.md) — `GET \u002Fv1\u002Fsites\u002Ffields`\n- [Агрегация сайтов](.\u002Fsites\u002Faggregate.md) — `POST \u002Fv1\u002Fsites\u002Faggregate`\n\n## Поля\n\n### Изменяемые поля\n\nПринимаются при [создании](.\u002Fsites\u002Fcreate.md) и [обновлении](.\u002Fsites\u002Fupdate.md).\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `title` | string | Название сайта, до 255 символов |\n| `code` | string | Символьный код сайта в URL. Если оставить пустым при создании — генерируется из `title`. Если код состоит только из цифр, добавляется префикс `site` |\n| `type` | string | Тип сайта: `PAGE` — лендинг, `STORE` — интернет-магазин, `KNOWLEDGE` — база знаний 2.0. Для `KNOWLEDGE` при создании и изменении нужен `scope: \"KNOWLEDGE\"`. В ответах у сайтов, созданных вне API, встречаются и другие значения — см. «Что нужно знать перед работой» |\n| `active` | boolean | Через API не устанавливается — принимается без ошибки, но не сохраняется. Новый сайт неактивен, активируется при публикации в интерфейсе портала Битрикс24 |\n| `domainId` | number | Идентификатор домена. Если не передать при создании — адрес формируется из `code` |\n| `description` | string \\| null | Описание сайта, до 255 символов. В ответе приходит `null`, если не задано |\n| `xmlId` | string \\| null | Внешний идентификатор, до 255 символов. В ответе приходит `null`, если не задан |\n| `landingIdIndex` | number \\| null | Идентификатор главной страницы. Задаётся только в обновлении — после создания страниц. `null`, если главная не назначена |\n| `landingId404` | number \\| null | Идентификатор страницы ошибки 404. Задаётся только в обновлении. Если не назначена — `0` или `null` |\n| `landingId503` | number \\| null | Идентификатор страницы ошибки 503. Задаётся только в обновлении. Если не назначена — `0` или `null` |\n\n### Только для чтения\n\nПриходят в ответе, но не принимаются при создании и обновлении.\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `id` | number | Идентификатор сайта |\n| `deleted` | string | Признак нахождения в корзине: `\"Y\"` \u002F `\"N\"`. Доступен в фильтре (`filter[deleted]=Y`) |\n| `createdById` | number | Идентификатор создавшего пользователя |\n| `modifiedById` | number | Идентификатор пользователя, изменившего сайт последним |\n| `dateCreate` | datetime | Дата создания. Формат локали Битрикс24, не ISO 8601 — см. «Что нужно знать перед работой» |\n| `dateModify` | datetime | Дата последнего изменения. Формат локали Битрикс24, не ISO 8601 |\n| `tplId` | number | Идентификатор шаблона сайта |\n| `tplCode` | string \\| null | Символьный код шаблона сайта. `null`, если у шаблона нет кода |\n| `smnSiteId` | string \\| null | Идентификатор связанного сайта «Управление сайтом» типа `SMN`. `null` у обычных сайтов |\n| `lang` | string \\| null | Код языка сайта, например `ru`. `null`, если язык не задан |\n| `special` | string | Служебный признак Битрикс24: `\"Y\"` \u002F `\"N\"` |\n| `version` | number | Версия внутренней структуры сайта |\n\n## Что нужно знать перед работой\n\n1. **Тело запроса плоское.** При создании и обновлении передавайте поля прямо в корне JSON: `{\"title\": \"...\", \"code\": \"...\"}`. Обёртка `fields` не нужна.\n2. **Удалить можно только пустой сайт.** Если у сайта есть хотя бы одна страница (включая страницы в корзине), `DELETE \u002Fv1\u002Fsites\u002F:id` вернёт ошибку `BITRIX_ERROR` с описанием «Сайт содержит страницы». Сначала удалите страницы, затем сам сайт.\n3. **Видимость зависит от прав пользователя.** Список и агрегация возвращают только те сайты, к которым у владельца API-ключа есть право «просмотр». Если на портале есть сайты, но ответ пустой — проверьте права пользователя, под которым выпущен ключ.\n4. **Корзина — `filter[deleted]=Y`.** По умолчанию удалённые сайты не возвращаются. Чтобы получить сайты в корзине, добавьте в фильтр `deleted=Y`. Значения — `Y` или `N`.\n5. **Полный список полей — [`GET \u002Fv1\u002Fsites\u002Ffields`](.\u002Fsites\u002Ffields.md).** Эндпоинт возвращает карту всех 22 полей с типом и признаком `readonly`. Перечень с описаниями приведён в разделе «Поля» выше.\n6. **Формат дат — локаль-зависимый, не ISO 8601.** Поля `dateCreate` и `dateModify` приходят строкой в локальном формате портала: на RU-локали — `ДД.ММ.ГГГГ ЧЧ:ММ:СС` (`30.12.2021 12:30:52`), на EN-локали — `MM\u002FDD\u002FYYYY hh:mm:ss am\u002Fpm` (`04\u002F22\u002F2020 02:39:17 pm`). Значение возвращается как есть, без приведения к ISO. `new Date(value)` вернёт `Invalid Date` либо перепутает день и месяц — не разбирайте дату по фиксированному шаблону, ориентируйтесь на региональные настройки портала.\n7. **Поле `type` в ответах шире, чем при создании.** Через API создаются сайты типов `PAGE`, `STORE`, `KNOWLEDGE`. В ответах у сайтов, собранных другими средствами, встречаются и другие значения — `VIBE` (сайт из конструктора) и `SMN` (связка с модулем «Управление сайтом»). Эти два типа возвращаются только для чтения. Полный перечень значений теперь покрыт схемой — [`GET \u002Fv1\u002Fsites\u002Ffields`](.\u002Fsites\u002Ffields.md) отдаёт их в `type.enum` с подписями.\n8. **Отсутствие значения — `null` или `0`.** Часть необязательных полей при отсутствии значения приходит как `null` — это `description`, `xmlId`, `tplCode`, `smnSiteId`, `lang`. Числовые идентификаторы страниц ошибок `landingId404` и `landingId503` — как `0`. Проверяйте оба варианта.\n9. **Фильтр по `code` — со слешами.** В фильтре значение `code` сравнивается с хранимой формой, обрамлённой слешами: `filter[code]=\u002Fmy-code\u002F` находит сайт, голое `filter[code]=my-code` — нет. Используйте то значение `code`, которое сайт отдаёт в ответе.\n\n## Связанные сущности\n\n| Сущность | Эндпоинт | Назначение |\n|----------|----------|-----------|\n| Страницы | [`GET \u002Fv1\u002Fpages`](\u002Fdocs\u002Fentities\u002Fpages) | Страницы сайта. Получите список страниц с `filter[siteId]=:id` перед удалением сайта или для редактирования содержимого. |\n\n## Лимиты\n\n| Лимит | Значение |\n|-------|----------|\n| Максимум записей на запрос | 5000 (`limit ≤ 5000`) |\n| Авто-пагинация | включается при `limit > 50` |\n| `offset` | не поддерживается — `?offset=N` возвращает `422 «Unknown parameter: start»` |\n| Batch-запросы | до 50 операций в [`POST \u002Fv1\u002Fbatch`](\u002Fdocs\u002Fbatch) |\n| Rate limit | общий для API Вайбкод — см. [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) |\n\n## Смотрите также\n\n- [Entity API](\u002Fdocs\u002Fentity-api) — общие принципы работы с сущностями\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch) — массовые операции\n- [Справочник сущностей](\u002Fdocs\u002Fentities-index)\n","2026-07-15",{"sites\u002Fcreate.md":7,"sites\u002Flist.md":8,"sites\u002Fget.md":9,"sites\u002Fupdate.md":10,"sites\u002Fdelete.md":11,"sites\u002Fsearch.md":12,"sites\u002Ffields.md":13,"sites\u002Faggregate.md":14},"\n## Создать сайт\n\n`POST \u002Fv1\u002Fsites`\n\nСоздаёт новый сайт на портале. Тип сайта определяется полем `type`. Поля передаются плоско в корне JSON — без обёртки `fields`.\n\n## Поля запроса (body)\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `title` | string | да | Название сайта, до 255 символов |\n| `type` | string | нет | Тип сайта. По умолчанию `PAGE` — лендинг. Также `STORE` — интернет-магазин, `KNOWLEDGE` — база знаний 2.0. Для `KNOWLEDGE` обязательно передайте также `scope: \"KNOWLEDGE\"` — см. ниже |\n| `scope` | string | нет | Раздел Битрикс24, в котором создаётся сайт: `KNOWLEDGE` (база знаний 2.0), `GROUP` (база знаний группы) или `MAINPAGE`. Без него создаётся обычный сайт-лендинг. **Чтобы создать базу знаний, передайте `scope: \"KNOWLEDGE\"` вместе с `type: \"KNOWLEDGE\"`** — иначе сервер вернёт `403 BITRIX_ACCESS_DENIED` («Доступ на создание сайта запрещён»). Можно передать как поле тела или query-параметром `?scope=KNOWLEDGE`. То же значение `scope` нужно при [обновлении](\u002Fdocs\u002Fentities\u002Fsites\u002Fupdate) и [удалении](\u002Fdocs\u002Fentities\u002Fsites\u002Fdelete) такого сайта |\n| `code` | string | да | Символьный код сайта в URL. **Ключ обязателен**, но значение может быть пустым (`\"\"`) или `null` — тогда код генерируется из `title`. Если опустить сам ключ `code`, создание возвращает `422` (см. «Адрес сайта обязателен» в «Известных особенностях»). Если код только из цифр — добавляется префикс `site`. Если код уже занят на домене — числовой суффикс (`code2`, `code3`) |\n| `domainId` | number | нет | Идентификатор домена. Если не передавать, адрес формируется из `code` на `bitrix24site.ru` |\n| `active` | boolean | нет | Принимается без ошибки, но не сохраняется. Новый сайт всегда создаётся неактивным — `active: false`. Сайт активируется при публикации в интерфейсе портала Битрикс24 |\n| `description` | string | нет | Описание сайта, до 255 символов |\n| `xmlId` | string | нет | Внешний идентификатор, до 255 символов |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Лендинг конференции\",\n    \"code\": \"conf-2026\",\n    \"type\": \"PAGE\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\" \\\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\": \"conf-2026\",\n    \"type\": \"PAGE\"\n  }'\n```\n\n### curl — база знаний 2.0 (`scope=KNOWLEDGE`)\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"База знаний компании\",\n    \"type\": \"KNOWLEDGE\",\n    \"scope\": \"KNOWLEDGE\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites', {\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: 'conf-2026',\n    type: 'PAGE',\n  }),\n})\n\nconst { success, data } = await res.json()\nconsole.log('Site ID:', data.id)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites', {\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: 'conf-2026',\n    type: 'PAGE',\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| `type` | string | Тип сайта |\n| `active` | boolean | Всегда `false` для только что созданного сайта |\n| `domainId` | number | Идентификатор домена (выданного автоматически или переданного) |\n| `createdById` | number | Идентификатор создавшего пользователя |\n| `dateCreate` | datetime | Дата создания |\n| `dateModify` | datetime | Дата последнего изменения |\n\nURL сайта в Битрикс24 строится из `id`:\n\n```\nhttps:\u002F\u002F\u003Cportal>.bitrix24.ru\u002Fsites\u002Fsite\u002F\u003Cid>\u002F\n```\n\n`\u003Cportal>` — домен портала. Доступ ограничен правами сотрудника в Битрикс24.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 173,\n    \"title\": \"Лендинг конференции\",\n    \"code\": \"\u002Fconf-2026\u002F\",\n    \"type\": \"PAGE\",\n    \"active\": false,\n    \"domainId\": 28,\n    \"createdById\": 1,\n    \"dateCreate\": \"07.05.2026 12:14:08\",\n    \"dateModify\": \"07.05.2026 12:14:08\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n422 — некорректный код сайта:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ERROR\",\n    \"message\": \"Адрес сайта введен неверно. Вы можете использовать только следующие символы: \\\"a-z\\\", \\\"0-9\\\", \\\"-\\\", \\\".\\\".\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | `error.code` | Маркер в `error.message` | Описание |\n|------|--------------|--------------------------|---------|\n| 422 | `BITRIX_ERROR` | `Не заполнено обязательное поле \"Адрес сайта\"` | Опущен ключ `code` — у сайта нет адреса. Передайте `code` с любым значением, можно пустым |\n| 422 | `BITRIX_ERROR` | `SLASH_IS_NOT_ALLOWED` | В `code` передан символ `\u002F` — слеши в коде запрещены |\n| 422 | `BITRIX_ERROR` | `DOMAIN_IS_INCORRECT` | Адрес сайта введён неверно: разрешены только символы `a-z`, `0-9`, `-`, `.` |\n| 422 | `BITRIX_ERROR` | `DOMAIN_EXIST` | Указанный домен уже занят другим сайтом |\n| 422 | `BITRIX_ERROR` | `DOMAIN_EXIST_TRASH` | Домен привязан к сайту в корзине — сначала отвяжите его |\n| 422 | `BITRIX_ERROR` | `DOMAIN_NOT_FOUND` | Домен с указанным `domainId` не существует |\n| 422 | `BITRIX_ERROR` | `SITE_LIMIT_REACHED` | Достигнут лимит количества сайтов на текущем тарифе |\n| 403 | `BITRIX_ACCESS_DENIED` | `Доступ на создание сайта запрещён` | У пользователя нет права на создание сайтов — ИЛИ создаётся `type: \"KNOWLEDGE\"` без `scope: \"KNOWLEDGE\"` (добавьте `scope`, см. таблицу полей) |\n| 403 | `SCOPE_DENIED` | — | API-ключ не имеет скоупа `landing` |\n| 401 | `TOKEN_MISSING` | — | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Слеши в ответе.** Поле `code` в ответе возвращается с обрамляющими слешами (`\u002Fconf-2026\u002F`) — это представление пути сайта в URL. В запросе слеши передавать нельзя.\n\n**Ключ `code` обязателен.** Значение `code` может быть пустой строкой `\"\"` или `null` — тогда код генерируется из `title`. Но если опустить сам ключ `code`, создание возвращает `422 BITRIX_ERROR` с сообщением `Не заполнено обязательное поле \"Адрес сайта\"`. Если `domainId` не передан, адрес формируется из `code` на `bitrix24site.ru`, например `b24-xxxxx.bitrix24site.ru`.\n\n**Главная страница и страницы ошибок.** Поля `landingIdIndex`, `landingId404`, `landingId503` при создании не задаются — страниц ещё нет. Назначьте их через [обновление](\u002Fdocs\u002Fentities\u002Fsites\u002Fupdate) после создания страниц сайта.\n\n**База знаний 2.0.** Создаётся как сайт с `type: \"KNOWLEDGE\"` И `scope: \"KNOWLEDGE\"` — оба поля обязательны. Без `scope` сервер вернёт `403 BITRIX_ACCESS_DENIED`, потому что Битрикс24 создаёт сайты типа `KNOWLEDGE` только в разделе баз знаний (тот же `scope` доступен для списка, чтения, обновления и удаления — см. соответствующие методы). Достаточно скоупа `landing` у ключа. Отдельного скоупа для баз знаний не требуется.\n\n## Смотрите также\n\n- [Список сайтов](\u002Fdocs\u002Fentities\u002Fsites\u002Flist) — посмотреть существующие сайты перед созданием\n- [Обновить сайт](\u002Fdocs\u002Fentities\u002Fsites\u002Fupdate) — изменить параметры созданного сайта\n- [Удалить сайт](\u002Fdocs\u002Fentities\u002Fsites\u002Fdelete) — удалить пустой сайт\n- [Batch](\u002Fdocs\u002Fbatch) — массовое создание\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Список сайтов\n\n`GET \u002Fv1\u002Fsites`\n\nВозвращает список сайтов портала с поддержкой фильтрации и авто-пагинации. По умолчанию возвращаются только не удалённые сайты — для получения сайтов из корзины передайте `filter[deleted]=Y`.\n\n## Параметры\n\n| Параметр | Тип | По умолч. | Описание |\n|----------|-----|-----------|---------|\n| `limit` | number | `50` | Количество записей (до 5000). При `limit > 50` Вайбкод автоматически запрашивает несколько страниц у Битрикс24 |\n| `select` | string | — | Выборка полей: `?select=id,title,type` |\n| `filter` | object | — | Фильтрация по ключевым полям сайта.\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering). Пример: `?filter[type]=PAGE` |\n| `scope` | string | — | Внутренняя область лендингов. Допустимые значения: `KNOWLEDGE` (база знаний), `GROUP` (страницы рабочих групп), `MAINPAGE` (главные страницы). Без параметра возвращаются обычные сайты-лендинги. Принимается как `?scope=KNOWLEDGE` или `?filter[scope]=KNOWLEDGE` — обе формы дают одинаковый запрос к Битрикс24 |\n\n> **Фильтр по типу и область (`scope`).** Битрикс24 привязывает фильтр `filter[type]` к текущей области: в области по умолчанию доступны только типы `PAGE` \u002F `STORE` \u002F `SMN` \u002F `VIBE`. Если вы фильтруете `filter[type]=KNOWLEDGE` или `filter[type]=GROUP` и **не** передали `scope`, Вайбкод сам подставит соответствующую область (`type=KNOWLEDGE` → `scope=KNOWLEDGE`) — фильтр по базам знаний и страницам групп работает без ручного указания `scope`. Явный `scope` всегда в приоритете. `MAINPAGE` — это область, а не тип сайта (её сайты имеют тип `VIBE`), поэтому из фильтра по типу не выводится: для главных страниц передавайте `scope=MAINPAGE` явно.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites?limit=10&filter[type]=PAGE\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites?limit=10&filter[type]=PAGE\" \\\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\u002Fsites?limit=10&filter[type]=PAGE', {\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 res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites?limit=10&filter[type]=PAGE', {\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| `meta.total` | number | Общее количество записей, соответствующих фильтру |\n| `meta.hasMore` | boolean | Есть ли ещё записи за пределами `limit` |\n\nURL любого сайта из массива `data` — его `id`:\n\n```\nhttps:\u002F\u002F\u003Cportal>.bitrix24.ru\u002Fsites\u002Fsite\u002F\u003Cid>\u002F\n```\n\n`\u003Cportal>` — домен портала. Доступ ограничен правами сотрудника в Битрикс24.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 157,\n      \"title\": \"Промо-лендинг\",\n      \"code\": \"\u002Fpromo\u002F\",\n      \"type\": \"PAGE\",\n      \"active\": true,\n      \"domainId\": 5,\n      \"createdById\": 1,\n      \"dateCreate\": \"12.09.2024 10:23:14\",\n      \"dateModify\": \"04.11.2025 08:51:20\"\n    },\n    {\n      \"id\": 3,\n      \"title\": \"Каталог услуг\",\n      \"code\": \"\u002Fservices\u002F\",\n      \"type\": \"PAGE\",\n      \"active\": true,\n      \"domainId\": 5,\n      \"createdById\": 1,\n      \"dateCreate\": \"22.04.2020 14:39:17\",\n      \"dateModify\": \"06.05.2024 15:43:34\"\n    }\n  ],\n  \"meta\": {\n    \"total\": 25,\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| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `landing` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Видимость по правам пользователя.** В список попадают только сайты, к которым у владельца API-ключа есть право «просмотр». Если на портале есть сайты, но ответ пустой — проверьте права пользователя, под которым выпущен ключ.\n\n**Корзина.** Чтобы получить удалённые сайты, передайте `filter[deleted]=Y`. Значения — `Y` или `N`.\n\n**Сортировка.** Поддерживается через `?order[поле]=asc|desc` или короткую форму `?sort=-поле` (по убыванию). Без параметра выборка идёт по возрастанию `id`.\n\n**База знаний и другие внутренние области.** Параметр `scope` переключает источник: `KNOWLEDGE` — сайты базы знаний, `GROUP` — сайты внутри рабочих групп, `MAINPAGE` — главные страницы. Без параметра возвращаются обычные сайты-лендинги (источник по умолчанию). Пример: `GET \u002Fv1\u002Fsites?scope=KNOWLEDGE` возвращает сайты базы знаний и игнорирует обычные лендинги.\n\n## Смотрите также\n\n- [Получить сайт](\u002Fdocs\u002Fentities\u002Fsites\u002Fget) — данные одного сайта по ID\n- [Поиск сайтов](\u002Fdocs\u002Fentities\u002Fsites\u002Fsearch) — POST-запрос для сложных фильтров\n- [Создать сайт](\u002Fdocs\u002Fentities\u002Fsites\u002Fcreate) — создание нового\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Entity API](\u002Fdocs\u002Fentity-api) — select, order, пагинация\n- [Batch](\u002Fdocs\u002Fbatch) — объединение нескольких list-запросов\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Получить сайт\n\n`GET \u002Fv1\u002Fsites\u002F:id`\n\nВозвращает один сайт по идентификатору.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор сайта |\n| `scope` (query) | string | нет | Внутренняя область лендингов: `KNOWLEDGE` \u002F `GROUP` \u002F `MAINPAGE`. Указывайте, если сайт принадлежит соответствующей области. Иначе возвращается `404 ENTITY_NOT_FOUND`. Пример: `GET \u002Fv1\u002Fsites\u002F42?scope=KNOWLEDGE` |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\u002F157\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\u002F157\" \\\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\u002Fsites\u002F157', {\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n  },\n})\n\nconst { success, data } = await res.json()\nconsole.log('Сайт:', data.title, '—', data.type)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\u002F157', {\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Возвращается полный объект сайта со всеми полями — см. [Поля](\u002Fdocs\u002Fentities\u002Fsites#поля).\n\n> **Формат дат — локаль-зависимый, не ISO 8601.** `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`). Значение возвращается как есть — `new Date(value)` даст `Invalid Date` либо перепутает день и месяц.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 157,\n    \"title\": \"Промо-лендинг\",\n    \"code\": \"\u002Fpromo\u002F\",\n    \"type\": \"PAGE\",\n    \"active\": true,\n    \"domainId\": 5,\n    \"createdById\": 1,\n    \"dateCreate\": \"12.09.2024 10:23:14\",\n    \"dateModify\": \"04.11.2025 08:51:20\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — сайт не найден:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"site 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\u002Fsites\u002Flist) — получить несколько сайтов с фильтрами\n- [Обновить сайт](\u002Fdocs\u002Fentities\u002Fsites\u002Fupdate) — изменение полей\n- [Удалить сайт](\u002Fdocs\u002Fentities\u002Fsites\u002Fdelete) — удаление по ID\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Обновить сайт\n\n`PATCH \u002Fv1\u002Fsites\u002F:id`\n\nОбновляет поля существующего сайта. Передавайте только изменяемые поля плоско в корне JSON — без обёртки `fields`.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор сайта |\n| `scope` | string | нет | Для сайта в разделе баз знаний передайте `scope: \"KNOWLEDGE\"` (то же значение, что при создании) — иначе сервер вернёт `403 BITRIX_ACCESS_DENIED` («Доступ на изменение сайта запрещён»). Можно как поле тела или query-параметром `?scope=KNOWLEDGE`. Для обычных сайтов-лендингов не требуется |\n\n## Поля для обновления (body)\n\n| Параметр | Тип | Описание |\n|----------|-----|---------|\n| `title` | string | Название сайта, до 255 символов |\n| `code` | string | Символьный код сайта в URL. Слеши запрещены. Если код состоит только из цифр, добавится префикс `site` |\n| `active` | boolean | Принимается без ошибки, но не сохраняется — активность управляется в интерфейсе портала Битрикс24 (сайт активируется при публикации страницы) |\n| `domainId` | number | Идентификатор домена |\n| `type` | string | Тип сайта: `PAGE`, `STORE` или `KNOWLEDGE` |\n| `description` | string | Описание сайта, до 255 символов |\n| `xmlId` | string | Внешний идентификатор, до 255 символов |\n| `landingIdIndex` | number | Идентификатор главной страницы сайта |\n| `landingId404` | number | Идентификатор страницы ошибки 404 |\n| `landingId503` | number | Идентификатор страницы ошибки 503 |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\u002F157\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Промо-лендинг — обновлено\",\n    \"active\": false\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\u002F157\" \\\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    \"active\": false\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\u002F157', {\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    active: false,\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\u002Fsites\u002F157', {\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    active: false,\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data` | object | Обновлённый объект сайта со всеми ключевыми полями |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": 157,\n    \"title\": \"Промо-лендинг — обновлено\",\n    \"code\": \"\u002Fpromo\u002F\",\n    \"type\": \"PAGE\",\n    \"active\": false,\n    \"domainId\": 5,\n    \"createdById\": 1,\n    \"dateCreate\": \"12.09.2024 10:23:14\",\n    \"dateModify\": \"07.05.2026 12:18:42\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n403 — нет прав на обновление этого сайта:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BITRIX_ACCESS_DENIED\",\n    \"message\": \"Access denied\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | `error.code` | Маркер в `error.message` | Описание |\n|------|--------------|--------------------------|---------|\n| 403 | `BITRIX_ACCESS_DENIED` | — | Нет права на изменение сайта или указанных полей, либо сайт с таким ID не существует или недоступен — Битрикс24 отвечает «Доступ запрещён». При PATCH `404` не возвращается, в отличие от `GET \u002Fv1\u002Fsites\u002F:id` |\n| 422 | `BITRIX_ERROR` | `SLASH_IS_NOT_ALLOWED` | В `code` передан символ `\u002F` — слеши в коде запрещены |\n| 422 | `BITRIX_ERROR` | `DOMAIN_IS_INCORRECT` | Передан некорректный формат доменного имени |\n| 422 | `BITRIX_ERROR` | `DOMAIN_EXIST` | Указанный домен уже занят другим сайтом |\n| 422 | `BITRIX_ERROR` | `DOMAIN_EXIST_TRASH` | Домен привязан к сайту в корзине — сначала отвяжите его |\n| 422 | `BITRIX_ERROR` | `DOMAIN_NOT_FOUND` | Домен с указанным `domainId` не существует |\n| 422 | `BITRIX_ERROR` | `CODE_IS_NOT_UNIQUE` | Код сайта не уникален в рамках домена |\n| 403 | `SCOPE_DENIED` | — | API-ключ не имеет скоупа `landing` |\n| 401 | `TOKEN_MISSING` | — | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Смотрите также\n\n- [Получить сайт](\u002Fdocs\u002Fentities\u002Fsites\u002Fget) — текущие значения полей\n- [Список сайтов](\u002Fdocs\u002Fentities\u002Fsites\u002Flist) — найти сайт по фильтру\n- [Удалить сайт](\u002Fdocs\u002Fentities\u002Fsites\u002Fdelete) — удаление пустого сайта\n- [Batch](\u002Fdocs\u002Fbatch) — массовое обновление\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Удалить сайт\n\n`DELETE \u002Fv1\u002Fsites\u002F:id`\n\nУдаляет сайт по идентификатору. **Удалить можно только пустой сайт** — без страниц (включая страницы в корзине). Если на сайте есть хотя бы одна страница, запрос вернёт ошибку.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | number | да | Идентификатор сайта |\n| `scope` | string | нет | Для сайта в разделе баз знаний передайте `scope: \"KNOWLEDGE\"` (то же значение, что при создании) — иначе сервер вернёт `403 BITRIX_ACCESS_DENIED`. Можно как query-параметр `?scope=KNOWLEDGE` или поле тела. Для обычных сайтов не требуется |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\u002F173\" \\\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\u002Fsites\u002F173\" \\\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\u002Fsites\u002F173', {\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\u002Fsites\u002F173', {\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\n422 — на сайте есть страницы:\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` | `SITE_IS_NOT_EMPTY` | На сайте есть страницы (включая страницы в корзине) |\n| 422 | `BITRIX_ERROR` | `SITE_IS_LOCK` | Сайт заблокирован на удаление |\n| 403 | `BITRIX_ACCESS_DENIED` | — | У пользователя нет права на удаление этого сайта, либо сайт с таким ID не существует или недоступен — Битрикс24 отвечает «Доступ запрещён». При удалении `404` не возвращается, в отличие от `GET \u002Fv1\u002Fsites\u002F:id` |\n| 403 | `BITRIX_ACCESS_DENIED` | `ACCESS_DENIED_DELETED` | На портале подключён доменный провайдер — удаление сайта через API недоступно, удалите через интерфейс портала |\n| 403 | `SCOPE_DENIED` | — | API-ключ не имеет скоупа `landing` |\n| 401 | `TOKEN_MISSING` | — | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Корзина не освобождает сайт.** Сайт нельзя удалить, пока на нём остаются страницы в корзине, — сначала очистите корзину страниц.\n\n## Смотрите также\n\n- [Список страниц сайта](\u002Fdocs\u002Fentities\u002Fpages) — `GET \u002Fv1\u002Fpages?filter[siteId]=:id` перед удалением сайта\n- [Список сайтов](\u002Fdocs\u002Fentities\u002Fsites\u002Flist) — найти ID нужного сайта\n- [Batch](\u002Fdocs\u002Fbatch) — массовое удаление\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Поиск сайтов\n\n`POST \u002Fv1\u002Fsites\u002Fsearch`\n\nПоиск сайтов с фильтрацией и авто-пагинацией. Аналогичен `GET \u002Fv1\u002Fsites` с фильтрами, но через POST — удобнее для сложных запросов с большим количеством условий.\n\n## Поля запроса (body)\n\n| Параметр | Тип | По умолч. | Описание |\n|----------|-----|-----------|---------|\n| `filter` | object | — | Фильтрация по ключевым полям сайта.\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering) |\n| `limit` | number | `50` | Количество записей (до 5000) |\n| `select` | string[] | — | Выборка полей: `[\"id\", \"title\", \"type\"]` |\n| `scope` | string | — | Внутренняя область лендингов: `KNOWLEDGE` \u002F `GROUP` \u002F `MAINPAGE`. Без параметра возвращаются обычные сайты-лендинги. Принимается на верхнем уровне тела (`\"scope\": \"KNOWLEDGE\"`) или внутри `filter.scope` — обе формы дают одинаковый запрос к Битрикс24 |\n\n> **Фильтр по типу и область (`scope`).** Битрикс24 привязывает `filter.type` к текущей области — в области по умолчанию доступны только `PAGE` \u002F `STORE` \u002F `SMN` \u002F `VIBE`. Если фильтруете `{\"filter\": {\"type\": \"KNOWLEDGE\"}}` или `\"GROUP\"` и **не** передали `scope`, Вайбкод сам подставит соответствующую область (`type=KNOWLEDGE` → `scope=KNOWLEDGE`), и поиск вернёт именно базы знаний \u002F страницы групп. Явный `scope` в приоритете. Если тип задан списком\u002Fоператором (`{\"type\": {\"$in\": [\"KNOWLEDGE\", \"PAGE\"]}}`), где одну область выбрать нельзя, в `meta.warnings` придёт подсказка с кодом `TYPE_REQUIRES_SCOPE`. `MAINPAGE` — область, а не тип сайта (её сайты имеют тип `VIBE`), поэтому из фильтра не выводится.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\u002Fsearch\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"filter\": { \"type\": \"PAGE\", \"active\": true },\n    \"limit\": 10,\n    \"select\": [\"id\", \"title\", \"type\", \"active\"]\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\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\": { \"type\": \"PAGE\", \"active\": true },\n    \"limit\": 10,\n    \"select\": [\"id\", \"title\", \"type\", \"active\"]\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\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: { type: 'PAGE', active: true },\n    limit: 10,\n    select: ['id', 'title', 'type', 'active'],\n  }),\n})\n\nconst { success, data, meta } = await res.json()\nconsole.log('Найдено:', meta.total)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\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: { type: 'PAGE', active: true },\n    limit: 10,\n    select: ['id', 'title', 'type', 'active'],\n  }),\n})\n\nconst { success, data, meta } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data` | array | Массив сайтов с ключевыми полями |\n\nURL любого сайта из массива `data` — его `id`:\n\n```\nhttps:\u002F\u002F\u003Cportal>.bitrix24.ru\u002Fsites\u002Fsite\u002F\u003Cid>\u002F\n```\n\n`\u003Cportal>` — домен портала. Доступ ограничен правами сотрудника в Битрикс24.\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": 157,\n      \"title\": \"Промо-лендинг\",\n      \"code\": \"\u002Fpromo\u002F\",\n      \"type\": \"PAGE\",\n      \"active\": true,\n      \"domainId\": 5,\n      \"createdById\": 1,\n      \"dateCreate\": \"12.09.2024 10:23:14\",\n      \"dateModify\": \"04.11.2025 08:51:20\"\n    }\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| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `landing` |\n| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Видимость по правам пользователя.** Поиск возвращает только те сайты, к которым у владельца API-ключа есть право «просмотр». Если ожидается результат, но `data` пустой — проверьте права пользователя.\n\n**Удалённые сайты.** По умолчанию исключаются. Чтобы включить их в результат, передайте `{\"filter\": {\"deleted\": \"Y\"}}`. Значения — `Y` или `N`.\n\n**Сортировка.** Поле `sort` в теле: `{\"sort\": \"-id\"}` — по убыванию, `{\"sort\": \"id\"}` — по возрастанию (принимается и алиас `order`). Без параметра — по возрастанию `id`.\n\n## Смотрите также\n\n- [Список сайтов](\u002Fdocs\u002Fentities\u002Fsites\u002Flist) — GET-запрос с query-параметрами (для простых фильтров)\n- [Получить сайт](\u002Fdocs\u002Fentities\u002Fsites\u002Fget) — данные одного сайта по ID\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Batch](\u002Fdocs\u002Fbatch) — объединение нескольких search в один запрос\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n","\n## Поля сайта\n\n`GET \u002Fv1\u002Fsites\u002Ffields`\n\nВозвращает карту всех полей сайта с типом и признаком только для чтения. Поля без этого признака доступны для записи при создании и обновлении.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\u002Ffields\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\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\u002Fsites\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\u002Fsites\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` с операциями, доступными в массовом режиме.\n\n| Поле | Битрикс24 | Тип | RO | Описание |\n|------|----------|-----|:--:|---------|\n| `id` | `ID` | number | да | Идентификатор сайта |\n| `title` | `TITLE` | string | | Название, до 255 символов |\n| `code` | `CODE` | string | | Символьный код в URL |\n| `type` | `TYPE` | string | | Тип сайта: `PAGE`, `STORE`, `KNOWLEDGE` — создаваемые через API. В ответах встречаются также `VIBE` и `SMN` |\n| `active` | `ACTIVE` | boolean | | Активен ли сайт |\n| `domainId` | `DOMAIN_ID` | number | | Идентификатор домена |\n| `description` | `DESCRIPTION` | string \\| null | | Описание, до 255 символов. `null`, если не задано |\n| `xmlId` | `XML_ID` | string \\| null | | Внешний идентификатор. `null`, если не задан |\n| `landingIdIndex` | `LANDING_ID_INDEX` | number \\| null | | Главная страница. Задаётся в обновлении после создания страниц |\n| `landingId404` | `LANDING_ID_404` | number \\| null | | Страница ошибки 404. Если не назначена — `0` или `null` |\n| `landingId503` | `LANDING_ID_503` | number \\| null | | Страница ошибки 503. Если не назначена — `0` или `null` |\n| `deleted` | `DELETED` | string | да | Признак корзины: `\"Y\"` \u002F `\"N\"` |\n| `createdById` | `CREATED_BY_ID` | number | да | Создатель. Поиск: `GET \u002Fv1\u002Fusers` |\n| `modifiedById` | `MODIFIED_BY_ID` | number | да | Последний редактор. Поиск: `GET \u002Fv1\u002Fusers` |\n| `dateCreate` | `DATE_CREATE` | datetime | да | Дата создания. Формат локали Битрикс24, не ISO 8601 |\n| `dateModify` | `DATE_MODIFY` | datetime | да | Дата последнего изменения. Формат локали Битрикс24 |\n| `tplId` | `TPL_ID` | number | да | Идентификатор шаблона сайта |\n| `tplCode` | `TPL_CODE` | string \\| null | да | Символьный код шаблона. `null`, если у шаблона нет кода |\n| `smnSiteId` | `SMN_SITE_ID` | string \\| null | да | Связанный сайт «Управление сайтом» типа `SMN`. `null` у обычных сайтов |\n| `lang` | `LANG` | string \\| null | да | Код языка, например `ru`. `null`, если не задан |\n| `special` | `SPECIAL` | string | да | Служебный признак Битрикс24: `\"Y\"` \u002F `\"N\"` |\n| `version` | `VERSION` | number | да | Версия внутренней структуры сайта |\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      \"type\": { \"type\": \"string\", \"readonly\": false },\n      \"active\": { \"type\": \"boolean\", \"readonly\": false }\n    },\n    \"batch\": [\"create\", \"update\", \"delete\"]\n  }\n}\n```\n\nПоказаны 4 из 22 полей. Полный список — в таблице выше.\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\u002Fsites\u002Fcreate)\n- [Обновить сайт](\u002Fdocs\u002Fentities\u002Fsites\u002Fupdate)\n- [Сайты](\u002Fdocs\u002Fentities\u002Fsites)\n- [Entity API](\u002Fdocs\u002Fentity-api)\n","\n## Агрегация сайтов\n\n`POST \u002Fv1\u002Fsites\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`: `type`, `active`, `deleted`, `lang`, `tplId`, `domainId`, `createdById`, `modifiedById`. До 5 полей |\n| `groupOrderBy` | array | нет | Сортировка групп: массив `{ \"field\": \"count\" \\| \"\u003Cизмерение>\", \"direction\": \"asc\" \\| \"desc\" }`. Работает только вместе с `groupBy` |\n| `groupLimit` | number | нет | Ограничение числа возвращаемых групп (1..1000). Работает только вместе с `groupBy` |\n| `filter` | object | нет | Фильтрация по ключевым полям сайта.\u003Cbr>[Синтаксис фильтрации](\u002Fdocs\u002Ffiltering) |\n| `scope` | string | нет | Внутренняя область лендингов: `KNOWLEDGE` \u002F `GROUP` \u002F `MAINPAGE`. Без параметра подсчитываются обычные сайты-лендинги |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\u002Faggregate\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"groupBy\": \"type\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\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\": \"type\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fsites\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: 'type',\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\u002Fsites\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: 'type',\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\": { \"type\": \"PAGE\", \"active\": true } }\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: \"type\"`):\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"count\": 18,\n    \"aggregates\": {},\n    \"groups\": [\n      { \"type\": \"PAGE\", \"count\": 11, \"aggregates\": {} },\n      { \"type\": \"STORE\", \"count\": 5, \"aggregates\": {} },\n      { \"type\": \"VIBE\", \"count\": 2, \"aggregates\": {} }\n    ],\n    \"meta\": {\n      \"totalRecords\": 18,\n      \"recordsProcessed\": 18,\n      \"truncated\": false,\n      \"groupTotal\": 3,\n      \"groupsTruncated\": false\n    }\n  }\n}\n```\n\nПростой подсчёт без группировки (`{}`):\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"count\": 18,\n    \"aggregates\": {},\n    \"meta\": {\n      \"totalRecords\": 18,\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: type, active, deleted, lang, tplId, domainId, 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\u002Fsites\u002Flist) — `total` в ответе даёт точное число записей\n- [Поиск сайтов](\u002Fdocs\u002Fentities\u002Fsites\u002Fsearch) — POST-запрос с фильтрами\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization) — rate limits\n"]