Init recurring meeting occurrence
init_recurring_meeting_occurrenceMaterialize a scheduled occurrence of a recurring meeting into an editable meeting, copying agenda and attachments so you can prepare minutes or files; also restores cancelled slots.
Instructions
Materialize one occurrence of a series as a real meeting, copied from the template.
Use it when a specific slot needs its own agenda, minutes or attachments before the day: the occurrence becomes a normal meeting (template agenda and attachments copied) that every meeting tool can work on. Called on a cancelled occurrence it RESTORES it to 'open'; called where an open meeting already exists it idempotently returns that meeting.
Returns the instantiated meeting in the same shape as get_meeting — its id is
the meeting id for follow-up calls, distinct from the series id.
Pitfalls — the instant is trusted, not validated. OpenProject matches start_time
by timestamp equality and does NOT check it against the schedule, so a wrong instant
creates a real off-schedule meeting: always copy the string from
get_recurring_meeting's occurrences (offsets are normalized to UTC 'Z' form on the
wire). An HTTP 500 here almost always means the series' template is still a DRAFT —
OpenProject fails uncleanly on that instead of answering 422; publish the template
with update_meeting(meeting_id=<template_meeting_id>, state='open') and retry.
This needs the 'create meetings' permission (403 otherwise; OpenProject 17.4 itself
briefly wanted 'edit meetings').
Cross-references: get_recurring_meeting for the exact start_time strings and the
template id; update_meeting / add_meeting_agenda_item on the result;
cancel_recurring_meeting_occurrence for the opposite move.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| start_time | Yes | The occurrence's scheduled instant, copied VERBATIM from a get_recurring_meeting occurrences row ('2026-08-12T10:00:00Z'). Matching is exact-instant and OpenProject does not check the value against the schedule — a retyped or rounded time silently creates an off-schedule meeting. | |
| recurring_meeting_id | Yes | Numeric series id from list_recurring_meetings. Never a meeting id. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Meeting id — what get_meeting and add_meeting_agenda_item take. | |
| notes | No | Degradation notes: agenda items that could not be read, work packages this account may not see. | |
| state | No | Lifecycle state: 'draft' (not yet opened to participants), 'open', 'in_progress', 'closed' or 'cancelled'. Cancelled meetings are excluded from listings. | |
| title | No | Meeting title. | |
| author | No | User who created the meeting. | |
| project | No | Project the meeting belongs to. | |
| end_time | No | ISO 8601 UTC end timestamp, derived from start plus duration. | |
| location | No | Room name or meeting URL as typed by the organizer. | |
| created_at | No | ISO 8601 UTC timestamp. | |
| start_time | No | ISO 8601 UTC start timestamp; null for an undated meeting. | |
| updated_at | No | ISO 8601 UTC timestamp. | |
| agenda_items | No | The agenda in order; always a list. Empty means either no agenda or an unreadable one — check 'notes' before concluding the meeting had none. | |
| lock_version | No | Optimistic-lock version. Echo it as update_meeting's lock_version so a concurrent edit fails loudly (409) instead of being overwritten. | |
| participants | No | Invited users; always a list. Attendance is not exposed by API v3. | |
| duration_hours | No | Scheduled length in hours (1.5 = 90 minutes); the wire sends an ISO duration, which is converted here. |