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

# Granola Integration for AI Agents & Workflows

> Retrieve meeting notes, summaries, attendees, calendar details, and transcripts from Granola.

{/* Self-hosted logo — build-time vendored from modulex.json / Iconify (see scripts/lib/logo.js). */}

<img src="https://mintcdn.com/modulexaillc/df8MOr-hXotYLTh5/logos/placeholder.svg?fit=max&auto=format&n=df8MOr-hXotYLTh5&q=85&s=a4046f9cd6d738c81259050e9833913c" alt="Granola logo" width="72" height="72" data-path="logos/placeholder.svg" />

## Overview

Add **Granola** to any ModuleX agent or workflow. Retrieve meeting notes, summaries, attendees, calendar event details, and transcripts from Granola through its REST API (`public-api.granola.ai`).

<Info>
  **Categories**: Productivity & Collaboration · Meeting · Note Taking · **Auth**: API Key · **Actions**: 3
</Info>

## Authentication

### API Key Authentication

Authenticate using your Granola API key

<Steps>
  <Step title="Step 1">
    Open Granola and go to Settings (a Business plan is required)
  </Step>

  <Step title="Step 2">
    Navigate to the API / Developer section
  </Step>

  <Step title="Step 3">
    Create a new API key and copy it
  </Step>

  <Step title="Step 4">
    Paste the API key below
  </Step>
</Steps>

#### Required Credentials

| Field           | Description          | Required | Format                         |
| --------------- | -------------------- | -------- | ------------------------------ |
| Granola API Key | Your Granola API key | Yes      | `grn_xxxxxxxxxxxxxxxxxxxxxxxx` |

## Available Actions

<AccordionGroup>
  <Accordion title="list_notes — Lists meeting notes from Granola with optional date filters and pagination.">
    ### Parameters

    <ResponseField name="created_before" type="string">
      Return notes created before this date (ISO 8601)
    </ResponseField>

    <ResponseField name="created_after" type="string">
      Return notes created after this date (ISO 8601)
    </ResponseField>

    <ResponseField name="updated_after" type="string">
      Return notes updated after this date (ISO 8601)
    </ResponseField>

    <ResponseField name="folder_id" type="string">
      Return notes in this folder and its child folders (e.g., fol\_4y6LduVdwSKC27)
    </ResponseField>

    <ResponseField name="cursor" type="string">
      Pagination cursor from a previous response
    </ResponseField>

    <ResponseField name="page_size" type="integer">
      Number of notes per page (1-30, default 10)
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "NoteSummary": {
          "additionalProperties": false,
          "description": "A single note row in ``list_notes``.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Title"
            },
            "owner_name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Owner Name"
            },
            "owner_email": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Owner Email"
            },
            "created_at": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Created At"
            },
            "updated_at": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Updated At"
            }
          },
          "title": "NoteSummary",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "notes": {
          "items": {
            "$ref": "#/$defs/NoteSummary"
          },
          "title": "Notes",
          "type": "array"
        },
        "has_more": {
          "default": false,
          "title": "Has More",
          "type": "boolean"
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Cursor"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListNotesOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="get_note — Retrieves a specific meeting note from Granola by ID, including summary, attendees, calendar event details, and optionally the transcript.">
    ### Parameters

    <ResponseField name="note_id" type="string" required>
      The note ID (e.g., not\_1d3tmYTlCICgjy)
    </ResponseField>

    <ResponseField name="include_transcript" type="boolean">
      Whether to include the meeting transcript (Default: `false`)
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "Attendee": {
          "additionalProperties": false,
          "description": "A meeting attendee in ``get_note``.",
          "properties": {
            "name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Name"
            },
            "email": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Email"
            }
          },
          "title": "Attendee",
          "type": "object"
        },
        "FolderRef": {
          "additionalProperties": false,
          "description": "A folder reference.\n\nUsed both for a note's folder memberships in ``get_note`` (id, name)\nand for the workspace folder listing in ``list_folders``\n(id, name, parent_folder_id).",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Name"
            },
            "parent_folder_id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Parent Folder Id"
            }
          },
          "title": "FolderRef",
          "type": "object"
        },
        "TranscriptSegment": {
          "additionalProperties": false,
          "description": "A single transcript entry in ``get_note``.",
          "properties": {
            "speaker": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Speaker"
            },
            "speaker_label": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Speaker Label"
            },
            "text": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Text"
            },
            "start_time": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Start Time"
            },
            "end_time": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "End Time"
            }
          },
          "title": "TranscriptSegment",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Id"
        },
        "title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Title"
        },
        "owner_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Owner Name"
        },
        "owner_email": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Owner Email"
        },
        "created_at": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Created At"
        },
        "updated_at": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Updated At"
        },
        "web_url": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Web Url"
        },
        "summary_text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Summary Text"
        },
        "summary_markdown": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Summary Markdown"
        },
        "attendees": {
          "items": {
            "$ref": "#/$defs/Attendee"
          },
          "title": "Attendees",
          "type": "array"
        },
        "folders": {
          "items": {
            "$ref": "#/$defs/FolderRef"
          },
          "title": "Folders",
          "type": "array"
        },
        "calendar_event_title": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Calendar Event Title"
        },
        "calendar_organiser": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Calendar Organiser"
        },
        "calendar_event_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Calendar Event Id"
        },
        "scheduled_start_time": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Scheduled Start Time"
        },
        "scheduled_end_time": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Scheduled End Time"
        },
        "invitees": {
          "items": {
            "type": "string"
          },
          "title": "Invitees",
          "type": "array"
        },
        "transcript": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/TranscriptSegment"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Transcript"
        }
      },
      "required": [
        "success"
      ],
      "title": "GetNoteOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="list_folders — Lists folders from Granola, sorted alphabetically, with pagination.">
    ### Parameters

    <ResponseField name="cursor" type="string">
      Pagination cursor from a previous response
    </ResponseField>

    <ResponseField name="page_size" type="integer">
      Number of folders per page (1-30, default 10)
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "FolderRef": {
          "additionalProperties": false,
          "description": "A folder reference.\n\nUsed both for a note's folder memberships in ``get_note`` (id, name)\nand for the workspace folder listing in ``list_folders``\n(id, name, parent_folder_id).",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Name"
            },
            "parent_folder_id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Parent Folder Id"
            }
          },
          "title": "FolderRef",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "folders": {
          "items": {
            "$ref": "#/$defs/FolderRef"
          },
          "title": "Folders",
          "type": "array"
        },
        "has_more": {
          "default": false,
          "title": "Has More",
          "type": "boolean"
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Cursor"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListFoldersOutput",
      "type": "object"
    }
    ```
  </Accordion>
</AccordionGroup>

## Limits & Quotas

* The API only returns notes that have a generated AI summary and
  transcript; notes still processing or never summarized are omitted
  from list responses and return `404` on direct access.
* `page_size` accepts `1-30` (default `10`) for `list_notes` and
  `list_folders`.
* Rate limits are applied per user or workspace depending on the key's
  access scope; exceeding them returns `429 Too Many Requests`.
* **Error model**: non-2xx responses and timeouts are caught and
  returned as `success=False` + `error` rather than raising. Plan for
  retries on the agent side based on the error string.

## Related integrations

<CardGroup cols={3}>
  <Card title="Grain" href="/integrations/tools/grain" />

  <Card title="Obsidian" href="/integrations/tools/obsidian" />

  <Card title="Reflect" href="/integrations/tools/reflect" />
</CardGroup>

## Links

* [Granola](https://granola.ai)
