[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-ai\u002Fconsumption\u002Foff-peak":3,"docs-tabs-ai\u002Fconsumption\u002Foff-peak":6},{"content":4,"lastmod":5},"\n## Расписание выгодных часов\n\n`GET \u002Fv1\u002Foff-peak`\n\nВозвращает расписание выгодных часов: насколько медленнее расходуется AI-квота компании в каждый час недели и когда наступит ближайшее окно со скидкой.\n\nСкидка применяется к расходу квоты — в выгодные часы один и тот же вызов забирает меньшую долю месячного лимита. Оплата за токены по кошельку скидку не получает. Эндпоинт предназначен для планирования: агент читает расписание и переносит массовые задачи, которые терпят отсрочку, в дешёвые окна.\n\n## Параметры\n\n| Параметр | Тип | Обяз. | По умолч. | Описание |\n|----------|-----|:-----:|-----------|---------|\n| `model` (query) | string | нет | — | Идентификатор модели из [`GET \u002Fv1\u002Fmodels`](\u002Fdocs\u002Fai\u002Fmodels\u002Flist). Возвращает расписание этой модели. Без параметра возвращается расписание, отмеченное платформой как основное |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Foff-peak?model=bitrix\u002Fbitrixgpt-5.5\" \\\n  -H \"X-Api-Key: YOUR_API_KEY\"\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl \"https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Foff-peak?model=bitrix\u002Fbitrixgpt-5.5\" \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\"\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst url = 'https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Foff-peak?model=bitrix\u002Fbitrixgpt-5.5'\nconst res = await fetch(url, {\n  headers: { 'X-Api-Key': 'YOUR_API_KEY' },\n})\n\nconst schedule = await res.json()\n\nif (schedule.enabled && schedule.currentMultiplier \u003C 1) {\n  const discount = Math.round((1 - schedule.currentMultiplier) * 100)\n  console.log(`Сейчас выгодный час: квота расходуется на ${discount}% медленнее`)\n} else if (schedule.nextWindow) {\n  console.log(`Дешевле станет через ${schedule.nextWindow.inHours} ч`)\n}\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst url = 'https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Foff-peak?model=bitrix\u002Fbitrixgpt-5.5'\nconst res = await fetch(url, {\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n  },\n})\n\nconst schedule = await res.json()\n```\n\n## Поля ответа\n\nУспешный ответ — сам объект расписания, без обёртки `success` и `data`.\n\n| Поле | Тип | Описание |\n|------|-----|---------|\n| `enabled` | boolean | Действует ли расписание для запрошенной модели. При `false` все часы идут по полной цене, остальные поля пустые |\n| `timezone` | string \\| null | Часовой пояс расписания — идентификатор из базы часовых поясов IANA, например `Europe\u002FMoscow`. По нему считаются день недели и час |\n| `currentMultiplier` | number | Множитель расхода квоты в текущий час, больше `0` и не больше `1`. Значение `0.5` означает, что квота расходуется вдвое медленнее, значение `1` — без скидки |\n| `nextWindow` | object \\| null | Ближайший час, который строго дешевле текущего, в пределах недели вперёд. `null`, когда такого часа нет |\n| `nextWindow.inHours` | number | Через сколько часов наступит этот час |\n| `nextWindow.multiplier` | number | Множитель расхода квоты в этом часе |\n| `grid` | array \\| null | Сетка множителей `grid[день][час]`. Семь строк по 24 значения. День `0` — воскресенье, день `6` — суббота. Час — от `0` до `23` в часовом поясе `timezone` |\n| `nowCell` | object \\| null | Ячейка сетки, которой соответствует текущий момент. Считается на сервере, поэтому совпадает с `currentMultiplier` |\n| `nowCell.dow` | number | День недели, от `0` (воскресенье) до `6` (суббота) |\n| `nowCell.hour` | number | Час, от `0` до `23` |\n\n## Пример ответа\n\nРасписание действует:\n\n```json\n{\n  \"enabled\": true,\n  \"timezone\": \"Europe\u002FMoscow\",\n  \"currentMultiplier\": 1,\n  \"nextWindow\": { \"inHours\": 4, \"multiplier\": 0.87 },\n  \"grid\": [\n    [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],\n    [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],\n    [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],\n    [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],\n    [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],\n    [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],\n    [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]\n  ],\n  \"nowCell\": { \"dow\": 4, \"hour\": 11 }\n}\n```\n\nРасписание не действует — у модели его нет, либо выгодные часы отключены на платформе:\n\n```json\n{\n  \"enabled\": false,\n  \"timezone\": null,\n  \"currentMultiplier\": 1,\n  \"nextWindow\": null,\n  \"grid\": null,\n  \"nowCell\": null\n}\n```\n\n## Пример ответа при ошибке\n\n`401 MISSING_API_KEY` — не передан заголовок `X-Api-Key`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_API_KEY\",\n    \"message\": \"API key required. Pass via X-Api-Key header.\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|---------|\n| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |\n| 401 | `INVALID_API_KEY` | Ключ не найден или отозван |\n| 403 | `scope_missing` | API-ключу не хватает скоупа `vibe:ai` |\n| 429 | `rate_limit_exceeded` | Превышен лимит запросов к AI-эндпоинтам. Время до сброса — в заголовке `Retry-After` |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Множитель — коэффициент расхода, а не размер скидки.** Значение `0.62` означает, что вызов забирает 62% от той доли квоты, которую он забрал бы без скидки, то есть расход снижен на 38%. Размер скидки считается как `1 - currentMultiplier`.\n\n**Указывайте модель.** Без параметра `model` эндпоинт отдаёт расписание, отмеченное платформой как основное. Пока основное расписание не назначено, такой вызов возвращает `enabled: false`, даже если у отдельных моделей скидки действуют.\n\n**Неизвестная модель не даёт ошибки.** Если у модели нет расписания или идентификатор не существует, приходит `200` с `enabled: false` и пустыми полями. Признак наличия скидок — поле `enabled`, а не код ответа.\n\n**Расписание меняется.** Платформа пересчитывает сетку по фактической нагрузке, поэтому перечитывайте расписание перед планированием, а не сохраняйте его надолго.\n\n**`nextWindow` ищет строго более дешёвый час.** Если текущий час уже самый дешёвый в пределах недели вперёд, поле равно `null`. Это не означает отсутствия скидки — смотрите `currentMultiplier`.\n\n**Скидка замедляет заполнение окон равномерного расходования.** Суточное и недельное окна растут на ту же величину расхода, что и месячная квота, то есть уже со скидкой. Перенос отложенных задач в выгодные часы отдаляет и `429 ai_pacing_limited`, и исчерпание месячной квоты.\n\n## Смотрите также\n\n- [AI-квота компании](\u002Fdocs\u002Fai\u002Fconsumption\u002Fquota)\n- [Список моделей](\u002Fdocs\u002Fai\u002Fmodels\u002Flist)\n- [Чат-комплишены](\u002Fdocs\u002Fai\u002Fchat\u002Fcompletions)\n- [AI Router](\u002Fdocs\u002Fai)\n","2026-07-10",{}]