## Отметить расписание по умолчанию

`PUT /v1/work-schedules/:id/default`

Отмечает расписание работы, на котором рождаются новые машины портала, или снимает эту отметку. Уже созданные машины свой режим не меняют.

Отметок две, и ставятся они независимо: `machines` — для новых серверов и приложений в галактике, `agents` — для новых агентов и ботов. Агент на расписании вне окна спит и не отвечает на сообщения до начала следующего окна, поэтому для агентов отметка отдельная. Каждая отметка стоит не больше чем на одном расписании: поставленная на новое расписание, она снимается с прежнего.

Отметку ставит и снимает только администратор портала — она меняет режим новых машин всех сотрудников, а с ним и их счёт. Право администратора проверяется по владельцу личного ключа, поэтому вызов с ключом OAuth-приложения отклоняется с `403 ADMIN_ONLY` и с сессией администратора. Примеры ниже — только для личного ключа.

## Параметры

| Параметр | В | Тип | Обяз. | Описание |
|----------|---|-----|:-----:|----------|
| `id` | path | string | да | ID расписания — готового или своего. Источник — `data[].id` из [списка расписаний](./list.md) |

## Поля запроса (body)

| Поле | Тип | Обяз. | Описание |
|------|-----|:-----:|----------|
| `audience` | string | да | Какая отметка: `machines` — новые серверы и приложения в галактике, `agents` — новые агенты и боты |
| `enabled` | boolean | да | `true` — поставить отметку на это расписание, `false` — снять её с него |

## Примеры

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

```bash
curl -X PUT https://vibecode.bitrix24.tech/v1/work-schedules/WORK_SCHEDULE_ID/default \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "audience": "machines", "enabled": true }'
```

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

```javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/work-schedules/${workScheduleId}/default`,
  {
    method: 'PUT',
    headers: {
      'X-Api-Key': 'YOUR_API_KEY',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ audience: 'machines', enabled: true }),
  }
)
const { data } = await res.json()
const marked = data.find(s => s.defaultForNewMachines)
console.log(`Новые машины рождаются на расписании: ${marked ? marked.name : 'не отмечено'}`)
```

## Поля ответа

| Поле | Тип | Описание |
|------|-----|----------|
| `success` | boolean | Всегда `true` при успехе |
| `data` | array | Вся библиотека расписаний портала после изменения: отметка могла переехать с одного расписания на другое. Форма элемента — как в [списке расписаний](./list.md) |
| `data[].defaultForNewMachines` | boolean | На этом расписании рождаются новые серверы и приложения в галактике. `true` не больше чем у одного расписания |
| `data[].defaultForNewAgents` | boolean | На этом расписании рождаются новые агенты и боты. `true` не больше чем у одного расписания |

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

Отметка для машин поставлена на расписание «Смены склада» и в ответе стоит только на нём:

```json
{
  "success": true,
  "data": [
    {
      "id": "cmfp4qz7x00031ocg5d1a8k2m",
      "kind": "PRESET",
      "name": "Будни 9–18",
      "presetKey": "weekdays-9-18",
      "timezone": "Europe/Moscow",
      "windows": [
        { "isoDay": 1, "start": "09:00", "end": "18:00" },
        { "isoDay": 2, "start": "09:00", "end": "18:00" },
        { "isoDay": 3, "start": "09:00", "end": "18:00" },
        { "isoDay": 4, "start": "09:00", "end": "18:00" },
        { "isoDay": 5, "start": "09:00", "end": "18:00" }
      ],
      "version": 1,
      "canEdit": false,
      "assignedCount": 3,
      "defaultForNewMachines": false,
      "defaultForNewAgents": false
    },
    {
      "id": "cmfp4r0q2000a1ocg7h2k9x3d",
      "kind": "CUSTOM",
      "name": "Смены склада",
      "presetKey": null,
      "timezone": "Europe/Moscow",
      "windows": [
        { "isoDay": 1, "start": "09:00", "end": "18:00" },
        { "isoDay": 2, "start": "09:00", "end": "13:00" },
        { "isoDay": 2, "start": "14:00", "end": "24:00" }
      ],
      "version": 2,
      "canEdit": true,
      "assignedCount": 1,
      "defaultForNewMachines": true,
      "defaultForNewAgents": false
    }
  ]
}
```

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

403 — владелец ключа не администратор портала:

```json
{
  "success": false,
  "error": {
    "code": "ADMIN_ONLY",
    "message": "Only a Bitrix24 account administrator can choose the schedule new machines are born with"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|----------|
| 400 | `VALIDATION_ERROR` | Тело не подходит под схему: нет `audience` или `enabled`, `audience` не `machines` и не `agents`, `enabled` не `true` и не `false`, в теле лишнее поле. В `message` — путь к полю и причина |
| 400 | `WORK_SCHEDULE_EMPTY` | У расписания нет ни одного окна: машина на нём не работала бы никогда. Снять отметку с такого расписания можно |
| 400 | `RUN_MODE_UNAVAILABLE` | Режимы работы ещё не включены для портала |
| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |
| 401 | `INVALID_API_KEY` | Ключ не опознан: такой строки на платформе нет |
| 403 | `ADMIN_ONLY` | Владелец ключа не администратор портала, либо вызов сделан ключом OAuth-приложения |
| 403 | `WRITE_BLOCKED_READONLY_KEY` | Ключ в режиме «только чтение» — отметка ему закрыта |
| 403 | `INFRA_SCOPE_REQUIRED` | У ключа нет скоупа `vibe:infra` |
| 403 | `INFRA_FORBIDDEN_FOR_COWORK_KEY` | Вызов сделан ключом Cowork/Code — библиотека расписаний такому ключу закрыта. Что делать — [Проектный ключ для деплоя](/docs/cowork/deploy-key) |
| 404 | `NOT_FOUND` | Расписания с таким `id` нет в портале ключа, либо ключ не привязан к порталу Битрикс24. Расписание другого портала отвечает так же — ответ не подтверждает, что оно существует |
| 429 | `RATE_LIMITED` | Превышен лимит 30 запросов в минуту на ключ. Точное значение — в заголовке `x-ratelimit-limit` (потолок делится на реплики) |

Полный список общих ошибок API — [Ошибки](/docs/errors).

## Известные особенности

- **Явный режим при создании сильнее отметки.** Сервер, в запросе создания которого передан блок `runMode`, рождается в названном режиме, включая явный `IDLE`. Отметка действует, только когда режим при создании не назван, — [Создать сервер](/docs/infra/servers/create).
- **Отметка не мешает созданию.** Если отмеченное расписание применить не удалось, машина рождается в том режиме, в котором родилась бы без отметки, а создание не отклоняется. Режим, доставшийся машине, — поля `runMode` и `workSchedule` в [`GET /v1/infra/servers/:id`](/docs/infra/servers/get).
- **Кто получает отметку при рождении.** Отметку `machines` получают сервер, созданный в личном кабинете или через `POST /v1/infra/servers`, и приложение в галактике. Отметку `agents` — машина, которую платформа создаёт под агента или управляемого бота. Хост галактики отметку не получает: своего режима у него нет, он работает, пока работает хоть одно его приложение.
- **Повторный вызов ничего не меняет.** Отметку, которая уже стоит на расписании, можно поставить ещё раз — ответ тот же `200`. Снятие с расписания, которое отметки не несёт, тоже отвечает `200` и не трогает отметку на другом расписании.
- **Одно расписание может нести обе отметки.** Отметки `machines` и `agents` независимы: их можно поставить на одно расписание или на разные.
- **Удаление расписания снимает его отметки.** После [удаления](./delete.md) отмеченного расписания новые машины рождаются так же, как без отметки.

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

- [Список расписаний](./list.md)
- [Сменить режим работы сервера](/docs/infra/lifecycle/run-mode)
- [Создать сервер](/docs/infra/servers/create)
