The connector only reads data. It never creates, changes or deletes anything in Granola.
Configuring Granola as a Source
In the Sources tab, click on the “Add source” button located on the top right of your screen. Then, select the Granola option from the list of connectors. Click Next and you’ll be prompted to add your access.1. Add account access
The connector signs in with a Granola API key. API keys are available on Granola Business and Enterprise plans. The key decides which notes the connector can read. There are two kinds of key:- Personal API key (any workspace member): when you create it, choose its access scopes. Personal notes gives access to the notes you own, notes shared directly with you and notes in private folders shared with you. Public notes gives access to the notes visible to everyone in the workspace, such as the notes in the Team space. Select both to read both.
- Workspace API key (workspace admins only): belongs to the workspace instead of a person and never expires. It reads the public notes plus the notes of every space that has Allow Granola API access turned on.
- Open the Granola desktop app.
- Go to Settings → Connectors → API keys and click Create new key.
- Choose the note access scopes the key should include and click Generate API Key.
- Copy the key (it starts with
grn_).
- API Key: The Granola API key (personal or workspace).
- Start Date (optional): On the first sync, only notes updated on or after this date are read (and audit events recorded after it). Leave it empty to read every note the key can access. Later syncs only read what changed since the previous one.
- Audit API Key (optional, advanced): Only needed for the Audit Events stream, on Enterprise plans. A workspace admin creates it in Settings → Connectors → Audit API keys. An Audit API key only reads the audit log, so the API Key above is still needed for the other streams. If you don’t use the audit log, leave it empty and don’t select Audit Events.
- Notes Time Budget (minutes) (advanced, default 180): The longest time an incremental sync spends reading notes. Each note needs its own requests and Granola allows 5 requests per second, so catching up after a long pause can take a while. When the budget is reached, the sync stops between two notes, keeps everything it read, and the next sync continues from there (oldest notes first). It never cuts the first sync or a full sync: those always read every note, so on large workspaces use the Start Date to keep the first sync short.
2. Select streams
Choose which data streams you want to sync. For faster extractions, select only the streams that are relevant to your analysis. You can select entire groups of streams or pick specific ones.Tip: The stream can be found more easily by typing its name.Select the streams and click Next.
3. Configure data streams
Customize how you want your data to appear in your catalog. Select the desired layer where the data will be placed, a folder to organize it inside the layer, a name for each table (which will effectively contain the fetched data) and the type of sync.- Layer: choose between the existing layers on your catalog. This is where you will find your new extracted tables as the extraction runs successfully.
- Folder: a folder can be created inside the selected layer to group all tables being created from this new data source.
- Table name: we suggest a name, but feel free to customize it. You have the option to add a prefix to all tables at once and make this process faster!
- Sync Type: you can choose between INCREMENTAL and FULL_TABLE.
- Incremental: every time the extraction happens, we’ll get only the new data, which is good if, for example, you want to keep every record ever fetched.
- Full table: every time the extraction happens, we’ll get the current state of the data, which is good if, for example, you don’t want to have deleted data in your catalog.
4. Configure data source
Describe your data source for easy identification within your organization, not exceeding 140 characters. To define your Trigger, consider how often you want data to be extracted from this source. This decision usually depends on how frequently you need the new table data updated (every day, once a week, or only at specific times). Optionally, you can define some additional settings:- Configure Delta Log Retention and determine for how long we should store old states of this table as it gets updated. Read more about this resource here.
- Determine when to execute an Additional Full Sync. This will complement the incremental data extractions, ensuring that your data is completely synchronized with your source every once in a while. For Granola we recommend a weekly full sync of Notes, or monthly on large workspaces (see Data Quality Considerations).
5. Check your new source
You can view your new source on the Sources page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.Streams and Fields
Available streams
The table below lists every stream, its slug (the exact identifier to pass when creating the source via API) and a short description.Granola only shares notes that already have a generated AI summary and transcript: a meeting that is still being processed appears on a later sync. Nested information (the calendar event, attendees, photos, folder and space membership, audit details) comes as JSON text; the most useful parts are also separate columns.
Joining transcripts and attendees to notes
Note Transcripts and Note Attendees are updated together with their note. When a note changes and its new version has fewer transcript lines or fewer attendees, the rows it no longer has cannot be removed from your tables by an incremental sync: they stay, with the oldernote_updated_at. Every row of the current version has note_updated_at equal to the note’s updated_at, so always join on both columns to get exactly the current transcript and attendees:
JOIN note_attendees AS a ON a.note_id = n.id AND a.note_updated_at = n.updated_at.
Fields by stream
Notes
Notes
Notes
Every note the API key can access that has a generated AI summary. Incremental by last update.Table:
notes · Primary key: id · Sync: Incremental (updated_at)Note Transcripts
Note Transcripts
The transcript of each note, one row per line. Read page by page with each note that changed.Table:
note_transcripts · Primary key: note_id, item_index · Sync: Incremental (note_updated_at)Note Attendees
Note Attendees
The attendees of each note, one row per attendee. Read together with the note, with no extra request.Table:
note_attendees · Primary key: note_id, email · Sync: Incremental (note_updated_at)Organisation
Folders
Folders
Every folder the API key can access. Read in full on every sync.Table:
folders · Primary key: id · Sync: Full tableSpaces
Spaces
Every space the API key can access. Read in full on every sync.Table:
spaces · Primary key: id · Sync: Full tableAudit log
Audit Events
Audit Events
The workspace audit log: who did what and when (sign-ins, note views, sharing changes, members joining or leaving, API and MCP use). Enterprise plans only, read with the Audit API Key. Granola keeps one year of events.Table:
audit_events · Primary key: id · Sync: Incremental (collected_at)Implementation Notes
Data Quality Considerations
- What the key can see is what you get. Notes, folders and spaces depend on the key’s access scopes and on the spaces with Granola API access turned on. Private notes typed by the owner are only filled when the key belongs to the note’s owner.
- Incremental syncs read the notes updated since the previous sync, with one extra day of overlap for notes edited offline. Notes already loaded and not changed since are not read again.
- Notes shared late. A note shared with you long after its last edit (or a space whose Granola API access is turned on later) may keep its old update date and be missed by incremental syncs. Finding them on every sync would mean listing every note each time, so instead schedule an Additional Full Sync of Notes (weekly, or monthly on large workspaces) to pick them up.
- Long catch-ups continue over several syncs. When an incremental sync reaches the Notes Time Budget, it stops between two notes, keeps what it read and tells you in the sync log; the next sync continues with the rest, oldest notes first. The first sync and full syncs are never cut: they read every note (or every note since the Start Date) in one go, and if one fails the next attempt starts over.
- Transcripts and attendees are refreshed with their note. When a note changes, its transcript and attendees are read again. A line or attendee removed in Granola stays in your table with an older
note_updated_atuntil a full sync: join onnote_updated_atas shown in Joining transcripts and attendees to notes. - Transcripts can be deleted by Granola. If your workspace deletes transcripts automatically after a period, notes older than that period have no transcript; the sync log tells you how many notes came without one.
- Deleted notes appear with
deleted_atfilled only for keys with access to all workspace notes. When Granola no longer shares the content of a deleted note, the row keeps its title, owner and dates andcontent_availableis false. - Folders and Spaces are read completely before anything is loaded: a sync that fails halfway leaves the previous table in place. If one of them comes back completely empty after a sync that had records, that stream fails and its table is left as it was.
API Limits & Performance
- Granola allows 5 requests per second per user or workspace (shared with your other Granola API integrations). The connector reads one request at a time below that limit and, when Granola asks it to slow down, waits as long as Granola says.
- Each note needs one request for its details, plus one request per 100 transcript lines. As a reference, a first sync of 1,000 one-hour meetings takes roughly half an hour to an hour. Set a Start Date to shorten the first sync and full syncs; later syncs only read what changed.
Troubleshooting
Skills for agents
Download Granola skills file
Granola connector documentation as plain markdown, for use in AI agent contexts.