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
limitintegerBetween 1 and 100. Default 50.
offsetintegerAt least 0. Default 0.
statusstringValues: scheduled, live, processing, ready, failed, no_bot, no_speech.
sourcestringValues: calendar, url, upload.
platformstringValues: teams, meet, zoom, upload.
fromstringOnly 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.
tostringOnly meetings that start at or before this point in time (ISO 8601).
qstringSubstring of the title, ignoring upper and lower case.
customerstringCompany domain, for example company.example. /customers lists the valid values.
orderstringSort 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 | nullStart of the appointment. null for an upload, which has none.
data[].ends_atdate-time | nullEnd 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.