[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-apps\u002Fendpoints":3,"docs-tabs-apps\u002Fendpoints":6},{"content":4,"lastmod":5},"\n# Эндпоинты раздела «Приложения»\n\nУправление OAuth-приложениями портала: создание, чтение, обновление, удаление и публикация в каталоге. Переключайте методы во вкладках — у каждого свои параметры, поля ответа и коды ошибок.\n\n**Базовый URL:** `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1` | **Авторизация:** `X-Api-Key` | **Скоуп для публикации:** `placement`\n\n## Операции\n\n- [Список приложений](.\u002Flist.md) — `GET \u002Fv1\u002Fapps`\n- [Данные приложения](.\u002Fget.md) — `GET \u002Fv1\u002Fapps\u002F:id`\n- [Создать приложение](.\u002Fcreate.md) — `POST \u002Fv1\u002Fapps`\n- [Обновить приложение](.\u002Fupdate.md) — `PATCH \u002Fv1\u002Fapps\u002F:id`\n- [Удалить приложение](.\u002Fdelete.md) — `DELETE \u002Fv1\u002Fapps\u002F:id`\n- [Опубликовать](.\u002Fpublish.md) — `POST \u002Fv1\u002Fapps\u002F:id\u002Fpublish`\n- [Снять с публикации](.\u002Funpublish.md) — `POST \u002Fv1\u002Fapps\u002F:id\u002Funpublish`\n","2026-06-24",{"list.md":7,"get.md":8,"create.md":9,"update.md":10,"delete.md":11,"publish.md":12,"unpublish.md":13},"\n## Список приложений\n\n`GET \u002Fv1\u002Fapps`\n\nВозвращает приложения портала, зарегистрированные текущим API-ключом, с постраничной разбивкой.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|:---------:|---------|\n| `page` (query) | number | нет | 1 | Номер страницы, от 1. Значение меньше 1 или нечисловое заменяется на 1 |\n| `limit` (query) | number | нет | 50 | Размер страницы. Максимум 200. Значение 0, отрицательное или нечисловое заменяется на 50 |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps?page=1&limit=50\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps?page=1&limit=50\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps?page=1&limit=50', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\nconst { data, total } = await res.json()\nconsole.log(`Приложений: ${total}`, data)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps?page=1&limit=50', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\nconst { data, total } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | array | Массив приложений |\n| `data[].id` | string | Идентификатор приложения |\n| `data[].title` | string | Название |\n| `data[].description` | string \\| null | Описание |\n| `data[].scopes` | string[] | Скоупы Битрикс24, закреплённые за ключом приложения |\n| `data[].handlerUrl` | string | Адрес обработчика на стороне платформы. Подробнее — [Приложения](\u002Fdocs\u002Fapps) |\n| `data[].appUrl` | string \\| null | Адрес приложения на Black Hole. До публикации — `null` |\n| `data[].redirectUris` | string[] | Разрешённые адреса возврата OAuth |\n| `data[].bitrixClientId` | string \\| null | Идентификатор OAuth-клиента на портале |\n| `data[].prefix` | string | Префикс ключа приложения |\n| `data[].suffix` | string | Последние символы ключа приложения |\n| `data[].authorId` | string | Идентификатор автора приложения |\n| `data[].portalId` | string | Идентификатор портала |\n| `data[].createdAt` | string | Дата создания, ISO 8601 |\n| `data[].updatedAt` | string | Дата изменения, ISO 8601 |\n| `data[].placements` | string[] | Привязанные места встраивания. До публикации — пустой массив |\n| `total` | number | Общее количество приложений портала, доступных ключу |\n| `page` | number | Текущая страница |\n| `limit` | number | Применённый размер страницы |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": \"11a2b3c4-d5e6-47f8-9012-3a4b5c6d7e8f\",\n      \"title\": \"Коннектор контакт-центра\",\n      \"description\": null,\n      \"scopes\": [\"crm\", \"imopenlines\", \"imconnector\", \"placement\"],\n      \"handlerUrl\": \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbitrix-handler\",\n      \"appUrl\": null,\n      \"redirectUris\": [\n        \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Foauth\u002Fcomplete\",\n        \"http:\u002F\u002Flocalhost\"\n      ],\n      \"bitrixClientId\": \"local.6b2c3d4e5f6a70.33334444\",\n      \"prefix\": \"vibe_app_local_6b2\",\n      \"suffix\": \"4444\",\n      \"authorId\": \"b2c3d4e5-f6a7-8901-bcde-f23456789012\",\n      \"portalId\": \"8b1f0e2a-3c4d-5e6f-7a8b-9c0d1e2f3a4b\",\n      \"createdAt\": \"2026-06-04T08:52:57.583Z\",\n      \"updatedAt\": \"2026-06-04T08:52:57.583Z\",\n      \"placements\": []\n    },\n    {\n      \"id\": \"22b3c4d5-e6f7-48a9-0123-4b5c6d7e8f90\",\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.5a1b2c3d4e5f60.11112222\",\n      \"prefix\": \"vibe_app_local_5a1\",\n      \"suffix\": \"2222\",\n      \"authorId\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n      \"portalId\": \"8b1f0e2a-3c4d-5e6f-7a8b-9c0d1e2f3a4b\",\n      \"createdAt\": \"2026-05-13T11:31:53.810Z\",\n      \"updatedAt\": \"2026-05-13T11:31:53.810Z\",\n      \"placements\": []\n    }\n  ],\n  \"total\": 2,\n  \"page\": 1,\n  \"limit\": 50\n}\n```\n\n## Пример ответа при ошибке\n\n401 — не передан заголовок `X-Api-Key`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_API_KEY\",\n    \"message\": \"API key required. Pass via X-Api-Key header.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный API-ключ |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- Приложение системного бота-компаньона и удалённые приложения в список не попадают.\n- По умолчанию ответ содержит не более 50 приложений — это граница, а не ошибка. Сравните `total` с длиной `data`, чтобы понять, остались ли приложения за пределами страницы, и при необходимости запросите следующую через `page`.\n\n## Смотрите также\n\n- [Приложения](\u002Fdocs\u002Fapps)\n- [Данные приложения](\u002Fdocs\u002Fapps\u002Fget)\n- [Создать приложение](\u002Fdocs\u002Fapps\u002Fcreate)\n- [Скоупы](\u002Fdocs\u002Fscopes)\n","\n## Данные приложения\n\n`GET \u002Fv1\u002Fapps\u002F:id`\n\nВозвращает одно приложение портала по идентификатору.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | string | да | Идентификатор приложения. Список: `GET \u002Fv1\u002Fapps` |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FYOUR_APP_ID \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FYOUR_APP_ID \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FYOUR_APP_ID', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\nconst { data } = await res.json()\nconsole.log('Приложение:', data)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FYOUR_APP_ID', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\nconst { data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.id` | string | Идентификатор приложения |\n| `data.title` | string | Название |\n| `data.description` | string \\| null | Описание |\n| `data.scopes` | string[] | Скоупы Битрикс24, закреплённые за ключом приложения |\n| `data.handlerUrl` | string | Адрес обработчика на стороне платформы. Подробнее — [Приложения](\u002Fdocs\u002Fapps) |\n| `data.appUrl` | string \\| null | Адрес приложения на Black Hole. До публикации — `null` |\n| `data.redirectUris` | string[] | Разрешённые адреса возврата OAuth |\n| `data.bitrixClientId` | string \\| null | Идентификатор OAuth-клиента на портале |\n| `data.prefix` | string | Префикс ключа приложения |\n| `data.suffix` | string | Последние символы ключа приложения |\n| `data.authorId` | string | Идентификатор автора приложения |\n| `data.portalId` | string | Идентификатор портала |\n| `data.createdAt` | string | Дата создания, ISO 8601 |\n| `data.updatedAt` | string | Дата изменения, ISO 8601 |\n| `data.placements` | string[] | Привязанные места встраивания. До публикации — пустой массив |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"33c4d5e6-f7a8-49b0-1234-5c6d7e8f9012\",\n    \"title\": \"Дашборд продаж\",\n    \"description\": \"Аналитика сделок в карточке CRM\",\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\": []\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — приложение не найдено:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"APP_NOT_FOUND\",\n    \"message\": \"Application not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 404 | `APP_NOT_FOUND` | Приложение с указанным `id` не принадлежит порталу ключа или не существует |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- Удалённое приложение возвращает `404 APP_NOT_FOUND` — тем же кодом, что и никогда не существовавший идентификатор. Отличить «удалено» от «не существовало» по ответу нельзя.\n\n## Смотрите также\n\n- [Приложения](\u002Fdocs\u002Fapps)\n- [Список приложений](\u002Fdocs\u002Fapps\u002Flist)\n- [Обновить приложение](\u002Fdocs\u002Fapps\u002Fupdate)\n- [Удалить приложение](\u002Fdocs\u002Fapps\u002Fdelete)\n- [Скоупы](\u002Fdocs\u002Fscopes)\n","\n## Создать приложение\n\n`POST \u002Fv1\u002Fapps`\n\nРегистрирует OAuth-приложение на портале Битрикс24 и создаёт парный API-ключ. Тело передаётся плоско, без обёртки.\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|---------|\n| `title` | string | да | Название приложения, от 1 до 255 символов |\n| `scopes` | array | да | Набор скоупов, минимум один. Для будущей публикации в наборе нужен `placement`. Список — [Скоупы](\u002Fdocs\u002Fscopes) |\n| `description` | string | нет | Описание приложения, до 2000 символов |\n| `appUrl` | string | нет | Адрес приложения, только `http:\u002F\u002F` или `https:\u002F\u002F`. Пустая строка сохраняется как `null` |\n| `redirectUris` | array | нет | Адреса перенаправления для OAuth. По умолчанию — адрес завершения авторизации и `http:\u002F\u002Flocalhost` |\n| `mode` | string | нет | Режим доступа парного ключа: `READONLY` или `READWRITE`. По умолчанию берётся из политики портала |\n\n`handlerUrl` задаёт платформа — в теле он не принимается, через него идут обратные вызовы OAuth и открытие места встраивания. Разница между `appUrl` и `handlerUrl` — в разделе [Приложения](\u002Fdocs\u002Fapps#appurl-и-handlerurl-разные-адреса).\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Дашборд продаж\",\n    \"scopes\": [\"crm\", \"user\", \"placement\"],\n    \"appUrl\": \"https:\u002F\u002Fapp-abc12345.vibecode.bitrix24.tech\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Дашборд продаж\",\n    \"scopes\": [\"crm\", \"user\", \"placement\"],\n    \"appUrl\": \"https:\u002F\u002Fapp-abc12345.vibecode.bitrix24.tech\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    title: 'Дашборд продаж',\n    scopes: ['crm', 'user', 'placement'],\n    appUrl: 'https:\u002F\u002Fapp-abc12345.vibecode.bitrix24.tech',\n  }),\n})\n\nconst { data } = await res.json()\n\u002F\u002F Сохраните data.rawKey сразу — он возвращается только один раз\nconsole.log('App ID:', data.id)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps', {\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({\n    title: 'Дашборд продаж',\n    scopes: ['crm', 'user', 'placement'],\n    appUrl: 'https:\u002F\u002Fapp-abc12345.vibecode.bitrix24.tech',\n  }),\n})\n\nconst { data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data.id` | string | Идентификатор приложения |\n| `data.title` | string | Название |\n| `data.description` | string \\| null | Описание |\n| `data.scopes` | array | Набор скоупов |\n| `data.handlerUrl` | string | Адрес обработчика, задан платформой |\n| `data.appUrl` | string \\| null | Адрес приложения |\n| `data.redirectUris` | array | Адреса перенаправления для OAuth |\n| `data.bitrixClientId` | string \\| null | Идентификатор OAuth-клиента на портале |\n| `data.prefix` | string | Префикс ключа |\n| `data.suffix` | string | Суффикс ключа |\n| `data.authorId` | string | Идентификатор автора |\n| `data.portalId` | string | Идентификатор портала |\n| `data.createdAt` | string | Дата создания, ISO 8601 |\n| `data.updatedAt` | string | Дата изменения, ISO 8601 |\n| `data.placements` | array | Места встраивания, до публикации пустой |\n| `data.rawKey` | string | Готовый ключ авторизации `vibe_app_…`. Возвращается только в этом ответе и больше не показывается |\n\n## Пример ответа\n\n`rawKey` показан с усечённым секретом — это не рабочее значение.\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\": [],\n    \"rawKey\": \"vibe_app_local_7c3d4e5f6a7b80_55556666_…_6666\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — нарушена валидация:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"VALIDATION_ERROR\",\n    \"message\": \"title: Required\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `VALIDATION_ERROR` | Нарушена валидация тела: пропущено `title`, пустой `scopes`, недопустимый `appUrl` |\n| 403 | `APP_CREATION_RESTRICTED` | Создание приложений на портале ограничено списком, автор в него не входит |\n| 403 | `KEY_POLICY_READONLY_REQUIRED` | Политика портала разрешает только `READONLY`, запрошен `READWRITE` |\n| 409 | `KEY_LIMIT_REACHED` | Достигнут предел ключей на пользователя для портала |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **Ключ авторизации возвращается только один раз.** Поле `rawKey` присутствует в ответе создания и больше нигде не отдаётся — ни в [данных приложения](\u002Fdocs\u002Fapps\u002Fget), ни в [списке](\u002Fdocs\u002Fapps\u002Flist). Не сохранили при создании — пересоздайте приложение.\n- **Создаётся пара: приложение и API-ключ.** Регистрация заводит запись приложения и парный ключ авторизации в один приём. Это влияет на удаление: ключ освобождает слот в пределе на пользователя только после [удаления приложения](\u002Fdocs\u002Fapps\u002Fdelete).\n\n## Смотрите также\n\n- [Приложения](\u002Fdocs\u002Fapps)\n- [Обновить приложение](\u002Fdocs\u002Fapps\u002Fupdate)\n- [Удалить приложение](\u002Fdocs\u002Fapps\u002Fdelete)\n- [Опубликовать](\u002Fdocs\u002Fapps\u002Fpublish)\n- [Скоупы](\u002Fdocs\u002Fscopes)\n- [Ключи и авторизация](\u002Fdocs\u002Fkeys-auth)\n","\n## Обновить приложение\n\n`PATCH \u002Fv1\u002Fapps\u002F:id`\n\nИзменяет свойства приложения. Передавайте только те поля, которые нужно изменить.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | string | да | Идентификатор приложения из [создания](\u002Fdocs\u002Fapps\u002Fcreate) или [списка](\u002Fdocs\u002Fapps\u002Flist) |\n\n## Поля запроса (body)\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `title` | string | Название, от 1 до 255 символов. У приложения в каталоге предел — 100 символов |\n| `description` | string \\| null | Описание, до 2000 символов |\n| `appUrl` | string | Адрес приложения, только `http:\u002F\u002F` или `https:\u002F\u002F`. Пустая строка сохраняется как `null` |\n| `scopes` | array | Набор скоупов, минимум один |\n| `redirectUris` | array | Адреса перенаправления для OAuth |\n| `placements` | array | Места встраивания. Список кодов — `GET \u002Fv1\u002Fplacements\u002Favailable` |\n\n`handlerUrl` менять нельзя — поле в теле приводит к `400 HANDLER_URL_READONLY`.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FAPP_ID \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"appUrl\": \"https:\u002F\u002Fapp-abc12345.vibecode.bitrix24.tech\u002Fdashboard\" }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FAPP_ID \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"appUrl\": \"https:\u002F\u002Fapp-abc12345.vibecode.bitrix24.tech\u002Fdashboard\" }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FAPP_ID', {\n  method: 'PATCH',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    appUrl: 'https:\u002F\u002Fapp-abc12345.vibecode.bitrix24.tech\u002Fdashboard',\n  }),\n})\n\nconst { data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FAPP_ID', {\n  method: 'PATCH',\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({\n    appUrl: 'https:\u002F\u002Fapp-abc12345.vibecode.bitrix24.tech\u002Fdashboard',\n  }),\n})\n\nconst { data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `data` | object | Приложение после обновления. Набор полей совпадает с ответом [создания](\u002Fdocs\u002Fapps\u002Fcreate), без `rawKey` |\n| `data.updatedAt` | string | Дата изменения, ISO 8601 |\n| `warnings` | array | Появляется при частичной синхронизации мест встраивания: коды, которые не удалось привязать |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"33c4d5e6-f7a8-49b0-1234-5c6d7e8f9012\",\n    \"title\": \"Дашборд продаж\",\n    \"description\": \"Обновлено\",\n    \"scopes\": [\"crm\", \"user\", \"placement\"],\n    \"handlerUrl\": \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fbitrix-handler\",\n    \"appUrl\": \"https:\u002F\u002Fapp-abc12345.vibecode.bitrix24.tech\u002Fdashboard\",\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:13:36.974Z\",\n    \"placements\": []\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — приложение не найдено:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"APP_NOT_FOUND\",\n    \"message\": \"Application not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 400 | `HANDLER_URL_READONLY` | В теле передан `handlerUrl` — поле задаёт платформа и менять его нельзя |\n| 400 | `NO_USER_TOKEN` | Смена `placements` или переименование опубликованного приложения без токена пользователя на облачном портале |\n| 400 | `TITLE_TOO_LONG_FOR_CATALOG` | Новое название длиннее 100 символов у приложения, добавленного в каталог |\n| 403 | `UNAUTHORIZED` | Ключ не принадлежит автору или владельцу приложения |\n| 404 | `APP_NOT_FOUND` | Приложения с указанным `id` нет |\n| 502 | `BITRIX_PARTIAL_REBIND` | Битрикс24 отклонил перепривязку места встраивания при переименовании. Новое название не записано — повторите запрос |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **Переименование приложения в каталоге меняет и подписи на портале.** Новое `title` уходит в карточку каталога (поле `catalogTitle` пишется вместе с `title`) и в места встраивания — пункт левого меню и вкладки CRM. Поэтому переименование обращается к Битрикс24 и может вернуть `400 NO_USER_TOKEN` или `502 BITRIX_PARTIAL_REBIND`; при отказе название не записывается, повтор запроса чинит состояние. Портал кэширует левое меню — новое имя видно после жёсткой перезагрузки страницы. У приложения вне каталога переименование меняет только `title`.\n- **Смена `placements` у опубликованного приложения запускает синхронизацию мест встраивания на портале.** Привязка и отвязка проходят прямо на портале Битрикс24, и часть кодов может не привязаться — тогда ответ несёт `warnings` со списком таких кодов. На облачном портале без токена пользователя синхронизация невозможна, запрос возвращает `400 NO_USER_TOKEN`. У приложения в статусе `PRIVATE` `placements` пишутся в базу без обращения к порталу.\n\n## Смотрите также\n\n- [Приложения](\u002Fdocs\u002Fapps)\n- [Создать приложение](\u002Fdocs\u002Fapps\u002Fcreate)\n- [Данные приложения](\u002Fdocs\u002Fapps\u002Fget)\n- [Удалить приложение](\u002Fdocs\u002Fapps\u002Fdelete)\n- [Опубликовать](\u002Fdocs\u002Fapps\u002Fpublish)\n","\n## Удалить приложение\n\n`DELETE \u002Fv1\u002Fapps\u002F:id`\n\nУдаляет приложение и отзывает парный API-ключ. Удаление мягкое: приложение скрывается из списка, каталога и обработчика портала, восстановить его через API нельзя — создавайте новое при необходимости.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | string | да | Идентификатор приложения из [создания](\u002Fdocs\u002Fapps\u002Fcreate) или [списка](\u002Fdocs\u002Fapps\u002Flist) |\n\nТело запроса не требуется — пустое тело допустимо.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FAPP_ID \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X DELETE https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FAPP_ID \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FAPP_ID', {\n  method: 'DELETE',\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\nif (res.status === 204) {\n  console.log('Удалено')\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FAPP_ID', {\n  method: 'DELETE',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n```\n\n## Ответ\n\nПри успешном удалении возвращается HTTP-статус `204 No Content` с пустым телом. Признак успеха — код ответа, не содержимое.\n\n## Пример ответа\n\n```\n204 No Content (без тела)\n```\n\n## Пример ответа при ошибке\n\n409 — у парного ключа есть активные серверы:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"APP_HAS_ACTIVE_SERVERS\",\n    \"message\": \"App key has active servers — rebind them first\",\n    \"details\": {\n      \"activeServerCount\": 2,\n      \"userMessage\": \"Перепривяжите серверы к другому ключу перед удалением приложения\",\n      \"servers\": [\n        { \"id\": \"srv-1\", \"name\": \"app-abc12345\" }\n      ]\n    }\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 403 | `UNAUTHORIZED` | Ключ не принадлежит автору или владельцу приложения |\n| 404 | `APP_NOT_FOUND` | Приложения с указанным `id` нет. Повторное удаление того же `id` тоже возвращает этот код |\n| 409 | `APP_HAS_ACTIVE_SERVERS` | У парного ключа есть активные серверы — сначала перепривяжите их к другому ключу. В `details` — `activeServerCount`, `userMessage`, `servers` |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **Повторное удаление идемпотентно.** Второй `DELETE` того же `id` возвращает `404 APP_NOT_FOUND` — приложение уже скрыто мягким удалением. Это штатный ответ, а не сбой: повторный вызов безопасен.\n\n## Смотрите также\n\n- [Приложения](\u002Fdocs\u002Fapps)\n- [Создать приложение](\u002Fdocs\u002Fapps\u002Fcreate)\n- [Данные приложения](\u002Fdocs\u002Fapps\u002Fget)\n- [Обновить приложение](\u002Fdocs\u002Fapps\u002Fupdate)\n","\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","\n## Снять с публикации\n\n`POST \u002Fv1\u002Fapps\u002F:id\u002Funpublish`\n\nПереводит опубликованное приложение в `UNPUBLISHED` и отвязывает места встраивания от портала.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | Описание |\n|----------|-----|:-----:|---------|\n| `id` (path) | string | да | Идентификатор приложения в статусе `PUBLISHED`. Список: `GET \u002Fv1\u002Fapps` |\n\nТело запроса не требуется — пустое тело допустимо.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FYOUR_APP_ID\u002Funpublish\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FYOUR_APP_ID\u002Funpublish\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  'https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FYOUR_APP_ID\u002Funpublish',\n  {\n    method: 'POST',\n    headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n  }\n)\nconst body = await res.json()\nif (!body.success) throw new Error(body.error.code)\nconsole.log(body.data.placements) \u002F\u002F []\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch(\n  'https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fapps\u002FYOUR_APP_ID\u002Funpublish',\n  {\n    method: 'POST',\n    headers: {\n      'X-Api-Key': 'YOUR_APP_KEY',\n      'Authorization': 'Bearer USER_SESSION_TOKEN',\n    },\n  }\n)\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | `true` при успешном снятии с публикации |\n| `data` | object | Приложение после снятия — те же 15 полей, что отдаёт [данные приложения](\u002Fdocs\u002Fapps\u002Fget) |\n| `data.placements` | 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\": []\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n404 — приложение не опубликовано:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"Published app not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 404 | `NOT_FOUND` | Приложение не существует, принадлежит другому порталу или не находится в статусе `PUBLISHED` |\n| 403 | `FORBIDDEN` | Запрос не от автора приложения и не от администратора портала |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **Возврат в `UNPUBLISHED`, а не в `PRIVATE`.** Метаданные каталога — название, описание, иконка — сохраняются, поэтому повторная [публикация](\u002Fdocs\u002Fapps\u002Fpublish) с пустым телом восстанавливает приложение без повторного заполнения.\n- **Отвязка мест встраивания не блокирует снятие.** Отвязка идёт без ожидания результата по каждому коду. Сбой отвязки отдельного места встраивания не прерывает операцию — приложение переходит в `UNPUBLISHED`, а `placements` становится пустым.\n\n## Смотрите также\n\n- [Приложения](\u002Fdocs\u002Fapps)\n- [Опубликовать](\u002Fdocs\u002Fapps\u002Fpublish)\n- [Данные приложения](\u002Fdocs\u002Fapps\u002Fget)\n- [Удалить приложение](\u002Fdocs\u002Fapps\u002Fdelete)\n"]