#Состояние подписки Cowork
GET /v1/cowork/state
Возвращает снимок состояния подписки Cowork: тарифный план, статус подписки, три квотных окна с абсолютными числами и временем сброса, рекомендацию по ожиданию или переходу на следующий тариф, а также полный каталог тарифов для построения сравнительной таблицы. Предназначен для настольного приложения Cowork.
Скоуп: vibe:cowork · Авторизация: X-Api-Key · Кэширование: Cache-Control: no-store
#Примеры
#curl
curl -H "X-Api-Key: YOUR_COWORK_KEY" \
https://vibecode.bitrix24.tech/v1/cowork/state
#JavaScript
const res = await fetch('https://vibecode.bitrix24.tech/v1/cowork/state', {
headers: { 'X-Api-Key': 'YOUR_COWORK_KEY' }
})
if (!res.ok) {
const { error } = await res.json()
console.error(error.code, error.message)
} else {
const { windows, recommendation, serverTime } = await res.json()
const remaining = windows.fiveHour.remaining
const resetIn = (new Date(windows.fiveHour.resetAt) - new Date(serverTime)) / 1000
console.log(`Осталось квоты: ${remaining}, сброс через ${Math.ceil(resetIn)}с`)
}
#Поля ответа
| Поле | Тип | Описание |
|---|---|---|
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 (ISO 8601) или null | Дата следующего списания; null для тарифа FREE |
subscription.cancelAtPeriodEnd |
boolean | true — пользователь запланировал отмену, которая вступит в силу в конце периода |
windows.fiveHour |
object | Скользящее 5-часовое окно |
windows.fiveHour.used |
number | Израсходованные единицы квоты |
windows.fiveHour.total |
number | Общий лимит окна |
windows.fiveHour.remaining |
number | Остаток квоты |
windows.fiveHour.pctUsed |
number | Процент использования, целое число 0–100 |
windows.fiveHour.resetAt |
string (ISO 8601) | Время сброса окна |
windows.fiveHour.exhausted |
boolean | true — квота исчерпана (remaining === 0) |
windows.week |
object | Скользящее недельное окно (аналогичные поля) |
windows.month |
object | Месячное окно — совпадает с расчётным периодом (аналогичные поля) |
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[].feeVibes |
number | Стоимость в Вайбах в месяц |
tiers[].monthTotal |
number | Месячный лимит квоты |
tiers[].weekCap |
number | Недельный лимит квоты |
tiers[].fiveHourCap |
number | 5-часовой лимит квоты |
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": { "used": 40, "total": 100, "remaining": 60, "pctUsed": 40, "resetAt": "2026-06-02T17:30:00.000Z", "exhausted": false },
"week": { "used": 120, "total": 500, "remaining": 380, "pctUsed": 24, "resetAt": "2026-06-09T09:00:00.000Z", "exhausted": false },
"month": { "used": 300, "total": 1500, "remaining": 1200, "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", "feeVibes": 0, "monthTotal": 1500, "weekCap": 500, "fiveHourCap": 100, "current": true, "isNext": false },
{ "tier": "START", "feeVibes": 2000, "monthTotal": 50000, "weekCap": 14000, "fiveHourCap": 2500, "current": false, "isNext": true },
{ "tier": "PRO", "feeVibes": 10000, "monthTotal": 250000, "weekCap": 70000, "fiveHourCap": 12500, "current": false, "isNext": false },
{ "tier": "MAX", "feeVibes": 40000, "monthTotal": 1000000, "weekCap": 280000, "fiveHourCap": 50000, "current": false, "isNext": false }
],
"serverTime": "2026-06-02T14: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 не найдена для пары пользователь+портал |
| 503 | COWORK_FEATURE_DISABLED |
Cowork отключён на уровне платформы |
Полный список общих ошибок API — Ошибки.
#Известные особенности
- Успешный ответ (200) — это сам объект состояния, без обёртки
success. Ошибки возвращаются в конверте{ success: false, error: { code, message } }. Определяйте успех по HTTP-статусу (res.ok), а не по полюsuccess. - Признак исчерпания —
remaining === 0илиexhausted: true, неpctUsed === 100. ПолеpctUsedокругляется до целого числа: 99,6% отображается как100, хотя остаток ещё есть. Для точного определения блокировки используйтеexhaustedили проверяйтеremaining === 0. - Время обратного отсчёта — от
serverTime, не от часов устройства. Вычисляйте «до сброса» какnew Date(resetAt) - new Date(serverTime). Разница между серверным и местным временем может существенно исказить счётчик. - Три окна вложены друг в друга: 5ч ⊂ неделя ⊂ месяц. Блокировка наступает при исчерпании любого из них. Поле
bottleneckвсегда указывает на наиболее нагруженное окно. - Окна сбрасываются лениво при чтении. Если пользователь не делал запросов с момента последнего сброса, сброс применяется в момент обращения к эндпоинту — снимок всегда актуален.
- Ответ не кэшируется. Заголовок
Cache-Control: no-store— не кэшируйте ответ на стороне клиента. Рекомендуемый интервал опроса — 15–30 секунд в активном режиме. recommendation.upgrade.nextTierсоответствует записи сisNext: trueв массивеtiers. Лимиты следующего тарифа берите из этой записи — не нужен отдельный запрос.wait.resetAt— позднейший из сброшенных пустых окон. Когда несколько окон исчерпаны одновременно,wait.resetAtуказывает на то, которое сбросится последним. После этого момента запросы снова будут приниматься.
#Смотрите также
GET /v1/cowork/me— упрощённый эндпоинт: базовые данные о подписке (только проценты) без рекомендаций и каталога тарифов- Ошибки
- Лимиты и оптимизация