Повторяющиеся задачи и события
В Bordio есть два разных способа повторения задачи. Они взаимоисключающие — выберите один:
- По расписанию (
recurrence) — задача/событие повторяется в фиксированные даты, например каждый понедельник. Использует iCalendarRRULE. Работает для задач и событий. Рассматривается первым, ниже. - После завершения (
repeat_on_completion) — новая копия создаётся только когда вы закрываете задачу, со сдвигом дат вперёд. Подходит для «сделать это снова через N дней после того, как я закончу». Только задачи. См. Повтор после завершения.
По расписанию (recurrence)
Заголовок раздела «По расписанию (recurrence)»Задача или событие может повторяться по расписанию — ежедневная задача, еженедельный стендап, ежемесячный обзор. Вы создаёте повторяющуюся серию, добавляя объект recurrence в обычный запрос на создание. Результат — это серия (один шаблон, к которому вы обращаетесь по его id), а не набор копий.
Повторение использует формат iCalendar RRULE (RFC 5545) — тот же синтаксис правил, что и в Google Calendar и CalDAV. Если вы когда-либо создавали повторение с помощью календарной библиотеки, вы уже с ним знакомы.
Создание повторяющегося события
Заголовок раздела «Создание повторяющегося события»Добавьте recurrence в POST /scheduled-events. Серия привязывается к start_at.
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.
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" } }'Объект recurrence
Заголовок раздела «Объект recurrence»| Поле | Обязательно | Описание |
|---|---|---|
rule |
да | Чистая строка iCalendar RRULE, например RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR. |
until |
нет | Дата/дата-время в формате ISO-8601 — включительная граница окончания серии. |
Как написать rule
Заголовок раздела «Как написать rule»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:
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, к которому вы обращаетесь (серию или одно вхождение), а не выбранный отрезок серии.
Эта страница будет обновлена, когда появятся ограниченные по области правки.