# Get meeting minutes

> Returns the latest ready version of the minutes.

Source: https://diko.app/en/api-docs/reference/get-meeting-minutes

Meetings · `GET /meetings/{meeting_id}/minutes`

- **Base URL:** https://api.diko.app/api/v1
- **Required scope:** `meetings:read`
- **Rate-limit policy:** `read`, `account`
- **Authentication:** `Authorization: Bearer dk_live_...`

When no ready version exists the response is still 200 and `status` explains why: `none`, `generating`, `failed`, `insufficient` or `unavailable`.

## Parameters

| Name | In | Type | Required | Default | Constraints | Description |
|---|---|---|---|---|---|---|
| `meeting_id` | path | `string` | yes | – | 26–26 characters; pattern: ^mtg_[0-9A-Za-z]{22}$ | Public meeting ID (`mtg_` prefix). |

## Response

### 200

The minutes.

- `RateLimit`: The most restrictive policy that applied: `"name";r=<requests left>;t=<seconds>`, where `t` is the number of seconds until one more request is allowed (0 when the quota is full). Absent when no rate limiter ran for the request.
- `RateLimit-Policy`: The rate-limit policies that applied to the request, one `"name";q=<burst>;w=<seconds>` item per policy, for example `"read";q=10;w=2, "account";q=20;w=2`: `q` is the burst quota and `w` the seconds in which an empty quota refills. Sent on every authenticated response; absent when no rate limiter ran for the request, for example when it was rejected before the key was checked.
- `Request-Id`: ID of this request (`req_` prefix), the same as `request_id` in an error body. It is also sent as `X-Request-ID`. Quote it when you contact support.
- `X-Client-Request-Id`: Your own `X-Client-Request-Id` request header, echoed back. It is sent only when the value you sent has 1-128 characters from A-Z a-z 0-9 . _ : -.
- `X-RateLimit-Limit`: Burst quota of the most restrictive policy (`q` in `RateLimit-Policy`). Absent when no rate limiter ran.
- `X-RateLimit-Remaining`: Requests left in the most restrictive policy (`r` in `RateLimit`). Absent when no rate limiter ran.
- `X-RateLimit-Reset`: Seconds until one more request is allowed in the most restrictive policy (`t` in `RateLimit`; 0 when the quota is full). It is a number of seconds, not a timestamp. Absent when no rate limiter ran.

Content type: `application/json`

- `object` (string, required): Always `minutes`.
- `meeting_id` (string, required, 26–26 characters, pattern: ^mtg_[0-9A-Za-z]{22}$): ID of the meeting.
- `status` (string, required): Minutes status. Allowed values: `none`, `generating`, `ready`, `failed`, `insufficient`, `unavailable`.
- `reason` (string | null, required): Reason when the status is `insufficient`.
- `version` (integer | null, required, 0–2147483647, format: int32): Version number.
- `generated_at` (string | null, required, ≤ 24 characters, format: date-time): When this version was generated.
- `language` (string | null, required): Language of the minutes.
- `summary` (string | null, required): Summary text.
- `key_points` (array<object>, required): Key points.
  - `text` (string, required): The statement.
  - `timestamps_ms` (array<integer>, required): Moments in the recording that support the statement, in milliseconds.
- `decisions` (array<object>, required): Decisions.
  - `text` (string, required): The statement.
  - `timestamps_ms` (array<integer>, required): Moments in the recording that support the statement, in milliseconds.
- `action_items` (array<object>, required): Generated action items.
  - `object` (string, required): Always `action_item`.
  - `id` (string | null, required, 26–26 characters, pattern: ^act_[0-9A-Za-z]{22}$): Public ID (`act_` prefix). Null for generated items.
  - `source` (string, required): Where the item comes from. Allowed values: `manual`, `generated`.
  - `text` (string, required): Task title.
  - `description` (string | null, required): Longer description, if any.
  - `status` (string, required): Task status. Generated items are always `open`. Allowed values: `open`, `in_progress`, `done`, `canceled`.
  - `assignee_name` (string | null, required): Name of the person responsible.
  - `due_text` (string | null, required): Free-text deadline from generated minutes.
  - `due_at` (string | null, required, ≤ 24 characters, format: date-time): Deadline of a manual item.
  - `timestamps_ms` (array<integer>, required): Moments in the recording the item comes from, in milliseconds.
  - `created_at` (string | null, required, ≤ 24 characters, format: date-time): When a manual item was created. Null for generated items.
- `open_questions` (array<object>, required): Open questions.
  - `text` (string, required): The statement.
  - `timestamps_ms` (array<integer>, required): Moments in the recording that support the statement, in milliseconds.
- `sections` (array<object>, required): Additional sections.
  - `title` (string, required): Section title.
  - `content` (string, required): Section text.
- `verification_status` (string | null, required): Result of the evidence check. Allowed values: `verified`, `repaired`, `unverified`.

```json
{
  "object": "minutes",
  "meeting_id": "mtg_5uF4g2Xu1i0qz3yAp0CP7W",
  "status": "ready",
  "reason": null,
  "version": 2,
  "generated_at": "2026-10-11T09:30:00.000Z",
  "language": "lt",
  "summary": "Aptartas pasiūlymo kainodaros pakeitimas ir kiti žingsniai iki mėnesio pabaigos.",
  "key_points": [
    {
      "text": "Nauja kainodara įsigalioja nuo lapkričio 1 d.",
      "timestamps_ms": []
    }
  ],
  "decisions": [
    {
      "text": "Pasiūlymą klientui išsiunčiame šią savaitę.",
      "timestamps_ms": [
        754000
      ]
    }
  ],
  "action_items": [
    {
      "object": "action_item",
      "id": null,
      "source": "generated",
      "text": "Išsiųsti pasiūlymą",
      "description": null,
      "status": "open",
      "assignee_name": "Jonas",
      "due_text": null,
      "due_at": null,
      "timestamps_ms": [],
      "created_at": null
    }
  ],
  "open_questions": [
    {
      "text": "Ar nuolaida taikoma ir esamiems klientams?",
      "timestamps_ms": []
    }
  ],
  "sections": [
    {
      "title": "Kainodara",
      "content": "Kainos peržiūrimos kartą per ketvirtį.\nNuolaidos taikomos nuo trečios licencijos."
    }
  ],
  "verification_status": "verified"
}
```

## Examples

**cURL**

```bash
curl "https://api.diko.app/api/v1/meetings/mtg_0aZ1bY2cX3dW4eV5fU6gT7/minutes" \
  -H "Authorization: Bearer $DIKO_API_KEY"
```

**Python**

```python
import os

import requests

response = requests.get(
    "https://api.diko.app/api/v1/meetings/mtg_0aZ1bY2cX3dW4eV5fU6gT7/minutes",
    headers={"Authorization": f"Bearer {os.environ['DIKO_API_KEY']}"},
    timeout=30,
)
response.raise_for_status()
print(response.json())
```

**TypeScript**

```typescript
const response = await fetch("https://api.diko.app/api/v1/meetings/mtg_0aZ1bY2cX3dW4eV5fU6gT7/minutes", {
  headers: {
    Authorization: `Bearer ${process.env.DIKO_API_KEY}`,
  },
})
if (!response.ok) throw new Error(`${response.status} ${await response.text()}`)
console.log(await response.json())
```

## Errors

This endpoint can return these errors. Every code is described in the error catalog.

| HTTP | Code | Meaning | Retry? |
|---|---|---|---|
| 401 | [`missing_api_key`](https://diko.app/en/api-docs/errors.md#missing_api_key) | The request has no `Authorization` header. | no |
| 401 | [`invalid_api_key`](https://diko.app/en/api-docs/errors.md#invalid_api_key) | The header is unusable (a scheme other than `Bearer`, an empty key or more than one `Authorization` header) or the key is unknown or malformed (wrong structure or checksum). The response is identical in all these cases. | no |
| 401 | [`api_key_expired`](https://diko.app/en/api-docs/errors.md#api_key_expired) | The key has expired. | no |
| 401 | [`api_key_revoked`](https://diko.app/en/api-docs/errors.md#api_key_revoked) | The key was revoked: manually, after a rotation grace period ended, because of a leak or because the account was disabled. | no |
| 401 | [`api_key_disabled`](https://diko.app/en/api-docs/errors.md#api_key_disabled) | The key is temporarily disabled. | no |
| 402 | [`subscription_required`](https://diko.app/en/api-docs/errors.md#subscription_required) | The account has no active paid access. | no |
| 403 | [`ip_not_allowed`](https://diko.app/en/api-docs/errors.md#ip_not_allowed) | The key has an IP allowlist and the request IP is not on it, or it cannot be determined reliably. | no |
| 403 | [`account_disabled`](https://diko.app/en/api-docs/errors.md#account_disabled) | The account is disabled. | no |
| 403 | [`email_not_verified`](https://diko.app/en/api-docs/errors.md#email_not_verified) | The account e-mail address is not verified. | no |
| 403 | [`api_access_suspended`](https://diko.app/en/api-docs/errors.md#api_access_suspended) | A Diko administrator suspended API access for this account. | no |
| 403 | [`plan_required`](https://diko.app/en/api-docs/errors.md#plan_required) | The plan does not include the API. `error.details.required_plans` lists `verslas`. | no |
| 403 | [`insufficient_scope`](https://diko.app/en/api-docs/errors.md#insufficient_scope) | The key lacks the scope this endpoint needs. `error.details` contains `required_scopes` and `granted_scopes`. | no |
| 404 | [`not_found`](https://diko.app/en/api-docs/errors.md#not_found) | The resource does not exist, does not belong to your account or its ID is encoded incorrectly. | no |
| 429 | [`rate_limit_exceeded`](https://diko.app/en/api-docs/errors.md#rate_limit_exceeded) | A rate-limit policy was exceeded. `error.details.policy` names it. | yes, after Retry-After |
| 500 | [`internal_error`](https://diko.app/en/api-docs/errors.md#internal_error) | An internal server error. | conditionally |
| 503 | [`service_unavailable`](https://diko.app/en/api-docs/errors.md#service_unavailable) | The service is temporarily busy, for example because of database load. | yes, after Retry-After |
