
## Создать сайт

`POST /v1/sites`

Создаёт новый сайт на портале. Тип сайта определяется полем `type`. Поля передаются плоско в корне JSON — без обёртки `fields`.

## Поля запроса (body)

| Параметр | Тип | Обяз. | Описание |
|----------|-----|:-----:|---------|
| `title` | string | да | Название сайта, до 255 символов |
| `type` | string | нет | Тип сайта. По умолчанию `PAGE` — лендинг. Также `STORE` — интернет-магазин, `KNOWLEDGE` — база знаний 2.0. Для `KNOWLEDGE` обязательно передайте также `scope: "KNOWLEDGE"` — см. ниже |
| `scope` | string | нет | Раздел Битрикс24, в котором создаётся сайт: `KNOWLEDGE` (база знаний 2.0), `GROUP` (база знаний группы) или `MAINPAGE`. Без него создаётся обычный сайт-лендинг. **Чтобы создать базу знаний, передайте `scope: "KNOWLEDGE"` вместе с `type: "KNOWLEDGE"`** — иначе сервер вернёт `403 BITRIX_ACCESS_DENIED` («Доступ на создание сайта запрещён»). Можно передать как поле тела или query-параметром `?scope=KNOWLEDGE`. То же значение `scope` нужно при [обновлении](/docs/entities/sites/update) и [удалении](/docs/entities/sites/delete) такого сайта |
| `code` | string | да | Символьный код сайта в URL. **Ключ обязателен**, но значение может быть пустым (`""`) или `null` — тогда код генерируется из `title`. Если опустить сам ключ `code`, создание возвращает `422` (см. «Адрес сайта обязателен» в «Известных особенностях»). Если код только из цифр — добавляется префикс `site`. Если код уже занят на домене — числовой суффикс (`code2`, `code3`) |
| `domainId` | number | нет | Идентификатор домена. Если не передавать, адрес формируется из `code` на `bitrix24site.ru` |
| `description` | string | нет | Описание сайта, до 255 символов |
| `xmlId` | string | нет | Внешний идентификатор, до 255 символов |

## Примеры

### curl — личный ключ

```bash
curl -X POST "https://vibecode.bitrix24.tech/v1/sites" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Лендинг конференции",
    "code": "conf-2026",
    "type": "PAGE"
  }'
```

### curl — OAuth-приложение

```bash
curl -X POST "https://vibecode.bitrix24.tech/v1/sites" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Лендинг конференции",
    "code": "conf-2026",
    "type": "PAGE"
  }'
```

### curl — база знаний 2.0 (`scope=KNOWLEDGE`)

```bash
curl -X POST "https://vibecode.bitrix24.tech/v1/sites" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "База знаний компании",
    "type": "KNOWLEDGE",
    "scope": "KNOWLEDGE"
  }'
```

### JavaScript — личный ключ

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/sites', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    title: 'Лендинг конференции',
    code: 'conf-2026',
    type: 'PAGE',
  }),
})

const { success, data } = await res.json()
console.log('Site ID:', data.id)
```

### JavaScript — OAuth-приложение

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/sites', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    title: 'Лендинг конференции',
    code: 'conf-2026',
    type: 'PAGE',
  }),
})

const { success, data } = await res.json()
```

## Поля ответа

Возвращается полный объект созданного сайта.

| Поле | Тип | Описание |
|------|-----|---------|
| `id` | number | Идентификатор созданного сайта |
| `title` | string | Название сайта |
| `code` | string | Фактический символьный код (с авто-суффиксом, если код запроса был занят) |
| `type` | string | Тип сайта |
| `active` | boolean | Всегда `false` для только что созданного сайта |
| `domainId` | number | Идентификатор домена (выданного автоматически или переданного) |
| `createdById` | number | Идентификатор создавшего пользователя |
| `dateCreate` | datetime | Дата создания |
| `dateModify` | datetime | Дата последнего изменения |

URL сайта в Битрикс24 строится из `id`:

```
https://<portal>.bitrix24.ru/sites/site/<id>/
```

`<portal>` — домен портала. Доступ ограничен правами сотрудника в Битрикс24.

## Пример ответа

```json
{
  "success": true,
  "data": {
    "id": 173,
    "title": "Лендинг конференции",
    "code": "/conf-2026/",
    "type": "PAGE",
    "active": false,
    "domainId": 28,
    "createdById": 1,
    "dateCreate": "07.05.2026 12:14:08",
    "dateModify": "07.05.2026 12:14:08"
  }
}
```

## Пример ответа при ошибке

422 — некорректный код сайта:

```json
{
  "success": false,
  "error": {
    "code": "BITRIX_ERROR",
    "message": "Адрес сайта введен неверно. Вы можете использовать только следующие символы: \"a-z\", \"0-9\", \"-\", \".\"."
  }
}
```

## Ошибки

| HTTP | `error.code` | Маркер в `error.message` | Описание |
|------|--------------|--------------------------|---------|
| 400 | `READONLY_FIELD` | `Field 'active' is read-only` | В теле передан `active` — поле только для чтения (Битрикс24 его не сохраняет). Уберите его из тела, сайт активируется публикацией в интерфейсе |
| 422 | `BITRIX_ERROR` | `Не заполнено обязательное поле "Адрес сайта"` | Опущен ключ `code` — у сайта нет адреса. Передайте `code` с любым значением, можно пустым |
| 422 | `BITRIX_ERROR` | `SLASH_IS_NOT_ALLOWED` | В `code` передан символ `/` — слеши в коде запрещены |
| 422 | `BITRIX_ERROR` | `DOMAIN_IS_INCORRECT` | Адрес сайта введён неверно: разрешены только символы `a-z`, `0-9`, `-`, `.` |
| 422 | `BITRIX_ERROR` | `DOMAIN_EXIST` | Указанный домен уже занят другим сайтом |
| 422 | `BITRIX_ERROR` | `DOMAIN_EXIST_TRASH` | Домен привязан к сайту в корзине — сначала отвяжите его |
| 422 | `BITRIX_ERROR` | `DOMAIN_NOT_FOUND` | Домен с указанным `domainId` не существует |
| 422 | `BITRIX_ERROR` | `SITE_LIMIT_REACHED` | Достигнут лимит количества сайтов на текущем тарифе |
| 403 | `BITRIX_ACCESS_DENIED` | `Доступ на создание сайта запрещён` | У пользователя нет права на создание сайтов — ИЛИ создаётся `type: "KNOWLEDGE"` без `scope: "KNOWLEDGE"` (добавьте `scope`, см. таблицу полей) |
| 403 | `SCOPE_DENIED` | — | API-ключ не имеет скоупа `landing` |
| 401 | `TOKEN_MISSING` | — | API-ключ не имеет настроенных токенов |

Полный список общих ошибок API — [Ошибки](/docs/errors).

## Известные особенности

**Слеши в ответе.** Поле `code` в ответе возвращается с обрамляющими слешами (`/conf-2026/`) — это представление пути сайта в URL. В запросе слеши передавать нельзя.

**Ключ `code` обязателен.** Значение `code` может быть пустой строкой `""` или `null` — тогда код генерируется из `title`. Но если опустить сам ключ `code`, создание возвращает `422 BITRIX_ERROR` с сообщением `Не заполнено обязательное поле "Адрес сайта"`. Если `domainId` не передан, адрес формируется из `code` на `bitrix24site.ru`, например `b24-xxxxx.bitrix24site.ru`.

**Активность не задаётся через API.** Поле `active` только для чтения: Битрикс24 не сохраняет переданное значение ни при создании, ни при обновлении, поэтому запрос с ним отклоняется с `400 READONLY_FIELD` до вызова Битрикс24. Новый сайт всегда создаётся неактивным — `active: false` в ответе; активируется сайт публикацией в интерфейсе портала Битрикс24.

**Главная страница и страницы ошибок.** Поля `landingIdIndex`, `landingId404`, `landingId503` при создании не задаются — страниц ещё нет. Назначьте их через [обновление](/docs/entities/sites/update) после создания страниц сайта.

**База знаний 2.0.** Создаётся как сайт с `type: "KNOWLEDGE"` И `scope: "KNOWLEDGE"` — оба поля обязательны. Без `scope` сервер вернёт `403 BITRIX_ACCESS_DENIED`, потому что Битрикс24 создаёт сайты типа `KNOWLEDGE` только в разделе баз знаний (тот же `scope` доступен для списка, чтения, обновления и удаления — см. соответствующие методы). Достаточно скоупа `landing` у ключа. Отдельного скоупа для баз знаний не требуется.

## Смотрите также

- [Список сайтов](/docs/entities/sites/list)
- [Обновить сайт](/docs/entities/sites/update)
- [Удалить сайт](/docs/entities/sites/delete)
- [Batch](/docs/batch)
- [Лимиты и оптимизация](/docs/optimization)
