Skip to main content
Webhooks notify your systems when notes change in Granola, so you don’t have to poll the API. You register an HTTPS URL as a webhook endpoint; when a subscribed event occurs, Granola sends it an HTTP POST with a small JSON payload, and you fetch the latest data through the Granola API. Webhooks are available on Business and Enterprise plans.

Set up a webhook endpoint

You’ll need a Granola API key. A webhook endpoint uses the same access scopes as API keys; the scopes control which notes it receives events for: Register your endpoint with Create webhook endpoint:
The signing_secret is returned only in this response and cannot be retrieved later. Store it securely. You need it to verify that deliveries came from Granola.
The URL must be HTTPS and publicly reachable; addresses on private networks are rejected. events chooses which events the endpoint receives; omit it to subscribe to all events. On Enterprise plans, workspace admins control which scopes members can use in Settings → Workspace → General → API access for members, the same controls that govern API keys.

Filter by folder

Pass folder_ids to receive events only for notes in those folders (or their subfolders), instead of every note matching scopes. Find folder IDs with List folders.
Make sure scopes matches the folder’s visibility: include personal for a private folder, public for a workspace-visible one.

Events

Each way a note can change has its own event. Your endpoint receives the events it subscribed to, for notes in its scope: note.generated is sent only when a note’s first summary is generated while your endpoint can access it. If an already-generated note is later shared with you, your endpoint receives note.access_granted instead. Subscribe to both events when using webhooks to discover notes. An example payload:
note.edited payloads also include a data object with changed_fields, the note fields that changed. Currently this is always ["summary"]. Payloads carry no note content. When you receive one, fetch the note with your API key. Access checks apply at fetch time, so a delivery never exposes more than the API would.

Verify deliveries

Every delivery is signed following the Standard Webhooks specification, so you can verify it with any Standard Webhooks library, or a few lines of code. The signature is an HMAC-SHA256 of {webhook-id}.{webhook-timestamp}.{body}, keyed with your signing secret (base64-decoded, after the whsec_ prefix). Sample code for verifying it yourself:
Compute the signature over the raw request body and parse the JSON only after verifying. To protect against replayed deliveries, reject requests whose webhook-timestamp is more than a few minutes old.

Deliveries and retries

Your endpoint has 15 seconds to respond, so acknowledge with a 2xx before any heavy processing. Failed deliveries are retried with exponential backoff for four days. Retries reuse event_id, which can be used to deduplicate deliveries. After repeated failures with no success for four days, Granola disables the endpoint and emails its creator or workspace admins. Events missed while disabled are not replayed. Restore the receiver, then re-enable the endpoint in Settings → Connectors → Webhooks.

Manage webhook endpoints

List the endpoints your key can manage. A personal key sees the endpoints you created; a workspace admin on Enterprise sees every endpoint in the workspace:
created_by is null when the endpoint creator’s account was deleted.
The signing secret is never included in list responses; it’s shown once, on creation.
Delete an endpoint to stop its deliveries immediately:
See the API reference for full request and response schemas: Create webhook endpoint, List webhook endpoints, Update webhook endpoint, Delete webhook endpoint.