[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-infra\u002Faccess-tokens\u002Frefresh":3,"docs-tabs-infra\u002Faccess-tokens\u002Frefresh":6},{"content":4,"lastmod":5},"\n## Обновить токен доступа\n\n`POST \u002Fv1\u002Finfra\u002Fservers\u002F:id\u002Faccess-tokens\u002F:tokenId\u002Frefresh`\n\nВыпускает свежий JWT для уже существующего токена режима `api-bearer` — **без создания новой записи**. JWT действует до 10 минут (или до `expiresAt` записи, если он ближе). Долгоживущему клиенту (CI, AI-агент) удобнее вызывать обновление перед истечением `jwtExpiresAt`, чем выпускать новый токен: обновление не расходует лимит активных токенов и лимит выпусков в час.\n\nТело запроса не требуется.\n\n## Параметры\n\n| Параметр | В | Тип | Обяз. | Описание |\n|----------|---|-----|:-----:|----------|\n| `id` | path | string (UUID) | да | ID BLACKHOLE-сервера |\n| `tokenId` | path | string (UUID) | да | ID токена `api-bearer` (поле `data.id` из ответа на выпуск) |\n\n## Примеры\n\n### curl\n\n```bash\ncurl -X POST \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Faccess-tokens\u002FTOKEN_ID\u002Frefresh\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### JavaScript — цикл «использовал → при 401 обновил → повторил»\n\n```javascript\nasync function callWithRefresh(serverId, tokenId, appUrl, jwt) {\n  let res = await fetch(`${appUrl}\u002Fapi\u002Fhealth`, {\n    headers: { Authorization: `Bearer ${jwt}` },\n  })\n  if (res.status === 401) {\n    const r = await fetch(\n      `https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002F${serverId}\u002Faccess-tokens\u002F${tokenId}\u002Frefresh`,\n      { method: 'POST', headers: { 'X-Api-Key': 'YOUR_API_KEY' } },\n    )\n    const { data } = await r.json()\n    jwt = data.token \u002F\u002F тот же tokenId, свежий JWT\n    res = await fetch(`${appUrl}\u002Fapi\u002Fhealth`, {\n      headers: { Authorization: `Bearer ${jwt}` },\n    })\n  }\n  return res\n}\n```\n\n## Поля ответа\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) | Реальный срок действия нового JWT. Ограничен 10 минутами (или `expiresAt` записи, если он ближе) |\n| `data.subdomain` | string | Субдомен сервера |\n| `data.appUrl` | string | Полный HTTPS-адрес приложения |\n| `data.curlExample` | string | Готовый `curl`-пример с новым токеном |\n| `data.note` | string | Пояснение о сроках действия и о повторном вызове |\n\n## Пример ответа\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"tk_7d3fa2b1\",\n    \"mode\": \"api-bearer\",\n    \"token\": \"eyJhbGciOiJFUzI1NiJ9...\",\n    \"expiresAt\": \"2026-06-25T10:50:00.000Z\",\n    \"jwtExpiresAt\": \"2026-06-25T10: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\": \"Refreshed the Gateway session JWT for this api-bearer token (same token id, no new row).\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 400 | `WRONG_TOKEN_MODE` | Токен в режиме `share-url`. Обновление применимо только к `api-bearer`; ссылки `share-url` обновляются сами при переходе |\n| 400 | `SERVER_NO_SUBDOMAIN` | У сервера нет субдомена |\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный или просроченный API-ключ |\n| 403 | `TOKEN_OWNER_MISMATCH` | Токен принадлежит другому ключу либо сервер больше не привязан к вашему ключу |\n| 404 | `NOT_FOUND` | Токен не найден на этом сервере |\n| 404 | `SERVER_NOT_FOUND` | Сервер не найден или удалён |\n| 410 | `ALREADY_REVOKED` | Токен отозван — выпустите новый |\n| 410 | `TOKEN_EXPIRED` | Срок хранения записи истёк — выпустите новый токен через `POST \u002Faccess-tokens` |\n| 503 | `FEATURE_DISABLED` | Токены доступа отключены на платформе |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Диагностика отказа Gateway\n\nЕсли запрос к приложению с заголовком `Authorization: Bearer` возвращает `401` с кодом `BH_LOGIN_REQUIRED`, тело ответа содержит поле `reason` с конкретной причиной отказа Gateway:\n\n| `reason` | Что произошло | Что делать |\n|----------|---------------|------------|\n| `expired` | JWT просрочен (истёк 10-минутный срок) | Обновите токен этим эндпоинтом или выпустите новый |\n| `signature` | Подпись не сошлась | Используйте токен, выпущенный для этого сервера; не редактируйте его |\n| `subdomain` | Токен привязан к другому субдомену | Обращайтесь к собственному субдомену `app-*` сервера |\n| `revoked` | Токен отозван | Выпустите новый токен |\n| `type` | Передан не `api-bearer`-токен | Используйте токен режима `api-bearer`, а не cookie-сессию |\n| `malformed` \u002F `invalid` | Строка не является корректным JWT | Проверьте целостность токена |\n\n## Известные особенности\n\n- **Обновление не создаёт новую запись.** `data.id` остаётся прежним; запись токена и её `expiresAt` не меняются — обновляется только JWT. Один отзыв (`DELETE`) гасит и исходный, и все обновлённые JWT одного токена.\n- **JWT никогда не живёт дольше записи.** Если до `expiresAt` записи осталось меньше 10 минут, новый `jwtExpiresAt` обрезается до этого срока.\n- **Только для `api-bearer`.** Ссылки `share-url` обновляются автоматически при каждом переходе через `\u002Fauth\u002Fbh-login`.\n\n## Смотрите также\n\n- [Выпустить токен](.\u002Fcreate.md)\n- [Список токенов](.\u002Flist.md)\n- [Отозвать токен](.\u002Fdelete.md)\n- [Токены доступа](\u002Fdocs\u002Finfra\u002Faccess-tokens)\n","2026-06-26",{}]