Skip to content

Google Workspace

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

30 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/calendarsgoogle.connection.manage
PUT /google/calendar/calendarsgoogle.connection.manage
GET /google/calendar/channelsgoogle.calendar.read
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
DELETE /google/drive/files/{drive_file_id}google.drive.write
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
GET /google/drive/stategoogle.drive.read
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 List — The viewer’s own calendarList — the selection UI’s read (#440). Briefly cached; the existing calendar.events scope covers it, so no re-consent is needed.

Permission: google.connection.manage

Returns: 200 · CalendarListEntry[]

Set Calendar Selection — Choose which shared calendars sync for the viewer. Deselecting removes the calendar’s cached events on the spot; selecting queues a sync so the agenda fills without waiting.

Permission: google.connection.manage

Request body: CalendarSelection

Returns: 200 · CalendarListEntry[]

Calendar Channels — The viewer’s selection off the database alone — what the Agenda’s feeds menu reads on every open, so it never costs a Google call.

Permission: google.calendar.read

Returns: 200 · SelectedCalendar[]

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

DELETE /api/v1/google/drive/files/{drive_file_id}

Section titled “DELETE /api/v1/google/drive/files/{drive_file_id}”

Trash File — Move a Drive file to Drive’s bin — the other half of unlink (#394).

Permission: google.drive.write

Path parameters: drive_file_id

Returns: 204

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)
limitintegerCap the page a panel draws (#407); ask for one more than you keep to learn there are more. Absent means every link, which is what the roll-up view needs — a roll-up folds a project’s tasks in after the query and cannot be cut before it.

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

Drive State — Provisioning readiness + this entity’s folder-job status, for the panels (#444).

Permission: google.drive.read

Query parameters:

NameTypeMeaning
entity_typestring
entity_idstring

Returns: 200 · DriveStateRead

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