Create recurring meeting
create_recurring_meetingCreate a recurring meeting series (schedule + template) in OpenProject, with local validation of frequency and end conditions. Use for weekly syncs or monthly meetings.
Instructions
Create a recurring meeting series: a schedule plus a template the occurrences copy.
Use it for "set up a weekly sync Mondays at 9" style requests. The frequency and end_after combinations are validated locally BEFORE anything is sent — OpenProject's own "infer the monthly fields" defaults never apply to API creates, so a bad combination is rejected here with the allowed matrix spelled out.
Returns the created series in the same shape as get_recurring_meeting, including
the computed next occurrences (their start_time strings are what the occurrence
tools take) and template_meeting_id.
Pitfalls — two upstream quirks are handled but must be understood. First, the
template meeting is created as a DRAFT: notes says so, and occurrences cannot be
initialized until update_meeting(meeting_id=<template_meeting_id>, state='open')
publishes it. Second, OpenProject overwrites time_zone on create with the API
account's own zone; this tool detects that and corrects it with a follow-up PATCH —
if that correction is refused (it needs 'edit meetings'), the series is still created
and notes names the zone it actually runs in. start_time must be now or in the
future, or the create is rejected with a validation error.
Cross-references: get_recurring_meeting to read it back;
update_meeting(meeting_id=<template_meeting_id>, ...) to build the shared agenda
and publish the template; init_recurring_meeting_occurrence to materialize a slot;
list_projects for the project id.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Series title, e.g. 'Weekly team sync'. | |
| notify | No | True emails participants about schedule changes and cancellations. Defaults to false — an API-created series stays quiet. | |
| end_date | No | Last possible date as 'YYYY-MM-DD'; required for, and only valid with, end_after='specific_date'. | |
| interval | No | Every N days/weeks/months (default 1 = every occurrence of the rule). Not applicable to 'working_days'. | |
| location | No | Room name or meeting URL every occurrence inherits. Omit for none. | |
| end_after | No | How the series ends: 'never' (the default), 'specific_date' (needs end_date) or 'iterations' (needs iterations). | never |
| frequency | No | Repetition rule: 'daily', 'working_days' (every working day), 'weekly' (the default), 'monthly_day_of_month' (needs monthly_day) or 'monthly_nth_weekday' (needs monthly_ordinal + monthly_weekday). | weekly |
| time_zone | Yes | IANA time zone the schedule computes in, e.g. 'Europe/Berlin' or 'Etc/UTC' — required, because it decides what 'every Monday 09:00' means across DST changes. Validated locally: OpenProject would store a typo silently and fall back to the account's zone. | |
| iterations | No | Total number of occurrences (1-1000); required for, and only valid with, end_after='iterations'. | |
| project_id | Yes | Numeric id or identifier of the project the series belongs to. It must have the Meetings module enabled and this account needs the 'create meetings' permission in it. | |
| start_time | Yes | First occurrence as ISO 8601 WITH a timezone: '2026-09-01T09:00:00Z' or '2026-09-01T11:00:00+02:00'. Must be now or in the future; a time without an offset is rejected locally. | |
| monthly_day | No | Day of the month (1-31); required for, and only valid with, frequency='monthly_day_of_month'. | |
| monthly_ordinal | No | Which weekday of the month: 1-4, or -1 for the last one; required for, and only valid with, frequency='monthly_nth_weekday'. | |
| monthly_weekday | No | Weekday name ('monday'…'sunday'); required for, and only valid with, frequency='monthly_nth_weekday'. | |
| duration_minutes | Yes | Length of each occurrence in minutes (90 = one and a half hours). The result reports it back as duration_hours. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Series id — what get_recurring_meeting and the occurrence tools take. Not a meeting id. | |
| notes | No | Degradation markers: an unreadable schedule, the occurrence cap, a time zone that could not be applied, a draft template. | |
| title | No | Series title. | |
| author | No | User who created the series. | |
| project | No | Project the series belongs to. | |
| end_date | No | Last possible date (ISO); only when end_after='specific_date'. | |
| interval | No | Every N days/weeks/months; always 1 for 'working_days'. | |
| location | No | Room name or meeting URL each occurrence inherits. | |
| end_after | No | 'never', 'specific_date' or 'iterations'. | |
| frequency | No | Repetition rule: 'daily', 'working_days', 'weekly', 'monthly_day_of_month' or 'monthly_nth_weekday'. | |
| time_zone | No | Zone the schedule computes in, as OpenProject stores it (an IANA identifier or a Rails zone name). | |
| iterations | No | Total occurrences; only when end_after='iterations'. | |
| start_time | No | First-occurrence start as ISO 8601 UTC. | |
| monthly_day | No | Day of month (1-31); only for 'monthly_day_of_month'. | |
| occurrences | No | The next upcoming slots in order (capped; see 'notes'). meeting_id is null until a slot is instantiated, and state 'planned' marks exactly those. | |
| duration_hours | No | Length of each occurrence in hours (1.5 = 90 minutes). | |
| monthly_ordinal | No | Which weekday occurrence (1-4, -1 = last); only for 'monthly_nth_weekday'. | |
| monthly_weekday | No | Weekday name; only for 'monthly_nth_weekday'. | |
| template_meeting_id | No | Id of the template meeting the occurrences are copied from. Its agenda is edited with the regular meeting tools, and a freshly created template is a DRAFT — publish it with update_meeting(meeting_id=<this>, state='open') before initialising occurrences. |