[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-cowork\u002Fendpoints":3,"docs-tabs-cowork\u002Fendpoints":6},{"content":4,"lastmod":5},"\n# Эндпоинты раздела «Cowork\u002FCode»\n\nМетоды раздела Cowork\u002FCode: чтение состояния подписки (тариф, состояние и расход квоты по трём окнам в процентах) и самостоятельная выдача проектного ключа с правом деплоя.\n\n**Скоуп:** `vibe:cowork`\n\n## Операции\n\n- [Состояние подписки](.\u002Fstate.md) — `GET \u002Fv1\u002Fcowork\u002Fstate`\n- [Краткая сводка](.\u002Fme.md) — `GET \u002Fv1\u002Fcowork\u002Fme`\n- [Проектный ключ для деплоя](.\u002Fdeploy-key.md) — `POST \u002Fv1\u002Fcowork\u002Fdeploy-key`\n","2026-07-07",{"state.md":7,"me.md":8,"deploy-key.md":9},"\n## Состояние подписки Cowork\u002FCode\n\n`GET \u002Fv1\u002Fcowork\u002Fstate`\n\nВозвращает полный снимок состояния подписки Cowork\u002FCode: тариф, состояние подписки, расход трёх окон квоты в процентах, рекомендацию по ожиданию или переходу на тариф выше и каталог тарифов для сравнительной таблицы.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcowork\u002Fstate \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcowork\u002Fstate \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcowork\u002Fstate', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\n\nif (!res.ok) {\n  const { error } = await res.json()\n  console.error(error.code, error.message)\n} else {\n  const state = await res.json()\n  const tight = state.windows[state.bottleneck]\n  console.log(`Окно ${state.bottleneck}: ${tight.pctUsed}%`, tight.exhausted ? 'исчерпано' : 'ок')\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcowork\u002Fstate', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst state = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `subscription.tier` | string | Текущий тариф: `FREE`, `PRO`, `MAX`, `ULTRA` |\n| `subscription.state` | string | Состояние подписки: `ACTIVE`, `PAUSED`, `CANCELLED` |\n| `subscription.currentPeriodStart` | string | Начало расчётного периода (ISO 8601) |\n| `subscription.currentPeriodEnd` | string | Конец расчётного периода (ISO 8601) |\n| `subscription.nextChargeAt` | string или null | Дата следующего списания, `null` для тарифа `FREE` |\n| `subscription.cancelAtPeriodEnd` | boolean | `true`, если на конец периода запланирована отмена |\n| `windows.fiveHour` | object | Скользящее 5-часовое окно |\n| `windows.fiveHour.pctUsed` | number | Использование в процентах, целое 0–100 |\n| `windows.fiveHour.resetAt` | string | Время сброса окна (ISO 8601) |\n| `windows.fiveHour.exhausted` | boolean | `true`, если квота окна исчерпана |\n| `windows.week` | object | Скользящее недельное окно, поля аналогичны `fiveHour` |\n| `windows.month` | object | Месячное окно, совпадает с расчётным периодом, поля аналогичны `fiveHour` |\n| `bottleneck` | string | Наиболее нагруженное окно: `fiveHour`, `week` или `month` |\n| `recommendation.reason` | string | Причина рекомендации: `none`, `approaching` (≥75 % и есть тариф выше), `window_exhausted` (5-часовое или недельное окно исчерпано, месячное ещё нет), `fully_exhausted` (исчерпано месячное окно) |\n| `recommendation.triggerWindow` | string или null | Окно, вызвавшее рекомендацию, `null` при `reason: none` |\n| `recommendation.wait` | object или null | Когда снимется блокировка: `{ window, resetAt }`, `null` если ни одно окно не исчерпано |\n| `recommendation.upgrade.available` | boolean | Доступен ли переход на тариф выше |\n| `recommendation.upgrade.nextTier` | string или null | Рекомендуемый следующий тариф, `null` на тарифе `MAX` |\n| `tiers` | array | Все четыре тарифа для сравнительной таблицы |\n| `tiers[].tier` | string | Название тарифа: `FREE`, `PRO`, `MAX`, `ULTRA` |\n| `tiers[].multiplier` | string или null | Множитель тарифа: `×1`, `×5`, `×20`, `null` для `FREE` |\n| `tiers[].feeVibes` | number | Стоимость тарифа в Вайбах за месяц |\n| `tiers[].current` | boolean | `true`, если тариф активен у владельца ключа |\n| `tiers[].isNext` | boolean | `true`, если тариф совпадает с `recommendation.upgrade.nextTier` |\n| `serverTime` | string | Серверное время в момент ответа (ISO 8601) |\n\n## Пример ответа\n\n```json\n{\n  \"subscription\": {\n    \"tier\": \"FREE\",\n    \"state\": \"ACTIVE\",\n    \"currentPeriodStart\": \"2026-06-01T00:00:00.000Z\",\n    \"currentPeriodEnd\": \"2026-07-01T00:00:00.000Z\",\n    \"nextChargeAt\": null,\n    \"cancelAtPeriodEnd\": false\n  },\n  \"windows\": {\n    \"fiveHour\": { \"pctUsed\": 40, \"resetAt\": \"2026-06-09T17:30:00.000Z\", \"exhausted\": false },\n    \"week\":     { \"pctUsed\": 24, \"resetAt\": \"2026-06-12T09:00:00.000Z\", \"exhausted\": false },\n    \"month\":    { \"pctUsed\": 20, \"resetAt\": \"2026-07-01T00:00:00.000Z\", \"exhausted\": false }\n  },\n  \"bottleneck\": \"fiveHour\",\n  \"recommendation\": {\n    \"reason\": \"none\",\n    \"triggerWindow\": null,\n    \"wait\": null,\n    \"upgrade\": { \"available\": true, \"nextTier\": \"PRO\" }\n  },\n  \"tiers\": [\n    { \"tier\": \"FREE\",  \"multiplier\": null,  \"feeVibes\": 0,     \"current\": true,  \"isNext\": false },\n    { \"tier\": \"PRO\",   \"multiplier\": \"×1\",  \"feeVibes\": 2000,  \"current\": false, \"isNext\": true  },\n    { \"tier\": \"MAX\",   \"multiplier\": \"×5\",  \"feeVibes\": 10000, \"current\": false, \"isNext\": false },\n    { \"tier\": \"ULTRA\", \"multiplier\": \"×20\", \"feeVibes\": 20000, \"current\": false, \"isNext\": false }\n  ],\n  \"serverTime\": \"2026-06-09T14:05:00.000Z\"\n}\n```\n\n## Пример ответа при ошибке\n\n404 — подписка не активирована:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"COWORK_NOT_ACTIVATED\",\n    \"message\": \"No active Cowork\u002FCode subscription for this user+portal\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный API-ключ |\n| 403 | `INSUFFICIENT_SCOPE` | У ключа нет скоупа `vibe:cowork` |\n| 404 | `COWORK_NOT_ACTIVATED` | Подписка Cowork\u002FCode не найдена для пары пользователь и портал |\n| 500 | `INVALID_TIER_CONFIGURATION` | Конфигурация тарифов на платформе некорректна |\n| 503 | `COWORK_FEATURE_DISABLED` | Cowork\u002FCode отключён на уровне платформы |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Успешный ответ (200) — это сам объект состояния, без обёртки `success`.** Ошибки приходят в конверте `{ success: false, error: { code, message } }`. Определяйте успех по HTTP-статусу (`res.ok`).\n\n**Признак исчерпания окна — поле `exhausted`, а не `pctUsed === 100`.** Значение `pctUsed` округляется до целого: 99,6 % отображается как `100`, хотя окно ещё не исчерпано.\n\n**Время до сброса отсчитывайте от `serverTime`, а не от часов устройства** — расхождение часов клиента и сервера исказит счётчик.\n\n**Окна сбрасываются лениво при чтении** — если запросов не было с момента сброса, он применяется при обращении к эндпоинту, поэтому снимок всегда актуален.\n\n**Опрашивайте не чаще одного раза в 15–30 секунд.** Ответ не кэшируется (`Cache-Control: no-store`).\n\n## Смотрите также\n\n- [Сводка по подписке Cowork\u002FCode](\u002Fdocs\u002Fcowork\u002Fme)\n- [Cowork\u002FCode](\u002Fdocs\u002Fcowork)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n- [Ошибки](\u002Fdocs\u002Ferrors)\n","\n## Сводка по подписке Cowork\u002FCode\n\n`GET \u002Fv1\u002Fcowork\u002Fme`\n\nВозвращает краткое состояние подписки Cowork\u002FCode: тариф, состояние подписки и расход трёх окон квоты в процентах. Облегчённый вариант [полного состояния](\u002Fdocs\u002Fcowork\u002Fstate) — без рекомендаций и каталога тарифов.\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcowork\u002Fme \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcowork\u002Fme \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcowork\u002Fme', {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\n\nif (!res.ok) {\n  const { error } = await res.json()\n  console.error(error.code, error.message)\n} else {\n  const { tier, quotaPct } = await res.json()\n  console.log(`Тариф ${tier}: месяц ${quotaPct.month}%, неделя ${quotaPct.week}%, 5ч ${quotaPct.fiveHour}%`)\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcowork\u002Fme', {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst me = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `tier` | string | Текущий тариф: `FREE`, `PRO`, `MAX`, `ULTRA` |\n| `state` | string | Состояние подписки: `ACTIVE`, `PAUSED`, `CANCELLED` |\n| `quotaPct.fiveHour` | number | 5-часовое окно, использование в процентах (целое 0–100) |\n| `quotaPct.week` | number | Недельное окно, использование в процентах (целое 0–100) |\n| `quotaPct.month` | number | Месячное окно, использование в процентах (целое 0–100) |\n| `resetAt.fiveHour` | string | Время сброса 5-часового окна (ISO 8601) |\n| `resetAt.week` | string | Время сброса недельного окна (ISO 8601) |\n| `resetAt.month` | string | Время сброса месячного окна — конец расчётного периода (ISO 8601) |\n| `nextChargeAt` | string или null | Дата следующего списания, `null` для тарифа `FREE` |\n\n## Пример ответа\n\n```json\n{\n  \"tier\": \"FREE\",\n  \"state\": \"ACTIVE\",\n  \"quotaPct\": { \"fiveHour\": 40, \"week\": 24, \"month\": 20 },\n  \"resetAt\": {\n    \"fiveHour\": \"2026-06-09T17:30:00.000Z\",\n    \"week\": \"2026-06-12T09:00:00.000Z\",\n    \"month\": \"2026-07-01T00:00:00.000Z\"\n  },\n  \"nextChargeAt\": null\n}\n```\n\n## Пример ответа при ошибке\n\n404 — подписка не активирована:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"COWORK_NOT_ACTIVATED\",\n    \"message\": \"No active Cowork\u002FCode subscription for this user+portal\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный API-ключ |\n| 403 | `INSUFFICIENT_SCOPE` | У ключа нет скоупа `vibe:cowork` |\n| 404 | `COWORK_NOT_ACTIVATED` | Подписка Cowork\u002FCode не найдена для пары пользователь и портал |\n| 500 | `INVALID_TIER_CONFIGURATION` | Конфигурация тарифов на платформе некорректна |\n| 503 | `COWORK_FEATURE_DISABLED` | Cowork\u002FCode отключён на уровне платформы |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Успешный ответ (200) — это сам объект, без обёртки `success`.** Ошибки приходят в конверте `{ success: false, error: { code, message } }`. Определяйте успех по HTTP-статусу (`res.ok`).\n\n**Эндпоинт отдаёт только проценты.** Признака исчерпания (`exhausted`), серверного времени и рекомендаций здесь нет — для них используйте [полное состояние](\u002Fdocs\u002Fcowork\u002Fstate).\n\n## Смотрите также\n\n- [Состояние подписки Cowork\u002FCode](\u002Fdocs\u002Fcowork\u002Fstate)\n- [Cowork\u002FCode](\u002Fdocs\u002Fcowork)\n- [Лимиты и оптимизация](\u002Fdocs\u002Foptimization)\n- [Ошибки](\u002Fdocs\u002Ferrors)\n","## Проектный ключ для деплоя\n\n`POST \u002Fv1\u002Fcowork\u002Fdeploy-key`\n\nКлюч Cowork\u002FCode (скоуп `vibe:cowork`) работает только с data-plane — чат и REST-прокси Bitrix24 — и блокируется на control-plane инфраструктуры (создание сервера, деплой, exec, лайфсайкл) с ответом `403 INFRA_FORBIDDEN_FOR_COWORK_KEY`. Этот эндпоинт выдаёт отдельный **проектный ключ с правом деплоя**: вызовите его тем же ключом Cowork\u002FCode, возьмите поле `key` из ответа (тело — плоский объект, без обёртки `data`) и используйте его как заголовок `X-Api-Key` для всех операций под `\u002Fv1\u002Finfra\u002F*`.\n\nВозвращаемый ключ несёт скоупы `vibe:infra` и `vibe:storage` (без `vibe:cowork`), действует 7 дней и привязан к владельцу и порталу ключа Cowork\u002FCode. На каждый вызов выдаётся свежий ключ, а прежний проектный ключ отзывается — активен всегда только один.\n\n**Скоуп:** `vibe:cowork` (ключ Cowork\u002FCode, которым вы вызываете эндпоинт). Возвращаемый ключ — отдельный, со скоупами `vibe:infra` + `vibe:storage`.\n\n## Примеры\n\n### curl\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcowork\u002Fdeploy-key \\\n  -H \"X-Api-Key: YOUR_COWORK_KEY\"\n```\n\n### JavaScript — получить ключ и задеплоить им\n\n```javascript\n\u002F\u002F 1. Получаем проектный ключ ключом Cowork\u002FCode\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fcowork\u002Fdeploy-key', {\n  method: 'POST',\n  headers: { 'X-Api-Key': 'YOUR_COWORK_KEY' },\n})\nconst deployKey = await res.json()\n\n\u002F\u002F 2. Дальше используем поле key (верхний уровень) для control-plane инфраструктуры\nconst deploy = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Finfra\u002Fservers\u002FSERVER_ID\u002Fdeploy', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': deployKey.key,          \u002F\u002F НЕ ключ Cowork\u002FCode\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({ \u002F* ... *\u002F }),\n})\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `key` | string | Сырой ключ. Возвращается ОДИН раз, восстановить нельзя — сохраните его. |\n| `apiKeyId` | string | Идентификатор созданного ключа |\n| `prefix` | string | Префикс ключа для отображения |\n| `suffix` | string | Последние символы ключа для идентификации |\n| `scopes` | array | `[\"vibe:infra\", \"vibe:storage\"]` |\n| `expiresAt` | string | Срок действия (ISO 8601), 7 дней с момента выдачи |\n| `howToUse` | string | Подсказка для агента: как применять ключ |\n\n## Пример ответа\n\n```json\n{\n  \"key\": \"vibe_api_…\",\n  \"apiKeyId\": \"...\",\n  \"prefix\": \"vibe_api_…\",\n  \"suffix\": \"…xy3z\",\n  \"scopes\": [\"vibe:infra\", \"vibe:storage\"],\n  \"expiresAt\": \"2026-07-06T14:05:00.000Z\",\n  \"howToUse\": \"Use this key as the X-Api-Key header for all deploy \u002F provision \u002F exec \u002F server-lifecycle calls under \u002Fv1\u002Finfra\u002F*.\"\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Неверный API-ключ |\n| 402 | `ACCOUNT_FROZEN` | Баланс портала исчерпан — пополните счёт |\n| 403 | `INSUFFICIENT_SCOPE` | У ключа нет скоупа `vibe:cowork` |\n| 403 | `COWORK_NOT_ACTIVATED` | Нет активной подписки Cowork\u002FCode для пары пользователь и портал |\n| 503 | `COWORK_FEATURE_DISABLED` | Cowork\u002FCode отключён на уровне платформы |\n| 503 | `DEPLOY_KEY_DISABLED` | Самостоятельная выдача проектных ключей отключена на уровне платформы |\n| 503 | `INFRA_DISABLED` | Инфраструктура отключена на уровне платформы — ключ не имел бы смысла |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Сырой ключ (`key`) возвращается один раз** — при выдаче. Восстановить его потом нельзя. На каждый вызов выдаётся новый ключ, прежний проектный ключ отзывается, поэтому вызывайте эндпоинт один раз в начале сессии деплоя и используйте полученный ключ до конца.\n\n**Для деплоя используйте поле `key` из ответа (верхний уровень), а НЕ ключ Cowork\u002FCode.** Ключ Cowork\u002FCode остаётся для чата и вызовов REST Bitrix24; проектный ключ — для `\u002Fv1\u002Finfra\u002F*`.\n\n**Успешный ответ (200) — это сам объект, без обёртки `success`.** Ошибки приходят в конверте `{ success: false, error: { code, message } }`. Определяйте успех по HTTP-статусу (`res.ok`).\n\n## Смотрите также\n\n- [Cowork\u002FCode](\u002Fdocs\u002Fcowork)\n- [Инфраструктура и деплой](\u002Fdocs\u002Finfra)\n- [Ошибки](\u002Fdocs\u002Ferrors)\n"]