#Выпустить токен доступа
POST /v1/infra/servers/:id/access-tokens
Выпускает краткосрочный токен для внешнего доступа к развёрнутому приложению. Два режима: api-bearer — JWT для HTTP-заголовка Authorization; share-url — ссылка, при переходе по которой устанавливается куки.
#Параметры
| Параметр | В | Тип | Обяз. | Описание |
|---|---|---|---|---|
id |
path | string (UUID) | да | ID BLACKHOLE-сервера |
#Поля запроса (body)
| Поле | Тип | Обяз. | По умолч. | Описание |
|---|---|---|---|---|
mode |
string | да | — | "api-bearer" или "share-url" |
ttlSeconds |
number | нет | 86400 |
Время жизни токена в секундах. Диапазон: 300–315 360 000 (от 5 минут до 10 лет). Значение 315 360 000 отображается в интерфейсе как «Бессрочно» |
identityBound |
boolean | нет | true |
Только для share-url. При true — потребует входа через Битрикс24, в журнале окажется реальный идентификатор пользователя. При false — анонимный переход, синтетический идентификатор |
name |
string | нет | — | Метка токена для отображения в списке (до 100 символов) |
#Примеры
#curl — личный ключ
curl -X POST "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/access-tokens" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "api-bearer",
"ttlSeconds": 600,
"name": "ci-smoke"
}'
#curl — OAuth-приложение
curl -X POST "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/access-tokens" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"mode": "share-url",
"ttlSeconds": 2592000,
"identityBound": false,
"name": "предпросмотр"
}'
#JavaScript — личный ключ
const res = await fetch(
`https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/access-tokens`,
{
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({ mode: 'api-bearer', ttlSeconds: 600 }),
}
)
const { data } = await res.json()
// E2E-проверка через публичный путь
const check = await fetch(`${data.appUrl}/api/health`, {
headers: { Authorization: `Bearer ${data.token}` },
})
console.log(check.status) // 200 — приложение отвечает через Gateway
#JavaScript — OAuth-приложение
const res = await fetch(
`https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/access-tokens`,
{
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
mode: 'share-url',
ttlSeconds: 2592000,
name: 'предпросмотр',
}),
}
)
const { data } = await res.json()
console.log(data.url) // https://app-xxxx.vibecode.bitrix24.tech/?s=R8k3Zm2P
#Поля ответа
Набор полей зависит от режима.
Режим api-bearer:
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | Всегда true при успехе |
data.id |
string | ID токена для последующего отзыва |
data.mode |
string | "api-bearer" |
data.token |
string | JWT для заголовка Authorization: Bearer. Возвращается один раз — при выпуске |
data.expiresAt |
string (ISO 8601) | Срок хранения записи токена — для листинга и отзыва |
data.jwtExpiresAt |
string (ISO 8601) | Реальный срок действия Bearer-токена. Ограничен 10 минутами независимо от ttlSeconds. После истечения выпустите новый токен |
data.note |
string | Пояснение о разнице между expiresAt и jwtExpiresAt |
data.subdomain |
string | Субдомен сервера |
data.appUrl |
string | Полный HTTPS-адрес приложения |
data.curlExample |
string | Готовый curl-пример с токеном для быстрой проверки |
Режим share-url:
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | Всегда true при успехе |
data.id |
string | ID токена для последующего отзыва |
data.mode |
string | "share-url" |
data.shortcode |
string | Код, вставляемый в URL как ?s=<shortcode> |
data.url |
string | Полная распространяемая ссылка |
data.identityBound |
boolean | Требует ли переход входа через Битрикс24 |
data.expiresAt |
string (ISO 8601) | Момент истечения токена |
data.name |
string | null | Метка, переданная при выпуске |
#Пример ответа
Режим api-bearer:
{
"success": true,
"data": {
"id": "tk_7d3fa2b1",
"mode": "api-bearer",
"token": "eyJhbGciOiJFUzI1NiJ9...",
"expiresAt": "2026-05-18T10:50:00.000Z",
"jwtExpiresAt": "2026-05-18T10:40:10.000Z",
"subdomain": "app-91306a4c",
"appUrl": "https://app-91306a4c.vibecode.bitrix24.tech",
"curlExample": "curl -H \"Authorization: Bearer eyJhbGciOiJFUzI1NiJ9...\" https://app-91306a4c.vibecode.bitrix24.tech/api/health",
"note": "JWT is a 10-minute Gateway session token. Bearer stops working at jwtExpiresAt. POST /access-tokens again to mint a fresh JWT."
}
}
Режим share-url:
{
"success": true,
"data": {
"id": "tk_8e4gb3c2",
"mode": "share-url",
"shortcode": "R8k3Zm2P",
"url": "https://app-91306a4c.vibecode.bitrix24.tech/?s=R8k3Zm2P",
"identityBound": false,
"expiresAt": "2026-06-17T08:44:00.000Z",
"name": "предпросмотр"
}
}
#Пример ответа при ошибке
429 — превышен лимит выпуска токенов:
{
"success": false,
"error": {
"code": "TOKEN_MINT_RATE_LIMIT",
"message": "Rate limit: 50 mints/hour per API key"
}
}
#Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 400 | INVALID_MODE |
Передан недопустимый mode |
| 400 | INVALID_TTL |
ttlSeconds вне допустимого диапазона [300, 315 360 000] |
| 400 | NAME_TOO_LONG |
name превышает 100 символов |
| 401 | MISSING_API_KEY |
Не передан заголовок X-Api-Key |
| 401 | INVALID_API_KEY |
Неверный или просроченный API-ключ |
| 403 | TOKEN_OWNER_MISMATCH |
Сервер принадлежит другому API-ключу |
| 404 | SERVER_NOT_FOUND |
Сервер не найден или удалён |
| 409 | ACTIVE_TOKEN_LIMIT |
Достигнут лимит 100 активных токенов на сервер |
| 429 | TOKEN_MINT_RATE_LIMIT |
Превышен лимит 50 выпусков в час на API-ключ. Заголовок Retry-After: 3600 |
| 503 | FEATURE_DISABLED |
Токены доступа отключены на платформе |
Полный список общих ошибок API — Ошибки.
#Известные особенности
tokenдействителен 10 минут независимо отttlSeconds. СохранитеtokenиjwtExpiresAtсразу: JWT перестаёт работать по истеченииjwtExpiresAt, а неexpiresAt.expiresAt— срок хранения записи (для листинга и отзыва). Повторно получить JWT невозможно — выпустите новый токен черезPOST /access-tokens.identityBoundигнорируется дляapi-bearer. Идентификатором в журнале всегда выступает UUID владельца API-ключа.- Лимиты: 100 активных токенов на сервер; 50 выпусков в час на API-ключ;
ttlSecondsот 300 до 315 360 000.