
## Создать приложение

`POST /v1/apps`

Регистрирует OAuth-приложение на портале Битрикс24 и создаёт парный API-ключ. Тело передаётся плоско, без обёртки.

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

| Поле | Тип | Обяз. | Описание |
|------|-----|:-----:|---------|
| `title` | string | да | Название приложения, от 1 до 255 символов |
| `scopes` | array | да | Набор скоупов приложения — доступ к данным портала Битрикс24, минимум один. Для будущей публикации в наборе нужен `placement`. Скоупы платформы `vibe:*` перечисляются, только когда запрос идёт ключом с зафиксированным набором прав. В остальных случаях парный ключ получает их сам, см. «Известные особенности». Список — [Скоупы](/docs/scopes) |
| `description` | string | нет | Описание приложения, до 2000 символов |
| `appUrl` | string | нет | Адрес приложения, только `http://` или `https://`. Пустая строка сохраняется как `null` |
| `redirectUris` | array | нет | Адреса перенаправления для OAuth. По умолчанию — адрес завершения авторизации и `http://localhost` |
| `mode` | string | нет | Режим доступа парного ключа: `READONLY` или `READWRITE`. По умолчанию берётся из политики портала |

`handlerUrl` задаёт платформа — в теле он не принимается, через него идут обратные вызовы OAuth и открытие [места встраивания](/docs/apps/placements). Разница между `appUrl` и `handlerUrl` — в разделе [Приложения](/docs/apps#appurl-и-handlerurl-разные-адреса).

## Примеры

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

```bash
curl -X POST https://vibecode.bitrix24.tech/v1/apps \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Дашборд продаж",
    "scopes": ["crm", "user", "placement"],
    "appUrl": "https://app-abc12345.vibecode.bitrix24.tech"
  }'
```

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

```bash
curl -X POST https://vibecode.bitrix24.tech/v1/apps \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Дашборд продаж",
    "scopes": ["crm", "user", "placement"],
    "appUrl": "https://app-abc12345.vibecode.bitrix24.tech"
  }'
```

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

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/apps', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    title: 'Дашборд продаж',
    scopes: ['crm', 'user', 'placement'],
    appUrl: 'https://app-abc12345.vibecode.bitrix24.tech',
  }),
})

const { data } = await res.json()
// Сохраните data.rawKey сразу — он возвращается только один раз
console.log('App ID:', data.id)
```

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

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/apps', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    title: 'Дашборд продаж',
    scopes: ['crm', 'user', 'placement'],
    appUrl: 'https://app-abc12345.vibecode.bitrix24.tech',
  }),
})

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

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

| Поле | Тип | Описание |
|------|-----|---------|
| `data.id` | string | Идентификатор приложения |
| `data.title` | string | Название |
| `data.description` | string \| null | Описание |
| `data.scopes` | array | Набор скоупов приложения — то, что вы передали в теле. Скоупы парного ключа шире, см. «Известные особенности» |
| `data.handlerUrl` | string | Адрес обработчика, задан платформой |
| `data.appUrl` | string \| null | Адрес приложения |
| `data.redirectUris` | array | Адреса перенаправления для OAuth |
| `data.bitrixClientId` | string \| null | Идентификатор OAuth-клиента на портале |
| `data.authorId` | string | Идентификатор автора |
| `data.portalId` | string | Идентификатор портала |
| `data.createdAt` | string | Дата создания, ISO 8601 |
| `data.updatedAt` | string | Дата изменения, ISO 8601 |
| `data.placements` | array | Места встраивания, до публикации пустой |
| `data.catalogStatus` | string | Статус в каталоге. У нового приложения — всегда `PRIVATE` |
| `data.publishedAt` | string \| null | Дата публикации, ISO 8601. У нового приложения — `null` |
| `data.rawKey` | string | Готовый ключ авторизации `vibe_app_…`. Единственное значение `vibe_app_…` в этом ответе — используйте именно его как `X-Api-Key`. Возвращается только в этом ответе и больше не показывается |
| `warnings` | array\<string\> | Приходит, только если есть что сказать. Сейчас единственный повод — название потеряло не-ASCII символы по дороге (см. «Известные особенности»). Приложение при этом создаётся, ответ остаётся `201` |

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

`rawKey` показан с усечённым секретом — это не рабочее значение.

```json
{
  "success": true,
  "data": {
    "id": "33c4d5e6-f7a8-49b0-1234-5c6d7e8f9012",
    "title": "Дашборд продаж",
    "description": null,
    "scopes": ["crm", "user", "placement"],
    "handlerUrl": "https://vibecode.bitrix24.tech/v1/bitrix-handler",
    "appUrl": "https://app-abc12345.vibecode.bitrix24.tech",
    "redirectUris": [
      "https://vibecode.bitrix24.tech/oauth/complete",
      "http://localhost"
    ],
    "bitrixClientId": "local.7c3d4e5f6a7b80.55556666",
    "authorId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "portalId": "8b1f0e2a-3c4d-5e6f-7a8b-9c0d1e2f3a4b",
    "createdAt": "2026-06-24T09:12:45.781Z",
    "updatedAt": "2026-06-24T09:12:45.781Z",
    "placements": [],
    "catalogStatus": "PRIVATE",
    "publishedAt": null,
    "rawKey": "vibe_app_local_7c3d4e5f6a7b80_55556666_…_6666"
  }
}
```

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

400 — нарушена валидация:

```json
{
  "success": false,
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "title: Required"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|---------|
| 400 | `VALIDATION_ERROR` | Нарушена валидация тела: пропущено `title`, пустой `scopes`, недопустимый `appUrl` |
| 402 | `MARKETPLACE_REQUIRED` | Первым делом маршрут проверяет доступ аккаунта к платформе. На аккаунте нет ни одной активной подписки, поэтому создание приложения не начинается. Приходит только там, где доступ к платформе открывает подписка. Ответ несёт `userMessage` и список путей решения в `error.details` |
| 402 | `BY_PAID_ONLY` | На аккаунте в Беларуси нет ни платного, ни демо-тарифа Битрикс24 — а доступ открывает именно тариф. Открывает его и платная подписка Битрикс24 Маркет Плюс: в Беларуси она продаётся |
| 402 | `KZ_PAID_ONLY` | На аккаунте в Казахстане есть пробный доступ Маркетплейса, но нет ни платной подписки, ни платного тарифа. Пробный доступ в этом регионе прав на платформу не даёт |
| 402 | `UZ_PAID_ONLY` | То же для аккаунта в Узбекистане |
| 402 | `INT_TARIFF_REQUIRED` | Аккаунт получает доступ по тарифу Битрикс24, а тариф бесплатный. Тот же код есть в строке `403` ниже, и это разные проверки: `402` отдаёт проверка доступа аккаунта до начала работы, `403` — отказ выписки парного ключа |
| 402 | `INT_VIBE_PLUS_REQUIRED` | Доступ аккаунта сужен до платной редакции Vibe+, и коммерческого тарифа Битрикс24 для него уже недостаточно. Аккаунт на демо-тарифе сохраняет пробный доступ и этот код не получает |
| 403 | `APP_CREATION_RESTRICTED` | Политика портала не разрешает вызывающему создавать приложения: создание закрыто совсем, разрешено только администраторам аккаунта либо ограничено списком, в который вызывающий не входит. Право выдаёт администратор Битрикс24 |
| 403 | `KEY_POLICY_READONLY_REQUIRED` | Политика портала разрешает только `READONLY`, запрошен `READWRITE` |
| 403 | `WRITE_BLOCKED_READONLY_KEY` | Запрос идёт ключом в режиме «только чтение», а парный ключ создаётся в режиме `READWRITE`. Такой ключ выписывает только приложение с `mode: "READONLY"`. Подробнее — [Режим доступа](/docs/keys-auth/access-mode) |
| 403 | `B24_MARKET_SUBSCRIPTION_REQUIRED` | На аккаунте нет активной подписки BitrixGPT + Маркетплейс — парный ключ авторизации выписать нельзя. Приходит и на коробочном портале, где ключ выдаёт модуль-коннектор. Ссылка на оформление — в `error.details.upgradeUrl` |
| 403 | `B24_MARKET_TRIAL_USED` | Пробный период подписки BitrixGPT + Маркетплейс уже использован — нужна платная подписка. Ссылка на оформление — в `error.details.upgradeUrl`. Приходит только на израсходованном пробном периоде. Там, где выписку ведёт модуль-коннектор, живая подписка даёт временную ошибку 502 из строки ниже, а не этот код |
| 403 | `INT_TARIFF_REQUIRED` | Аккаунт получает доступ по тарифу Битрикс24, а не по подписке — нужен коммерческий тариф. Приходит вместо двух кодов выше, а также когда модель доступа аккаунта определить не удалось. `error.details.upgradeUrl` не передаётся: подписки, которую можно оформить, у такого аккаунта нет. Тот же код с ответом `402` выше — другая проверка, она идёт раньше и относится к доступу аккаунта, а не к выписке ключа |
| 403 | `SCOPE_GRANT_REQUIRES_CONSENT` | Запрос идёт ключом с зафиксированным набором прав и объявляет платформенный скоуп `vibe:*`, которого у самого вызывающего ключа нет. Список таких скоупов приходит в `error.details.unconsented`. Набор зафиксирован у [партнёрского](/docs/partner-connect) ключа, проектного ключа [Cowork](/docs/cowork), личного ключа из формы кабинета (она выдаёт ровно отмеченные права) и ключа, выписанного с `exactScopes: true` — [Менеджмент-ключи](/docs/management-keys). Скоупы, подтверждённые партнёрскому ключу на странице согласия, объявлять можно. Как отличить такой ключ — «Известные особенности» |
| 403 | `CONNECTOR_APP_INSTALL_FORBIDDEN` | Администратор аккаунта Битрикс24 запретил этому сотруднику устанавливать приложения. Приходит там, где приложение устанавливает модуль-коннектор: на коробочном аккаунте, а на облачном — когда такой выпуск для аккаунта включён. Повтор запроса состояние не меняет, право выдаёт администратор аккаунта |
| 409 | `KEY_LIMIT_REACHED` | Достигнут предел ключей на пользователя для портала. В `error.details` приходит состояние квоты: `limit` — сколько ключей разрешено, `used` — сколько занято. В `used` входят и ключи авторизации приложений, и ключи, выписанные платформой, поэтому число бывает больше, чем список ключей в кабинете — [подробнее](/docs/keys-auth#сколько-ключей-можно-создать) |
| 409 | `CONNECTOR_MODULE_NOT_INSTALLED` | Модуль-коннектор не установлен на аккаунте Битрикс24 — установить приложение и выписать парный ключ через него нельзя. Состояние постоянное, повтор без установки модуля не поможет |
| 409 | `B24_USER_DELETED` | Сотрудник Битрикс24, которому принадлежит парный ключ, больше не активен на аккаунте. Состояние постоянное: ни повтор, ни освобождение слота ключа не помогут — сотрудника нужно восстановить на аккаунте либо создавать приложение от другого пользователя |
| 502 | `CONNECTOR_APP_INSTALL_FAILED` | Модуль-коннектор не смог установить приложение по другой причине. Приложение и парный ключ не созданы, запрос можно повторить |
| 502 | `CONNECTOR_REST_UNAVAILABLE` | Подписка или пробный период действуют, но Битрикс24 отказал в выписке парного ключа. Приходит там же, где остальные коннекторные коды, — когда приложение устанавливает модуль-коннектор. Исходная причина отказа приходит в `error.details.reason`, а `error.details.retryable: true` говорит, что состояние временное — повторите запрос, при повторении обратитесь в поддержку. Предложения оформить подписку в этом ответе нет: оформлять нечего |

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

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

- **Потерянные не-ASCII символы в названии платформа называет.** Строка, отправленная без явной сериализации в UTF-8 (типичный случай — Windows PowerShell), приходит с вопросительными знаками вместо букв: байты теряются на стороне клиента, до отправки запроса. Приложение создаётся как есть, а в ответе появляется `warnings` с именем поля — название уезжает в карточку каталога Битрикс24 при публикации, поэтому чинить его лучше сразу. Готовый вызов с `UTF8.GetBytes` — [Windows / PowerShell и UTF-8](/docs/infra#windows-powershell-и-utf-8).
- **Ключ авторизации возвращается только один раз.** Поле `rawKey` присутствует в ответе создания и больше нигде не отдаётся — ни в [данных приложения](/docs/apps/get), ни в [списке](/docs/apps/list). Не сохранили при создании — пересоздайте приложение.
- **Создаётся пара: приложение и API-ключ.** Регистрация заводит запись приложения и парный ключ авторизации в один приём. Это влияет на удаление: ключ освобождает слот в пределе на пользователя только после [удаления приложения](/docs/apps/delete).
- **Скоупы приложения и скоупы парного ключа — разные наборы.** В `scopes` вы объявляете доступ к данным портала Битрикс24 — `crm`, `user`, `placement`. Если набор прав вызывающего ключа не зафиксирован, парный ключ получает этот набор **и дополнительно** четыре платформенных скоупа: `vibe:infra` — серверы и агенты, `vibe:ai` — вызовы моделей, `vibe:search` — веб-поиск и исследование, `vibe:storage` — объектное хранилище. Тогда ключ авторизации сразу создаёт серверы через [`POST /v1/infra/servers`](/docs/infra/servers/create), хотя в теле создания слова `vibe:infra` не было. Ответ в `data.scopes` показывает объявление приложения, а не итоговый набор ключа — итоговый смотрите в `data.scopes` ответа [`GET /v1/me`](/docs/keys-auth/me), вызванного этим ключом.
- **Ключ с зафиксированным набором прав выдаёт парному ключу ровно объявленное.** Набор зафиксирован у [партнёрского](/docs/partner-connect) ключа, проектного ключа [Cowork](/docs/cowork), личного ключа из формы кабинета и ключа, выписанного с `exactScopes: true` — [Менеджмент-ключи](/docs/management-keys). Приложение, созданное таким ключом, получает парный ключ ровно с тем, что стоит в `scopes`, — платформенные скоупы к нему не добавляются. Нужна инфраструктура: перечислите `vibe:infra` в `scopes` при создании, иначе [`POST /v1/infra/servers`](/docs/infra/servers/create) ответит `403 INFRA_SCOPE_REQUIRED`. То же для `vibe:ai`, `vibe:search` и `vibe:storage`. Объявить можно только то право, которое есть у самого вызывающего ключа, иначе ответ — `403 SCOPE_GRANT_REQUIRES_CONSENT`. Дописать право позже [обновлением приложения](/docs/apps/update) не получится: перенос `vibe:*` до ключа с зафиксированным набором не доходит.
- **Отличить ключ с зафиксированным набором прав можно до создания приложения.** Вызовите [`GET /v1/me`](/docs/keys-auth/me) тем ключом, которым собираетесь создавать. Набор зафиксирован, если `data.scopes` совпадает с тем, что было отмечено при выдаче ключа. У остальных ключей в наборе стоят `vibe:ai` и `vibe:search`, даже когда их не отмечали.

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

- [Приложения](/docs/apps)
- [Обновить приложение](/docs/apps/update)
- [Удалить приложение](/docs/apps/delete)
- [Опубликовать](/docs/apps/publish)
- [Скоупы](/docs/scopes)
- [Ключи и авторизация](/docs/keys-auth)
