Опубликовать приложение
POST /v1/apps/:id/publish
Переводит приложение в PUBLISHED, привязывает места встраивания к порталу и делает приложение видимым всем сотрудникам.
Параметры
| Параметр | Тип | Обяз. | Описание |
|---|---|---|---|
id (path) |
string | да | Идентификатор приложения. Список: GET /v1/apps |
Поля запроса (body)
Тело необязательное. При пустом теле берутся значения из записи приложения — это основной сценарий повторной публикации без изменений. Если передаёте тело, добавьте заголовок Content-Type: application/json — без него запрос с телом вернёт 413 FST_ERR_CTP_BODY_TOO_LARGE.
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
catalogTitle |
string | нет | Название в каталоге портала. Если не передано — текущее значение приложения |
catalogDescription |
string | нет | Описание в каталоге |
catalogIcon |
string | нет | Код иконки в каталоге |
appUrl |
string | нет | Адрес приложения на Black Hole. Если не передан — текущий appUrl приложения |
placements |
string[] | нет | Коды мест встраивания. Список допустимых кодов: GET /v1/placements/available. Если не передан — текущий набор приложения |
sourceVersionId |
string | нет | Конкретный снапшот исходников для публикации, формат v<номер>. Применимо при включённом хранилище исходников |
Примеры
curl — личный ключ
curl -X POST "https://vibecode.bitrix24.tech/v1/apps/YOUR_APP_ID/publish" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "placements": ["CRM_DEAL_DETAIL_TAB"] }'
curl — OAuth-приложение
curl -X POST "https://vibecode.bitrix24.tech/v1/apps/YOUR_APP_ID/publish" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "placements": ["CRM_DEAL_DETAIL_TAB"] }'
JavaScript — личный ключ
const res = await fetch(
'https://vibecode.bitrix24.tech/v1/apps/YOUR_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 body = await res.json()
if (!body.success) throw new Error(body.error.code)
// body.warnings — массив, если часть мест встраивания не привязалась
console.log(body.data.placements)
JavaScript — OAuth-приложение
const res = await fetch(
'https://vibecode.bitrix24.tech/v1/apps/YOUR_APP_ID/publish',
{
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({ placements: ['CRM_DEAL_DETAIL_TAB'] }),
}
)
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | true при успешной публикации |
data |
object | Приложение после публикации — те же 15 полей, что отдаёт данные приложения |
data.placements |
string[] | Привязанные места встраивания |
warnings |
string[] | Присутствует, если часть мест встраивания не удалось привязать. Перечисляет коды, которые не привязались |
Пример ответа
Поле data повторяет объект приложения с заполненным массивом placements:
{
"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",
"prefix": "vibe_app_local_7c3",
"suffix": "6666",
"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": ["CRM_DEAL_DETAIL_TAB"]
}
}
Пример ответа при ошибке
400 — у OAuth-ключа нет скоупа placement:
{
"success": false,
"error": {
"code": "MISSING_SCOPE",
"message": "OAuth API key must have the placement scope to publish (catalog publishing binds placements on Bitrix24)."
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 404 | NOT_FOUND |
Приложение не найдено или принадлежит другому порталу |
| 403 | FORBIDDEN |
Запрос не от автора приложения и не от администратора портала |
| 409 | ALREADY_PUBLISHED |
Приложение уже в статусе PUBLISHED |
| 400 | NO_OAUTH_KEY |
У приложения нет связанного OAuth-ключа |
| 400 | MISSING_SCOPE |
У OAuth-ключа нет скоупа placement |
| 409 | SNAPSHOT_REQUIRED |
Включено хранилище исходников, но свежего снапшота нет. Тело несёт hint с шагами для POST /v1/apps/:id/sources |
| 400 | NO_USER_TOKEN |
Приложение не авторизовано на портале по OAuth — авторизуйте его на портале и повторите |
| 400 | TITLE_TOO_LONG_FOR_CATALOG |
Итоговое название длиннее 100 символов. Так бывает, когда catalogTitle не передан, а title приложения длиннее предела каталога |
Полный список общих ошибок API — Ошибки.
Известные особенности
- Заголовок места встраивания — это название приложения. Пункт левого меню и вкладки CRM подписываются итоговым
catalogTitle; отдельного названия для меню нет. Переименование приложения через обновление меняет и подписи мест встраивания. - Снятые с публикации приложения публикуются повторно. Публикация принимается и в статусе
UNPUBLISHED— приложение возвращается вPUBLISHEDс теми же или новыми местами встраивания. Метаданные каталога при снятии с публикации сохранялись, поэтому при пустом теле каталог восстанавливается без повторного заполнения. - Часть мест встраивания может не привязаться. Привязка идёт по каждому коду отдельно. Коды, которые не удалось привязать, не прерывают публикацию — приложение становится
PUBLISHED, а несработавшие коды перечисляются вwarnings.