#Состояние подписки Cowork
GET /v1/cowork/state
Возвращает полный снимок состояния подписки Cowork: тариф, состояние подписки, расход трёх окон квоты в процентах, рекомендацию по ожиданию или переходу на тариф выше и каталог тарифов для сравнительной таблицы.
#Примеры
#curl — личный ключ
curl https://vibecode.bitrix24.tech/v1/cowork/state \
-H "X-Api-Key: YOUR_API_KEY"
#curl — OAuth-приложение
curl https://vibecode.bitrix24.tech/v1/cowork/state \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
#JavaScript — личный ключ
const res = await fetch('https://vibecode.bitrix24.tech/v1/cowork/state', {
headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
if (!res.ok) {
const { error } = await res.json()
console.error(error.code, error.message)
} else {
const state = await res.json()
const tight = state.windows[state.bottleneck]
console.log(`Окно ${state.bottleneck}: ${tight.pctUsed}%`, tight.exhausted ? 'исчерпано' : 'ок')
}
#JavaScript — OAuth-приложение
const res = await fetch('https://vibecode.bitrix24.tech/v1/cowork/state', {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const state = await res.json()
#Поля ответа
| Поле | Тип | Описание |
|---|---|---|
subscription.tier |
string | Текущий тариф: FREE, START, PRO, MAX |
subscription.state |
string | Состояние подписки: ACTIVE, PAUSED, CANCELLED |
subscription.currentPeriodStart |
string | Начало расчётного периода (ISO 8601) |
subscription.currentPeriodEnd |
string | Конец расчётного периода (ISO 8601) |
subscription.nextChargeAt |
string или null | Дата следующего списания, null для тарифа FREE |
subscription.cancelAtPeriodEnd |
boolean | true, если на конец периода запланирована отмена |
windows.fiveHour |
object | Скользящее 5-часовое окно |
windows.fiveHour.pctUsed |
number | Использование в процентах, целое 0–100 |
windows.fiveHour.resetAt |
string | Время сброса окна (ISO 8601) |
windows.fiveHour.exhausted |
boolean | true, если квота окна исчерпана |
windows.week |
object | Скользящее недельное окно, поля аналогичны fiveHour |
windows.month |
object | Месячное окно, совпадает с расчётным периодом, поля аналогичны fiveHour |
bottleneck |
string | Наиболее нагруженное окно: fiveHour, week или month |
recommendation.reason |
string | Причина рекомендации: none, approaching (≥75 % и есть тариф выше), window_exhausted (5-часовое или недельное окно исчерпано, месячное ещё нет), fully_exhausted (исчерпано месячное окно) |
recommendation.triggerWindow |
string или null | Окно, вызвавшее рекомендацию, null при reason: none |
recommendation.wait |
object или null | Когда снимется блокировка: { window, resetAt }, null если ни одно окно не исчерпано |
recommendation.upgrade.available |
boolean | Доступен ли переход на тариф выше |
recommendation.upgrade.nextTier |
string или null | Рекомендуемый следующий тариф, null на тарифе MAX |
tiers |
array | Все четыре тарифа для сравнительной таблицы |
tiers[].tier |
string | Название тарифа: FREE, START, PRO, MAX |
tiers[].multiplier |
string или null | Множитель тарифа: ×1, ×5, ×20, null для FREE |
tiers[].feeVibes |
number | Стоимость тарифа в Вайбах за месяц |
tiers[].current |
boolean | true, если тариф активен у владельца ключа |
tiers[].isNext |
boolean | true, если тариф совпадает с recommendation.upgrade.nextTier |
serverTime |
string | Серверное время в момент ответа (ISO 8601) |
#Пример ответа
{
"subscription": {
"tier": "FREE",
"state": "ACTIVE",
"currentPeriodStart": "2026-06-01T00:00:00.000Z",
"currentPeriodEnd": "2026-07-01T00:00:00.000Z",
"nextChargeAt": null,
"cancelAtPeriodEnd": false
},
"windows": {
"fiveHour": { "pctUsed": 40, "resetAt": "2026-06-09T17:30:00.000Z", "exhausted": false },
"week": { "pctUsed": 24, "resetAt": "2026-06-12T09:00:00.000Z", "exhausted": false },
"month": { "pctUsed": 20, "resetAt": "2026-07-01T00:00:00.000Z", "exhausted": false }
},
"bottleneck": "fiveHour",
"recommendation": {
"reason": "none",
"triggerWindow": null,
"wait": null,
"upgrade": { "available": true, "nextTier": "START" }
},
"tiers": [
{ "tier": "FREE", "multiplier": null, "feeVibes": 0, "current": true, "isNext": false },
{ "tier": "START", "multiplier": "×1", "feeVibes": 2000, "current": false, "isNext": true },
{ "tier": "PRO", "multiplier": "×5", "feeVibes": 10000, "current": false, "isNext": false },
{ "tier": "MAX", "multiplier": "×20", "feeVibes": 40000, "current": false, "isNext": false }
],
"serverTime": "2026-06-09T14:05:00.000Z"
}
#Пример ответа при ошибке
404 — подписка не активирована:
{
"success": false,
"error": {
"code": "COWORK_NOT_ACTIVATED",
"message": "No active Cowork subscription for this user+portal"
}
}
#Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 401 | MISSING_API_KEY |
Не передан заголовок X-Api-Key |
| 401 | INVALID_API_KEY |
Неверный API-ключ |
| 403 | INSUFFICIENT_SCOPE |
У ключа нет скоупа vibe:cowork |
| 404 | COWORK_NOT_ACTIVATED |
Подписка Cowork не найдена для пары пользователь и портал |
| 500 | INVALID_TIER_CONFIGURATION |
Конфигурация тарифов на платформе некорректна |
| 503 | COWORK_FEATURE_DISABLED |
Cowork отключён на уровне платформы |
Полный список общих ошибок API — Ошибки.
#Известные особенности
Успешный ответ (200) — это сам объект состояния, без обёртки success. Ошибки приходят в конверте { success: false, error: { code, message } }. Определяйте успех по HTTP-статусу (res.ok).
Признак исчерпания окна — поле exhausted, а не pctUsed === 100. Значение pctUsed округляется до целого: 99,6 % отображается как 100, хотя окно ещё не исчерпано.
Время до сброса отсчитывайте от serverTime, а не от часов устройства — расхождение часов клиента и сервера исказит счётчик.
Окна сбрасываются лениво при чтении — если запросов не было с момента сброса, он применяется при обращении к эндпоинту, поэтому снимок всегда актуален.
Опрашивайте не чаще одного раза в 15–30 секунд. Ответ не кэшируется (Cache-Control: no-store).