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

# Granola API

> Granola API documentation. Programmatic access to meeting notes, transcripts, and AI summaries.

The Granola API provides programmatic access to your workspace's meeting notes and related data. This RESTful API enables you to integrate Granola with your existing tools, build custom workflows, and extract insights from your meeting documentation.

## API Key Types

There are two types of API, with different scopes:

| Key type                    | Who can create       | Plan required          | What it can access                                                                      |
| --------------------------- | -------------------- | ---------------------- | --------------------------------------------------------------------------------------- |
| **Personal API key** (Beta) | Any workspace member | Business or Enterprise | Notes you own, notes directly shared with you, notes in private folders shared with you |
| **Enterprise API key**      | Workspace admin      | Enterprise             | All notes in the Team space                                                             |

On Enterprise plans, workspace admins can enable or disable Personal API key creation for their workspace in **Settings → Workspace**.

## Obtaining an API Key

1. Open the Granola desktop app
2. Navigate to **Settings → Connectors → API keys**
3. Click **Create new key**
4. Choose a key type (if prompted) and click **Generate API Key**

<Note>
  On Enterprise plans, Personal API key creation must be enabled by a workspace admin via the "Allow personal API keys" toggle in **Settings → Workspace**.
</Note>

## Revoking an API Key

To revoke an API key:

1. Go to **Settings → Connectors → API keys**
2. Find the key you want to revoke and click **Revoke**
3. Confirm in the dialog

Once revoked, the key is permanently disabled and moves to the **Revoked** section of the table. This cannot be undone.

## Quick Start

```bash theme={null}
# List notes created this week
$ curl "https://public-api.granola.ai/v1/notes?created_after=$(date -u -v-7d +%Y-%m-%dT%H:%M:%SZ)" \
  -H "Authorization: Bearer grn_YOUR_API_KEY"
{
  "notes": [ ... ],
  "hasMore": true,
  "cursor": "eyJjcmVkZW50aWFsfQ=="
}

# Get the next page using the cursor
$ curl "https://public-api.granola.ai/v1/notes?created_after=$(date -u -v-7d +%Y-%m-%dT%H:%M:%SZ)&cursor=eyJjcmVkZW50aWFsfQ==" \
  -H "Authorization: Bearer grn_YOUR_API_KEY"
{
  "notes": [
    { "id": "not_1d3tmYTlCICgjy", "title": "Quarterly yoghurt budget review", ... },
    ...
  ],
  "hasMore": false
}

# Get that note with its transcript
# (use the not_ ID from the list response, not a UUID)
$ curl "https://public-api.granola.ai/v1/notes/not_1d3tmYTlCICgjy?include=transcript" \
  -H "Authorization: Bearer grn_YOUR_API_KEY"
{
  "id": "not_1d3tmYTlCICgjy",
  "title": "Quarterly yoghurt budget review",
  "owner": { "name": "Oat Benson", "email": "oat@granola.ai" },
  "summary": "The quarterly yoghurt budget review was a success. ...",
  "transcript": [
    { "speaker": { "source": "microphone" }, "text": "I'm done pretending. Greek is the only yoghurt that deserves us." },
    { "speaker": { "source": "speaker" }, "text": "Finally. Regular yoghurt is just milk that gave up halfway." }
  ],
  ...
}
```

<Info>
  This transcript example is from macOS. On macOS, transcript items can come
  from the local microphone or from other meeting audio, so you'll see
  `speaker.source = "microphone"` and `speaker.source = "speaker"`.
</Info>

For iOS transcripts, the shape is slightly different:

```json theme={null}
[
  {
    "speaker": { "source": "microphone", "diarization_label": "Speaker A" },
    "text": "I'm done pretending. Greek is the only yoghurt that deserves us."
  },
  {
    "speaker": { "source": "microphone", "diarization_label": "Speaker B" },
    "text": "Finally. Regular yoghurt is just milk that gave up halfway."
  }
]
```

<Info>
  On iOS, Granola currently returns `speaker.source = "microphone"` because the
  app currently captures a single audio stream. Clients should not assume that
  will never expand in the future. When diarization is available,
  `diarization_label` carries the anonymous `Speaker A/B/...` bucket.
</Info>

<Info>
  The API only returns notes that have a **generated AI summary and transcript**. Notes that are still being processed or were never summarized won't appear in responses — the List Notes endpoint excludes them, and the Get Note endpoint returns a 404.
</Info>

## Rate Limits

Rate limits are applied per workspace to ensure fair usage and platform stability. For Personal API keys, rate limits are applied per user.

| Metric         | Value                          |
| -------------- | ------------------------------ |
| Burst capacity | 25 requests                    |
| Time window    | 5 seconds                      |
| Sustained rate | 5 requests/second (300/minute) |

When rate limits are exceeded, the API returns a `429 Too Many Requests` response.
