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.

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 webhook deliveries are retried using exponential backoff over a 24-hour period. A slow or failed response can trigger a retry for an event you already processed, so deduplicate on event_id if handling an event twice would cause problems.

Manage webhook endpoints

List the endpoints your key can manage. A personal key sees the endpoints you created; a workspace key (or a workspace admin on Enterprise) sees every endpoint in the workspace:
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, Delete webhook endpoint.