Для 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. Возвращается только в этом ответе и больше не показывается

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

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
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.GetBytesWindows / PowerShell и UTF-8.

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