Google does not provide a public API that lets a bot join a meeting, capture audio, or pull a live transcript.
That means the only way to build a Google Meet bot yourself is to automate a real browser. The bot opens Google Meet just like a human would, clicks through the join flow, enables captions, and reads what appears on screen.
This guide walks you through building that bot step by step using Node.js and Puppeteer.
By the end you will have a working bot that joins a Google Meet, enables live captions, and saves a transcript to a file.
Quick Recap
Create a dedicated Google account for the bot
Set up a Node.js project and install Puppeteer
Automate Google login using page.type() and page.click(), or load saved cookies
Navigate to the Meet URL and click the Join button using text-based button matching
Enable captions through the More Options menu
Poll the captions DOM container every 1.5 seconds and write new lines to a file
Save session cookies to avoid repeated login flows in production
What You Need Before You Start
Node.js version 18 or above installed on your machine
A dedicated Google account for the bot (do not use your personal account)
A Google Meet link to test with
Basic familiarity with JavaScript
Use a fresh Google account created specifically for this bot. Running repeated automated logins on a personal account risks triggering Google's bot detection and getting the account flagged.
How to Build a Google Meet Bot?
Step 1: Set Up Your Project
Create a new folder for the project and initialise it.
bash
mkdir meet-bot
cd meet-bot
npm init -y
Install Puppeteer. This downloads a bundled version of Chromium along with the library.
The bot needs to be signed into a Google account before it can join a Meet. Puppeteer launches a real Chromium browser window and automates the login flow.
Run it once with headless: false so you can watch what happens and debug any issues with the login flow. Google sometimes adds extra verification steps for new accounts or unfamiliar login locations. Handle those manually the first time, then automate once the session is stable.
Step 3: Navigate to the Meeting and Join
After login, go to the Meet URL and click through the pre-join screen.
const text = await page.evaluate(el => el.innerText, button);
if(text.includes('Join') || text.includes('Ask to join')){
await button.click();
break;
}
}
console.log('Joined the meeting.');
await page.waitForTimeout(3000);
}
A quick note on selectors: Google updates the Meet UI regularly. The selectors above work as of early 2025 but may change. If the bot fails to click the join button, open DevTools in a real Chrome window on the same page and inspect the element to find the current selector.
Step 4: Enable Live Captions
Captions are how the bot reads what people say. Enable them through the Meet toolbar.
javascript
asyncfunctionenableCaptions(page){
// Click the "More options" button (three dots) in the bottom toolbar
The caption container selector [jsname="tgaKEf"] is the one used in Meet's DOM currently. The jsname attribute tends to be more stable than class names, but always verify it by inspecting the live page if something breaks after a Meet update.
You should see the browser open, log into Google, navigate to the Meet, join the call, enable captions, and start printing captured text to your terminal while writing it to transcript.txt.
Things That Break and How to Handle Them
Google blocks the login. This happens when Google detects an automated login pattern. Use a real session cookie instead of typing credentials each time. Save cookies after the first manual login and reload them on subsequent runs.
The join button selector stops working. Google updates Meet's frontend regularly. When this happens, open a Chrome window, go to the Meet pre-join screen, right-click the Join button, and click Inspect. Find the current attribute or text you can target.
Captions drop words. Google's caption engine paraphrases aggressively and truncates long phrases. If you need high-accuracy transcription, route the audio to a proper ASR engine like Whisper or Deepgram instead of relying on DOM captions.
Conclusion
This bot gives you a working proof of concept. It joins a meeting, reads captions, and saves a transcript. That is enough for internal tools, lightweight summarisation pipelines, and meeting note automation.
What it cannot do easily: it does not capture raw audio, it does not produce speaker-attributed transcripts reliably, and it requires ongoing maintenance every time Google updates their UI. If any of those things matter for your use case, you will spend significant engineering time maintaining selectors and handling edge cases.
For teams who want all of that out of the box without the maintenance overhead, Meetstream.ai is worth a look. It handles bot deployment, real-time transcription with speaker labels, and recording storage through a clean API, so you can focus on building what you actually want rather than keeping up with Google Meet's frontend changes.