> ## Documentation Index
> Fetch the complete documentation index at: https://collabase.ch/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Meetings API

> Plan meetings, keep agendas and record decisions from another system through /api/v1/meetings, with the same rights as in Collabase.

The Meetings API gives integrations the same operations the Meetings app offers: create and plan
meetings, invite people, keep the agenda, run and close a meeting, and read or record its outcomes,
decisions and polls. Every call runs as the person who issued the token, with exactly the rights that
person has in Collabase.

## Meeting lifecycle

A meeting starts as a **draft** that only its organizers see in their calendar view.
[Planning](/docs/api/meetings/lifecycle/plan-meeting) it sends the invitations. A planned meeting is
[started](/docs/api/meetings/lifecycle/start-meeting) by a moderator, then
[closed](/docs/api/meetings/lifecycle/close-meeting), which freezes it and queues the meeting note. A closed
meeting can be [reopened](/docs/api/meetings/lifecycle/reopen-meeting) for a correction. Drafts and planned
meetings can be [cancelled](/docs/api/meetings/lifecycle/cancel-meeting). A call in the wrong state, for
example starting a draft, returns `409 CONFLICT`.

| Status | Meaning |
| - | - |
| **`DRAFT`** | Created, not announced, no invitations sent |
| **`PLANNED`** | Announced; participants hold it in their calendar |
| **`RUNNING`** | In progress; outcomes and decisions can be recorded |
| **`CLOSED`** | Ended; read-only until reopened |
| **`CANCELLED`** | Called off; everyone who held it received a cancellation |

## Scopes

| Scope | Allows |
| - | - |
| `meetings:read` | Every `GET` endpoint below |
| `meetings:write` | Every other endpoint; includes `meetings:read` |

A token without the scope receives `403 INSUFFICIENT_SCOPE`. A token with the scope still cannot do
more than its owner: a person who may not edit a meeting gets `403 FORBIDDEN` through the API too.

## Conventions

* **Visibility.** A meeting the caller may not see answers `404 NOT_FOUND`, exactly like one that
  does not exist. Private meetings are visible only to their participants.
* **Times.** Instants in responses are ISO 8601 in UTC. When you create or move a meeting, `date`
  (`YYYY-MM-DD`) and `time` (`HH:mm`) are wall-clock values in the time zone of the token owner's
  profile, the same way the app reads them. Instants you send, such as `baseUpdatedAt` and a poll's
  `closesAt`, must be UTC with a `Z` (`2026-10-15T08:05:12.000Z`); an offset such as `+02:00` is
  rejected with `422`.
* **Concurrent edits.** Changes to agenda sections, agenda items, outcomes and decisions carry
  `baseUpdatedAt`, the `updatedAt` you read. If someone changed the object since, the request
  returns `409 CONFLICT` with the object as it is now in `current`, next to `error`. Re-read, merge
  and send again. Draft polls carry `baseUpdatedAt` as well; their conflict returns `409 CONFLICT`
  without `current`.
* **Strict bodies.** Unknown fields are rejected with `422 VALIDATION_ERROR`, not silently dropped.
  A missing or malformed JSON body answers `422` too, except on the endpoints whose body is optional
  ([Cancel meeting](/docs/api/meetings/lifecycle/cancel-meeting), [Close meeting](/docs/api/meetings/lifecycle/close-meeting)).
* **Limits.** A meeting holds up to 500 participants, 50 agenda sections, 200 agenda items, 500
  outcomes, 300 decisions and 50 polls. Going beyond answers `400 VALIDATION_ERROR`.

## Errors

On top of the [general errors](/docs/api/introduction#response-format):

| Status | Code | Meaning |
| - | - | - |
| `400` | `VALIDATION_ERROR` | The request is well formed but does not fit the meeting, for example a decision maker who is not invited |
| `409` | `CONFLICT` | Someone changed the object since you read it, or the meeting is in the wrong state for this action |
| `409` | `MEETING_NOT_WRITABLE` | The meeting is closed or cancelled; reopen it first |
| `409` | `MEETING_NOT_RUNNING` | Outcomes and decisions are recorded only while the meeting runs |

```json 409 theme={"dark"}
{
  "error": { "code": "CONFLICT", "message": "Changed by someone else since it was loaded" },
  "current": { "id": "cm4sect0001", "title": "Budget 2027", "order": 1000, "updatedAt": "2026-10-15T08:05:12.000Z" }
}
```

## Endpoints

| Method | Path | Scope |
| - | - | - |
| `GET` | [`/api/v1/meetings`](/docs/api/meetings/list-meetings) | `meetings:read` |
| `POST` | [`/api/v1/meetings`](/docs/api/meetings/create-meeting) | `meetings:write` |
| `GET` | [`/api/v1/meetings/{meetingId}`](/docs/api/meetings/get-meeting) | `meetings:read` |
| `PATCH` | [`/api/v1/meetings/{meetingId}`](/docs/api/meetings/update-meeting) | `meetings:write` |
| `DELETE` | [`/api/v1/meetings/{meetingId}`](/docs/api/meetings/delete-meeting) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/plan`](/docs/api/meetings/lifecycle/plan-meeting) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/cancel`](/docs/api/meetings/lifecycle/cancel-meeting) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/start`](/docs/api/meetings/lifecycle/start-meeting) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/close`](/docs/api/meetings/lifecycle/close-meeting) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/reopen`](/docs/api/meetings/lifecycle/reopen-meeting) | `meetings:write` |
| `GET` | [`/api/v1/meetings/{meetingId}/participants`](/docs/api/meetings/participants/list-participants) | `meetings:read` |
| `POST` | [`/api/v1/meetings/{meetingId}/participants`](/docs/api/meetings/participants/invite-participant) | `meetings:write` |
| `PATCH` | [`/api/v1/meetings/{meetingId}/participants/{participantId}`](/docs/api/meetings/participants/update-participant) | `meetings:write` |
| `DELETE` | [`/api/v1/meetings/{meetingId}/participants/{participantId}`](/docs/api/meetings/participants/remove-participant) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/rsvp`](/docs/api/meetings/participants/respond-to-invitation) | `meetings:write` |
| `GET` | [`/api/v1/meetings/{meetingId}/agenda`](/docs/api/meetings/agenda/get-agenda) | `meetings:read` |
| `POST` | [`/api/v1/meetings/{meetingId}/agenda/sections`](/docs/api/meetings/agenda/create-section) | `meetings:write` |
| `PATCH` | [`/api/v1/meetings/{meetingId}/agenda/sections/{sectionId}`](/docs/api/meetings/agenda/update-section) | `meetings:write` |
| `DELETE` | [`/api/v1/meetings/{meetingId}/agenda/sections/{sectionId}`](/docs/api/meetings/agenda/delete-section) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/agenda/sections/{sectionId}/move`](/docs/api/meetings/agenda/move-section) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/agenda/items`](/docs/api/meetings/agenda/create-item) | `meetings:write` |
| `PATCH` | [`/api/v1/meetings/{meetingId}/agenda/items/{itemId}`](/docs/api/meetings/agenda/update-item) | `meetings:write` |
| `DELETE` | [`/api/v1/meetings/{meetingId}/agenda/items/{itemId}`](/docs/api/meetings/agenda/delete-item) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/agenda/items/{itemId}/move`](/docs/api/meetings/agenda/move-item) | `meetings:write` |
| `GET` | [`/api/v1/meetings/{meetingId}/outcomes`](/docs/api/meetings/outcomes/list-outcomes) | `meetings:read` |
| `POST` | [`/api/v1/meetings/{meetingId}/agenda/items/{itemId}/outcomes`](/docs/api/meetings/outcomes/create-outcome) | `meetings:write` |
| `PATCH` | [`/api/v1/meetings/{meetingId}/outcomes/{outcomeId}`](/docs/api/meetings/outcomes/update-outcome) | `meetings:write` |
| `DELETE` | [`/api/v1/meetings/{meetingId}/outcomes/{outcomeId}`](/docs/api/meetings/outcomes/delete-outcome) | `meetings:write` |
| `GET` | [`/api/v1/meetings/{meetingId}/decisions`](/docs/api/meetings/decisions/list-decisions) | `meetings:read` |
| `POST` | [`/api/v1/meetings/{meetingId}/decisions`](/docs/api/meetings/decisions/record-decision) | `meetings:write` |
| `PATCH` | [`/api/v1/meetings/{meetingId}/decisions/{decisionId}`](/docs/api/meetings/decisions/update-decision) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/decisions/{decisionId}/supersede`](/docs/api/meetings/decisions/supersede-decision) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/decisions/{decisionId}/revoke`](/docs/api/meetings/decisions/revoke-decision) | `meetings:write` |
| `GET` | [`/api/v1/meetings/decisions`](/docs/api/meetings/decisions/decision-register) | `meetings:read` |
| `GET` | [`/api/v1/meetings/{meetingId}/polls`](/docs/api/meetings/polls/list-polls) | `meetings:read` |
| `POST` | [`/api/v1/meetings/{meetingId}/polls`](/docs/api/meetings/polls/create-poll) | `meetings:write` |
| `PATCH` | [`/api/v1/meetings/{meetingId}/polls/{pollId}`](/docs/api/meetings/polls/update-poll) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/polls/{pollId}/open`](/docs/api/meetings/polls/open-poll) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/polls/{pollId}/close`](/docs/api/meetings/polls/close-poll) | `meetings:write` |
| `POST` | [`/api/v1/meetings/{meetingId}/series`](/docs/api/meetings/series/create-series) | `meetings:write` |
| `PATCH` | [`/api/v1/meetings/{meetingId}/series`](/docs/api/meetings/series/change-series-rule) | `meetings:write` |
| `GET` | [`/api/v1/meetings/series/{seriesId}`](/docs/api/meetings/series/get-series) | `meetings:read` |

## Reacting to changes

There is no separate webhook subscription for meetings. Build an
[automation](/docs/automation/triggers#collabase-events) on one of the meeting events (created, updated,
cancelled, closed, decision recorded, note published) and add an **HTTP** action that calls your
system. An event reaches only automations whose owner may see the meeting. It carries identifiers,
dates and a decision's title, never agenda text or notes; read the details through this API with a
token of your own.

The other direction works too: the Collabase connector has the automation actions **Create
Meeting**, **Add Agenda Item** (also to the next occurrence of a series) and **Invite to Meeting**,
which act with the automation owner's rights. See the
[Collabase connector](/docs/automation/connectors/collabase).

<CardGroup cols={2}>
  <Card title="Meetings" icon="calendar" href="/docs/api/meetings/list-meetings">
    List, create, read, change and delete meetings.
  </Card>

  <Card title="Lifecycle" icon="play" href="/docs/api/meetings/lifecycle/plan-meeting">
    Plan, start, close, reopen and cancel a meeting.
  </Card>

  <Card title="Participants" icon="users" href="/docs/api/meetings/participants/list-participants">
    Invite members and guests, change roles, answer invitations.
  </Card>

  <Card title="Agenda" icon="list-ordered" href="/docs/api/meetings/agenda/get-agenda">
    Sections, items and their order.
  </Card>

  <Card title="Outcomes" icon="list-check" href="/docs/api/meetings/outcomes/list-outcomes">
    What came out of each agenda item while the meeting ran.
  </Card>

  <Card title="Decisions" icon="gavel" href="/docs/api/meetings/decisions/list-decisions">
    Record, reword, replace and revoke decisions; search the register.
  </Card>

  <Card title="Polls" icon="square-check" href="/docs/api/meetings/polls/list-polls">
    Prepare, open and close polls; read turnout and results.
  </Card>

  <Card title="Series" icon="repeat" href="/docs/api/meetings/series/get-series">
    Turn a meeting into a series, change its rule, page through occurrences.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.