Skip to content

Tasks across meetings ​

GET /api/v1/action-items action_items:read

Every task the key is allowed to see — "everything still open and due by Friday", without loading meetings first. Each row carries the meeting id, title and start along with it. Sorted by due date ascending, tasks without one last, then by meeting start descending.

Query parameters ​

NameTypeRequiredDescription
meeting_iduuid—Narrow to one meeting. Without it, the tasks come from all of them.
statusstring—Where the task stands. Values: open, done, dismissed.
verdictstring—Outcome of the second pass over the task. Values: open, resolved_in_meeting, discarded, duplicate, unclear_owner.
due_fromdate—YYYY-MM-DD. An invalid value gives 400.
due_todate—YYYY-MM-DD. An invalid value gives 400.
limitinteger—Integer page size, clamped to the supported range. Non-integer or non-finite values give 400. Between 1 and 200. Default 100.
offsetinteger—Integer offset, clamped to the supported range. Non-integer or non-finite values give 400. Between 0 and 2147483647. Default 0.

Response 200 ​

The tasks.

Example response

json
{
  "data": [
    {
      "id": "e07b6d13-84af-4c92-b5d7-0a9e1f83c246",
      "meeting_id": "8f14e45f-ceea-467a-9e2b-1d3f5c0a7b21",
      "meeting_title": "Quarterly review",
      "meeting_starts_at": "2026-08-04T08:00:00Z",
      "protocol_id": "8f14e45f-ceea-467a-9e2b-1d3f5c0a7b21",
      "task": "Send the quote",
      "owner_name": "Anna Weber",
      "due": "2026-08-15",
      "verdict": "open",
      "status": "open"
    }
  ],
  "pagination": {
    "limit": 50,
    "offset": 0,
    "total": 3
  }
}
FieldTypeRequiredDescription
dataobject[]yesThe tasks on this page.
data[].iduuidyesIdentifies the task.
data[].meeting_iduuidyesThe meeting this task came out of.
data[].meeting_titlestringyesSubject of that meeting, so a task list reads without a second call.
data[].meeting_starts_atdate-time | null—Start of that meeting.
data[].protocol_iduuidyesThe minutes this task was taken from.
data[].taskstringyesWhat is to be done, in one sentence.
data[].owner_namestring | null—Who is to do it. null when nobody was named in the meeting.
data[].duedate | null—When it is due. null when no date was named.
data[].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.
data[].statusstringyesWhere the task stands. This one is set by a person in the app, not by the model. Values: open, done, dismissed.
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.