Skip to content

One meeting with its minutes and tasks

GET /api/v1/meetings/{id} meetings:read

One meeting, with its participants and the times they were present, the current minutes and the tasks.

⚠️ The participant shape here is NARROWER than under /participants: no domain, no attended. If you need the company or "invited, did not turn up", call /participants.

Path parameters

NameTypeRequiredDescription
iduuidyesThe meeting, by the id from /meetings.

Response 200

The meeting.

Example response

json
{
  "id": "8f14e45f-ceea-467a-9e2b-1d3f5c0a7b21",
  "title": "Quarterly review",
  "platform": "teams",
  "source": "calendar",
  "status": "ready",
  "starts_at": "2026-08-04T08:00:00Z",
  "ends_at": "2026-08-04T09:00:00Z",
  "join_url": "https://teams.microsoft.com/l/meetup-join/…",
  "organizer_email": "anna@company.example",
  "created_at": "2026-08-01T09:12:44Z",
  "template_id": "e07b6d13-84af-4c92-b5d7-0a9e1f83c246",
  "participants": [
    {
      "display_name": "Anna Weber",
      "email": "anna@company.example",
      "is_internal": true,
      "source": "calendar",
      "approx_joined_at": "2026-08-04T08:01:37Z",
      "approx_left_at": "2026-08-04T08:58:02Z"
    }
  ],
  "protocol": {
    "id": "3b1f7c02-5d64-4c1a-9f88-2ac0e6b41d77",
    "tldr": "Quote goes out by Friday, engineering clarifies the interface.",
    "content_md": "# Quarterly review\n\n## Decisions\n…",
    "generated_at": "2026-08-04T09:04:12Z",
    "edited_at": null,
    "action_items": [
      {
        "id": "c4d9f0a1-72be-4e35-8f10-6d2a5b8c9e04",
        "task": "Send the quote",
        "owner_name": "Anna Weber",
        "due": "2026-08-15",
        "verdict": "open",
        "status": "open"
      }
    ]
  }
}
FieldTypeRequiredDescription
iduuidyesIdentifies the meeting everywhere in this API.
titlestringyesSubject, as the calendar or the upload spelled it.
platformstringyesWhere it took place. upload means there was no live meeting — a recording came in. Values: teams, meet, zoom, upload.
sourcestringyesHow the meeting reached Protoki. Values: calendar, url, upload.
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.
starts_atdate-time | nullStart of the appointment. null for an upload, which has none.
ends_atdate-time | nullEnd of the appointment. null for an upload.
join_urlstring | nullThe link the recorder used to join. null for an upload.
organizer_emailemail | nullWho invited. null when the calendar gave nothing.
created_atdate-timeyesWhen the meeting was first recorded in Protoki.
template_iduuid | nullThe template these minutes were written against. null when the default was used.
participantsobject[]yesEveryone the meeting knows about — present or only invited.
participants[].display_namestringyesThe name as the calendar or the meeting platform spelled it.
participants[].emailemail | nullEmail address. null when neither source gave one.
participants[].is_internalbooleanyesThe email domain belongs to your own house.
participants[].sourcestringyesWhere this person came from: the invitation, the meeting platform, or a correction by hand. Values: calendar, platform, manual.
participants[].approx_joined_atdate-time | nullWhen this person was first there. Approximate — it comes from the recording, not from a join event.
participants[].approx_left_atdate-time | nullWhen this person was last there. Approximate, same reason.
protocolobject | nullThe most recent minutes — null for as long as none exist.
protocol.iduuidyesIdentifies this set of minutes.
protocol.tldrstring | nullThe short version. null when the model produced none.
protocol.content_mdstringyesThe full minutes, in Markdown.
protocol.generated_atdate-timeyesWhen the model wrote these minutes.
protocol.edited_atdate-time | nullSet once a person has edited the minutes.
protocol.action_itemsobject[]yesThe tasks taken from these minutes.
protocol.action_items[].iduuidyesIdentifies the task.
protocol.action_items[].taskstringyesWhat is to be done, in one sentence.
protocol.action_items[].owner_namestring | nullWho is to do it. null when nobody was named in the meeting.
protocol.action_items[].duedate | nullWhen it is due. null when no date was named.
protocol.action_items[].verdictstringyesOutcome of the second pass over the task. resolved_in_meeting means it was already dealt with while the meeting was still running. Values: open, resolved_in_meeting, discarded, duplicate, unclear_owner.
protocol.action_items[].statusstringyesWhere the task stands. This one is set by a person in the app, not by the model. Values: open, done, dismissed.

Other answers

CodeMeaning
401No key, or a key that is not valid.
403The key is missing the scope this endpoint needs.
404Not found, not in the workspace of the key — or, for a personal key, not visible to that person. 404 rather than 403, deliberately.
500The minutes could not be loaded.

Protoki — EU/GDPR-compliant meeting notetaker.