Для 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 нет Адрес приложения: адрес на платформе или публичный https://-адрес вне платформы (без localhost, адресов внутренней сети и логина и пароля). Пустая строка сохраняется как null
redirectUris array нет Адреса перенаправления для OAuth. По умолчанию — адрес завершения авторизации и http://localhost
mode string нет Режим доступа парного ключа: READONLY или READWRITE. По умолчанию — самый узкий из режима политики портала, режима вызывающего ключа и режима места Cowork/Code, если вызывающий ключ принадлежит месту, как проектный ключ для деплоя. Поэтому ключ «только чтение» без этого поля получает приложение в своём режиме. Явное значение шире режима места отказом не отвечает — парный ключ выдаётся в режиме места. Ответ создания режим не называет: фактический режим смотрите в data.accessMode ответа GET /v1/me, вызванного парным ключом
mobile boolean нет Приложение поддерживает мобильный клиент Битрикс24 — портал получает этот признак при регистрации. Значение по умолчанию — false. Задаётся только при создании, см. «Известные особенности»

handlerUrl задаёт платформа — в теле он не принимается, через него идут обратные вызовы OAuth и открытие места встраивания. Разница между appUrl и handlerUrl — в разделе Приложения.

Примеры

Примеры JavaScript предназначены для Node.js на Linux/macOS. Они сохраняют одноразовый ключ в файле app.key в отдельной закрытой папке внутри домашнего каталога и выводят только путь к файлу и идентификатор приложения. Перенесите ключ в своё хранилище секретов.

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
import { mkdtemp, writeFile } from 'node:fs/promises'
import { homedir } from 'node:os'
import { join } from 'node:path'

const keyDir = await mkdtemp(join(homedir(), '.vibecode-app-'))
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()
// Ключ возвращается только один раз; файл доступен только владельцу
const keyPath = join(keyDir, 'app.key')
await writeFile(keyPath, data.rawKey, { mode: 0o600, flag: 'wx' })
console.log('App ID:', data.id)
console.log('Key file:', keyPath)

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

javascript
import { mkdtemp, writeFile } from 'node:fs/promises'
import { homedir } from 'node:os'
import { join } from 'node:path'

const keyDir = await mkdtemp(join(homedir(), '.vibecode-app-'))
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()
// Ключ возвращается только один раз; файл доступен только владельцу
const keyPath = join(keyDir, 'app.key')
await writeFile(keyPath, data.rawKey, { mode: 0o600, flag: 'wx' })
console.log('App ID:', data.id)
console.log('Key file:', keyPath)

Поля ответа

Поле Тип Описание
success boolean true при успешном создании
data object Созданное приложение и его парный ключ авторизации
data.id string Идентификатор приложения
data.title string Название
data.description string | null Описание
data.scopes string[] Набор скоупов приложения — то, что вы передали в теле. Скоупы парного ключа зависят от прав вызывающего ключа, см. «Известные особенности»
data.handlerUrl string Адрес обработчика, задан платформой
data.appUrl string | null Адрес приложения
data.redirectUris string[] Адреса перенаправления для OAuth
data.bitrixClientId string | null Идентификатор OAuth-клиента на портале
data.authorId string Идентификатор автора в платформе Вайбкод. Для связи с сотрудником Битрикс24 используйте data.authorBitrixUserId только при data.authorBitrixUserIdSource: "member"
data.authorBitrixUserId integer | null Номер сотрудника Битрикс24 в формате id из GET /v1/users. Считайте его подтверждённым номером автора только при источнике member. null, если номер неизвестен
data.authorBitrixUserIdSource string | null Откуда взят номер: member — из подтверждённого участия автора в аккаунте. snapshot — из значения, сохранённого при создании приложения: оно не подтверждено и после смены владельца может указывать на другого сотрудника. null — номера нет
data.portalId string Идентификатор портала, к которому привязан ключ. То же поле возвращает GET /v1/me
data.createdAt string Дата создания, ISO 8601
data.updatedAt string Дата изменения, ISO 8601
data.placements string[] Коды мест встраивания. У нового приложения массив пустой
data.catalogStatus string Статус в каталоге. У нового приложения — всегда PRIVATE
data.publishedAt string | null Дата публикации, ISO 8601. У нового приложения — null
data.placementResizeEnabled boolean Подстраивать ли высоту iframe встройки под содержимое приложения. У нового приложения — false. Включается через Обновить приложение
data.mobile boolean Признак «Поддерживает BitrixMobile», который платформа реально передала порталу Битрикс24 при регистрации. false, если поле не передано или признак не удалось применить, тогда причина приходит в warnings
data.hosting string Где работает приложение: platform — на сервере платформы, привязанном к приложению или принадлежащем этому аккаунту Битрикс24, или на подтверждённом своём домене такого сервера, либо адреса у приложения нет вовсе, platform-orphan — адрес на поддомене платформы, за которым нет работающего сервера, external — любой другой адрес, в том числе сервер платформы другого аккаунта Битрикс24. Вычисляется при каждом чтении
data.externalHost string | null Имя хоста из appUrl (в punycode) для external, иначе null. У external тоже бывает null — когда в адресе нет хоста: строка не разбирается как URL или её схема без хоста
data.externalRegistrable string | null Регистрируемый домен хоста по публичному списку суффиксов, включая частные зоны: для shop.example.co.uk — example.co.uk, для IP-адреса — весь адрес. null, когда externalHost равен null
data.rawKey string Готовый ключ авторизации vibe_app_… для заголовка X-Api-Key. Возвращается только при создании — ни данные приложения, ни список его не показывают. Сохраните сразу. Если ключ потерян, пересоздайте приложение
warnings string[] Приходит, только если есть что сказать. Два повода: название потеряло не-ASCII символы по дороге (см. «Известные особенности») или способ регистрации на аккаунте не позволяет передать признак mobile. Во втором случае строка начинается с mobile:. Включите признак в карточке приложения на аккаунте Битрикс24. Приложение при этом создаётся, ответ остаётся 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",
    "authorBitrixUserId": 42,
    "authorBitrixUserIdSource": "member",
    "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,
    "placementResizeEnabled": false,
    "mobile": false,
    "hosting": "platform",
    "externalHost": null,
    "externalRegistrable": 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
400 REST_REGISTRATION_FAILED Битрикс24 отказал в регистрации приложения или его вебхука и причину не назвал. Ответ несёт error.details.incidentCode — шестисимвольный код обращения, по которому поддержка находит запись в журнале. Назовите этот код в обращении
400 APP_URL_UNSAFE Адрес вне платформы должен быть публичным https://: без http://, без localhost и адресов внутренней сети и без логина и пароля в адресе
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 B24_PAID_TARIFF_REQUIRED Тариф Битрикс24 на аккаунте бесплатный, а на таком тарифе Битрикс24 закрывает REST при любом состоянии подписки BitrixGPT + Маркетплейс. userMessage называет условие доступа, ссылки на оформление в ответе нет — помогает только переход аккаунта на любой платный тариф Битрикс24. Повтор запроса состояние не меняет. Тариф «Демо» не затронут
403 INFRA_DISABLED_FOR_PORTAL В scopes явно запрошено право vibe:infra, а администратор портала выключил работу с серверами. Приложение не создаётся. Запрос без этого права проходит и на закрытом портале: право, которое платформа дописывает по умолчанию, там снимается молча
403 ONEC_ACCESS_REQUIRED В scopes запрошено право vibe:onec, а у владельца ключа, которым отправлен запрос, нет доступа к 1С. Доступ к 1С выдаёт администратор портала. Приложение не создаётся. Если проверить доступ не удалось, право выдаётся
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 Запрос идёт ключом в режиме «только чтение», а в теле явно передан mode: "READWRITE": парный ключ не выписывается шире вызывающего. Без поля mode такой ключ получает приложение в своём режиме. Режим места Cowork/Code этим кодом не отвечает: запрос шире места выдаёт ключ в режиме места. Подробнее — Режим доступа
403 B24_MARKET_SUBSCRIPTION_REQUIRED На аккаунте нет активной подписки BitrixGPT + Маркетплейс — парный ключ авторизации выписать нельзя. Приходит и на коробочном портале, где ключ выдаёт модуль-коннектор. Ссылка на оформление — в error.details.upgradeUrl, а второй адрес покупки, если аккаунт его называет, — в необязательном error.details.secondaryUpgradeUrl. На облачном аккаунте с прочитанным бесплатным тарифом Битрикс24 вместо него приходит 402 B24_PAID_TARIFF_REQUIRED
403 B24_MARKET_TRIAL_USED Пробный период подписки BitrixGPT + Маркетплейс уже использован — нужна платная подписка. Ссылка на оформление — в error.details.upgradeUrl, а второй адрес покупки, если аккаунт его называет, — в необязательном error.details.secondaryUpgradeUrl. Приходит только на израсходованном пробном периоде. Там, где выписку ведёт модуль-коннектор, живая подписка даёт временную ошибку 502 из строки ниже, а не этот код. На облачном аккаунте с прочитанным бесплатным тарифом Битрикс24 вместо него приходит 402 B24_PAID_TARIFF_REQUIRED
403 INT_TARIFF_REQUIRED Аккаунт получает доступ по тарифу Битрикс24, а не по подписке — нужен коммерческий тариф. Приходит вместо двух кодов выше. error.details.upgradeUrl не передаётся: подписки, которую можно оформить, у такого аккаунта нет. Тот же код с ответом 402 выше — другая проверка, она идёт раньше и относится к доступу аккаунта, а не к выписке ключа
403 PORTAL_TARIFF_UNREADABLE Тариф аккаунта прочитать не удалось, поэтому какого тарифа не хватает, ответ не называет: поле error.details.requiredTariffs пустое, а кнопка ведёт в поддержку. Покупка тарифа отказ не снимает
403 PORTAL_SUBSCRIPTION_UNREADABLE Состояние подписки аккаунта прочитать не удалось — ключу разработчика не хватает прав на чтение лицензии, поэтому платформа не знает, есть подписка или нет. Поле error.details.requiredTariffs пустое, покупка отказ не снимает: приложение нужно переподключить под главным администратором аккаунта
403 SCOPE_GRANT_REQUIRES_CONSENT Запрос идёт ключом с зафиксированным набором прав и объявляет платформенный скоуп vibe:*, которого у самого вызывающего ключа нет. Список таких скоупов приходит в error.details.unconsented. Набор зафиксирован у партнёрского ключа, проектного ключа Cowork, личного ключа из формы кабинета (она выдаёт ровно отмеченные права) и ключа, выписанного с exactScopes: true — Менеджмент-ключи. Скоупы, подтверждённые партнёрскому ключу на странице согласия, объявлять можно. Как отличить такой ключ — «Известные особенности»
403 SCOPE_GRANT_REQUIRES_CONSENT Запрос идёт партнёрским ключом и объявляет vibe:ai: это право партнёрский ключ парному ключу не передаёт, даже если держит его сам. В error.details.unconsented приходит ["vibe:ai"]
403 CONNECTOR_APP_INSTALL_FORBIDDEN Администратор аккаунта Битрикс24 запретил этому сотруднику устанавливать приложения. Приходит там, где приложение устанавливает модуль-коннектор: на коробочном аккаунте, а на облачном — когда такой выпуск для аккаунта включён. Повтор запроса состояние не меняет, право выдаёт администратор аккаунта. Подробнее — Права на создание
409 KEY_LIMIT_REACHED Достигнут предел ключей. В error.details приходит состояние квоты: limit — сколько ключей разрешено, used — сколько занято, requested — сколько новых ключей нужно операции. Без scope это лимит пользователя на портале. Значение scope: "portal" означает портальный потолок платформы, который администратор портала не поднимает. В 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 говорит, что состояние временное — повторите запрос, при повторении обратитесь в поддержку. Предложения оформить подписку в этом ответе нет: оформлять нечего
502 CONNECTOR_PLAN_REQUIRED Битрикс24 отказал в выписке парного ключа: тариф аккаунта не включает Вайбкод. Приходит там, где предлагать нечего — коробочный аккаунт, аккаунт уже на платном тарифе, нераспознанный регион. Текст причины для человека приходит в error.userMessage. Состояние постоянное: повтор не поможет, пока тариф Битрикс24 не сменён. Там, где доступ продаётся, тот же отказ приходит ответом 402 с кодом тарифного пейвола из таблицы выше

Полный список общих ошибок API — Ошибки.

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

  • Потерянные не-ASCII символы в названии платформа называет. Строка, отправленная без явной сериализации в UTF-8, приходит с вопросительными знаками вместо букв: байты теряются на стороне клиента, до отправки запроса. Так отправляет строки Windows PowerShell. Приложение создаётся как есть, а в ответе появляется warnings с именем поля — название уезжает в карточку каталога Битрикс24 при публикации, поэтому чинить его лучше сразу. Готовый вызов с UTF8.GetBytes — Windows / PowerShell и UTF-8.
  • Создаётся пара: приложение и 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, даже когда их не отмечали.
  • Приложение открывается в интерфейсе аккаунта. Регистрация объявляет аккаунту Битрикс24, что у приложения есть интерфейс, поэтому после создания приложение появляется в меню аккаунта, а с mobile: true — и в мобильном клиенте. Режим задаётся при создании и обновлением приложения не меняется. Приложение, которое в меню не появилось, зарегистрировано как работающее только по API: снимите режим «только API» в карточке приложения на аккаунте Битрикс24 либо создайте приложение заново.
  • Признак mobile можно задать только при создании. PATCH /v1/apps/:id поле mobile не принимает — присланное значение игнорируется, см. Обновить приложение. Для уже созданного приложения признак включается в карточке приложения на портале Битрикс24 либо приложение создаётся заново.

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