Для AI-агентов: markdown этой страницы — /docs-content/cowork/state.md индекс документации — /llms.txt

Состояние подписки Cowork/Code

GET /v1/cowork/state

Возвращает полный снимок состояния подписки Cowork/Code: тариф, состояние подписки, расход трёх окон квоты в процентах, рекомендацию по ожиданию или переходу на тариф выше и каталог тарифов для сравнительной таблицы.

Для десктопного ключа ответ также содержит modelAnnouncement — активный анонс новой модели или null.

Примеры

curl — личный ключ

Terminal
curl https://vibecode.bitrix24.tech/v1/cowork/state \
  -H "X-Api-Key: YOUR_API_KEY"

curl — OAuth-приложение

Terminal
curl https://vibecode.bitrix24.tech/v1/cowork/state \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN"

JavaScript — личный ключ

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-приложение

javascript
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 может не быть вовсе — проверяйте наличие: блок приходит, когда сброс лимитов по праву акции включён для аккаунта. Нет ключа — нет и возможности.

Пример ответа

JSON
{
  "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 — подписка не активирована:

JSON
{
  "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 показывает условия из demoOffer и передаёт выбор пользователя ключом десктопа.