[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-apps\u002Fpublish":3,"docs-tabs-apps\u002Fpublish":6},{"content":4,"lastmod":5},"\n## Опубликовать приложение\n\n`POST \u002Fv1\u002Fapps\u002F:id\u002Fpublish`\n\nПереводит приложение в `PUBLISHED`, привязывает места встраивания к порталу и делает приложение видимым всем сотрудникам.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | string | да | Идентификатор приложения. Список: `GET \u002Fv1\u002Fapps` |\n\n## Поля запроса (body)\n\nТело необязательное. При пустом теле берутся значения из записи приложения — это основной сценарий повторной публикации без изменений. Если передаёте тело, добавьте заголовок `Content-Type: application\u002Fjson` — без него запрос с телом вернёт `413 FST_ERR_CTP_BODY_TOO_LARGE`.\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|----------|\n| `catalogTitle` | string | нет | Название в каталоге портала. Если не передано — текущее значение приложения |\n| `catalogDescription` | string | нет | Описание в каталоге |\n| `catalogIcon` | string | нет | Код иконки в каталоге |\n| `appUrl` | string | нет | Адрес приложения на Black Hole. Если не передан — текущий `appUrl` приложения |\n| `placements` | string[] | нет | Коды мест встраивания. Список допустимых кодов: `GET \u002Fv1\u002Fplacements\u002Favailable`. Если не передан — текущий набор приложения |\n| `sourceVersionId` | string | нет | Конкретный снапшот исходников для публикации, формат `v\u003Cномер>`. Применимо при включённом [хранилище исходников](\u002Fdocs\u002Fsource-storage) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FYOUR_APP_ID\u002Fpublish\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"placements\": [\"CRM_DEAL_DETAIL_TAB\"] }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FYOUR_APP_ID\u002Fpublish\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"placements\": [\"CRM_DEAL_DETAIL_TAB\"] }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  'https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FYOUR_APP_ID\u002Fpublish',\n  {\n    method: 'POST',\n    headers: {\n      'X-Api-Key': 'YOUR_API_KEY',\n      'Content-Type': 'application\u002Fjson',\n    },\n    body: JSON.stringify({ placements: ['CRM_DEAL_DETAIL_TAB'] }),\n  }\n)\nconst body = await res.json()\nif (!body.success) throw new Error(body.error.code)\n\u002F\u002F body.warnings — массив, если часть мест встраивания не привязалась\nconsole.log(body.data.placements)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch(\n  'https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FYOUR_APP_ID\u002Fpublish',\n  {\n    method: 'POST',\n    headers: {\n      'X-Api-Key': 'YOUR_APP_KEY',\n      'Authorization': 'Bearer USER_SESSION_TOKEN',\n      'Content-Type': 'application\u002Fjson',\n    },\n    body: JSON.stringify({ placements: ['CRM_DEAL_DETAIL_TAB'] }),\n  }\n)\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | `true` при успешной публикации |\n| `data` | object | Приложение после публикации — те же 15 полей, что отдаёт [данные приложения](\u002Fdocs\u002Fapps\u002Fget) |\n| `data.placements` | string[] | Привязанные места встраивания |\n| `warnings` | string[] | Присутствует, если часть мест встраивания не удалось привязать. Перечисляет коды, которые не привязались |\n\n## Пример ответа\n\nПоле `data` повторяет объект приложения с заполненным массивом `placements`:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"33c4d5e6-f7a8-49b0-1234-5c6d7e8f9012\",\n    \"title\": \"Дашборд продаж\",\n    \"description\": null,\n    \"scopes\": [\"crm\", \"user\", \"placement\"],\n    \"handlerUrl\": \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbitrix-handler\",\n    \"appUrl\": \"https:\u002F\u002Fapp-abc12345.vibecode.bitrix24.tech\",\n    \"redirectUris\": [\n      \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Foauth\u002Fcomplete\",\n      \"http:\u002F\u002Flocalhost\"\n    ],\n    \"bitrixClientId\": \"local.7c3d4e5f6a7b80.55556666\",\n    \"prefix\": \"vibe_app_local_7c3\",\n    \"suffix\": \"6666\",\n    \"authorId\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n    \"portalId\": \"8b1f0e2a-3c4d-5e6f-7a8b-9c0d1e2f3a4b\",\n    \"createdAt\": \"2026-06-24T09:12:45.781Z\",\n    \"updatedAt\": \"2026-06-24T09:12:45.781Z\",\n    \"placements\": [\"CRM_DEAL_DETAIL_TAB\"]\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — у OAuth-ключа нет скоупа `placement`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_SCOPE\",\n    \"message\": \"OAuth API key must have the placement scope to publish (catalog publishing binds placements on Bitrix24).\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 404 | `NOT_FOUND` | Приложение не найдено или принадлежит другому порталу |\n| 403 | `FORBIDDEN` | Запрос не от автора приложения и не от администратора портала |\n| 409 | `ALREADY_PUBLISHED` | Приложение уже в статусе `PUBLISHED` |\n| 400 | `NO_OAUTH_KEY` | У приложения нет связанного OAuth-ключа |\n| 400 | `MISSING_SCOPE` | У OAuth-ключа нет скоупа `placement` |\n| 409 | `SNAPSHOT_REQUIRED` | Включено хранилище исходников, но свежего снапшота нет. Тело несёт `hint` с шагами для `POST \u002Fv1\u002Fapps\u002F:id\u002Fsources` |\n| 400 | `NO_USER_TOKEN` | Приложение не авторизовано на портале по OAuth — авторизуйте его на портале и повторите |\n| 400 | `TITLE_TOO_LONG_FOR_CATALOG` | Итоговое название длиннее 100 символов. Так бывает, когда `catalogTitle` не передан, а `title` приложения длиннее предела каталога |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **Заголовок места встраивания — это название приложения.** Пункт левого меню и вкладки CRM подписываются итоговым `catalogTitle`; отдельного названия для меню нет. Переименование приложения через [обновление](\u002Fdocs\u002Fapps\u002Fupdate) меняет и подписи мест встраивания.\n- **Снятые с публикации приложения публикуются повторно.** Публикация принимается и в статусе `UNPUBLISHED` — приложение возвращается в `PUBLISHED` с теми же или новыми местами встраивания. Метаданные каталога при снятии с публикации сохранялись, поэтому при пустом теле каталог восстанавливается без повторного заполнения.\n- **Часть мест встраивания может не привязаться.** Привязка идёт по каждому коду отдельно. Коды, которые не удалось привязать, не прерывают публикацию — приложение становится `PUBLISHED`, а несработавшие коды перечисляются в `warnings`.\n\n## Смотрите также\n\n- [Приложения](\u002Fdocs\u002Fapps)\n- [Снять с публикации](\u002Fdocs\u002Fapps\u002Funpublish)\n- [Обновить приложение](\u002Fdocs\u002Fapps\u002Fupdate)\n- [Данные приложения](\u002Fdocs\u002Fapps\u002Fget)\n- [Хранилище исходников](\u002Fdocs\u002Fsource-storage)\n- [Подписки на события портала](\u002Fdocs\u002Finfra\u002Fevent-subscriptions)\n","2026-07-14",{}]