#Приложения: создание и публикация

OAuth-приложение Вайбкод — это запись в каталоге портала Битрикс24, через которую ваш код встраивается в интерфейс (в карточки CRM, левое меню, чаты и другие места). Жизненный цикл приложения проходит четыре шага: создать → развернуть код → задать адрес → опубликовать. До публикации приложение видит только автор, его адрес (appUrl) пуст, а список мест встраивания (placements) пустой — это нормальное состояние, а не ошибка.

#Состояния приложения

Статус Что значит Видно в каталоге
PRIVATE Состояние по умолчанию сразу после создания. Места встраивания не привязаны к порталу Только автору
PUBLISHED Приложение опубликовано, места встраивания привязаны к порталу Всем сотрудникам портала
UNPUBLISHED Снято с публикации, места встраивания отвязаны, но карточка в каталоге сохранена Всем (неактивно)

Переходы: PRIVATE → PUBLISHED → UNPUBLISHED → PUBLISHED (повторная публикация). Снятие с публикации возвращает в UNPUBLISHED, а не в PRIVATE — метаданные каталога сохраняются для повторной публикации.

#Почему `appUrl: null` и пустые `placements` до публикации

Это частый вопрос: приложение создано, код развёрнут на Black Hole, GET /v1/me показывает capabilities.apps.publish.available: true, но GET /v1/apps отдаёт appUrl: null и пустой массив placements, а в каталоге приложения нет. Так и должно быть — пока приложение в статусе PRIVATE:

  • appUrl пуст, пока вы не зададите его явно через PATCH /v1/apps/:id или не передадите в теле публикации;
  • placements пуст, потому что места встраивания привязываются к порталу только в момент публикации;
  • в каталоге приложение появляется только после POST /v1/apps/:id/publish.

#Полный цикл

#Шаг 1. Создать приложение

POST /v1/apps регистрирует OAuth-приложение на портале и возвращает ключ один раз — в поле rawKey ответа. Сохраните его сразу: повторно ключ не показывается. Для последующей публикации в наборе скоупов обязателен placement (без него публикация вернёт ошибку).

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"
  }'

#Шаг 2. Развернуть код и задать адрес

Разверните приложение на Black Hole-сервере (Deploy API) и убедитесь, что appUrl указывает на его адрес. Если адрес не задан при создании — задайте его сейчас:

Terminal
curl -X PATCH "https://vibecode.bitrix24.tech/v1/apps/APP_ID" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "appUrl": "https://app-abc12345.vibecode.bitrix24.tech" }'

#Шаг 3. Опубликовать

POST /v1/apps/:id/publish переводит приложение в PUBLISHED, привязывает места встраивания к порталу и делает приложение видимым всем сотрудникам.

#Публикация

POST /v1/apps/:id/publish

Все поля тела необязательны — если их не передать, берутся значения из записи приложения. Передавайте их, когда хотите переопределить заголовок каталога, адрес или набор мест встраивания прямо в момент публикации.

Поле Тип Описание
catalogTitle string Заголовок в каталоге. По умолчанию — title приложения
catalogDescription string Описание в каталоге
catalogIcon string Иконка в каталоге
appUrl string Адрес приложения. По умолчанию — текущий appUrl записи
menuTitle string Подпись в меню. По умолчанию — catalogTitle
placements string[] Места встраивания (например, ["CRM_DEAL_DETAIL_TAB"]). Список доступных — GET /v1/placements/available. По умолчанию — текущие placements записи
sourceVersionId string ID снапшота исходников для привязки к публикации — см. Хранилище исходников

#Примеры

Terminal
# Минимальная публикация — все параметры берутся из записи приложения
curl -X POST "https://vibecode.bitrix24.tech/v1/apps/APP_ID/publish" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
Terminal
# Публикация с явными местами встраивания и заголовком
curl -X POST "https://vibecode.bitrix24.tech/v1/apps/APP_ID/publish" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "catalogTitle": "Дашборд продаж",
    "appUrl": "https://app-abc12345.vibecode.bitrix24.tech",
    "placements": ["CRM_DEAL_DETAIL_TAB", "LEFT_MENU"]
  }'
javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/apps/APP_ID/publish', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    placements: ['CRM_DEAL_DETAIL_TAB'],
  }),
})

const { success, data } = await res.json()
if (success) console.log('Опубликовано, места встраивания:', data.placements)

#Поля ответа

В ответе возвращается обновлённая запись приложения. Успешная публикация подтверждается success: true и заполненным массивом data.placements (плюс data.appUrl). Отдельного поля статуса каталога в ответе нет.

Поле Тип Описание
success boolean true при успехе
data.appUrl string Адрес приложения
data.placements string[] Привязанные места встраивания
warnings string[] Присутствует, если часть мест встраивания не удалось привязать (каждое — текстовое описание)
JSON
{
  "success": true,
  "data": {
    "id": "APP_ID",
    "title": "Дашборд продаж",
    "appUrl": "https://app-abc12345.vibecode.bitrix24.tech",
    "placements": ["CRM_DEAL_DETAIL_TAB"]
  }
}

#Снятие с публикации

POST /v1/apps/:id/unpublish

Отвязывает места встраивания от портала и переводит приложение в UNPUBLISHED. Тело не требуется. Метаданные каталога сохраняются — повторная публикация вернёт приложение в каталог.

Terminal
curl -X POST "https://vibecode.bitrix24.tech/v1/apps/APP_ID/unpublish" \
  -H "X-Api-Key: YOUR_API_KEY"

#Ошибки

HTTP Код Описание
400 NO_OAUTH_KEY У приложения нет OAuth-ключа — публиковать нечем
400 MISSING_SCOPE OAuth-ключ приложения не имеет скоупа placement (он нужен для привязки мест встраивания)
400 NO_USER_TOKEN Нет авторизованного OAuth-токена пользователя. Авторизуйте приложение на портале и повторите
403 FORBIDDEN Публиковать может только автор приложения или администратор портала
404 NOT_FOUND Приложение не существует или принадлежит другому порталу
409 ALREADY_PUBLISHED Приложение уже опубликовано
409 SNAPSHOT_REQUIRED Включено хранилище исходников и нет свежего снапшота — сначала вызовите POST /v1/apps/:id/sources (см. Хранилище исходников)

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

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

  • Привязка мест встраивания требует коммерческого тарифа Битрикс24. Создание приложения, чтение мест встраивания и снятие с публикации работают на любом тарифе. Сама привязка (а значит и публикация, которая её выполняет) на бесплатном тарифе вернёт 502 BITRIX_UNAVAILABLE — это ограничение на стороне Битрикс24, не платформы. GET /v1/me отражает это в capabilities.apps.bindPlacements.
  • appUrl и handlerUrl — разные адреса. handlerUrl платформа задаёт сама и менять его нельзя — через него идут OAuth-колбэки и открытие iframe. appUrl — ваш адрес на Black Hole, куда платформа перенаправляет открытие места встраивания; его задаёте вы.
  • Скоуп placement нельзя добавить задним числом. Набор скоупов Битрикс24 закрепляется за ключом при создании. Если приложение создано без placement, публикация вернёт MISSING_SCOPE — пересоздайте приложение с нужным скоупом (см. Скоупы).
  • Смена скоупов не применяется к уже установленному приложению автоматически. Если изменить набор скоупов Битрикс24 у опубликованного приложения, уже выданный токен продолжит обращаться к данным со старым набором — новые скоупы вступят в силу только после переустановки (повторной авторизации) приложения на портале. До переустановки запросы, которым нужен добавленный скоуп, возвращают BITRIX_ACCESS_DENIED. То же правило для API-ключей описано на странице Скоупы.
  • Места встраивания со смарт-процессами. Динамические коды вида CRM_DYNAMIC_<entityTypeId>_DETAIL_TAB принимаются наравне со статическими — id зависит от портала.
  • Точный список кодов мест встраивания. placements принимает только коды из фиксированного набора — актуальный перечень отдаёт GET /v1/placements/available. Коды вне набора (например, CONTACT_CENTER) возвращают 400 VALIDATION_ERROR при POST /v1/placements/bind. Если нужного кода нет в /available — он не поддерживается, угадывать имя бесполезно.
  • appUrl может содержать путь. Допустим не только голый поддомен, но и адрес с путём (https://app-abc12345.vibecode.bitrix24.tech/hh-connector) — PATCH /v1/apps/:id его принимает. Это рабочий приём для нескольких приложений за одним поддоменом Black Hole: разведите их по путям через обратный прокси на своём сервере, а каждому приложению задайте свой appUrl с нужным путём.
  • Методы коннекторов внешних мессенджеров — под скоупом imopenlines. Регистрация коннектора открытых линий (imconnector.*) исполняется Битрикс24 под скоупом imopenlines — указывайте его для этих методов. Полный перечень доступных скоупов — Скоупы.

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