Update meeting
update_meetingUpdate a meeting's title, schedule, location, participants, or lifecycle state. Reschedule, publish drafts, start or close meetings in OpenProject.
Instructions
Change a meeting's title, time, place or invite list — or move its lifecycle state.
Use it to reschedule ("move Thursday's review to 15:00"), to publish a draft
(state='open'), to start or wrap up a running one (state='in_progress' /
'closed' — outcomes can only be recorded while it is in progress), or to fix the
participants. Only the parameters you pass are sent; omitted fields stay as they are.
Returns the updated meeting in the same shape as get_meeting, including the fresh
lock_version for a follow-up edit.
Pitfalls. participants replaces the entire set — a partial list silently uninvites
everyone else. A closed meeting accepts a state-only patch (reopening it) and nothing
else; any other change is rejected with a validation error until it is reopened. A
conflict error (409) means somebody edited the meeting since you read it — the error
carries the fresh lock_version and the differing fields, so re-read, decide, retry
deliberately. This needs the 'edit meetings' permission, and moving a meeting to
another project is deliberately not offered.
Cross-references: get_meeting for the current values and the lock_version;
create_meeting to schedule a new one; delete_meeting to remove one;
add_meeting_outcome for what an 'in_progress' state unlocks.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | New lifecycle state: 'open' publishes a draft to its participants (exactly what the UI's publish does), 'in_progress' starts it (required before outcomes can be recorded), 'closed' freezes it, 'cancelled' calls it off. There is no dedicated state endpoint upstream — this plain field is it. | |
| title | No | New meeting title. Omit to leave it alone; it cannot be cleared. | |
| location | No | New room name or meeting URL; REPLACES the stored one. Pass null or an empty string to clear it. Omit the parameter entirely (the default) to leave it untouched. | __unchanged__ |
| meeting_id | Yes | Numeric meeting id from list_meetings or get_meeting. Never a project id or an agenda item id. | |
| start_time | No | New start as ISO 8601 WITH a timezone: '2026-08-03T14:00:00Z' or '2026-08-03T16:00:00+02:00'. A time without an offset is rejected locally rather than booked in the wrong hour. Omit to keep the current time. | |
| lock_version | No | The lock_version you read from get_meeting. Pass it and the write fails loudly (409) if somebody else edited the meeting in the meantime. Omit it and the current version is fetched and echoed — still safe, just one more round trip and a slightly wider conflict window. | |
| participants | No | User ids of the FULL new invite list, from search_principals or a project's memberships. This REPLACES the whole set — anyone not listed is uninvited — so read the current list with get_meeting first and send it complete. Omit to leave the participants untouched. | |
| duration_minutes | No | New length in minutes (90 = one and a half hours); the end time is derived from it. Omit to keep the current duration. |
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. |