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

Эндпоинты раздела «Cowork/Code»

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

Скоуп: vibe:cowork

Состояние подписки 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()

Поля ответа

Поле Тип Описание
portal object Портал Битрикс24, к которому относятся тариф и квота в ответе. Ключ привязан к одному порталу навсегда, а у человека с несколькими порталами на каждом своя подписка. Приходит в каждом успешном ответе
portal.id string Идентификатор портала на платформе Вайбкод. Совпадает с portalId в самоописании ключа
portal.domain string или null Домен портала. null приходит, только если записи портала на платформе уже нет
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
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. Знаменатель тот же, что у месячной доли в 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, 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 суток
infraState object Остановлена ли инфраструктура за неуплату. Блок общий с самоописанием, строки внутри машинные
infraState.frozen boolean Остановлены ли за неуплату серверы, деплой и хранилище. Сам этот вызов баланс не оплачивает, поэтому на замороженном счёте он проходит и отдаёт true. Пока сужение отказа не дошло до портала, вызов на должнике отвечает 402 ACCOUNT_FROZEN, и остановку читают из самоописания. Состав отказа — Коды ошибок
infraState.reason string или null Код причины остановки: DEBT либо null, когда остановки нет
infraState.topupUrl string или null Адрес пополнения кабинета либо null, когда пополнять нечего
relief.boostGrantedAt string или null Когда выдали временное увеличение лимитов, с точностью до часа (ISO 8601). null, если увеличения не выдавали, если отметке больше 7 суток и если увеличение уже закончилось. Пустое значение не означает, что увеличения нет, — смотрите boostPct

Ключи offPeak и touSavedPct приходят в каждом успешном ответе.

Ключ relief приходит в каждом успешном ответе. null внутри блока — это отдельный смысл, а не отсутствие данных.

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

JSON
{
  "portal": {
    "id": "d41f0b93-6c85-42e7-9a13-58bd0e7c2f46",
    "domain": "mycompany.bitrix24.ru"
  },
  "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 }
  },
  "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",
  "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
  }
}

В примере показан аккаунт тарифного региона. У российского и белорусского аккаунта 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 Код Описание
401 MISSING_API_KEY Не передан заголовок X-Api-Key
401 INVALID_API_KEY Ключ не опознан: такой строки на платформе нет
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.

PARKED — место без активного владельца. Платное место переходит в это состояние, когда его владелец перестаёт быть активным участником портала, а оплаченный срок ещё не закончился. За такое место ничего не списывается, а тариф и оплаченный срок сохраняются. Администратор портала может передать место другому сотруднику. В течение суток после окончания оплаченного срока место переходит в PAUSED.

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

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

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

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

Пустое relief.boostGrantedAt не означает, что увеличения лимитов нет. Отметка нужна для разового уведомления и видна 7 суток, а само увеличение выдают на срок до 30 суток. Увеличение, выданное больше семи суток назад, отдаёт пустую отметку и при этом продолжает действовать. Действует увеличение или нет, показывает только boostPct.

Значение блока relief совпадает с тем, что отдаёт сводка по подписке. Отметку, о которой вы уже сообщили пользователю, запоминайте один раз на приложение, а не отдельно по каждому эндпоинту, иначе одна компенсация будет показана дважды. Уведомляйте только когда пришло непустое значение, отличное от запомненного: сервер намеренно переводит отметку в null (закрылось окно видимости, истёк или отозван буст, место передали), и правило «изменилось — покажи» дало бы ложное уведомление на каждом таком переходе.

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