> ## Documentation Index
> Fetch the complete documentation index at: https://miniti.app/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# api and mcp

> read your meetings from scripts, claude code, cursor, claude.ai and chatgpt

from v3.0.0, meetings in the cloud can be read by your own tools. there is a rest api at `https://api.miniti.app/api/v1` and an mcp server at `https://api.miniti.app/api/mcp`. both are read only.

you need [cloud sync](/docs/features/cloud-sync) on, which means pro on a managed account. only meetings that are in the cloud are visible; a meeting kept off the cloud or recorded in private mode is not.

## personal access tokens

tokens are for scripts, claude code and cursor. apps like claude.ai and chatgpt sign in with your email instead; see [oauth](#oauth-for-claudeai-chatgpt-and-cursor).

1. open **settings → cloud → api access**
2. choose **new token**, give it a name such as `laptop`, and confirm
3. copy it now. it is shown once and starts with `mnt_`

the list shows each token's name, prefix, creation date and last use. **revoke** stops a token at once. an account can hold up to 20 live tokens. every token stops working when pro lapses, when you use **delete cloud copy**, or when you delete the account.

treat a token like a password. anyone who has it can read every meeting in your cloud.

## rest api

send the token as a bearer header. responses are json; errors have the shape `{ "error": "...", "message": "..." }`.

```bash theme={null}
curl -H "Authorization: Bearer mnt_..." \
  "https://api.miniti.app/api/v1/meetings?q=pricing&since=2026-09-01T00:00:00Z&limit=5"
```

| route | query | returns |
| - | - | - |
| `GET /api/v1/me` | | `account_id`, `tier`, `meeting_count`, the token's `scopes` and `client_id` |
| `GET /api/v1/meetings` | `since`, `until` (iso 8601, on the start time), `q` (words, searched across title, summary, notes and transcript), `cursor`, `limit` (1 to 100, default 25) | `meetings` (summaries, newest first, no transcript) and `next_cursor` (null on the last page) |
| `GET /api/v1/meetings/{id}` | | the full meeting: the same keys as the [webhook payload](/docs/integrations/webhooks#payload), with `transcript`, `speaker_names`, `meddpicc`, `questions`, `docs` (playbook cards), `template`, `attendees` and `pinned` |
| `GET /api/v1/meetings/{id}/transcript` | `format` = `json` (default), `markdown` or `srt` | json: `{ id, transcript: [{ speaker, text, timestamp }] }`. markdown: the meeting export. srt: subtitle cues |
| `GET /api/v1/action-items` | `since`, `limit` (1 to 100, default 25) | `action_items`: one entry per meeting that has items, with `meeting_id`, `title`, `date` and the items |

the search in `q` works like a web search: every word has to match. speaker labels in the transcript are the names you set, `you` for your own voice, and `speaker 2` style labels otherwise.

### errors

| status | error | meaning |
| - | - | - |
| 401 | `invalid_token` | missing, unknown or revoked token |
| 401 | `token_expired` | an oauth access token past its hour; the app refreshes it |
| 402 | `pro_required` | the account is not pro |
| 403 | `insufficient_scope` | the token cannot do this; every token is read only today |
| 404 | `not_found` | unknown or deleted meeting |
| 429 | `rate_limited` | slow down. the `Retry-After` header says how long |
| 503 | `cloud_unavailable` | cloud is switched off on the server |

## mcp server

the mcp server speaks streamable http at `https://api.miniti.app/api/mcp`. every tool is read only and returns the same json as the rest api, so a model sees exactly what a script sees. the server never summarises for you; it hands the transcript to whichever model asked.

| tool | input | returns |
| - | - | - |
| `list_meetings` | `since`, `until`, `query`, `limit`, all optional | meeting summaries, newest first |
| `get_meeting` | `id`, `include_transcript` (default false) | the full meeting. without the transcript, `transcript_available` says whether there is one |
| `search_meetings` | `query`, `limit` | summaries that match the words |
| `get_transcript` | `id`, `format` = `json`, `markdown` or `srt` | the transcript |
| `get_action_items` | `since`, `limit` | action items per meeting |

there is also a resource, `miniti://meetings/{id}`, for clients that read resources.

### claude code

```bash theme={null}
claude mcp add --transport http miniti https://api.miniti.app/api/mcp \
  --header "Authorization: Bearer mnt_..."
```

then ask claude code about a meeting: "what did we agree with sasha last week?" it calls `search_meetings` and `get_transcript` as needed.

### cursor

add the server to `.cursor/mcp.json` in a project, or to `~/.cursor/mcp.json` for every project:

```json theme={null}
{
  "mcpServers": {
    "miniti": {
      "url": "https://api.miniti.app/api/mcp",
      "headers": { "Authorization": "Bearer mnt_..." }
    }
  }
}
```

cursor can also connect without a token: leave out `headers` and it opens the sign-in page described below.

### claude.ai

1. add an email in **settings → cloud** if you have not yet, and confirm it from your inbox
2. in claude.ai, open settings → connectors and add a custom connector with the url `https://api.miniti.app/api/mcp`
3. claude.ai sends you to `api.miniti.app/signin`. enter the email, open the link it sends you, and approve the connection
4. the connector appears in **settings → cloud → connected apps** in the app

### chatgpt

the same steps, with chatgpt's connector settings in place of claude.ai's: add the mcp url as a custom connector, sign in with the email link, approve.

## oauth for claude.ai, chatgpt and cursor

hosted apps cannot be given a token by hand, so they use oauth. the flow, in plain words:

1. the app asks the mcp server and is told where to sign in
2. you sign in at `https://api.miniti.app/signin` with a link sent to your account email. the link lasts 15 minutes and works once; the browser session lasts 30 days
3. a consent page names the app, says it will read meetings, and shows how many meetings are in your cloud. choose **approve** or **deny**
4. the app receives a short-lived access token (1 hour) and a refresh token. it refreshes on its own; you do not sign in again until you disconnect

the app never sees your email or password; there is no password. it only ever holds its own tokens, and those are read only.

**disconnect** next to the app in settings → cloud revokes its access at once. removing the email from the account disconnects every app and ends every browser session.

## scopes

one scope exists today, `meetings:read`. nothing can create, edit or delete a meeting through the api or mcp. a write scope may come later.

## rate limits

* 60 requests per minute per token or connected app, shared between the rest api and the mcp server
* a `429` carries `Retry-After` in seconds

## what is visible

* only finished meetings that are in the cloud. the live recording is never visible
* meetings kept off the cloud, and meetings recorded in private mode, are not in the cloud and not visible
* a deleted meeting disappears from the api at once
* the full transcript, insights, notes, attendees and speaker names. anything you can see in the app, minus audio and coaching numbers

## see also

* [cloud sync](/docs/features/cloud-sync)
* [webhooks](/docs/integrations/webhooks) for the payload shape, which the api shares
* [account and recovery key](/docs/reference/account-and-recovery-key)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.