[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-infra\u002Faccess-tokens\u002Fcreate":3,"docs-tabs-infra\u002Faccess-tokens\u002Fcreate":6},{"content":4,"lastmod":5},"\n## Выпустить токен доступа\n\n`POST \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Faccess-tokens`\n\nВыпускает краткосрочный токен для внешнего доступа к развёрнутому приложению. Два режима: `api-bearer` — JWT для HTTP-заголовка `Authorization`. `share-url` — ссылка, при переходе по которой устанавливается куки.\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|----------|\n| `id` | path | string (UUID) | да | ID BLACKHOLE-сервера |\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | По умолч. | Описание |\n|------|-----|:-----:|-----------|----------|\n| `mode` | string | да | — | `\"api-bearer\"` или `\"share-url\"` |\n| `ttlSeconds` | number | нет | `86400` | Время жизни токена в секундах. Диапазон: 300–315 360 000 (от 5 минут до 10 лет). Значение 315 360 000 отображается в интерфейсе как «Бессрочно» |\n| `identityBound` | boolean | нет | `true` | Только для `share-url`. При `true` — потребует входа через Битрикс24, и в журнале окажется реальный идентификатор пользователя. При `false` — анонимный переход, синтетический идентификатор |\n| `name` | string | нет | — | Метка токена для отображения в списке (до 100 символов) |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Faccess-tokens\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"mode\": \"api-bearer\",\n    \"ttlSeconds\": 600,\n    \"name\": \"ci-smoke\"\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Faccess-tokens\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"mode\": \"share-url\",\n    \"ttlSeconds\": 2592000,\n    \"identityBound\": false,\n    \"name\": \"предпросмотр\"\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Faccess-tokens`,\n  {\n    method: 'POST',\n    headers: {\n      'X-Api-Key': 'YOUR_API_KEY',\n      'Content-Type': 'application\u002Fjson',\n    },\n    body: JSON.stringify({ mode: 'api-bearer', ttlSeconds: 600 }),\n  }\n)\nconst { data } = await res.json()\n\n\u002F\u002F E2E-проверка через публичный путь\nconst check = await fetch(`${data.appUrl}\u002Fapi\u002Fhealth`, {\n  headers: { Authorization: `Bearer ${data.token}` },\n})\nconsole.log(check.status) \u002F\u002F 200 — приложение отвечает через Gateway\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch(\n  `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Faccess-tokens`,\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      mode: 'share-url',\n      ttlSeconds: 2592000,\n      name: 'предпросмотр',\n    }),\n  }\n)\nconst { data } = await res.json()\nconsole.log(data.url) \u002F\u002F https:\u002F\u002Fapp-xxxx.vibecode.bitrix24.tech\u002F?s=R8k3Zm2P\n```\n\n## Поля ответа\n\nНабор полей зависит от режима.\n\n**Режим `api-bearer`:**\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.id` | string | ID токена для последующего отзыва |\n| `data.mode` | string | `\"api-bearer\"` |\n| `data.token` | string | JWT для заголовка `Authorization: Bearer`. Возвращается **один раз** — при выпуске |\n| `data.expiresAt` | string (ISO 8601) | Срок хранения записи токена — для листинга и отзыва |\n| `data.jwtExpiresAt` | string (ISO 8601) | Реальный срок действия Bearer-токена. Ограничен 10 минутами независимо от `ttlSeconds`. После истечения выпустите новый токен |\n| `data.note` | string | Пояснение о разнице между `expiresAt` и `jwtExpiresAt` |\n| `data.subdomain` | string | Субдомен сервера |\n| `data.appUrl` | string | Полный HTTPS-адрес приложения |\n| `data.curlExample` | string | Готовый `curl`-пример с токеном для быстрой проверки |\n\n**Режим `share-url`:**\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data.id` | string | ID токена для последующего отзыва |\n| `data.mode` | string | `\"share-url\"` |\n| `data.shortcode` | string | Код, вставляемый в URL как `?s=\u003Cshortcode>` |\n| `data.url` | string | Полная распространяемая ссылка |\n| `data.identityBound` | boolean | Требует ли переход входа через Битрикс24 |\n| `data.expiresAt` | string (ISO 8601) | Момент истечения токена |\n| `data.name` | string \\| null | Метка, переданная при выпуске |\n\n## Пример ответа\n\n**Режим `api-bearer`:**\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"tk_7d3fa2b1\",\n    \"mode\": \"api-bearer\",\n    \"token\": \"eyJhbGciOiJFUzI1NiJ9...\",\n    \"expiresAt\": \"2026-05-18T10:50:00.000Z\",\n    \"jwtExpiresAt\": \"2026-05-18T10:40:10.000Z\",\n    \"subdomain\": \"app-91306a4c\",\n    \"appUrl\": \"https:\u002F\u002Fapp-91306a4c.vibecode.bitrix24.tech\",\n    \"curlExample\": \"curl -H \\\"Authorization: Bearer eyJhbGciOiJFUzI1NiJ9...\\\" https:\u002F\u002Fapp-91306a4c.vibecode.bitrix24.tech\u002Fapi\u002Fhealth\",\n    \"note\": \"JWT is a 10-minute Gateway session token. Bearer stops working at jwtExpiresAt. POST ...\u002F:tokenId\u002Frefresh to renew the same token, or POST \u002Faccess-tokens for a new one.\"\n  }\n}\n```\n\n**Режим `share-url`:**\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"tk_8e4gb3c2\",\n    \"mode\": \"share-url\",\n    \"shortcode\": \"R8k3Zm2P\",\n    \"url\": \"https:\u002F\u002Fapp-91306a4c.vibecode.bitrix24.tech\u002F?s=R8k3Zm2P\",\n    \"identityBound\": false,\n    \"expiresAt\": \"2026-06-17T08:44:00.000Z\",\n    \"name\": \"предпросмотр\"\n  }\n}\n```\n\n## Пример ответа при ошибке\n\n429 — превышен лимит выпуска токенов:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"TOKEN_MINT_RATE_LIMIT\",\n    \"message\": \"Rate limit: 50 mints\u002Fhour per API key\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 400 | `INVALID_MODE` | Передан недопустимый `mode` |\n| 400 | `INVALID_TTL` | `ttlSeconds` вне допустимого диапазона [300, 315 360 000] |\n| 400 | `NAME_TOO_LONG` | `name` превышает 100 символов |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 403 | `TOKEN_OWNER_MISMATCH` | Сервер принадлежит другому API-ключу |\n| 404 | `SERVER_NOT_FOUND` | Сервер не найден или удалён |\n| 409 | `ACTIVE_TOKEN_LIMIT` | Достигнут лимит 100 активных токенов на сервер |\n| 429 | `TOKEN_MINT_RATE_LIMIT` | Превышен лимит 50 выпусков в час на API-ключ. Заголовок `Retry-After: 3600` |\n| 503 | `FEATURE_DISABLED` | Токены доступа отключены на платформе |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n- **`token` действителен 10 минут независимо от `ttlSeconds`.** Сохраните `token` и `jwtExpiresAt` сразу: JWT перестаёт работать по истечении `jwtExpiresAt`, а не `expiresAt`. `expiresAt` — срок хранения записи (для листинга и отзыва). Чтобы продлить доступ — вызовите [обновление токена](.\u002Frefresh.md) (тот же токен, свежий JWT, без новой записи) или выпустите новый через `POST \u002Faccess-tokens`.\n- **`identityBound` игнорируется для `api-bearer`.** Идентификатором в журнале всегда выступает UUID владельца API-ключа.\n- **Лимиты:** 100 активных токенов на сервер, 50 выпусков в час на API-ключ, `ttlSeconds` от 300 до 315 360 000.\n\n## Смотрите также\n\n- [Обновить токен](.\u002Frefresh.md)\n- [Список токенов](.\u002Flist.md)\n- [Отозвать токен](.\u002Fdelete.md)\n- [Токены доступа](\u002Fdocs\u002Finfra\u002Faccess-tokens)\n- [Deploy API](\u002Fdocs\u002Finfra\u002Fdeploy)\n","2026-06-29",{}]