Skip to content

Google Workspace

Calendar, Drive, Gmail and Contacts, connected per organisation with your own OAuth client and switched on per employee.

25 endpoints across 1 group. A permission written module.resource.action:own is scoped: :own covers rows that are yours, :any covers everyone’s, and :any satisfies a check for :own.

EndpointPermission
GET /google/calendar/eventsgoogle.calendar.read
POST /google/calendar/webhookDeliberately open
GET /google/connectionsgoogle.settings.manage
GET /google/connections/megoogle.connection.manage
PATCH /google/connections/megoogle.connection.manage
POST /google/connections/me/disconnectgoogle.connection.manage
GET /google/drive/browsegoogle.drive.read
PUT /google/drive/foldergoogle.drive.write
POST /google/drive/foldersgoogle.drive.write
GET /google/drive/linksgoogle.drive.read
POST /google/drive/linksgoogle.drive.write
DELETE /google/drive/links/{link_id}google.drive.write
POST /google/drive/provisiongoogle.drive.write
POST /google/drive/provision-allgoogle.settings.manage
POST /google/drive/upload-sessiongoogle.drive.write
POST /google/gmail/importinteractions.interaction.write
GET /google/gmail/lookupgoogle.connection.manage
POST /google/gmail/refreshgoogle.connection.manage
GET /google/gmail/searchgoogle.connection.manage
GET /google/gmail/statusgoogle.connection.manage
GET /google/gmail/threads/{thread_id}google.connection.manage
GET /google/oauth/callbackgoogle.connection.manage
GET /google/oauth/connectgoogle.connection.manage
GET /google/settingsgoogle.settings.manage
PUT /google/settingsgoogle.settings.manage
Parameters and schemas per endpoint

Calendar Events — The viewer’s own cached Google events. Reads the local cache, never Google live.

Permission: google.calendar.read

Query parameters:

NameTypeMeaning
date_fromstring · required
date_tostring · required

Returns: 200 · CalendarFeedItem[]

Calendar Webhook

Permission: Deliberately open

Returns: 200

List Connections

Permission: google.settings.manage

Returns: 200 · app__integrations__google__schemas__ConnectionRead[]

My Connection

Permission: google.connection.manage

Returns: 200 · MyConnectionRead

Update My Connection

Permission: google.connection.manage

Request body: MyConnectionUpdate

Returns: 200 · MyConnectionRead

POST /api/v1/google/connections/me/disconnect

Section titled “POST /api/v1/google/connections/me/disconnect”

Disconnect My Connection

Permission: google.connection.manage

Returns: 204

Browse — Live folder contents as the viewing user — Drive’s permissions are authoritative.

Permission: google.drive.read

Query parameters:

NameTypeMeaning
folder_idstring
qstring
refreshboolean(default false)

Returns: 200 · DriveBrowseResult

Set Folder — Point a record at an existing Drive folder — the picker’s target.

Permission: google.drive.write

Request body: DriveFolderSet

Returns: 200 · DriveLinkRead

Create Folder — Create a subfolder inside the folder being browsed, as the viewing user (issue #21).

Permission: google.drive.write

Request body: DriveFolderCreate

Returns: 201 · DriveFolder

List Links

Permission: google.drive.read

Query parameters:

NameTypeMeaning
entity_typestring · required
entity_idstring · required
rollupboolean(default false)

Returns: 200 · DriveLinkRead[]

Create Link

Permission: google.drive.write

Request body: DriveLinkCreate

Returns: 201 · DriveLinkRead

Section titled “DELETE /api/v1/google/drive/links/{link_id}”

Delete Link — Unlink only. The Drive file is never touched (issue #21 — the dialog says so too).

Permission: google.drive.write

Path parameters: link_id

Returns: 204

Provision Entity — Queue one entity’s folder — the panel’s “create folder” button.

Permission: google.drive.write

Request body: DriveProvisionRequest

Returns: 202

Provision All — Backfill: a folder for every client that has none (Instellingen → Google).

Permission: google.settings.manage

Returns: 200 · DriveBulkProvisionResult

Create Upload Session

Permission: google.drive.write

Request body: DriveUploadSessionCreate

Returns: 200 · DriveUploadSession

Import Gmail Message — Log one message the poller skipped, filed where the caller says.

Permission: interactions.interaction.write

Request body: GmailImportRequest

Returns: 201 · GmailImportResult

Lookup Gmail Message — Resolve a pasted reference to the message(s) it names, in the caller’s own mailbox.

Permission: google.connection.manage

Query parameters:

NameTypeMeaning
referencestring · requiredA Gmail link, a message/thread id, or an RFC-822 Message-ID

Returns: 200 · GmailLookupResult

Refresh Gmail — Poll this mailbox once, now — rate-limited to one manual poll per minute.

Permission: google.connection.manage

Returns: 200 · GmailRefreshResult

Search Gmail — Find a message in the caller’s own mailbox, by who it was with and when (#372).

Permission: google.connection.manage

Query parameters:

NameTypeMeaning
participantstring
subjectstring
afterstring
beforestring

Returns: 200 · GmailSearchResult

Read Gmail Status — When this mailbox was last polled, and whether asking for another one is worth it.

Permission: google.connection.manage

Returns: 200 · GmailSyncStatus

GET /api/v1/google/gmail/threads/{thread_id}

Section titled “GET /api/v1/google/gmail/threads/{thread_id}”

Read Gmail Thread — Every message of one conversation, marked with what is already on the timeline.

Permission: google.connection.manage

Path parameters: thread_id

Returns: 200 · GmailLookupResult

Google Oauth Callback — Store the grant and land the browser back where the connect started.

Permission: google.connection.manage

Returns: 200

Oauth Connect — 302 to Google’s consent screen, asking exactly the enabled surfaces’ scopes.

Permission: google.connection.manage

Query parameters:

NameTypeMeaning
include_gmailboolean(default false)
include_marketingboolean(default false)
include_analyticsboolean(default false)
include_search_consoleboolean(default false)
include_adsboolean(default false)
include_tag_managerboolean(default false)
nextstring(default “)

Returns: 200

Get Settings

Permission: google.settings.manage

Returns: 200 · GoogleSettingsRead

Save Settings

Permission: google.settings.manage

Request body: GoogleSettingsWrite

Returns: 200 · GoogleSettingsRead