How to Get a Google Meet Transcript Automatically (Step-by-Step for Developers)
Google Meet doesn't have a native transcript API — but you can get full, speaker-attributed transcripts from any Meet call automatically using a meeting bot. Here's exactly how to do it, with working code.
Gregnote Team
25 August 2026
Does Google Meet have a transcript API?
Not really — not in the way developers need.
Google Meet has a built-in captioning feature, and Google Workspace Enterprise accounts can access transcript files stored in Google Drive. But neither of these is useful for building on: the captions are UI-only (you can't extract them programmatically), and the Workspace transcript file requires specific admin settings, Workspace plan levels, and only works for meetings hosted by users in that specific Google Workspace org.
If you're building a product that needs to capture transcripts from arbitrary Google Meet calls — not just meetings from your own Google Workspace — you need a different approach: a meeting bot.
What is a meeting bot?
A meeting bot is an automated participant that joins a Google Meet call, records the audio, sends it for transcription, and delivers the result via webhook.
It appears in the participant list like a human guest — with whatever name you give it. It captures audio using WebRTC, the same protocol used by real participants. When the meeting ends, you receive a webhook with the full, diarised transcript: who said what, when.
This is how every serious meeting intelligence tool works — Otter, Fireflies, Fathom, and the APIs that power them all use a bot to get audio from the meeting.
Step-by-step: Get a Google Meet transcript with the Gregnote API
What you'll need
- A Gregnote API key (free at app.gregnote.com)
- A webhook endpoint — a URL your server exposes publicly. Use ngrok or Cloudflare Tunnel for local development.
- A Google Meet URL to test with
Step 1: Sign up and get your API key
Sign up at app.gregnote.com. Your API key is on the dashboard home page. It starts with gk_live_.
Step 2: Send the bot to your Google Meet
Make one API call with the meeting URL, your webhook URL, and optionally a name for the bot:
curl -X POST https://api.gregnote.com/v1/bots \
-H "Authorization: Bearer gk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"meeting_url": "https://meet.google.com/abc-def-ghi",
"bot_name": "Meeting Recorder",
"webhook_url": "https://yourdomain.com/hooks/gregnote"
}'Response:
``
{
"id": "bot_01J9ABCD...",
"status": "joining",
"meeting_url": "https://meet.google.com/abc-def-ghi"
}
The bot appears in the Google Meet participant list within seconds. In Google Meet, the host will see a notification that "Meeting Recorder" has joined (or is asking to join, depending on the meeting's access settings).
Step 3: Admit the bot if needed
Google Meet has a setting for who can join meetings: - "Allow anyone with the link": The bot joins immediately with no host action needed. - "Only invited users" or organisational-only meetings: The bot sends a join request and the host must click "Admit."
For automated workflows, set your meetings to "allow anyone with the link" or invite the bot using a Google account you control. For products you're building for others, build UX that explains to your users that they'll see a join request and should click Admit.
Step 4: Let the meeting run
The bot records in the background. Participants can talk normally. The bot is shown as a participant — it's always visible, never hidden. This is intentional and important for privacy compliance.
Step 5: Receive the transcript via webhook
When the meeting ends, Gregnote sends a POST request to your webhook_url with the full transcript:
{
"event": "meeting.completed",
"bot_id": "bot_01J9ABCD...",
"transcript": {
"text": "Alice: Let's kick off the Q3 review. Bob: Sounds good...",
"language": "en",
"segments": [
{
"speaker": "Alice",
"text": "Let's kick off the Q3 review.",
"start": 0.0,
"end": 3.8
},
{
"speaker": "Bob",
"text": "Sounds good, first item is pipeline.",
"start": 4.1,
"end": 7.2
}
]
},
"duration_seconds": 1847,
"meeting_url": "https://meet.google.com/abc-def-ghi"
}Step 6: Handle the webhook in your server
import crypto from "crypto"; import express from "express";
const app = express(); app.use(express.raw({ type: "application/json" }));
app.post("/hooks/gregnote", (req, res) => { // Verify the webhook signature const sig = req.headers["x-gregnote-signature"] as string; const [tPart, vPart] = sig.split(","); const timestamp = tPart.slice(2); const received = vPart.slice(3); const expected = crypto .createHmac("sha256", process.env.GREGNOTE_WEBHOOK_SECRET!) .update(timestamp + "." + req.body) .digest("hex");
if (received !== expected) { return res.sendStatus(401); }
// Acknowledge immediately res.sendStatus(200);
// Parse and process
const event = JSON.parse(req.body.toString());
if (event.event === "meeting.completed") {
const { segments } = event.transcript;
// Do whatever you want with the transcript:
// - Save to database
// - Send to LLM for summarisation
// - Push to Slack, Notion, CRM
console.log(Meeting ended. ${segments.length} transcript segments.);
}
});
```
What about the transcript format?
The segments array gives you everything you need for downstream processing:
- `speaker`: The display name of the speaker as identified by diarization. On Google Meet, Gregnote uses the participant's display name when available.
- `text`: The transcribed words for that segment.
- `start` / `end`: Timestamps in seconds from the start of the meeting.
The text field on the top-level transcript object gives you the full transcript as a continuous string, with speaker labels inline.
Multi-language support
If your meeting is in a language other than English, pass the language hint:
{
"meeting_url": "...",
"transcription": { "language": "fr" }
}Supported: English, French, German, Spanish, Italian, Portuguese, Japanese, Chinese, Korean, Arabic, and more. If you omit the hint, Gregnote auto-detects the language from the audio.
How long does transcription take?
For a typical meeting, the webhook fires within 1–3 minutes of the meeting ending. The transcription step usually takes 10–20% of the meeting duration — a 30-minute meeting takes 3–6 minutes to process.
If your use case requires faster turnaround, you can poll the bot status endpoint between the meeting ending and the webhook arriving. In practice, most applications queue the webhook event and process it asynchronously, so the processing latency isn't user-facing.
Common questions
Will participants know the bot is recording? Yes. The bot appears as a named participant in Google Meet. This is required — undisclosed recording is illegal in most jurisdictions. Always name the bot clearly (e.g., "Meeting Recorder" or "[Your Company] Notetaker").
What happens if the bot doesn't get admitted?
If the host doesn't admit the bot within the configured timeout (default 10 minutes), Gregnote fires a bot.owner_no_show event and the bot withdraws. No charge for the failed session.
Can I get transcripts from meetings I didn't create? Yes — as long as a participant in the meeting admits the bot or the meeting is set to allow all participants. The meeting doesn't need to be on your Google account.
Does it work with Google Workspace meetings? Yes, as long as the Workspace org's meeting policy allows external participants to join. Most do by default.
Next steps
For a deeper look at how to build a complete meeting intelligence product on top of these transcripts, see building meeting intelligence into your SaaS product. For handling the webhook reliably in production, see webhook reliability patterns.
Try it yourself
API key in 30 seconds. Free credit on sign-up. No card required.