Для 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. Возвращается только в этом ответе и больше не показывается |
warnings |
array<string> | Приходит, только если есть что сказать. Сейчас единственный повод — название потеряло не-ASCII символы по дороге (см. «Известные особенности»). Приложение при этом создаётся, ответ остаётся 201 |
Пример ответа
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 |
| 402 | MARKETPLACE_REQUIRED |
Первым делом маршрут проверяет доступ аккаунта к платформе. На аккаунте нет ни одной активной подписки, поэтому создание приложения не начинается. Приходит только там, где доступ к платформе открывает подписка. Ответ несёт userMessage, пути решения в error.alternatives, а текущий и требуемые тарифы со ссылкой на оформление — в 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 | INFRA_FORBIDDEN_FOR_COWORK_KEY |
Вызов сделан ключом Cowork/Code — такой ключ работает только с данными, изменяющие операции ему закрыты. Что делать — Проектный ключ для деплоя |
| 403 | APP_CREATION_RESTRICTED |
Политика портала не разрешает вызывающему создавать приложения: создание закрыто совсем, разрешено только администраторам аккаунта либо ограничено списком, в который вызывающий не входит. Право выдаёт администратор Битрикс24 |
| 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 не передаётся: подписки, которую можно оформить, у такого аккаунта нет. Тот же код с ответом 402 выше — другая проверка, она идёт раньше и относится к доступу аккаунта, а не к выписке ключа |
| 403 | SCOPE_GRANT_REQUIRES_CONSENT |
Запрос идёт ключом с зафиксированным набором прав и объявляет платформенный скоуп vibe:*, которого у самого вызывающего ключа нет. Список таких скоупов приходит в error.details.unconsented. Набор зафиксирован у партнёрского ключа, проектного ключа Cowork, личного ключа из формы кабинета (она выдаёт ровно отмеченные права) и ключа, выписанного с exactScopes: true — Менеджмент-ключи. Скоупы, подтверждённые партнёрскому ключу на странице согласия, объявлять можно. Как отличить такой ключ — «Известные особенности» |
| 403 | CONNECTOR_APP_INSTALL_FORBIDDEN |
Администратор аккаунта Битрикс24 запретил этому сотруднику устанавливать приложения. Приходит там, где приложение устанавливает модуль-коннектор: на коробочном аккаунте, а на облачном — когда такой выпуск для аккаунта включён. Повтор запроса состояние не меняет, право выдаёт администратор аккаунта |
| 409 | KEY_LIMIT_REACHED |
Достигнут предел ключей на пользователя для портала. В error.details приходит состояние квоты: limit — сколько ключей разрешено, used — сколько занято. В used входят и ключи авторизации приложений, и ключи, выписанные платформой, поэтому число бывает больше, чем список ключей в кабинете — подробнее |
| 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 — Ошибки.
Известные особенности
- Потерянные не-ASCII символы в названии платформа называет. Строка, отправленная без явной сериализации в UTF-8, приходит с вопросительными знаками вместо букв: байты теряются на стороне клиента, до отправки запроса. Так отправляет строки Windows PowerShell. Приложение создаётся как есть, а в ответе появляется
warningsс именем поля — название уезжает в карточку каталога Битрикс24 при публикации, поэтому чинить его лучше сразу. Готовый вызов сUTF8.GetBytes— Windows / PowerShell и UTF-8. - Ключ авторизации возвращается только один раз. Поле
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, вызванного этим ключом. - Ключ с зафиксированным набором прав выдаёт парному ключу ровно объявленное. Набор зафиксирован у партнёрского ключа, проектного ключа Cowork, личного ключа из формы кабинета и ключа, выписанного с
exactScopes: true— Менеджмент-ключи. Приложение, созданное таким ключом, получает парный ключ ровно с тем, что стоит вscopes, — платформенные скоупы к нему не добавляются. Нужна инфраструктура: перечислитеvibe:infraвscopesпри создании, иначеPOST /v1/infra/serversответит403 INFRA_SCOPE_REQUIRED. То же дляvibe:ai,vibe:searchиvibe:storage. Объявить можно только то право, которое есть у самого вызывающего ключа, иначе ответ —403 SCOPE_GRANT_REQUIRES_CONSENT. Дописать право позже обновлением приложения не получится: переносvibe:*до ключа с зафиксированным набором не доходит. - Отличить ключ с зафиксированным набором прав можно до создания приложения. Вызовите
GET /v1/meтем ключом, которым собираетесь создавать. Набор зафиксирован, еслиdata.scopesсовпадает с тем, что было отмечено при выдаче ключа. У остальных ключей в наборе стоятvibe:aiиvibe:search, даже когда их не отмечали.