Перейти к содержимому

Повторяющиеся задачи и события

В Bordio есть два разных способа повторения задачи. Они взаимоисключающие — выберите один:

  • По расписанию (recurrence) — задача/событие повторяется в фиксированные даты, например каждый понедельник. Использует iCalendar RRULE. Работает для задач и событий. Рассматривается первым, ниже.
  • После завершения (repeat_on_completion) — новая копия создаётся только когда вы закрываете задачу, со сдвигом дат вперёд. Подходит для «сделать это снова через N дней после того, как я закончу». Только задачи. См. Повтор после завершения.

Задача или событие может повторяться по расписанию — ежедневная задача, еженедельный стендап, ежемесячный обзор. Вы создаёте повторяющуюся серию, добавляя объект recurrence в обычный запрос на создание. Результат — это серия (один шаблон, к которому вы обращаетесь по его id), а не набор копий.

Повторение использует формат iCalendar RRULE (RFC 5545) — тот же синтаксис правил, что и в Google Calendar и CalDAV. Если вы когда-либо создавали повторение с помощью календарной библиотеки, вы уже с ним знакомы.

Добавьте recurrence в POST /scheduled-events. Серия привязывается к start_at.

Terminal window
curl -X POST "https://api.bordio.com/public/v1/scheduled-events" \
-H "Authorization: Bearer brd_sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"title": "Team standup",
"start_at": "2026-07-06T09:00:00Z",
"end_at": "2026-07-06T09:15:00Z",
"recurrence": {
"rule": "RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR",
"until": "2026-12-31"
}
}'

Это создаёт стендап каждый понедельник, среду и пятницу с 06 июля 2026 года до конца года.

Добавьте recurrence в POST /tasks. Серия привязывается к date задачи (день, на который назначена задача) — вы обязаны указать date, иначе запрос будет отклонён с ошибкой 422.

Terminal window
curl -X POST "https://api.bordio.com/public/v1/tasks" \
-H "Authorization: Bearer brd_sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"title": "Water the plants",
"project_id": "proj_6594a1b2c3d4e5f6a7b8c9d0",
"date": "2026-07-06",
"recurrence": {
"rule": "RRULE:FREQ=DAILY",
"until": "2026-08-31"
}
}'
Поле Обязательно Описание
rule да Чистая строка iCalendar RRULE, например RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR.
until нет Дата/дата-время в формате ISO-8601 — включительная граница окончания серии.

rule — это стандартная строка RRULE. Наиболее часто используемые части:

  • FREQ= — как часто: DAILY, WEEKLY, MONTHLY или YEARLY.
  • INTERVAL= — каждые N периодов (например, INTERVAL=2 с FREQ=WEEKLY = раз в две недели). По умолчанию 1.
  • BYDAY= — дни недели: MO,TU,WE,TH,FR,SA,SU (используется с FREQ=WEEKLY).
  • BYMONTHDAY= — день месяца, например BYMONTHDAY=1 (используется с FREQ=MONTHLY).

Примеры:

Цель rule
Каждый день RRULE:FREQ=DAILY
Каждый будний день RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
Каждый второй понедельник RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=MO
Первое число каждого месяца RRULE:FREQ=MONTHLY;BYMONTHDAY=1
Каждый год RRULE:FREQ=YEARLY

Чтобы серии оставались валидными и безопасными, API строг к rule:

  • FREQ обязателен и должен быть одним из DAILY, WEEKLY, MONTHLY, YEARLY. Частоты чаще, чем раз в день (HOURLY, MINUTELY, SECONDLY), отклоняются.
  • Не включайте DTSTART. Начало выводится из ресурса (start_at для событий, date для задач). DTSTART в rule отклоняется.
  • Не используйте COUNT. Вместо этого ограничивайте серию полем until.
  • INTERVAL, если присутствует, должен быть положительным целым числом (≤ 1000).
  • rule должен быть единственной строкой RRULE: (без RDATE/EXDATE, без переносов строк).

Всё остальное возвращает 422 validation_error с кодом invalid_recurrence_rule.

Используйте поле until для даты окончания. Если вы опустите until, серия будет бессрочной и будет повторяться неограниченно.

Повторяющиеся ресурсы включают в ответах объект recurrence; одиночные (не повторяющиеся) возвращают recurrence: null.

{
"data": {
"id": "event_6594a1b2c3d4e5f6a7b8c9d0",
"title": "Team standup",
"start_at": "2026-07-06T09:00:00.000Z",
"recurrence": {
"rule": "RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR",
"until": "2026-12-31T00:00:00.000Z"
}
}
}

Возвращаемый rule нормализуется до строки RRULE: — внутренний DTSTART не раскрывается.

Вместо фиксированного расписания задача может порождать новую копию себя, когда вы её завершаете (переводите в закрытый статус). Это иной механизм, нежели recurrence выше — здесь нет RRULE, и ничего не создаётся, пока задача действительно не закрыта. Добавьте repeat_on_completion в POST /tasks:

Terminal window
curl -X POST "https://api.bordio.com/public/v1/tasks" \
-H "Authorization: Bearer brd_sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"title": "Change the water filter",
"project_id": "proj_6594a1b2c3d4e5f6a7b8c9d0",
"estimated_time_seconds": 1800,
"repeat_on_completion": {
"start_date_shift_days": 30,
"due_date_shift_days": 2,
"until": "2027-12-31"
}
}'

Когда эта задача закрывается, Bordio создаёт новую копию: тот же заголовок, проект, исполнители, приоритет и подзадачи, с датой начала, установленной через 30 дней после даты завершения, и датой выполнения через 2 дня после этого. Копия повторяется тем же образом, пока не пройдёт until.

Поле Обязательно Описание
start_date_shift_days да Через сколько дней после завершения начинается следующая копия. 0 = в тот же день.
due_date_shift_days нет Через сколько дней после начала копии наступает её срок выполнения. Опустите, чтобы не было срока выполнения.
until нет Прекратить повторение после этой даты (ISO-8601). Опустите для бессрочного повторения.

Примечания:

  • Только при закрытии. Копия создаётся, когда задача переходит в статус, состояние которого — закрытое, а не при каждом изменении.
  • Поля наследуются. Заголовок, описание, проект, исполнители, репортеры, приоритет, подзадачи и оценка времени переносятся в каждую копию автоматически; вы указываете только сдвиги дат.
  • Взаимоисключимо с recurrence. Отправка обоих для одной задачи возвращает 422.

Ответы включают объект repeat_on_completion (или null):

{
"data": {
"id": "task_6594a1b2c3d4e5f6a7b8c9d0",
"repeat_on_completion": {
"start_date_shift_days": 30,
"due_date_shift_days": 2,
"until": "2027-12-31T00:00:00.000Z"
}
}
}
  • Серия (шаблон) имеет обычный id — task_<id> / event_<id> — тот id, который вы получаете при создании. Чтение, обновление или удаление применяется ко всей серии.
  • Отдельное вхождение имеет собственный id, содержащий дату вхождения, например task_<id>_20260113T090000Z (см. Идентификаторы). Считайте его из API и используйте дословно для обращения к этому единственному вхождению — никогда не собирайте его самостоятельно.
  • Создание повторяющейся задачи или события.
  • Чтение, обновление и удаление как серии, так и отдельного вхождения по его id.

Пока недоступно:

  • Ограниченные по области правки — семантика «это и последующие» / «все». Обновление сейчас затрагивает единственный id, к которому вы обращаетесь (серию или одно вхождение), а не выбранный отрезок серии.

Эта страница будет обновлена, когда появятся ограниченные по области правки.