# List meetings

> Returns your meetings, newest first by default.

Source: https://diko.app/en/api-docs/reference/list-meetings

Meetings · `GET /meetings`

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

Archived meetings are hidden unless `archived` says otherwise. List items omit `participants`, `speakers` and `counts`; fetch one meeting to get them. Every item carries the current `transcript.revision`, which takes time proportional to the length of its transcript, so pages of very long meetings answer slower: use a smaller `limit` when you walk your whole history.

## Parameters

| Name | In | Type | Required | Default | Constraints | Description |
|---|---|---|---|---|---|---|
| `status` | query | `array<string>` (repeatable) | no | – | – | Filter by derived status. Repeat the parameter to match several (`status=ready&status=failed`). Allowed values: `draft`, `recording`, `uploaded`, `processing`, `ready`, `failed`. |
| `archived` | query | `string` | no | `false` | – | Return active (`false`), archived (`true`) or all (`all`) items. Allowed values: `false`, `true`, `all`. |
| `created_after` | query | `string` | no | – | ≤ 64 characters | Only meetings created after this moment (exclusive). RFC 3339 date or date-time. Compared in milliseconds, like the timestamps in responses, so passing back a returned timestamp never returns that same item again. |
| `created_before` | query | `string` | no | – | ≤ 64 characters | Only meetings created before this moment (exclusive). RFC 3339 date or date-time. Compared in milliseconds, like the timestamps in responses, so passing back a returned timestamp never returns that same item again. |
| `updated_after` | query | `string` | no | – | ≤ 64 characters | Only meetings changed after this moment (exclusive). RFC 3339 date or date-time. Compared in milliseconds, like the timestamps in responses, so passing back a returned timestamp never returns that same item again. |
| `q` | query | `string` | no | – | ≤ 200 characters | Search in the title. |
| `sort` | query | `string` | no | `created_at` | – | Field to sort by. Allowed values: `created_at`, `updated_at`. |
| `order` | query | `string` | no | `desc` | – | Sort direction. Allowed values: `desc`, `asc`. |
| `limit` | query | `integer` | no | `20` | 1–100; format: int32 | Page size, from 1 to 100. Default 20. Follow `has_more`, not the page size. |
| `cursor` | query | `string` | no | – | ≤ 1024 characters | Opaque cursor from `next_cursor` of the previous page. Cursors are tied to the user, route, sort order and filters. |

## Response

### 200

A page of meetings.

- `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 `list`.
- `data` (array<object>, required): The items of this page.
  - `id` (string, required, 26–26 characters, pattern: ^mtg_[0-9A-Za-z]{22}$): Public meeting ID (`mtg_` prefix).
  - `object` (string, required): Always `meeting`.
  - `title` (string, required): Meeting title.
  - `language` (string | null, required): Language code of the meeting, for example `lt`.
  - `status` (string, required): Derived status. Archived meetings keep the status of their latest processing run. Allowed values: `draft`, `recording`, `uploaded`, `processing`, `ready`, `failed`.
  - `archived` (boolean, required): Whether the meeting is archived.
  - `created_at` (string, required, ≤ 24 characters, format: date-time): When the meeting was created.
  - `updated_at` (string, required, ≤ 24 characters, format: date-time): When the meeting was last changed.
  - `started_at` (string | null, required, ≤ 24 characters, format: date-time): Real start time, or null while unknown. It is not aliased to `created_at`.
  - `duration_ms` (integer | null, required, 0–9007199254740991, format: int64): Duration in milliseconds, or null.
  - `web_url` (string, required, format: uri): Link to the meeting in the Diko app.
  - `processing` (object, required): Latest processing run.
    - `status` (string | null, required): Processing status, or null when no run exists. Allowed values: `queued`, `transcribing`, `diarizing`, `summarizing`, `complete`, `failed`, `canceled`.
    - `progress` (number | null, required, 0–1): Progress from 0 to 1, or null.
    - `error` (object | null, required): Error details when processing failed.
      - `code` (string, required): Stable error code. Unknown internal codes are reported as `internal_error`. Allowed values: `upload_unavailable`, `audio_invalid`, `audio_too_long`, `transcription_failed`, `transcription_timeout`, `provider_limit`, `canceled`, `internal_error`.
      - `message` (string, required): Explanation in the language of `Accept-Language`. Never an internal error text.
  - `transcript` (object, required): Transcript summary.
    - `status` (string, required): Transcript status. Allowed values: `none`, `processing`, `ready`.
    - `revision` (string | null, required): Opaque token that changes whenever any segment changes.
    - `segment_count` (integer, required, 0–2147483647, format: int32): Number of segments.
    - `has_pending_edits` (boolean, required): Whether grammar suggestions are waiting for approval in Diko.
  - `minutes` (object, required): Minutes summary.
    - `status` (string, required): Minutes status. Allowed values: `none`, `generating`, `ready`, `failed`, `insufficient`, `unavailable`.
    - `version` (integer | null, required, 0–2147483647, format: int32): Version number of the latest ready minutes.
    - `verification_status` (string | null, required): Result of the evidence check: verified, repaired after a second pass, or unverified. Allowed values: `verified`, `repaired`, `unverified`.
  - `participants` (array<object>, optional): Participants. Only in the single-meeting response.
    - `id` (string, required, 26–26 characters, pattern: ^prt_[0-9A-Za-z]{22}$): Public participant ID (`prt_` prefix).
    - `object` (string, required): Always `participant`.
    - `name` (string | null, required): Participant name.
    - `email` (string | null, required): Participant e-mail address, if known.
    - `role` (string | null, required): Participant role, if known.
  - `speakers` (array<object>, optional): Speakers. Only in the single-meeting response.
    - `id` (string, required, 26–26 characters, pattern: ^spk_[0-9A-Za-z]{22}$): Public speaker ID (`spk_` prefix).
    - `object` (string, required): Always `speaker`.
    - `label` (string, required): Automatic label such as `SPEAKER_00`.
    - `name` (string | null, required): Name assigned to the speaker, if any.
  - `counts` (object, optional): Counts. Only in the single-meeting response.
    - `participants` (integer, required, 0–2147483647, format: int32): Number of participants.
    - `speakers` (integer, required, 0–2147483647, format: int32): Number of speakers.
    - `action_items` (integer, required, 0–2147483647, format: int32): Number of action items.
    - `comments` (integer, required, 0–2147483647, format: int32): Number of comments.
- `has_more` (boolean, required): Whether more items follow. Keep paging while this is true.
- `next_cursor` (string | null, required, ≤ 1024 characters): Cursor for the next page, or null when `has_more` is false.

```json
{
  "object": "list",
  "data": [
    {
      "id": "mtg_5uF4g2Xu1i0qz3yAp0CP7W",
      "object": "meeting",
      "title": "Pardavimų aptarimas",
      "language": "lt",
      "status": "ready",
      "archived": false,
      "created_at": "2026-10-11T08:00:00.000Z",
      "updated_at": "2026-10-11T09:30:00.000Z",
      "started_at": null,
      "duration_ms": 3541000,
      "web_url": "https://studio.diko.app/meetings/c2171dae-bbc2-53b3-92b9-ba8c37850ff6",
      "processing": {
        "status": "complete",
        "progress": 1,
        "error": null
      },
      "transcript": {
        "status": "ready",
        "revision": "r_1bedcb71b3a1fdc6bfeeb92054fc6f92",
        "segment_count": 412,
        "has_pending_edits": false
      },
      "minutes": {
        "status": "ready",
        "version": 2,
        "verification_status": "verified"
      }
    }
  ],
  "has_more": false,
  "next_cursor": null
}
```

## Examples

**cURL**

```bash
curl "https://api.diko.app/api/v1/meetings?status=ready&limit=20" \
  -H "Authorization: Bearer $DIKO_API_KEY"
```

**Python**

```python
import os

import requests

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

**TypeScript**

```typescript
const response = await fetch("https://api.diko.app/api/v1/meetings?status=ready&limit=20", {
  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? |
|---|---|---|---|
| 400 | [`invalid_parameter`](https://diko.app/en/api-docs/errors.md#invalid_parameter) | A path, query or body parameter has an invalid value, a required field is missing or a field is unknown (unknown fields are rejected). `error.param` names the parameter. | no |
| 400 | [`invalid_cursor`](https://diko.app/en/api-docs/errors.md#invalid_cursor) | The `cursor` is corrupted or was issued for another user, route, sort order or set of filters. | no |
| 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 |
| 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 |
