Skip to main content

Google Meet

This connector pins https://meet.googleapis.com/v2 and covers what the Meet REST API actually is: a record of meetings that have happened. It reads conference records, who attended and for how long, and the recordings and transcripts a meeting produced — which makes it the connector for "who was on Tuesday's call and what did they agree". It can also open an instant meeting space and, with approval, end a call that is running.

Scheduling a meeting is a Calendar operation

The Meet API has no notion of a future meeting: there is no start time to set anywhere in it. To book a meeting with a Meet link, use the Google Calendar connector: call events.create with conferenceDataVersion=1 and a conferenceData.createRequest, and Google mints the conference for you. spaces.create here hands back a meetingUri immediately — a link you can send someone now, which becomes a live conference when the first person clicks it. Useful, but not a diary entry.

What you need

Meet has no API keys. Access is OAuth only: you register your own Google OAuth app, and your gateway runs the authorisation code flow against it and keeps the connection refreshed from then on.

Needs gateway 1.1.0

From 1.1.0 the gateway performs the OAuth exchange itself and refreshes the access token two minutes before it expires, indefinitely. Older gateways have no OAuth endpoint at all. curl -s http://127.0.0.1:7376/health reports the version you are running.

Registering the app is the same for every Google connector, and it is written out once on the Google Drive page: Cloud console project, consent screen, OAuth client id and secret, redirect URI. Two things differ here.

Enable the Google Meet API rather than the Drive one, under APIs & Services → Library.

Ask for the least privilege that covers what you intend to enable:

ScopeGoogle's description
https://www.googleapis.com/auth/meetings.space.readonlyread metadata about any meeting space the user has access to
https://www.googleapis.com/auth/meetings.space.createdcreate, modify and read metadata about meeting spaces created by your app

A read-only scope is the sensible default. meetings.space.readonly covers all eight read actions, including participants, recordings and transcripts. Add meetings.space.created only if you want spaces.create or spaces.end_active_conference — and note the limitation in its own description: it reaches spaces your app made, not every meeting in the organisation.

Do not leave the app in Testing

The Meet space scopes are classed as sensitive, and while your OAuth app's publishing status is Testing, Google expires each refresh token seven days after it is issued — refreshing does not extend that, so the connection breaks weekly however well the gateway behaves. Set the app's user type to Internal (Google Workspace organisations only) or publish it to In production before you rely on this. The Drive page has the detail.

Add the connection

Both halves of this are gateway-side today: the console's Add connection dialog cannot finish an OAuth connection yet. Create the connection with POST /v1/connections/from-preset and "preset_id": "google-meet", exactly as the Drive page shows. Creating it makes the actions possible, not permitted — an agent still needs a grant.

Then authorise the connection_id that came back, with an operator token, as the Drive page describes but with Meet's scopes:

BASE=http://127.0.0.1:7376
curl -s -X POST $BASE/v1/connections/<connection_id>/oauth/start \
-H "authorization: Bearer $TOKEN" -H 'content-type: application/json' -d '{
"client_id": "<your-client-id>",
"client_secret": "<your-client-secret>",
"redirect_uri": "http://127.0.0.1:7376/oauth/callback",
"scopes": ["https://www.googleapis.com/auth/meetings.space.readonly"]
}'

Open the authorize_url it returns and approve. Google redirects back to your gateway, which exchanges the code itself and seals the access token, refresh token and client secret as the connection's credential: encrypted on your gateway, injected server-side on every approved call, never readable again. permaura.com is not part of the exchange and never sees any of it. The redirect_uri has to match what you registered with Google character for character, the authorize link is single-use and expires after 10 minutes, and with a device enrolled for approvals the flow has to be started from the gateway's own host rather than over a tunnel.

What the agent can do

ActionWhat it doesOn by default
spaces.getReads a meeting space by id or meeting codeYes
conference_records.listLists past and active conferencesYes
conference_records.getReads one conference recordYes
participants.listLists who attended a conferenceYes
participant_sessions.listLists a participant's join and leave sessionsYes
recordings.listLists a conference's recordings and their Drive locationYes
transcripts.listLists a conference's transcriptsYes
transcript_entries.listReads what was said, entry by entryYes
spaces.createOpens an instant meeting space and returns its linkNo
spaces.end_active_conferenceEnds the conference running in a space right nowNo — and asks a human every time

spaces.end_active_conference throws everyone out of a live call, so it is marked critical and approval-gated on top of starting switched off.

Good to know

  • Spaces and conferences are different things. A space is the persistent room, identified as spaces/{space} or by its typeable meeting code (spaces/abc-mnop-xyz). A conference is one meeting that happened in it, identified as conferenceRecords/{conferenceRecord}. Only one conference can be active in a space at a time. spaces.get takes either form of space identifier.
  • Thirty days. Conference information is available for up to 30 days after the meeting ends, and transcript entries are deleted 30 days after the conference. If you need longer, that is a Google Vault retention question, not an API one.
  • Artifacts only exist if someone switched them on. Recordings and transcripts have to be started in Meet before the conference ends; nothing retro-generates them. Transcripts do not require recording to be enabled — they are independent.
  • Recordings and transcripts are Drive files. Meet saves them to the meeting organiser's Drive when the conference ends. recordings.list returns a driveDestination with the MP4's file id, not the bytes; transcripts.list returns a docsDestination pointing at a Google Doc. Fetching either means the Google Drive connector, authorised with a Drive scope of its own — https://www.googleapis.com/auth/drive.meet.readonly is the narrow one, limited to files Meet created.
  • Transcripts are the sensitive part. transcript_entries.list returns what people actually said, attributed to a speaker. Treat it as you would a recording: grant it to one agent for one purpose rather than leaving it on the default policy.
  • Nothing is redacted here, and that is deliberate. Most connectors blank named fields before an agent sees them — Mailchimp strips subscriber emails, DocuSign strips signer details. This one declares no redaction, because on these actions the sensitive fields are the payload: a transcript with the speech removed, or an attendee list with the names removed, is not worth calling. So the control is the grant rather than the filter, and it is a sharper one than usual. This is the most personal data any connector in the catalog returns by default, so give it to one agent for one job.
  • Filtering, and the fields differ per call. Three of the list actions take a filter in Google's EBNF syntax, but not over the same fields: conference_records.list filters on space.meeting_code, space.name, start_time and end_time; participants.list on earliest_start_time and latest_end_time; participant_sessions.list on start_time and end_time. Borrowing one call's field names for another is rejected.
  • Pagination is small. Recordings and transcripts default to 10 per page (max 100), transcript entries to 10 (max 100), and conference records to 25 (max 100). Expect the agent to page.
  • Quotas. Reads are 6,000 a minute per project and 600 a minute per user. Writes are 1,000 and 100. spaces.create sits on a much tighter allowance of its own — 100 a minute per project and 10 a minute per user — so an agent that opens spaces in a loop will hit 429 quickly.
  • No credentials in this manifest. The pinned host is meet.googleapis.com, so the connection cannot be pointed at anything else, and the token is injected server-side on every call.