Create recurring meeting
create_recurring_meetingCreate a recurring meeting series with a template agenda, rejecting invalid frequency/end combinations before saving.
Instructions
Create a recurring meeting series: a schedule plus a template the occurrences copy.
For "set up a weekly sync Mondays at 9" requests. frequency/end_after combinations are validated locally before anything is sent, rejecting a bad combination with the allowed matrix spelled out.
Returns the created series in get_recurring_meeting's shape, including computed
next occurrences (their start_time is what occurrence tools take) and
template_meeting_id.
Pitfalls. The template meeting is created as a DRAFT: notes says so, and occurrences
can't be initialized until update_meeting(meeting_id=<template_meeting_id>, state='open') publishes it. OpenProject also overwrites time_zone on create with
its own account zone; this tool corrects it with a follow-up PATCH — if refused
(needs 'edit meetings'), the series is still created and notes names the zone it
runs in.
Cross-references: get_recurring_meeting reads it back;
update_meeting(meeting_id=<template_meeting_id>, ...) builds the agenda and
publishes it; init_recurring_meeting_occurrence materializes 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 | Emails participants about schedule changes and cancellations; defaults to false (quiet). | |
| end_date | No | Last date as 'YYYY-MM-DD'; only with end_after='specific_date'. | |
| interval | No | Every N days/weeks/months (default 1). Not applicable to 'working_days'. | |
| location | No | Room name or 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', 'weekly' (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'; decides what 'every Monday 09:00' means across DST. Validated locally — OpenProject would silently store a typo and fall back to the account's zone. | |
| iterations | No | Total occurrences (1-1000); only with end_after='iterations'. | |
| project_id | Yes | Numeric id or identifier of the project; needs the Meetings module and 'create meetings' permission. | |
| start_time | Yes | First occurrence as ISO 8601 with a timezone: '2026-09-01T09:00:00Z' or '...+02:00'. Must be now or later; offset-less times are rejected locally. | |
| monthly_day | No | Day of the month (1-31); only with frequency='monthly_day_of_month'. | |
| monthly_ordinal | No | Which weekday of the month: 1-4, or -1 for the last one; only with frequency='monthly_nth_weekday'. | |
| monthly_weekday | No | Weekday name ('monday'…'sunday'); only with frequency='monthly_nth_weekday'. | |
| duration_minutes | Yes | Length of each occurrence in minutes (90 = 1.5 hours); echoed 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. |