Skip to content

List meetings ​

GET /api/v1/meetings meetings:read

Meetings of the workspace. Every filter is applied on the server — you do not have to (and are not meant to) fetch everything and filter afterwards.

Query parameters ​

NameTypeRequiredDescription
limitinteger—Integer page size, clamped to the supported range. Non-integer or non-finite values give 400. Between 1 and 100. Default 50.
offsetinteger—Integer offset, clamped to the supported range. Non-integer or non-finite values give 400. Between 0 and 2147483647. Default 0.
statusstring—Values: scheduled, live, processing, ready, failed, no_bot, no_speech.
sourcestring—Values: calendar, url, upload.
platformstring—Values: teams, meet, zoom, upload.
fromstring—Only meetings that start at or after this point in time (ISO 8601, for example 2026-08-01 or 2026-08-01T09:00:00Z). Meetings without a start time — an upload — fall out of any range filter. An invalid value gives 400.
tostring—Only meetings that start at or before this point in time (ISO 8601).
qstring—Substring of the title, ignoring upper and lower case.
customerstring—Company domain, for example company.example. /customers lists the valid values.
orderstring—Sort order. created_at and starts_at descending, title ascending. Values: created_at, starts_at, title. Default created_at.

Response 200 ​

A list of meetings. pagination carries the clamped request values.

Example response

json
{
  "data": [
    {
      "id": "e07b6d13-84af-4c92-b5d7-0a9e1f83c246",
      "title": "Quarterly review",
      "platform": "teams",
      "source": "calendar",
      "status": "ready",
      "starts_at": "2026-08-04T08:00:00Z",
      "ends_at": "2026-08-04T09:00:00Z",
      "created_at": "2026-08-01T09:12:44Z"
    }
  ],
  "pagination": {
    "limit": 50,
    "offset": 0,
    "total": 3
  }
}
FieldTypeRequiredDescription
dataobject[]yesThe meetings on this page.
data[].iduuidyesIdentifies the meeting everywhere in this API.
data[].titlestringyesSubject, as the calendar or the upload spelled it.
data[].platformstringyesWhere it took place. upload means there was no live meeting — a recording came in. Values: teams, meet, zoom, upload.
data[].sourcestringyesHow the meeting reached Protoki. Values: calendar, url, upload.
data[].statusstringyesWhere it stands. Only ready promises minutes; no_speech means nobody said anything worth writing down, and no_bot that no recorder ever joined. Values: scheduled, live, processing, ready, failed, no_bot, no_speech.
data[].starts_atdate-time | null—Start of the appointment. null for an upload, which has none.
data[].ends_atdate-time | null—End of the appointment. null for an upload.
data[].created_atdate-timeyesWhen the meeting was first recorded in Protoki.
paginationobjectyesWhere this page sits in the whole set.
pagination.limitintegeryesThe page size that was applied, after clamping.
pagination.offsetintegeryesThe offset that was applied.
pagination.totalintegeryesNumber of hits in total, ignoring limit and offset.

Other answers ​

CodeMeaning
400Invalid parameter — the text names the field and the shape expected.
401No key, or a key that is not valid.
403The key is missing the scope this endpoint needs.
503The endpoint does not exist on this deployment yet, because a database change has not been applied. A temporary state, not a mistake in your request.

Protoki — EU/GDPR-compliant meeting notetaker.