Для 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 — личный ключ

Terminal
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-приложение

Terminal
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.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.GetBytesWindows / 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, даже когда их не отмечали.

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