Для AI-агентов: markdown этой страницы — /docs-content/cowork/state.md индекс документации — /llms.txt
Состояние подписки Cowork/Code
GET /v1/cowork/state
Возвращает полный снимок состояния подписки Cowork/Code: тариф, состояние подписки, расход трёх окон квоты в процентах, рекомендацию по ожиданию или переходу на тариф выше и каталог тарифов для сравнительной таблицы.
Для десктопного ключа ответ также содержит modelAnnouncement — активный анонс новой модели или null.
Примеры
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()
Поля ответа
| Поле | Тип | Описание |
|---|---|---|
Полеportal |
Типobject | ОписаниеПортал Битрикс24, к которому относятся тариф и квота в ответе. Ключ привязан к одному порталу навсегда, а у человека с несколькими порталами на каждом своя подписка. Приходит в каждом успешном ответе |
Полеportal.id |
Типstring | ОписаниеИдентификатор портала на платформе Вайбкод. Совпадает с portalId в самоописании ключа |
Полеportal.domain |
Типstring или null | ОписаниеДомен портала. null приходит, только если записи портала на платформе уже нет |
Полеportal.isPartner |
Типboolean | ОписаниеПризнак партнёрского (NFR) аккаунта Битрикс24. Есть у бесплатных и платных мест. false, если запись аккаунта отсутствует или удалена. |
Полеsubscription.tier |
Типstring | ОписаниеТекущий тариф: FREE, PRO, MAX, ULTRA |
Полеsubscription.state |
Типstring | ОписаниеСостояние подписки: ACTIVE, PAUSED, CANCELLED, PARKED. Доступ к Cowork/Code даёт только ACTIVE, поэтому незнакомое значение тоже означает, что доступа нет |
Полеsubscription.currentPeriodStart |
Типstring | ОписаниеНачало расчётного периода (ISO 8601) |
Полеsubscription.currentPeriodEnd |
Типstring | ОписаниеКонец расчётного периода (ISO 8601) |
Полеsubscription.nextChargeAt |
Типstring или null | ОписаниеДата следующего списания, null для тарифа FREE. У места в состоянии PARKED — дата окончания оплаченного срока, списания в неё нет |
Полеsubscription.cancelAtPeriodEnd |
Типboolean | Описаниеtrue, если на конец периода запланирована отмена |
Полеsubscription.pendingTier |
Типstring или null | ОписаниеТариф ниже текущего, на который сиденье перейдёт в конце оплаченного срока: FREE, PRO или MAX. Дата перехода — subscription.paidThroughAt. Переход на тариф выше применяется сразу и в этом поле не появляется. null, когда понижение не запланировано, а также у бесплатного сиденья, у подписки не в состоянии ACTIVE и у подписки с cancelAtPeriodEnd: true |
Полеsubscription.termMonths |
Типnumber | ОписаниеНа сколько месяцев вперёд оплачено сиденье: 1, 3, 6 или 12. У помесячной подписки — 1 |
Полеsubscription.paidThroughAt |
Типstring | ОписаниеДо какой даты оплачено сиденье (ISO 8601). Отличается от currentPeriodEnd: расчётный период — это окно квоты, оно сдвигается каждые 30 дней независимо от срока. Именно на paidThroughAt приходится переход на pendingTier, и до этой же даты сохраняется доступ после отмены. Поле осмысленно только когда nextChargeAt не null. У бесплатного сиденья оно проставляется один раз при заведении и больше никогда не двигается, поэтому со временем уходит в прошлое — платить там нечего, и продлевать нечего |
Поле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 |
Полеcompletion.phase |
Типstring | ОписаниеФаза пятичасового окна: normal, landing (сервер просит завершить уже начатый ход), exhausted. Новая задача в фазе landing принимается обычно. Это состояние подписки, не признак отдельного ответа модели |
Полеcompletion.resetAt |
Типstring | ОписаниеВремя сброса пятичасового окна (ISO 8601) |
Поле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 на тарифе ULTRA |
Полеtiers |
Типarray | ОписаниеВсе четыре тарифа для сравнительной таблицы |
Полеtiers[].tier |
Типstring | ОписаниеНазвание тарифа: FREE, PRO, MAX, ULTRA |
Поле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) |
ПолеboostPct |
Типinteger | ОписаниеВременное увеличение лимитов в процентах, выданное поддержкой платформы (100 = лимиты вдвое). 0 — увеличения нет. Все доли pctUsed уже посчитаны с его учётом |
ПолеboostExpiresAt |
Типstring или null | ОписаниеМомент, когда временное увеличение закончится. null, если увеличения нет |
ПолеoffPeak |
Типobject | ОписаниеВыгодные часы: действует ли скидка сейчас, когда начнётся ближайшая и сетка множителей по часам недели. Состав блока — Выгодные часы в подписке Cowork/Code |
ПолеtouSavedPct |
Типnumber или null | ОписаниеКакую долю МЕСЯЧНОГО ОБЪЁМА подписки вернули выгодные часы за текущий расчётный период, в процентах, не больше 100. Знаменатель тот же, что у месячной доли windows.month.pctUsed, — это НЕ доля расхода. Подробности: Выгодные часы |
Полеactivation |
Типobject | ОписаниеКак аккаунту открыть работу с Битрикс24: модель доступа региона, ссылка на условия тарифа и признак доступности пробного периода Маркета |
Полеactivation.model |
Типstring | ОписаниеМодель доступа региона аккаунта: subscription — работает подписка Маркета и её пробный период. tariff — подписки Маркета там нет как продукта, вход через коммерческий тариф Битрикс24 |
Полеactivation.tariffInfoUrl |
Типstring | ОписаниеСтраница с условиями тарифов Битрикс24. Приходит только при model: tariff и только для облачного аккаунта |
Полеactivation.marketTrial.available |
Типboolean | ОписаниеМожно ли предлагать включение пробного периода прямо сейчас |
Полеactivation.marketTrial.unavailableReason |
Типstring или null | ОписаниеПричина, по которой предлагать не нужно. Приходит null, когда available: true. Значения: trial_already_activated, subscription_active, demo_used, region_not_supported, not_cloud, portal_state, not_supported, not_required_for_data |
Полеactivation.marketTrial.status |
Типstring | ОписаниеЖурнал наших попыток: not_attempted — не пробовали, activated — пробный период включён через нас, failed — попытка была и успехом пока не завершилась (включение, идущее прямо сейчас, читается так же) |
Полеactivation.marketTrial.endsAt |
Типstring или null | ОписаниеКогда пробный период заканчивается, по данным Битрикс24 (ISO 8601) |
Полеactivation.marketTrial.activatedAt |
Типstring или null | ОписаниеКогда мы включили пробный период (ISO 8601) |
Полеrelief |
Типobject | ОписаниеКомпенсации квоты: когда поддержка платформы сбрасывала счётчики расхода и когда выдавала временное увеличение лимитов. Внутри блока оба поля есть всегда |
Полеrelief.resetGrantedAt |
Типstring или null | ОписаниеКогда счётчики расхода сбросили, с точностью до часа (ISO 8601). null, если сброса не было, а также если отметке больше 7 суток |
Полеrelief.boostGrantedAt |
Типstring или null | ОписаниеКогда выдали временное увеличение лимитов, с точностью до часа (ISO 8601). null, если увеличения не выдавали, если отметке больше 7 суток и если увеличение уже закончилось. Пустое значение не означает, что увеличения нет, — смотрите boostPct |
Полеdemo |
Типobject или null | ОписаниеДемо-доступ места: объект, пока он действует, иначе null. Тариф в subscription.tier при этом остаётся FREE, а доли pctUsed в windows уже посчитаны от лимитов демо-доступа. Показывайте тариф как «Demo» с датой окончания и ссылкой на правила использования |
ПолеdemoOffer |
Типobject or null | ОписаниеДоступное предложение до активации; null, если недоступно. Само чтение ничего не выдаёт |
ПолеdemoOffer.tier |
Типstring | ОписаниеПредлагаемый тариф: PRO, MAX, ULTRA; передайте в принятие |
ПолеdemoOffer.durationDays |
Типinteger | ОписаниеДлительность предложения в днях; передайте в принятие |
ПолеdemoOffer.rulesUrl |
Типstring | ОписаниеПравила предложения; покажите перед согласием |
ПолеdemoOffer.shouldPrompt |
Типboolean | Описаниеtrue — показать выбор; после отказа false, но ручное принятие доступного предложения разрешено |
Полеdemo.until |
Типstring | ОписаниеМомент окончания демо-доступа (ISO 8601) |
Полеdemo.rulesUrl |
Типstring | ОписаниеАдрес страницы правил использования Cowork/Code |
ПолеinfraState |
Типobject | ОписаниеОстановлена ли инфраструктура за неуплату. Блок общий с самоописанием, строки внутри машинные |
ПолеinfraState.frozen |
Типboolean | ОписаниеОстановлены ли за неуплату серверы, деплой и хранилище. Сам этот вызов баланс не оплачивает, поэтому на замороженном счёте он проходит и отдаёт true. Пока сужение отказа не дошло до портала, вызов на должнике отвечает 402 ACCOUNT_FROZEN, и остановку читают из самоописания. Состав отказа — Коды ошибок |
ПолеinfraState.reason |
Типstring или null | ОписаниеКод причины остановки: DEBT либо null, когда остановки нет |
ПолеinfraState.topupUrl |
Типstring или null | ОписаниеАдрес пополнения кабинета либо null, когда пополнять нечего |
ПолеlimitReset |
Типobject | ОписаниеПрава сбросить лимиты по акции платформы. Ключа может не быть — см. ниже |
ПолеlimitReset.rights |
Типarray | ОписаниеЖивые права пользователя. Первыми идут права, которые можно потратить на текущем месте, внутри — по сроку: раньше сгорающее первым, при равенстве — по id. Пустой массив — прав нет |
ПолеlimitReset.rights[].id |
Типstring | ОписаниеИдентификатор права — rightId для сброса лимитов в приложении Cowork/Code |
ПолеlimitReset.rights[].expiresAt |
Типstring | ОписаниеКогда право сгорит — окончание его акции (ISO 8601). Показывайте местные дату и время |
ПолеlimitReset.rights[].seatAlreadyReset |
Типboolean | Описаниеtrue — текущее место уже сбрасывали по акции этого права, например его передал коллега, который сбросил лимиты. Право живо, но на этом месте его не потратить |
ПолеlimitReset.lastUsedAt |
Типstring или null | ОписаниеКогда пользователь последний раз сбросил лимиты по праву, которое ещё в деле: его акция идёт либо по правилу «не суммировать» оно заменило право идущей акции. Иначе null |
ПолеlimitReset.accountFrozen |
Типboolean | Описаниеtrue — счёт аккаунта заморожен за долг, и сброс сейчас ответит 402 ACCOUNT_FROZEN |
Ключи boostPct, boostExpiresAt, offPeak, touSavedPct, relief, demo и infraState приходят в каждом успешном ответе. null внутри блока relief — это отдельный смысл, а не отсутствие данных.
Ключа limitReset может не быть вовсе — проверяйте наличие: блок приходит, когда сброс лимитов по праву акции включён для аккаунта. Нет ключа — нет и возможности.
Пример ответа
{
"portal": {
"id": "d41f0b93-6c85-42e7-9a13-58bd0e7c2f46",
"domain": "mycompany.bitrix24.ru",
"isPartner": false
},
"subscription": {
"tier": "FREE",
"state": "ACTIVE",
"currentPeriodStart": "2026-06-01T00:00:00.000Z",
"currentPeriodEnd": "2026-07-01T00:00:00.000Z",
"nextChargeAt": null,
"cancelAtPeriodEnd": false,
"pendingTier": null,
"termMonths": 1,
"paidThroughAt": "2026-05-15T00:00:00.000Z"
},
"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 }
},
"completion": { "phase": "normal", "resetAt": "2026-06-09T17:30:00.000Z" },
"bottleneck": "fiveHour",
"recommendation": {
"reason": "none",
"triggerWindow": null,
"wait": null,
"upgrade": { "available": true, "nextTier": "PRO" }
},
"tiers": [
{ "tier": "FREE", "multiplier": null, "feeVibes": 0, "current": true, "isNext": false },
{ "tier": "PRO", "multiplier": "×1", "feeVibes": 2000, "current": false, "isNext": true },
{ "tier": "MAX", "multiplier": "×5", "feeVibes": 10000, "current": false, "isNext": false },
{ "tier": "ULTRA", "multiplier": "×20", "feeVibes": 20000, "current": false, "isNext": false }
],
"serverTime": "2026-06-09T14:05:00.000Z",
"boostPct": 0,
"boostExpiresAt": null,
"offPeak": {
"enabled": true,
"visible": "now",
"timezone": "Europe/Moscow",
"currentMultiplier": 0.5,
"currentWindowEndsInHours": 6,
"nextAtOrBelow": { "inHours": 1, "multiplier": 0.5 },
"perModel": false,
"modelName": null,
"grid": [
[0.75, 0.87, 0.87, 0.87, 0.87, 0.87, 0.87, 0.87, 0.75, 0.75, 0.75, 0.75, 0.62, 0.5, 0.75, 0.87, 1, 1, 0.87, 0.87, 0.87, 0.75, 0.75, 0.75],
[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.62, 0.62, 0.62, 0.62, 0.75, 0.75, 0.87, 0.87, 0.75, 0.75, 0.75, 0.75, 0.62, 0.5, 0.5],
[0.5, 0.5, 0.62, 0.62, 0.75, 0.62, 0.62, 0.62, 0.75, 0.75, 0.87, 1, 1, 0.87, 0.75, 0.87, 0.87, 0.75, 0.75, 0.62, 0.62, 0.62, 0.62, 0.62],
[0.75, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.62, 0.62, 0.62, 0.75, 0.75, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87],
[1, 1, 1, 1, 1, 0.87, 0.87, 0.87, 0.87, 1, 1, 1, 1, 1, 1, 0.87, 0.75, 0.75, 0.75, 0.87, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0.87, 0.87, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.87, 0.87, 0.75, 0.87],
[0.75, 0.62, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.62, 0.75, 0.75, 0.62, 0.62, 0.75, 0.75, 0.87, 0.87, 1, 1, 1, 1, 0.87]
],
"nowCell": { "dow": 1, "hour": 3 }
},
"touSavedPct": 12.4,
"activation": {
"model": "tariff",
"tariffInfoUrl": "https://www.bitrix24.ru/prices/",
"marketTrial": {
"available": false,
"unavailableReason": "region_not_supported",
"status": "not_attempted",
"endsAt": null,
"activatedAt": null
}
},
"relief": {
"resetGrantedAt": "2026-06-09T12:00:00.000Z",
"boostGrantedAt": null
},
"demo": null,
"demoOffer": null,
"infraState": {
"frozen": false,
"reason": null,
"topupUrl": null
}
}
В примере показан аккаунт тарифного региона. У российского и белорусского аккаунта activation.model будет subscription, а ключа tariffInfoUrl не будет вовсе. Значение marketTrial.available у такого аккаунта может быть true. Оно приходит false с причиной not_required_for_data, когда платформа больше не считает подписку Маркета условием для чтения данных компании этим ключом — предлагать включение пробного периода в этом случае не нужно. Тип аккаунта на это не влияет: облачный и на собственном сервере отвечают одинаково.
Пример ответа при ошибке
404 — подписка не активирована:
{
"success": false,
"error": {
"code": "COWORK_NOT_ACTIVATED",
"message": "No active Cowork/Code subscription for this user+portal"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| HTTP401 | КодMISSING_API_KEY |
ОписаниеНе передан заголовок X-Api-Key |
| HTTP401 | КодINVALID_API_KEY |
ОписаниеКлюч не опознан: такой строки на платформе нет |
| HTTP403 | КодINSUFFICIENT_SCOPE |
ОписаниеУ ключа нет скоупа vibe:cowork |
| HTTP404 | КодCOWORK_NOT_ACTIVATED |
ОписаниеПодписка Cowork/Code не найдена для пары пользователь и портал |
| HTTP429 | КодRATE_LIMITED |
ОписаниеОпрос чаще допустимого |
| HTTP500 | КодINVALID_TIER_CONFIGURATION |
ОписаниеКонфигурация тарифов на платформе некорректна |
| HTTP503 | КодCOWORK_FEATURE_DISABLED |
ОписаниеCowork/Code отключён на уровне платформы |
Полный список общих ошибок 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). У эндпоинта есть предел частоты — общий на аккаунт и владельца ключа, то есть все устройства одного человека делят его. Рекомендованный интервал укладывается в предел с большим запасом, а сверх него приходит 429 RATE_LIMITED.
PARKED — место без активного владельца. Платное место переходит в это состояние, когда его владелец перестаёт быть активным участником портала, а оплаченный срок ещё не закончился. За такое место ничего не списывается, а тариф и оплаченный срок сохраняются. Администратор портала может передать место другому сотруднику. В течение суток после окончания оплаченного срока место переходит в PAUSED.
Блока activation может не быть в ответе вовсе — так отвечает платформа, которая про него ещё не знает. Это штатное состояние: блока нет — работайте как раньше. Если блок есть, поля available и unavailableReason внутри него присутствуют всегда, поэтому проверяйте наличие БЛОКА и читайте ЗНАЧЕНИЕ поля, а не наоборот.
activation.marketTrial.available — прогноз, а не гарантия. Значение false окончательно: шаг включения пробного периода показывать не нужно. Значение true означает «предлагать можно», но не обещает успех: состояние аккаунта может измениться между запросом и нажатием, а окончательное решение остаётся за Битрикс24 — обработку отказа на самом включении оставьте.
Список причин в unavailableReason может пополняться. Неизвестное значение читайте как «активацию не предлагать», без отдельной ветки. Так же и со status.
Ссылка activation.tariffInfoUrl — общая страница условий, а не адрес вашего аккаунта. Значение постоянное, в ответе оно может отсутствовать (подписочный регион, коробочный аккаунт) — экран обязан пережить отсутствие ссылки. Не сохраняйте её у себя и не разбирайте домен.
Пустое relief.boostGrantedAt не означает, что увеличения лимитов нет. Отметка нужна для разового уведомления и видна 7 суток, а само увеличение выдают на срок до 30 суток. Увеличение, выданное больше семи суток назад, отдаёт пустую отметку и при этом продолжает действовать. Действует увеличение или нет, показывает только boostPct.
Значение блока relief совпадает с тем, что отдаёт сводка по подписке. Отметку, о которой вы уже сообщили пользователю, запоминайте один раз на приложение, а не отдельно по каждому эндпоинту, иначе одна компенсация будет показана дважды. Уведомляйте только когда пришло непустое значение, отличное от запомненного: сервер намеренно переводит отметку в null (закрылось окно видимости, истёк или отозван буст, место передали), и правило «изменилось — покажи» дало бы ложное уведомление на каждом таком переходе.
Блок limitReset — данные для кнопки сброса лимитов. Право тратит приложение Cowork/Code: ключ десктопа выбирает первое пригодное право (seatAlreadyReset: false), пригодного нет — кнопку не показывать. Значение блока совпадает с тем, что отдаёт сводка по подписке.
Смотрите также
- Сводка по подписке Cowork/Code
- Выгодные часы в подписке Cowork/Code
- Cowork/Code
- Лимиты и оптимизация
- Ошибки
Выбор демо до активации
При доступном предложении приложение Cowork/Code показывает условия из demoOffer и передаёт выбор пользователя ключом десктопа.