Для AI-агентов: markdown этой страницы — /docs-content/apps/create.md индекс документации — /llms.txt
Создать приложение
POST /v1/apps
Регистрирует OAuth-приложение на портале Битрикс24 и создаёт парный API-ключ. Тело передаётся плоско, без обёртки.
Поля запроса (body)
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
title |
string | да | Название приложения, от 1 до 255 символов |
scopes |
array | да | Набор скоупов приложения — доступ к данным портала Битрикс24, минимум один. Для будущей публикации в наборе нужен placement. Скоупы платформы vibe:* перечислять не нужно, их выдаёт сама платформа. Список — Скоупы |
description |
string | нет | Описание приложения, до 2000 символов |
appUrl |
string | нет | Адрес приложения, только http:// или https://. Пустая строка сохраняется как null |
redirectUris |
array | нет | Адреса перенаправления для OAuth. По умолчанию — адрес завершения авторизации и http://localhost |
mode |
string | нет | Режим доступа парного ключа: READONLY или READWRITE. По умолчанию берётся из политики портала |
handlerUrl задаёт платформа — в теле он не принимается, через него идут обратные вызовы OAuth и открытие места встраивания. Разница между appUrl и handlerUrl — в разделе Приложения.
Примеры
curl — личный ключ
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-приложение
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 — личный ключ
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-приложение
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. Возвращается только в этом ответе и больше не показывается |
Пример ответа
rawKey показан с усечённым секретом — это не рабочее значение.
{
"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 — нарушена валидация:
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "title: Required"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 400 | VALIDATION_ERROR |
Нарушена валидация тела: пропущено title, пустой scopes, недопустимый appUrl |
| 403 | APP_CREATION_RESTRICTED |
Создание приложений на портале ограничено списком, автор в него не входит |
| 403 | KEY_POLICY_READONLY_REQUIRED |
Политика портала разрешает только READONLY, запрошен READWRITE |
| 403 | WRITE_BLOCKED_READONLY_KEY |
Запрос идёт ключом в режиме «только чтение», а парный ключ создаётся в режиме READWRITE. Такой ключ выписывает только приложение с mode: "READONLY". Подробнее — Режим доступа |
| 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 не передаётся: подписки, которую можно оформить, у такого аккаунта нет. На .com инфраструктура и выпуск ключей дополнительно требуют тарифа Vibe+ (INT_VIBE_PLUS_REQUIRED) |
| 403 | SCOPE_GRANT_REQUIRES_CONSENT |
Запрос идёт ключом с зафиксированным при выдаче набором прав — партнёрским или проектным ключом Cowork — и объявляет платформенный скоуп vibe:*, которого у самого вызывающего ключа нет. Список таких скоупов приходит в error.details.unconsented. Скоупы, подтверждённые партнёрскому ключу на странице согласия, выдаются как раньше. Личного ключа и ключа авторизации из кабинета эта проверка не касается |
| 403 | CONNECTOR_APP_INSTALL_FORBIDDEN |
Администратор аккаунта Битрикс24 запретил этому сотруднику устанавливать приложения. Приходит там, где приложение устанавливает модуль-коннектор: на коробочном аккаунте, а на облачном — когда такой выпуск для аккаунта включён. Повтор запроса состояние не меняет, право выдаёт администратор аккаунта |
| 409 | KEY_LIMIT_REACHED |
Достигнут предел ключей на пользователя для портала. В error.details приходит состояние квоты: limit — сколько ключей разрешено, used — сколько занято. В used входят и ключи авторизации приложений, и ключи, выписанные платформой, поэтому число бывает больше, чем список ключей в кабинете — подробнее |
| 409 | CONNECTOR_MODULE_NOT_INSTALLED |
Модуль-коннектор не установлен на аккаунте Битрикс24 — установить приложение и выписать парный ключ через него нельзя. Состояние постоянное, повтор без установки модуля не поможет |
| 502 | CONNECTOR_APP_INSTALL_FAILED |
Модуль-коннектор не смог установить приложение по другой причине. Приложение и парный ключ не созданы, запрос можно повторить |
| 502 | CONNECTOR_REST_UNAVAILABLE |
Подписка или пробный период действуют, но Битрикс24 отказал в выписке парного ключа. Приходит там же, где остальные коннекторные коды, — когда приложение устанавливает модуль-коннектор. Исходная причина отказа приходит в error.details.reason, а error.details.retryable: true говорит, что состояние временное — повторите запрос, при повторении обратитесь в поддержку. Предложения оформить подписку в этом ответе нет: оформлять нечего |
Полный список общих ошибок API — Ошибки.
Известные особенности
- Ключ авторизации возвращается только один раз. Поле
rawKeyприсутствует в ответе создания и больше нигде не отдаётся — ни в данных приложения, ни в списке. Не сохранили при создании — пересоздайте приложение. - Создаётся пара: приложение и API-ключ. Регистрация заводит запись приложения и парный ключ авторизации в один приём. Это влияет на удаление: ключ освобождает слот в пределе на пользователя только после удаления приложения.
- Скоупы приложения и скоупы парного ключа — разные наборы. В
scopesвы объявляете доступ к данным портала Битрикс24 —crm,user,placement. Парный ключ получает этот набор и дополнительно четыре платформенных скоупа:vibe:infra— серверы и агенты,vibe:ai— вызовы моделей,vibe:search— веб-поиск и исследование,vibe:storage— объектное хранилище. Поэтому свежий ключ авторизации сразу создаёт серверы черезPOST /v1/infra/servers, хотя в теле создания словаvibe:infraне было. Ответ вdata.scopesпоказывает объявление приложения, а не итоговый набор ключа — итоговый смотрите вdata.scopesответаGET /v1/me, вызванного этим ключом. - Кириллица в
titleиз Windows PowerShell. Отправленная без явной сериализации в UTF-8, она сохраняется знаками вопроса (?): байты теряются на стороне клиента, до отправки запроса. Готовый вызов сUTF8.GetBytes— Windows / PowerShell и UTF-8.