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

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

GET /v1/cowork/state

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

Примеры

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()

Поля ответа

Поле Тип Описание
subscription.tier string Текущий тариф: FREE, PRO, MAX, ULTRA
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, если на конец периода запланирована отмена
subscription.pendingTier string или null Тариф ниже текущего, на который сиденье перейдёт в конце оплаченного периода: FREE, PRO или MAX. Дата перехода — subscription.currentPeriodEnd. Переход на тариф выше применяется сразу и в этом поле не появляется. null, когда понижение не запланировано, а также у бесплатного сиденья, у подписки в состоянии PAUSED или CANCELLED и у подписки с cancelAtPeriodEnd: 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 на тарифе 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)
offPeak object Выгодные часы: действует ли скидка сейчас, когда начнётся ближайшая и сетка множителей по часам недели. Состав блока — Выгодные часы в подписке Cowork/Code
touSavedPct number или null Какую долю МЕСЯЧНОГО ОБЪЁМА подписки вернули выгодные часы за текущий расчётный период, в процентах, не больше 100. Знаменатель тот же, что у месячной доли в quotaPct, — это НЕ доля расхода. Подробности: Выгодные часы
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
activation.marketTrial.status string Журнал наших попыток: not_attempted — не пробовали, activated — пробный период включён через нас, failed — попытка была и успехом пока не завершилась (включение, идущее прямо сейчас, читается так же)
activation.marketTrial.endsAt string или null Когда пробный период заканчивается, по данным Битрикс24 (ISO 8601)
activation.marketTrial.activatedAt string или null Когда мы включили пробный период (ISO 8601)

Ключи offPeak и touSavedPct приходят, только когда выгодные часы включены для аккаунта. Пока возможность не включена, их нет в теле ответа вовсе, и в примере ниже они не показаны.

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

JSON
{
  "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
  },
  "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": "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",
  "activation": {
    "model": "tariff",
    "tariffInfoUrl": "https://www.bitrix24.ru/prices/",
    "marketTrial": {
      "available": false,
      "unavailableReason": "region_not_supported",
      "status": "not_attempted",
      "endsAt": null,
      "activatedAt": null
    }
  }
}

В примере показан аккаунт тарифного региона. У российского и белорусского аккаунта activation.model будет subscription, ключа tariffInfoUrl не будет вовсе, а marketTrial.available может быть true.

Пример ответа при ошибке

404 — подписка не активирована:

JSON
{
  "success": false,
  "error": {
    "code": "COWORK_NOT_ACTIVATED",
    "message": "No active Cowork/Code 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/Code не найдена для пары пользователь и портал
429 RATE_LIMITED Опрос чаще допустимого
500 INVALID_TIER_CONFIGURATION Конфигурация тарифов на платформе некорректна
503 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.

Блока activation может не быть в ответе вовсе — так отвечает платформа, которая про него ещё не знает. Это штатное состояние: блока нет — работайте как раньше. Если блок есть, поля available и unavailableReason внутри него присутствуют всегда, поэтому проверяйте наличие БЛОКА и читайте ЗНАЧЕНИЕ поля, а не наоборот.

activation.marketTrial.available — прогноз, а не гарантия. Значение false окончательно: шаг включения пробного периода показывать не нужно. Значение true означает «предлагать можно», но не обещает успех: состояние аккаунта может измениться между запросом и нажатием, а окончательное решение остаётся за Битрикс24 — обработку отказа на самом включении оставьте.

Список причин в unavailableReason может пополняться. Неизвестное значение читайте как «активацию не предлагать», без отдельной ветки. Так же и со status.

Ссылка activation.tariffInfoUrl — общая страница условий, а не адрес вашего аккаунта. Значение постоянное, в ответе оно может отсутствовать (подписочный регион, коробочный аккаунт) — экран обязан пережить отсутствие ссылки. Не сохраняйте её у себя и не разбирайте домен.

Смотрите также