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

# Audit events reference

> Every action GET /v1/audit can return, and what each one records.

`GET /v1/audit` returns only the actions listed below, grouped by what they act on. Each one lists the fields its `data` carries. Every field an action declares is always present in `data`: one marked nullable is `null` whenever Granola had nothing to record for it, and any field reads as `null` rather than being dropped if the value it recorded could not be read back. Read the [Audit API overview](/audit) first for access, rotation and pagination.

## Sign-in and sessions

### `auth.calendar_linked`

A member connected a calendar account to Granola, with the access the provider granted.

| Field           | Type                        |
| --------------- | --------------------------- |
| `userId`        | User ID (`usr_…`)           |
| `oauthProvider` | String (nullable)           |
| `grantedScopes` | Array of strings (nullable) |

### `auth.login`

A member signed in, with how they authenticated and from which client.

| Field                  | Type                                                                  |
| ---------------------- | --------------------------------------------------------------------- |
| `userId`               | User ID (`usr_…`)                                                     |
| `authenticationMethod` | String, one of `sso`, `oauth`                                         |
| `provider`             | String                                                                |
| `oauthProvider`        | String (nullable)                                                     |
| `isSSOLogin`           | Boolean                                                               |
| `isFirstSSOLogin`      | Boolean                                                               |
| `isNewCustomer`        | Boolean                                                               |
| `platform`             | String                                                                |
| `location`             | String (nullable)                                                     |
| `deviceInfo`           | Object with `userAgent`, `platform`, `appVersion`, `isDev` (nullable) |

### `auth.login_failed`

A login attempt through this workspace's identity provider failed.

| Field                  | Type                          |
| ---------------------- | ----------------------------- |
| `authenticationMethod` | String, one of `oauth`, `sso` |
| `userEmail`            | String (nullable)             |
| `errorCode`            | String (nullable)             |

### `auth.logout`

A user logged out of Granola.

`data` is empty for this action.

### `auth.session_revoked`

One of a member's sign-in sessions, or all of them, were revoked, with the reason they ended.

| Field                 | Type                           |
| --------------------- | ------------------------------ |
| `userId`              | User ID (`usr_…`)              |
| `reason`              | String                         |
| `revokedSessionCount` | Number                         |
| `scope`               | String, one of `single`, `all` |

### `auth.sessions_revoked`

A member was signed out of every session because their connected calendar credentials stopped validating.

| Field    | Type              |
| -------- | ----------------- |
| `userId` | User ID (`usr_…`) |
| `reason` | String            |

## Billing

### `billing.subscription.canceled`

The workspace subscription was canceled, with the state it was in beforehand.

| Field               | Type                            |
| ------------------- | ------------------------------- |
| `previousState`     | Object with `status` (nullable) |
| `newState`          | Object with `status`            |
| `performedByUserId` | User ID (`usr_…`)               |

### `billing.subscription.seats_updated`

The number of seats on the workspace subscription changed.

| Field           | Type                           |
| --------------- | ------------------------------ |
| `previousState` | Object with `seats` (nullable) |
| `newState`      | Object with `seats`            |

### `billing.subscription.status_updated`

The workspace subscription's status changed, for example from active to past due.

| Field           | Type                            |
| --------------- | ------------------------------- |
| `previousState` | Object with `status` (nullable) |
| `newState`      | Object with `status`            |

## Chat follow-up emails

### `chat_follow_up_email.sent`

A member sent a follow-up email through Granola's chat assistant, with the number of direct, CC, and BCC recipients.

| Field            | Type              |
| ---------------- | ----------------- |
| `recipientCount` | Number (nullable) |
| `ccCount`        | Number (nullable) |
| `bccCount`       | Number (nullable) |

## Data exports

### `data_export.failed`

A requested data export failed after exhausting its retries. No download link was sent.

| Field      | Type                     |
| ---------- | ------------------------ |
| `exportId` | Data export ID (`dex_…`) |
| `format`   | String (nullable)        |

### `data_export.requested`

A workspace member requested an export of their notes from this workspace. It is generated in the background and emailed to them as a download link.

| Field                     | Type                     |
| ------------------------- | ------------------------ |
| `exportId`                | Data export ID (`dex_…`) |
| `format`                  | String                   |
| `documentCount`           | Number                   |
| `scheduledProcessingTime` | String                   |

### `data_export.succeeded`

A requested data export finished and its download link was emailed to the workspace member who asked for it.

| Field      | Type                     |
| ---------- | ------------------------ |
| `exportId` | Data export ID (`dex_…`) |
| `format`   | String                   |

## Notes

### `document.access_granted`

One or more users were given access to a note.

| Field            | Type                        |
| ---------------- | --------------------------- |
| `documentId`     | Note ID (`not_…`)           |
| `grantedUserIds` | Array of user IDs (`usr_…`) |
| `grantedEmails`  | Array of strings            |
| `role`           | String                      |
| `via`            | String                      |

### `document.access_revoked`

One or more users lost access to a note.

| Field            | Type                        |
| ---------------- | --------------------------- |
| `documentId`     | Note ID (`not_…`)           |
| `revokedUserIds` | Array of user IDs (`usr_…`) |

### `document.hard_deleted`

A note was permanently deleted, along with its transcript and chat history.

| Field             | Type              |
| ----------------- | ----------------- |
| `documentId`      | Note ID (`not_…`) |
| `deletedByUserId` | User ID (`usr_…`) |
| `softDeletedAt`   | String            |

### `document.moved_to_workspace`

A note was moved out of this workspace into another one, and dropped out of any folders or spaces it was in here.

| Field                  | Type                                              |
| ---------------------- | ------------------------------------------------- |
| `documentId`           | Note ID (`not_…`)                                 |
| `removedFromFolderIds` | Array of folder or space IDs (`fol_…` or `spa_…`) |

### `document.sharing_link_visibility_changed`

The sharing link visibility of a note was changed, which controls who can open the note from its link.

| Field                              | Type               |
| ---------------------------------- | ------------------ |
| `documentId`                       | Note ID (`not_…`)  |
| `previousVisibility`               | String (nullable)  |
| `newVisibility`                    | String (nullable)  |
| `hasShareableLink`                 | Boolean (nullable) |
| `requestedVisibility`              | String (nullable)  |
| `changeSource`                     | String             |
| `userDefaultSharingLinkVisibility` | String (nullable)  |

### `document.user_role_changed`

A user's role on a note was changed, for example from viewer to collaborator.

| Field          | Type              |
| -------------- | ----------------- |
| `documentId`   | Note ID (`not_…`) |
| `userId`       | User ID (`usr_…`) |
| `previousRole` | String            |
| `newRole`      | String            |

### `document.viewed`

A user opened a note and saw its content. `source` says where it was opened from. Only authenticated reads are recorded, from the desktop and web apps.

| Field            | Type                                                                                                               |
| ---------------- | ------------------------------------------------------------------------------------------------------------------ |
| `documentId`     | Note ID (`not_…`)                                                                                                  |
| `source`         | String, one of `meeting_mode`, `homescreen`, `folder`, `nub`, `deep_link`, `web`, `watch`, `share_link` (nullable) |
| `isOwner`        | Boolean (nullable)                                                                                                 |
| `linkVisibility` | String (nullable)                                                                                                  |

## Folders and spaces

### `document_list.deleted`

A folder or space was deleted. The notes it held are not deleted with it.

| Field            | Type                                    |
| ---------------- | --------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`) |
| `deletedAt`      | String                                  |

### `document_list.document_added`

A note was added to a folder or space.

| Field            | Type                                    |
| ---------------- | --------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`) |
| `documentId`     | Note ID (`not_…`)                       |
| `hasPanel`       | Boolean                                 |
| `listVisibility` | String                                  |

### `document_list.document_removed`

A note was removed from a folder or space.

| Field            | Type                                    |
| ---------------- | --------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`) |
| `documentId`     | Note ID (`not_…`)                       |

### `document_list.invite_created`

People without a Granola account were invited to a folder or space by email address. They get the invited role once they sign up.

| Field            | Type                                    |
| ---------------- | --------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`) |
| `emails`         | Array of strings                        |
| `role`           | String                                  |

### `document_list.invite_link_created`

A shareable invite link to a folder or space was created. Anyone holding the link can join with that link's role until it expires or is revoked.

| Field            | Type                                    |
| ---------------- | --------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`) |
| `expiresAt`      | String                                  |
| `role`           | String                                  |

### `document_list.invite_link_joined`

Someone joined a folder or space using a shareable invite link.

| Field            | Type                                    |
| ---------------- | --------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`) |
| `inviterUserId`  | User ID (`usr_…`)                       |

### `document_list.invite_link_revoked`

A shareable folder or space invite link was revoked and can no longer be used to join.

| Field            | Type                                    |
| ---------------- | --------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`) |

### `document_list.invite_role_changed`

The role a pending folder or space invitation will grant was changed.

| Field             | Type                                    |
| ----------------- | --------------------------------------- |
| `documentListId`  | Folder or space ID (`fol_…` or `spa_…`) |
| `email`           | String                                  |
| `previousRole`    | String                                  |
| `newRole`         | String                                  |
| `changedByUserId` | User ID (`usr_…`)                       |

### `document_list.member_added`

One or more users were given access to a folder or space.

| Field            | Type                                    |
| ---------------- | --------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`) |
| `userIds`        | Array of user IDs (`usr_…`)             |
| `emails`         | Array of strings                        |
| `role`           | String                                  |

### `document_list.member_removed`

One or more users lost access to a folder or space.

| Field            | Type                                    |
| ---------------- | --------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`) |
| `userIds`        | Array of user IDs (`usr_…`)             |
| `emails`         | Array of strings                        |

### `document_list.member_role_changed`

A member's role on a folder or space changed, for example from viewer to collaborator.

| Field             | Type                                    |
| ----------------- | --------------------------------------- |
| `documentListId`  | Folder or space ID (`fol_…` or `spa_…`) |
| `userId`          | User ID (`usr_…`)                       |
| `previousRole`    | String                                  |
| `newRole`         | String                                  |
| `changedByUserId` | User ID (`usr_…`)                       |

### `document_list.updated`

A folder or space was renamed, re-described, moved, or had its visibility changed. Only the keys that changed are present, and `changes` is an empty object when a change touched only keys this endpoint does not report — an icon-only edit, for instance. `title` and `description` report as `"[redacted]"` rather than their text: the edit is recorded, the wording is not. Either still reports `null` when the value was cleared.

| Field            | Type                                                                                                                        |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`)                                                                                     |
| `changes`        | Object with `title`, `description`, `visibility`, `sharing_link_visibility`, `is_default_folder`, `parent_document_list_id` |
| `previousValues` | Object with `title`, `description`, `visibility`, `sharing_link_visibility`, `is_default_folder`, `parent_document_list_id` |

## Follow-up emails

### `follow_up_email.retention_cleanup_run`

Granola's retention policy deleted follow-up emails in this workspace, with how many were removed.

| Field          | Type   |
| -------------- | ------ |
| `deletedCount` | Number |

### `follow_up_email.sent`

A member sent a follow-up email for a meeting from Granola's follow-up composer, with how many people it went to.

| Field               | Type               |
| ------------------- | ------------------ |
| `documentId`        | Note ID (`not_…`)  |
| `recipientCount`    | Number (nullable)  |
| `ccCount`           | Number (nullable)  |
| `bccCount`          | Number (nullable)  |
| `usedThread`        | Boolean            |
| `signatureIncluded` | Boolean (nullable) |

## Integrations

### `integration.attio_connected`

The Attio integration was connected.

| Field       | Type                                          |
| ----------- | --------------------------------------------- |
| `authScope` | String, one of `workspace`, `user` (nullable) |

### `integration.attio_disconnected`

The Attio integration was disconnected. Where Granola managed Attio lists for the workspace, the counts record what was removed.

| Field                     | Type                                          |
| ------------------------- | --------------------------------------------- |
| `integrationDeletedCount` | Number (nullable)                             |
| `listsDeletedCount`       | Number (nullable)                             |
| `authScope`               | String, one of `workspace`, `user` (nullable) |

### `integration.cloud_agent_disconnected`

A cloud connector was disconnected and its stored access tokens were revoked.

| Field                            | Type               |
| -------------------------------- | ------------------ |
| `connector`                      | String             |
| `googleRevoked`                  | Boolean (nullable) |
| `revokedTokenCount`              | Number (nullable)  |
| `lastAuthLoginProvider`          | String (nullable)  |
| `requiresGoogleReauthentication` | Boolean (nullable) |

### `integration.hubspot_connected`

The HubSpot integration was connected.

| Field       | Type                                          |
| ----------- | --------------------------------------------- |
| `authScope` | String, one of `workspace`, `user` (nullable) |

### `integration.hubspot_disconnected`

The HubSpot integration was disconnected.

| Field       | Type                                          |
| ----------- | --------------------------------------------- |
| `authScope` | String, one of `workspace`, `user` (nullable) |

### `integration.notion_connected`

The Notion integration was connected.

`data` is empty for this action.

### `integration.notion_disconnected`

The Notion integration was disconnected.

`data` is empty for this action.

### `integration.pipedrive_connected`

The Pipedrive integration was connected.

| Field       | Type                                          |
| ----------- | --------------------------------------------- |
| `authScope` | String, one of `workspace`, `user` (nullable) |

### `integration.pipedrive_disconnected`

The Pipedrive integration was disconnected.

| Field       | Type                                          |
| ----------- | --------------------------------------------- |
| `authScope` | String, one of `workspace`, `user` (nullable) |

### `integration.salesforce_connected`

The Salesforce integration was connected.

| Field       | Type                                          |
| ----------- | --------------------------------------------- |
| `authScope` | String, one of `workspace`, `user` (nullable) |

### `integration.salesforce_disconnected`

The Salesforce integration was disconnected.

| Field       | Type                                          |
| ----------- | --------------------------------------------- |
| `authScope` | String, one of `workspace`, `user` (nullable) |

### `integration.slack_connected`

The Slack integration was connected.

| Field           | Type                                          |
| --------------- | --------------------------------------------- |
| `slackTeamName` | String (nullable)                             |
| `authScope`     | String, one of `workspace`, `user` (nullable) |

### `integration.slack_disconnected`

The Slack integration was disconnected.

| Field       | Type                                          |
| ----------- | --------------------------------------------- |
| `authScope` | String, one of `workspace`, `user` (nullable) |

### `integration.user_connection_removed`

A user's connection to a third-party integration was removed, so notes in the affected folder or space stop syncing for them.

| Field            | Type                                    |
| ---------------- | --------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`) |
| `ownerUserId`    | User ID (`usr_…`)                       |
| `provider`       | String                                  |
| `reason`         | String                                  |

### `integration.zapier_connection_created`

A Zapier connection was created.

| Field            | Type   |
| ---------------- | ------ |
| `connectionType` | String |
| `visibility`     | String |

### `integration.zapier_connection_deleted`

A Zapier connection was deleted.

| Field            | Type              |
| ---------------- | ----------------- |
| `connectionType` | String (nullable) |
| `visibility`     | String (nullable) |

## MCP

### `mcp.token_disabled`

A member's MCP token was removed, revoking MCP client access to their notes.

`data` is empty for this action.

### `mcp.token_enabled`

A member created an MCP token, letting an MCP client read their notes through Granola's MCP server.

`data` is empty for this action.

### `mcp.token_regenerated`

A member replaced their MCP token. The previous token stops working immediately.

`data` is empty for this action.

### `mcp.tool_used`

A user invoked a Granola tool through an external MCP connection.

| Field           | Type                                                                                                                                                                                                   |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `toolName`      | String, one of `query_granola_meetings`, `list_meetings`, `list_meeting_folders`, `get_meetings`, `get_meeting_transcript`, `get_account_info`, `search_by_people_and_companies`, `search_by_keywords` |
| `outcome`       | String, one of `success`, `error`, `not_found`                                                                                                                                                         |
| `clientName`    | String (nullable)                                                                                                                                                                                      |
| `clientVersion` | String (nullable)                                                                                                                                                                                      |

## Note transfers

### `notes.transfer_completed`

A transfer of another Granola account's notes into this workspace completed, with how many notes arrived.

| Field           | Type              |
| --------------- | ----------------- |
| `toUserId`      | User ID (`usr_…`) |
| `documentCount` | Number (nullable) |

### `notes.transfer_out`

A member's notes were transferred out of this workspace into another Granola account, with how many notes left.

| Field           | Type              |
| --------------- | ----------------- |
| `fromUserId`    | User ID (`usr_…`) |
| `documentCount` | Number            |

## Recipes

### `recipe.created`

A recipe was created. Reported only when the recipe was shared with the workspace as it was created.

| Field             | Type              |
| ----------------- | ----------------- |
| `slug`            | String            |
| `visibility`      | String            |
| `publisherSlug`   | String (nullable) |
| `creationContext` | String (nullable) |

### `recipe.deleted`

A recipe was deleted, either by its owner or by Granola for a built-in recipe. Reported only for recipes shared with the workspace.

| Field           | Type                                     |
| --------------- | ---------------------------------------- |
| `slug`          | String (nullable)                        |
| `visibility`    | String (nullable)                        |
| `publisherSlug` | String (nullable)                        |
| `deletedBy`     | String, one of `owner`, `granola_editor` |

### `recipe.updated`

A recipe was changed. Names which parts changed, but never the recipe's own instructions or examples. Reported only for recipes shared with the workspace, and a change that shares or unshares one is reported either way, as `config.show_in_shared_tabs`. Only the keys that changed are present, and `changes` is an empty object when a change touched only keys this endpoint does not report.

| Field            | Type                                                           |
| ---------------- | -------------------------------------------------------------- |
| `slug`           | String                                                         |
| `visibility`     | String                                                         |
| `publisherSlug`  | String (nullable)                                              |
| `changedFields`  | Array of strings                                               |
| `changes`        | Object with `slug`, `visibility`, `config.show_in_shared_tabs` |
| `previousValues` | Object with `slug`, `visibility`, `config.show_in_shared_tabs` |

## Transcript views

### `transcript.viewed`

A user opened a note's transcript and saw its content. `source` says which surface it was read on. Only authenticated reads are recorded, from the desktop app.

| Field        | Type                                                         |
| ------------ | ------------------------------------------------------------ |
| `documentId` | Note ID (`not_…`)                                            |
| `source`     | String, one of `transcript_panel`, `nub`, `sheet` (nullable) |
| `isOwner`    | Boolean (nullable)                                           |

## Transcripts

### `transcription.chunks_deleted`

Parts of a note's transcript were deleted, with the time range of each part removed.

| Field        | Type                                                                                   |
| ------------ | -------------------------------------------------------------------------------------- |
| `documentId` | Note ID (`not_…`)                                                                      |
| `chunks`     | Array of objects with `source`, `startTimestamp`, `endTimestamp`, `previousTextLength` |

### `transcription.ended`

A recording ended. `occurred_at` is when the recording actually stopped; the scheduled times and calendar IDs describe the meeting it belongs to, if it was on a calendar. Scheduled times are RFC 3339 timestamps, or a plain `YYYY-MM-DD` date for an all-day meeting.

| Field                  | Type                                                   |
| ---------------------- | ------------------------------------------------------ |
| `documentId`           | Note ID (`not_…`)                                      |
| `calendarEventId`      | String (nullable)                                      |
| `calendarEventIcalUid` | String (nullable)                                      |
| `calendarProvider`     | String, one of `google`, `outlook`, `apple` (nullable) |
| `scheduledStartTime`   | String (nullable)                                      |
| `scheduledEndTime`     | String (nullable)                                      |
| `ownerUserId`          | User ID (`usr_…`)                                      |

### `transcription.policy_acknowledged_to_continue`

A user acknowledged one or more workspace transcription policies and chose to continue. Condition types describe what the client reported showing. This records the user's selection, not that recording subsequently started.

| Field                  | Type                                                                                                                                                                                            |
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `documentId`           | Note ID (`not_…`)                                                                                                                                                                               |
| `calendarEventId`      | String (nullable)                                                                                                                                                                               |
| `calendarEventIcalUid` | String (nullable)                                                                                                                                                                               |
| `calendarProvider`     | String, one of `google`, `outlook`, `apple` (nullable)                                                                                                                                          |
| `scheduledStartTime`   | String (nullable)                                                                                                                                                                               |
| `scheduledEndTime`     | String (nullable)                                                                                                                                                                               |
| `conditionTypes`       | Array of string, one of `always`, `external_participant`, `only_internal_participants`, `participant_domain`, `participant_email`, `in_person`, `consent_page_missing`, `calendar_event_title`s |
| `surface`              | String, one of `main_dialog`, `nub_banner`                                                                                                                                                      |

### `transcription.started`

A recording started. `occurred_at` is when the recording actually began; the scheduled times and calendar IDs describe the meeting it belongs to, if it was on a calendar. Scheduled times are RFC 3339 timestamps, or a plain `YYYY-MM-DD` date for an all-day meeting.

| Field                  | Type                                                   |
| ---------------------- | ------------------------------------------------------ |
| `documentId`           | Note ID (`not_…`)                                      |
| `calendarEventId`      | String (nullable)                                      |
| `calendarEventIcalUid` | String (nullable)                                      |
| `calendarProvider`     | String, one of `google`, `outlook`, `apple` (nullable) |
| `scheduledStartTime`   | String (nullable)                                      |
| `scheduledEndTime`     | String (nullable)                                      |
| `ownerUserId`          | User ID (`usr_…`)                                      |

## User accounts

### `user.email_changed`

A member's Granola email address changed, with the address before and after.

| Field      | Type   |
| ---------- | ------ |
| `oldEmail` | String |
| `newEmail` | String |

## Groups

### `user_group.created`

A user group was created in the workspace.

| Field                | Type                    |
| -------------------- | ----------------------- |
| `userGroupId`        | User group ID (`ugr_…`) |
| `name`               | String                  |
| `initialMemberCount` | Number                  |

### `user_group.deleted`

A user group was deleted. Its members keep their own workspace access.

| Field         | Type                    |
| ------------- | ----------------------- |
| `userGroupId` | User group ID (`ugr_…`) |
| `name`        | String                  |
| `memberCount` | Number                  |

### `user_group.document_access_granted`

One or more user groups were given access to a note.

| Field          | Type                                    |
| -------------- | --------------------------------------- |
| `documentId`   | Note ID (`not_…`)                       |
| `userGroupIds` | Array of user group IDs (`ugr_…`)       |
| `role`         | String, one of `COLLABORATOR`, `VIEWER` |

### `user_group.document_access_revoked`

One or more user groups lost access to a note.

| Field          | Type                              |
| -------------- | --------------------------------- |
| `documentId`   | Note ID (`not_…`)                 |
| `userGroupIds` | Array of user group IDs (`ugr_…`) |

### `user_group.document_list_access_granted`

One or more user groups were given access to a folder or space.

| Field            | Type                                    |
| ---------------- | --------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`) |
| `userGroupIds`   | Array of user group IDs (`ugr_…`)       |
| `role`           | String, one of `COLLABORATOR`, `VIEWER` |

### `user_group.document_list_access_revoked`

One or more user groups lost access to a folder or space.

| Field            | Type                                    |
| ---------------- | --------------------------------------- |
| `documentListId` | Folder or space ID (`fol_…` or `spa_…`) |
| `userGroupIds`   | Array of user group IDs (`ugr_…`)       |

### `user_group.dsync_converted_to_manual`

A user group stopped being managed by directory sync and is now maintained by hand.

| Field          | Type                                                |
| -------------- | --------------------------------------------------- |
| `userGroupId`  | User group ID (`ugr_…`)                             |
| `previousName` | String                                              |
| `reason`       | String, one of `group_deleted`, `directory_deleted` |

### `user_group.dsync_deleted`

A directory-synced user group was deleted because it disappeared from the identity provider.

| Field          | Type                                                |
| -------------- | --------------------------------------------------- |
| `userGroupId`  | User group ID (`ugr_…`)                             |
| `previousName` | String                                              |
| `reason`       | String, one of `group_deleted`, `directory_deleted` |

### `user_group.dsync_linked`

A user group was created from an identity-provider directory group and is now managed by directory sync.

| Field                 | Type                    |
| --------------------- | ----------------------- |
| `userGroupId`         | User group ID (`ugr_…`) |
| `directoryName`       | String                  |
| `finalName`           | String                  |
| `bufferedMemberCount` | Number                  |

### `user_group.dsync_members_synced`

A user group's membership changed because the linked identity-provider directory group changed.

| Field            | Type                        |
| ---------------- | --------------------------- |
| `userGroupId`    | User group ID (`ugr_…`)     |
| `userGroupName`  | String (nullable)           |
| `addedUserIds`   | Array of user IDs (`usr_…`) |
| `removedUserIds` | Array of user IDs (`usr_…`) |

### `user_group.dsync_renamed`

A directory-synced user group was renamed because the identity-provider group was renamed.

| Field          | Type                    |
| -------------- | ----------------------- |
| `userGroupId`  | User group ID (`ugr_…`) |
| `previousName` | String                  |
| `newName`      | String                  |

### `user_group.members_added`

One or more users were added to a user group.

| Field          | Type                        |
| -------------- | --------------------------- |
| `userGroupId`  | User group ID (`ugr_…`)     |
| `addedUserIds` | Array of user IDs (`usr_…`) |

### `user_group.members_removed`

One or more users were removed from a user group.

| Field            | Type                        |
| ---------------- | --------------------------- |
| `userGroupId`    | User group ID (`ugr_…`)     |
| `removedUserIds` | Array of user IDs (`usr_…`) |
| `source`         | String                      |

### `user_group.renamed`

A user group was renamed.

| Field          | Type                    |
| -------------- | ----------------------- |
| `userGroupId`  | User group ID (`ugr_…`) |
| `previousName` | String                  |
| `newName`      | String                  |

## Workspace

### `workspace.access_requested`

A user asked to join the workspace and is waiting for an admin to approve or decline.

| Field                     | Type              |
| ------------------------- | ----------------- |
| `requestedByUserId`       | User ID (`usr_…`) |
| `requestedByEmail`        | String            |
| `migrateOrphanedEntities` | Boolean           |
| `migrateSubscription`     | Boolean           |
| `source`                  | String            |

### `workspace.invite_link_created`

A shareable invite link to the workspace was created. Anyone holding the link can join until it expires or is revoked.

| Field       | Type   |
| ----------- | ------ |
| `expiresAt` | String |
| `maxUses`   | Number |

### `workspace.invite_link_domain_blocked`

Someone tried to join the workspace with an invite link and was refused because their email domain is not allowed.

| Field             | Type              |
| ----------------- | ----------------- |
| `userId`          | User ID (`usr_…`) |
| `inviteCreatedBy` | User ID (`usr_…`) |
| `emailDomain`     | String            |
| `workspaceSlug`   | String            |

### `workspace.invite_link_revoked`

A shareable workspace invite link was revoked and can no longer be used to join.

| Field               | Type   |
| ------------------- | ------ |
| `revokedAt`         | String |
| `previousExpiresAt` | String |

### `workspace.member_added`

A user was added straight into the workspace, without an invitation they had to accept.

| Field           | Type              |
| --------------- | ----------------- |
| `userId`        | User ID (`usr_…`) |
| `addedByUserId` | User ID (`usr_…`) |
| `email`         | String            |
| `role`          | String            |
| `status`        | String            |
| `source`        | String            |

### `workspace.member_invited`

A user was invited to the workspace. They become a member once they accept.

| Field             | Type              |
| ----------------- | ----------------- |
| `invitedByUserId` | User ID (`usr_…`) |
| `userId`          | User ID (`usr_…`) |
| `email`           | String            |
| `role`            | String            |
| `source`          | String            |

### `workspace.member_joined`

A user became a member of the workspace, by accepting an invitation, using an invite link, or joining through a verified email domain.

| Field                            | Type              |
| -------------------------------- | ----------------- |
| `userId`                         | User ID (`usr_…`) |
| `email`                          | String            |
| `role`                           | String            |
| `source`                         | String            |
| `hadPendingInvite`               | Boolean           |
| `migratedOrphanedEntities`       | Boolean           |
| `migratedIndividualSubscription` | String            |

### `workspace.member_left`

A member left the workspace themselves.

| Field                      | Type              |
| -------------------------- | ----------------- |
| `userId`                   | User ID (`usr_…`) |
| `role`                     | String            |
| `documentListUsersDeleted` | Number            |
| `savedRecipesDeleted`      | Number            |

### `workspace.member_removed`

A member was removed from the workspace by someone else.

| Field             | Type              |
| ----------------- | ----------------- |
| `userId`          | User ID (`usr_…`) |
| `removedByUserId` | User ID (`usr_…`) |
| `email`           | String (nullable) |
| `previousRole`    | String            |
| `previousStatus`  | String            |
| `source`          | String            |

### `workspace.member_role_changed`

A member's workspace role changed, for example from member to admin.

| Field             | Type              |
| ----------------- | ----------------- |
| `userId`          | User ID (`usr_…`) |
| `changedByUserId` | User ID (`usr_…`) |
| `previousRole`    | String            |
| `newRole`         | String            |
| `source`          | String            |

### `workspace.member_status_changed`

A member's workspace status changed, for example from invited to active, or to deactivated.

| Field             | Type              |
| ----------------- | ----------------- |
| `userId`          | User ID (`usr_…`) |
| `changedByUserId` | User ID (`usr_…`) |
| `previousStatus`  | String            |
| `newStatus`       | String            |
| `source`          | String            |

### `workspace.public_api_key_created`

A public API key was created for the workspace.

| Field                  | Type                                                                                                                                                                 |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `initiatedByUserId`    | User ID (`usr_…`)                                                                                                                                                    |
| `workspaceDisplayName` | String                                                                                                                                                               |
| `apiKeyScope`          | String, one of `public_notes`, `all_workspace_notes`, `user_notes`, `user_accessible_notes`, `exposed_spaces_and_public_notes`, `all_workspace_notes_by_id`, `audit` |

### `workspace.public_api_key_first_used`

A public API key made its earliest recorded authenticated request for the workspace.

| Field            | Type                                                                                                                                                                                                                      |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apiKeyName`     | String                                                                                                                                                                                                                    |
| `apiKeyIdSuffix` | String                                                                                                                                                                                                                    |
| `endpointClass`  | String, one of `get-note`, `get-transcript`, `list-audit-events`, `list-folders`, `list-notes`, `list-spaces`, `public-create-webhook`, `public-delete-webhook`, `public-list-webhooks`, `public-update-webhook`, `other` |
| `firstUsedAt`    | String                                                                                                                                                                                                                    |

### `workspace.public_api_key_revoked`

A public API key was revoked and can no longer authenticate requests.

| Field               | Type              |
| ------------------- | ----------------- |
| `initiatedByUserId` | User ID (`usr_…`) |
| `apiKeyId`          | String            |
| `revokedAt`         | String            |

### `workspace.public_api_key_updated`

A public API key's scope was changed.

| Field                 | Type                                                                                                                                                                 |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `initiatedByUserId`   | User ID (`usr_…`)                                                                                                                                                    |
| `apiKeyId`            | String                                                                                                                                                               |
| `previousApiKeyScope` | String, one of `public_notes`, `all_workspace_notes`, `user_notes`, `user_accessible_notes`, `exposed_spaces_and_public_notes`, `all_workspace_notes_by_id`, `audit` |
| `apiKeyScope`         | String, one of `public_notes`, `all_workspace_notes`, `user_notes`, `user_accessible_notes`, `exposed_spaces_and_public_notes`, `all_workspace_notes_by_id`, `audit` |

### `workspace.public_api_key_used`

A five-minute summary of requests authenticated with a public API key.

| Field              | Type                                                                                                                                                                                                                      |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `apiKeyName`       | String                                                                                                                                                                                                                    |
| `apiKeyIdSuffix`   | String                                                                                                                                                                                                                    |
| `endpointClass`    | String, one of `get-note`, `get-transcript`, `list-audit-events`, `list-folders`, `list-notes`, `list-spaces`, `public-create-webhook`, `public-delete-webhook`, `public-list-webhooks`, `public-update-webhook`, `other` |
| `windowStartedAt`  | String                                                                                                                                                                                                                    |
| `windowEndedAt`    | String                                                                                                                                                                                                                    |
| `requestCount`     | Number                                                                                                                                                                                                                    |
| `successCount`     | Number                                                                                                                                                                                                                    |
| `clientErrorCount` | Number                                                                                                                                                                                                                    |
| `serverErrorCount` | Number                                                                                                                                                                                                                    |
| `distinctIpCount`  | Number                                                                                                                                                                                                                    |

### `workspace.restored`

A deleted workspace was restored.

| Field        | Type   |
| ------------ | ------ |
| `restoredAt` | String |

### `workspace.soft_deleted`

The workspace was deleted. Its data is retained until it is permanently deleted, and it can still be restored.

| Field       | Type   |
| ----------- | ------ |
| `deletedAt` | String |

### `workspace.sso-config-created`

Single sign-on was configured for the workspace, setting how members are allowed to log in.

| Field                   | Type              |
| ----------------------- | ----------------- |
| `workspaceSlug`         | String            |
| `workspaceDisplayName`  | String            |
| `shouldBlockOAuthLogin` | Boolean           |
| `oauthProvider`         | String (nullable) |
| `performedByUserId`     | User ID (`usr_…`) |

### `workspace.sso-config-updated`

The workspace's single sign-on configuration changed, including whether members may still log in with Google or Microsoft directly.

| Field                           | Type               |
| ------------------------------- | ------------------ |
| `workspaceSlug`                 | String             |
| `previousShouldBlockOAuthLogin` | Boolean (nullable) |
| `previousOauthProvider`         | String (nullable)  |
| `shouldBlockOAuthLogin`         | Boolean            |
| `oauthProvider`                 | String             |
| `performedByUserId`             | User ID (`usr_…`)  |

### `workspace.sso-connection-activated`

A single sign-on connection became active for the workspace, so members can sign in through the identity provider.

| Field                   | Type               |
| ----------------------- | ------------------ |
| `workspaceSlug`         | String             |
| `connectionType`        | String (nullable)  |
| `oauthProvider`         | String (nullable)  |
| `shouldBlockOAuthLogin` | Boolean (nullable) |

### `workspace.sso-connection-deactivated`

A single sign-on connection was deactivated for the workspace and can no longer be used to sign in.

| Field                  | Type    |
| ---------------------- | ------- |
| `workspaceSlug`        | String  |
| `wasCurrentConnection` | Boolean |

### `workspace.sso-connection-deleted`

A single sign-on connection was deleted from the workspace's identity provider configuration.

| Field                  | Type    |
| ---------------------- | ------- |
| `workspaceSlug`        | String  |
| `wasCurrentConnection` | Boolean |

### `workspace.updated`

A workspace setting changed, with the value before and after. Only the keys that changed are present, and `changes` is an empty object when a change touched only keys this endpoint does not report.

| Field            | Type   |
| ---------------- | ------ |
| `changes`        | Object |
| `previousValues` | Object |

`changes` and `previousValues` may contain: `display_name`, `slug`, `logo_url`, `is_locked`, `discoverable`, `transcript_retention_hours`, `transcript_retention_hours_updated_at`, `sharing_link_visibility`, `link_sharing_allowed_domains`, `allow_moving_notes`, `allow_transfer_notes`, `allow_data_export`, `hipaa_enabled`, `allowed_ip_cidrs`, `disable_chat_web_access`, `dictionary`, `mcp_enabled`, `user_notes_api_enabled`, `zoom_rtms_enabled`, `self_email_enabled`, `privacy_mode_enabled`, `affirmative_consent_enabled`, `speaker_attribution_enabled`, `google_meet_consent_enabled`, `google_meet_consent_settings`, `chat_paste_enabled`, `chat_paste_message`, `legal_hold_enabled`, `in_meeting_copy_consent_message_banner_enabled`, `in_meeting_copy_consent_message_banner_message`, `virtual_webcam_notice_enabled`, `virtual_webcam_notice_enabled_at`, `virtual_webcam_notice_enforced`, `virtual_webcam_notice_require_installation_by`, `pre_call_email_enabled`, `pre_call_email_large_meeting_threshold`, `pre_call_email_blocklist`, `pre_call_email_allowlist`, `allow_external_sharing`, `allow_external_invites`, `allow_external_users_to_share_with_workspace`, `allow_public_folders`, `restrict_invite_links_to_domain`.

### `workspace.webhook_endpoint_created`

An API-managed webhook endpoint was created for the workspace.

| Field               | Type                          |
| ------------------- | ----------------------------- |
| `webhookEndpointId` | Webhook endpoint ID (`whe_…`) |

### `workspace.webhook_endpoint_deleted`

An API-managed webhook endpoint was deleted from the workspace.

| Field               | Type                          |
| ------------------- | ----------------------------- |
| `webhookEndpointId` | Webhook endpoint ID (`whe_…`) |

### `workspace.webhook_endpoint_updated`

A webhook endpoint for the workspace was changed. Names which parts changed, never their values, and reports whether the endpoint is delivering afterwards. Also covers the changes Granola makes on its own: disabling an endpoint after sustained delivery failures, and re-enabling it once delivery recovers.

| Field               | Type                          |
| ------------------- | ----------------------------- |
| `webhookEndpointId` | Webhook endpoint ID (`whe_…`) |
| `changedFields`     | Array of strings              |
| `enabled`           | Boolean                       |

## Automations

### `workspace_automation.created`

A workspace automation was created. It files matching meetings into a folder, or sends them to a webhook.

| Field                 | Type                                                                             |
| --------------------- | -------------------------------------------------------------------------------- |
| `automationId`        | Workspace automation ID (`aut_…`)                                                |
| `name`                | String (nullable)                                                                |
| `description`         | String (nullable)                                                                |
| `actionType`          | String                                                                           |
| `actionConfig`        | One of: empty object, object with `webhook_endpoint_id`, object with `folder_id` |
| `destinationFolderId` | Folder or space ID (`fol_…` or `spa_…`)                                          |
| `ruleType`            | String                                                                           |
| `selectedIds`         | Array of strings                                                                 |
| `filters`             | Array of objects with `type`, `operator`, `selected_ids`, `config` (nullable)    |
| `userIds`             | Array of user IDs (`usr_…`)                                                      |
| `userGroupIds`        | Array of user group IDs (`ugr_…`)                                                |
| `appliesToAllUsers`   | Boolean (nullable)                                                               |
| `allowsUserOptIn`     | Boolean (nullable)                                                               |

### `workspace_automation.deleted`

A workspace automation was deleted.

| Field                 | Type                                    |
| --------------------- | --------------------------------------- |
| `automationId`        | Workspace automation ID (`aut_…`)       |
| `actionType`          | String                                  |
| `destinationFolderId` | Folder or space ID (`fol_…` or `spa_…`) |
| `userCount`           | Number                                  |

### `workspace_automation.opt_in_prompt_dismissed`

A workspace member dismissed an offer to enroll in an automation.

| Field          | Type                              |
| -------------- | --------------------------------- |
| `automationId` | Workspace automation ID (`aut_…`) |
| `userId`       | User ID (`usr_…`)                 |

### `workspace_automation.self_enrolled`

A workspace member enrolled themselves in an automation.

| Field                   | Type                              |
| ----------------------- | --------------------------------- |
| `automationId`          | Workspace automation ID (`aut_…`) |
| `userId`                | User ID (`usr_…`)                 |
| `directMembershipAdded` | Boolean                           |
| `preferenceReenabled`   | Boolean                           |
| `becameApplicable`      | Boolean                           |

### `workspace_automation.updated`

A workspace automation was changed. Only the keys that changed are present, and `changes` is an empty object when a change touched only keys this endpoint does not report.

| Field            | Type                              |
| ---------------- | --------------------------------- |
| `automationId`   | Workspace automation ID (`aut_…`) |
| `changes`        | Object                            |
| `previousValues` | Object                            |

`changes` and `previousValues` may contain: `name`, `description`, `trigger_type`, `action_type`, `rule_type`, `selected_ids`, `filters`, `applies_to_all_users`, `allows_user_opt_in`, `destination_folder_id`, `owner_user_id`, `action_config`.

### `workspace_automation.user_groups_added`

One or more user groups were added to a workspace automation.

| Field          | Type                              |
| -------------- | --------------------------------- |
| `automationId` | Workspace automation ID (`aut_…`) |
| `userGroupIds` | Array of user group IDs (`ugr_…`) |

### `workspace_automation.user_groups_removed`

One or more user groups were removed from a workspace automation.

| Field          | Type                              |
| -------------- | --------------------------------- |
| `automationId` | Workspace automation ID (`aut_…`) |
| `userGroupIds` | Array of user group IDs (`ugr_…`) |

### `workspace_automation.users_added`

One or more users were added to a workspace automation.

| Field          | Type                              |
| -------------- | --------------------------------- |
| `automationId` | Workspace automation ID (`aut_…`) |
| `userIds`      | Array of user IDs (`usr_…`)       |

### `workspace_automation.users_removed`

One or more users were removed from a workspace automation.

| Field          | Type                              |
| -------------- | --------------------------------- |
| `automationId` | Workspace automation ID (`aut_…`) |
| `userIds`      | Array of user IDs (`usr_…`)       |
