[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-infra\u002Faccess\u002Faccess-delete":3,"docs-tabs-infra\u002Faccess\u002Faccess-delete":6},{"content":4,"lastmod":5},"\n## Удалить запись доступа\n\n`DELETE \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Faccess\u002F:accessId`\n\nУдаляет запись доступа — пользователя или отдел — из списка BLACKHOLE-сервера. Эндпоинт универсальный: один и тот же `accessId` может относиться либо к пользователю (`BlackHoleAccess`), либо к отделу (`BlackHoleDepartment`) — платформа сначала ищет в первой таблице, потом во второй. После удаления запись исчезает из [`GET \u002Faccess`](.\u002Faccess-list.md).\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|----------|\n| `id` | path | string (UUID) | да | ID BLACKHOLE-сервера |\n| `accessId` | path | string (UUID) | да | ID записи доступа из [`GET \u002Faccess`](.\u002Faccess-list.md) или [`POST \u002Faccess`](.\u002Faccess-add.md) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X DELETE -H \"X-Api-Key: YOUR_API_KEY\" \\\n  https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Faccess\u002Fb3a6f8d1-3c2a-4e17-9f0b-1a7c2d4e5f60\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X DELETE -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Faccess\u002FACCESS_ID\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Faccess\u002F${accessId}`,\n  {\n    method: 'DELETE',\n    headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n  }\n)\nconst { success } = await res.json()\nif (success) console.log('Запись удалена')\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nawait fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Faccess\u002F${accessId}`,\n  {\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\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | `true` при успешном удалении |\n\n## Пример ответа\n\n```json\n{ \"success\": true }\n```\n\n## Пример ответа при ошибке\n\n404 — запись не найдена (уже удалена, неверный accessId, либо accessId другого сервера):\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"Access entry not found\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 400 | `BLACKHOLE_ONLY` | Сервер в режиме OPEN |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 404 | `NOT_FOUND` | Сервер не существует или запись не найдена (неверный `accessId`, уже удалена, или принадлежит другому серверу) |\n| 429 | `RATE_LIMITED` | Превышен общий лимит запросов платформы |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **Физическое удаление, не пометка на удаление.** Запись стирается из базы. Восстановить нельзя — придётся повторно вызывать [`POST \u002Faccess`](.\u002Faccess-add.md).\n- **`accessId` привязан к серверу.** Попытка удалить запись доступа другого сервера (правильный `accessId`, но неверный `:id` в пути) вернёт 404 `NOT_FOUND`. Платформа намеренно не раскрывает факт существования записей чужих серверов.\n- **Удаление не меняет политику.** Если вы удалите всех пользователей при `accessPolicy: \"NAMED_USERS\"`, политика останется `NAMED_USERS` (и приложение станет недоступно никому, кроме владельца ключа). Чтобы «полностью вернуть приватность» — меняйте политику обратно на `OWNER_ONLY` через [`PATCH \u002Faccess-policy`](.\u002Faccess-policy.md).\n- **Владельца ключа удалить нельзя.** Владелец всегда имеет доступ, даже если его нет в списке. Чтобы забрать у себя доступ — нужен другой API-ключ.\n\n## Смотрите также\n\n- [Список доступа](.\u002Faccess-list.md) — получить `accessId` для удаления.\n- [Добавить пользователя\u002Fотдел](.\u002Faccess-add.md) — `POST \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Faccess`.\n- [Политика доступа](.\u002Faccess-policy.md) — `PATCH \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Faccess-policy`.\n","2026-06-29",{"access-add.md":7,"access-policy.md":8},"\n## Добавить пользователя или отдел\n\n`POST \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Faccess`\n\nДобавляет запись доступа к BLACKHOLE-серверу: конкретного пользователя Битрикс24 (при политике `NAMED_USERS`) или отдел (при политике `DEPARTMENT`). Политика при этом не меняется автоматически — смените её через [`PATCH \u002Faccess-policy`](.\u002Faccess-policy.md) отдельно, если ещё не переключали. Дубликаты (тот же `userId` или `departmentId` на том же сервере) возвращают 409 `ALREADY_EXISTS`.\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|----------|\n| `id` | path | string (UUID) | да | ID BLACKHOLE-сервера |\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|----------|\n| `type` | string | **да** | `user` — добавить пользователя, `department` — добавить отдел |\n| `userId` | string | да (для `type: \"user\"`) | ID пользователя Битрикс24. Ищите через [`GET \u002Fb24-users?search=`](.\u002Fb24-users.md) |\n| `userName` | string | нет | Имя пользователя (до 255 символов). Опционально, но рекомендуется для удобства чтения в UI |\n| `departmentId` | string | да (для `type: \"department\"`) | ID отдела Битрикс24 |\n| `departmentName` | string | да (для `type: \"department\"`) | Имя отдела (до 255 символов) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\n# Добавить пользователя\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Faccess \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"type\": \"user\", \"userId\": \"243\", \"userName\": \"Катя Иванова\"}'\n\n# Добавить отдел\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Faccess \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"type\": \"department\", \"departmentId\": \"5\", \"departmentName\": \"Разработка\"}'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Faccess \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"type\": \"user\", \"userId\": \"243\", \"userName\": \"Катя Иванова\"}'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Faccess`,\n  {\n    method: 'POST',\n    headers: {\n      'X-Api-Key': 'YOUR_API_KEY',\n      'Content-Type': 'application\u002Fjson',\n    },\n    body: JSON.stringify({\n      type: 'user',\n      userId: '243',\n      userName: 'Катя Иванова',\n    }),\n  }\n)\nif (res.status === 201) {\n  const { data } = await res.json()\n  console.log(`Добавлен: ${data.userName} (запись ${data.id})`)\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nawait fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Faccess`,\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({\n      type: 'department',\n      departmentId: '5',\n      departmentName: 'Разработка',\n    }),\n  }\n)\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | `true` при успешном добавлении. HTTP-статус — 201 |\n| `data.id` | string (UUID) | ID созданной записи — передавайте в [`DELETE \u002Faccess\u002F:accessId`](.\u002Faccess-delete.md) для удаления |\n| `data.serverId` | string (UUID) | ID сервера |\n| `data.userId` | string | ID пользователя Битрикс24 (только для `type: \"user\"`) |\n| `data.userName` | string \\| null | Имя пользователя (только для `type: \"user\"`) |\n| `data.networkUserId` | string \\| null | Network ID пользователя. `null` сразу после создания, заполняется асинхронно (только для `type: \"user\"`) |\n| `data.departmentId` | string | ID отдела Битрикс24 (только для `type: \"department\"`) |\n| `data.departmentName` | string | Имя отдела (только для `type: \"department\"`) |\n| `data.grantedBy` | string (UUID) | ID пользователя Вайбкод, который создал запись |\n| `data.createdAt` | string (ISO 8601) | Момент добавления |\n\n## Пример ответа\n\nДобавление пользователя:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"b3a6f8d1-3c2a-4e17-9f0b-1a7c2d4e5f60\",\n    \"serverId\": \"e765edfc-ba0a-43de-b8ea-838dd872c522\",\n    \"userId\": \"243\",\n    \"userName\": \"Катя Иванова\",\n    \"networkUserId\": null,\n    \"grantedBy\": \"f1d2e3c4-5b6a-4d0e-8f1a-2b3c4d5e6f70\",\n    \"createdAt\": \"2026-04-22T10:15:00.000Z\"\n  }\n}\n```\n\nДобавление отдела:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"c7d8e9f0-1a2b-3c4d-5e6f-7a8b9c0d1e2f\",\n    \"serverId\": \"e765edfc-ba0a-43de-b8ea-838dd872c522\",\n    \"departmentId\": \"5\",\n    \"departmentName\": \"Разработка\",\n    \"grantedBy\": \"f1d2e3c4-5b6a-4d0e-8f1a-2b3c4d5e6f70\",\n    \"createdAt\": \"2026-04-22T11:30:00.000Z\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n409 — запись уже существует:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ALREADY_EXISTS\",\n    \"message\": \"Access entry already exists\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 400 | `VALIDATION_ERROR` | Поля не прошли валидацию: неверный `type`, отсутствует обязательное поле для выбранного типа |\n| 400 | `BLACKHOLE_ONLY` | Сервер в режиме OPEN |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 404 | `NOT_FOUND` | Сервер не существует, удалён или принадлежит другому API-ключу |\n| 409 | `ALREADY_EXISTS` | Запись для этого `userId`\u002F`departmentId` на этом сервере уже существует |\n| 429 | `RATE_LIMITED` | Превышен общий лимит запросов платформы |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **`userName` и `departmentName` — только для отображения.** Для сопоставления при проверке доступа используются `userId`\u002F`departmentId` — имя на авторизацию не влияет. Имя используется для отображения в списке, когда интеграция с Битрикс24 временно недоступна.\n- **`networkUserId` заполняется асинхронно.** Сразу после `POST` поле `null`. В фоне платформа вызывает веб-хук Битрикс24 (если доступен), находит Network ID пользователя и обновляет запись. Это нужно для сопоставления, когда пользователь входит в Вайбкод через Network OAuth (а не через ваш портал).\n- **Уникальность — пара `(serverId, userId)` для пользователей и `(serverId, departmentId)` для отделов.** Чтобы «обновить» запись — сначала `DELETE`, потом `POST`.\n- **Политика не меняется автоматически.** Если сервер в `OWNER_ONLY`, добавление записи не сработает как «открытие доступа» — сначала переключите политику на `NAMED_USERS` (или `DEPARTMENT`) через [`PATCH \u002Faccess-policy`](.\u002Faccess-policy.md).\n\n## Смотрите также\n\n- [Список доступа](.\u002Faccess-list.md) — проверить, что запись добавилась.\n- [Удалить запись](.\u002Faccess-delete.md) — `DELETE \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Faccess\u002F:accessId`.\n- [Политика доступа](.\u002Faccess-policy.md) — переключить `NAMED_USERS` \u002F `DEPARTMENT`.\n- [Поиск пользователей Битрикс24](.\u002Fb24-users.md) — найти `userId` до добавления.\n","\n## Политика доступа\n\n`PATCH \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Faccess-policy`\n\nОбновляет политику доступа для BLACKHOLE-сервера — определяет, кто из пользователей Битрикс24 может открывать приложение по HTTPS-субдомену (`app-{id}.vibecode.bitrix24.tech`). По умолчанию установлено `OWNER_ONLY` — только владелец API-ключа. Работает только в режиме `BLACKHOLE`. Для OPEN-сервера возвращается `BLACKHOLE_ONLY` — сначала переключите режим через [`PATCH \u002Fmode`](.\u002Fmode.md).\n\n> **Изменение `accessPolicy` с `OWNER_ONLY` на более открытую напрямую влияет на безопасность.** Смена на `PORTAL`, `AUTHENTICATED` или `PUBLIC` открывает приложение другим людям. **AI-агенты: никогда не вызывайте этот эндпоинт без явного подтверждения пользователя.**\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|----------|\n| `id` | path | string (UUID) | да | ID сервера в режиме BLACKHOLE |\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|----------|\n| `accessPolicy` | string | **да** | Одно из: `OWNER_ONLY`, `NAMED_USERS`, `DEPARTMENT`, `PORTAL`, `AUTHENTICATED`, `PUBLIC` |\n\nЗначения (от самой закрытой к самой открытой):\n\n| Значение | Кто видит приложение |\n|----------|---------------------|\n| `OWNER_ONLY` | Только владелец API-ключа (по умолчанию) |\n| `NAMED_USERS` | Конкретные пользователи из списка [`\u002Faccess`](.\u002Faccess-list.md) |\n| `DEPARTMENT` | Отделы Битрикс24 из списка [`\u002Faccess`](.\u002Faccess-list.md) |\n| `PORTAL` | Все пользователи портала Битрикс24 |\n| `AUTHENTICATED` | Все авторизованные пользователи (включая не-членов портала) |\n| `PUBLIC` | Все, без авторизации |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X PATCH https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Faccess-policy \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"accessPolicy\": \"PORTAL\"}'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X PATCH https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Faccess-policy \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"accessPolicy\": \"NAMED_USERS\"}'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Faccess-policy`,\n  {\n    method: 'PATCH',\n    headers: {\n      'X-Api-Key': 'YOUR_API_KEY',\n      'Content-Type': 'application\u002Fjson',\n    },\n    body: JSON.stringify({ accessPolicy: 'NAMED_USERS' }),\n  }\n)\nconst { data } = await res.json()\nconsole.log('Новая политика:', data.accessPolicy)\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nawait fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Faccess-policy`,\n  {\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({ accessPolicy: 'OWNER_ONLY' }),\n  }\n)\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.accessPolicy` | string | Новое значение политики (эхо) |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"accessPolicy\": \"PORTAL\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n400 — сервер в режиме OPEN:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"BLACKHOLE_ONLY\",\n    \"message\": \"Access policy is a Black Hole feature. Server is in OPEN mode — switch to BLACKHOLE via PATCH \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Fmode first.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 400 | `VALIDATION_ERROR` | `accessPolicy` не в списке допустимых значений |\n| 400 | `BLACKHOLE_ONLY` | Сервер в режиме OPEN — политика не применима |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 404 | `NOT_FOUND` | Сервер не существует, удалён или принадлежит другому API-ключу |\n| 429 | `RATE_LIMITED` | Превышен общий лимит запросов платформы |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **`PUBLIC` особенно опасен.** Он делает приложение доступным без какой-либо авторизации — любому посетителю из интернета. Факт смены политики фиксируется в аудит-логе портала.\n- **`NAMED_USERS` и `DEPARTMENT` требуют непустых списков доступа.** Сама смена политики не добавляет пользователей — список ведётся отдельно через [`POST \u002Faccess`](.\u002Faccess-add.md). Если список пустой при `NAMED_USERS`\u002F`DEPARTMENT`, приложение будет недоступно никому, кроме владельца (автоматического отката к `OWNER_ONLY` не происходит).\n- **При возврате в `OWNER_ONLY` записи в `\u002Faccess` сохраняются в базе.** Они не применяются, пока политика не `NAMED_USERS`\u002F`DEPARTMENT`. Если захотите очистить историю — удалите записи через [`DELETE \u002Faccess\u002F:accessId`](.\u002Faccess-delete.md).\n- **При смене режима на OPEN `accessPolicy` не меняется**, но и не применяется: в OPEN защита идёт через SSH-ключи и iptables. При возврате в BLACKHOLE политика снова станет действующей.\n- **`AUTHENTICATED` включает не-членов портала.** В отличие от `PORTAL`, `AUTHENTICATED` пропускает любого авторизованного пользователя Битрикс24 (в том числе тех, кто не состоит в вашем портале). Подходит для приложений-гостевых форм, но снимает привязку к своему портальному коллективу.\n- **Владелец API-ключа всегда имеет доступ** — он не удаляется из списка при смене политики. Чтобы забрать доступ у себя, нужен запрос с другого ключа.\n\n## Смотрите также\n\n- [Список доступа](.\u002Faccess-list.md) — `GET \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Faccess` — кого сейчас видит политика.\n- [Добавить пользователя\u002Fотдел](.\u002Faccess-add.md) — `POST \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Faccess`.\n- [Удалить запись доступа](.\u002Faccess-delete.md) — `DELETE \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Faccess\u002F:accessId`.\n- [Поиск пользователей Битрикс24](.\u002Fb24-users.md) — найти `userId` для `NAMED_USERS`.\n- [Переключить режим](.\u002Fmode.md) — политика работает только в BLACKHOLE.\n"]