Skip to main content
Connect Granola to sync AI meeting notes and transcripts into your Supermemory knowledge base. The connector uses a Granola API key, so there is no OAuth redirect flow.
The Granola connector requires a Max Plan or higher in Supermemory and a Granola plan that can create API keys. In Granola, create one from Settings > Connectors > API keys.

Quick Setup

From the Console

  1. Open the Supermemory Console.
  2. Go to Connectors.
  3. Find the Granola row and click Connect.
  4. Paste your Granola API key.
  5. Optionally set a document limit and container tag.
  6. Click Connect.
The console creates the connection and starts the initial sync automatically.
The console limits connector setup to 500 documents. Use the API setup below for higher documentLimit values, up to 10,000.

With the API

import Supermemory from 'supermemory';

const client = new Supermemory({
  apiKey: process.env.SUPERMEMORY_API_KEY!
});

const connection = await client.connections.create('granola', {
  metadata: {
    apiKey: process.env.GRANOLA_API_KEY!
  },
  containerTags: ['org-123', 'meeting-notes'],
  documentLimit: 1000
});

console.log('Granola connection:', connection.id);
Supermemory validates the Granola API key before creating the connection. The initial sync starts automatically after the connection is created.

Configuration Options

For Granola, provider-specific fields are passed inside the top-level metadata object. General connection options stay top-level.
ParameterLocationRequiredDescription
apiKeymetadata.apiKeyYesGranola API key from Settings > Connectors > API keys
containerTagstop-levelNoTags for organizing imported notes by user, organization, project, or tenant
documentLimittop-levelNoMaximum notes to sync per connection (default: 10,000)
In the Python SDK, use container_tags and document_limit for top-level options, but keep the Granola metadata key in camelCase: apiKey.

What Gets Synced

Granola notes are synced as markdown documents. Each document can include:
  • Note title
  • Meeting time, attendees, and meeting URL when Granola returns them
  • AI-generated summary when present
  • Full transcript when present

Document Metadata

Each synced note includes searchable metadata:
FieldDescription
typeAlways granola
titleGranola note title
createdAtGranola note creation timestamp
updatedAtGranola note update timestamp
urlGranola note URL, when available
attendeesAttendee names or emails, when available
meetingStartCalendar event start time, when available
You can filter searches using these metadata fields:
const results = await client.search.documents({
  q: "customer onboarding discussion",
  containerTags: ['org-123'],
  filters: JSON.stringify({
    AND: [
      { key: "type", value: "granola", negate: false },
      { key: "attendees", value: "alex@company.com", negate: false }
    ]
  })
});

Connection Management

Delete Connection

await client.connections.deleteByID('conn_granola_abc123');
By default, deleting a connection removes all synced documents from Supermemory. To keep documents, pass deleteDocuments=false as a query parameter: DELETE /v3/connections/:id?deleteDocuments=false

Manual Sync

await client.connections.import('granola', {
  containerTags: ['org-123']
});

Sync Behavior

FeatureBehavior
Initial syncFetches Granola notes up to documentLimit
Incremental syncUses Granola updated_at timestamps to fetch notes changed since the previous sync
Transcript handlingFetches each note with transcript content included
Sync scheduleInitial sync after connection creation + manual triggers
Document limit10,000 notes per connection (default)

Troubleshooting

ErrorSolution
Granola API key is requiredInclude a non-empty metadata.apiKey value when creating the connection
Granola API key is invalidCreate a new key in Granola and reconnect
Could not reach Granola APIRetry after checking Granola API availability and network access
Missing notesCheck documentLimit; if the workspace has more notes than the limit, only notes up to the limit are imported