All blogs Resources
By Ajitesh

Build a Voice AI Agent That Joins Google Meet and Zoom

Build a Voice AI Agent That Joins Google Meet and Zoom

A Google Meet bot is a program that joins a meeting as a participant. The catch is that Google has no API that lets a bot talk in a call. Google’s Meet Media API only lets an app receive a meeting’s audio and video. It is still in Developer Preview, and every participant in the call has to be enrolled in that preview. So a bot that speaks in Google Meet has to join the way a person does: a Chrome browser opens the meeting link, and its microphone is wired to a voice AI model.

That leaves three ways to build one. You can write the whole stack yourself, use a meeting-bot API that handles the joining, or use a platform where joining, voice, and analysis already work. This guide walks through how the pieces fit together, what each path asks of you, and how to send a talking agent into Google Meet or Zoom with Tough Tongue AI, from the dashboard, from your own code, or from Claude and ChatGPT.

Here is a short walkthrough of the no-code path:

How a Google Meet bot actually works

Take away the product names, and every talking meeting bot does the same five jobs.

  1. Join. A headless Chrome browser opens the Meet link, switches on the camera and microphone, and asks to join. Puppeteer and Playwright are the usual tools. If the meeting only admits signed-in users, the browser needs a real Google account.
  2. Listen. The bot pulls the call’s audio out of the browser and streams it to a server.
  3. Think. Speech-to-text turns the audio into words, a language model decides what to say, and text-to-speech turns the reply back into audio. Some teams replace that chain with one real-time speech model. Either way, this step has to judge when the other person has finished talking, and stop when someone interrupts.
  4. Speak. The reply plays into the call through a virtual microphone, so everyone hears the bot like any other participant. A video avatar goes in the same way, through a virtual camera.
  5. Report. When the call ends, the bot keeps the recording and transcript and runs whatever analysis you need.

The first two jobs are plumbing, and there is good open-source work on them. The third is where the experience lives. A bot that pauses too long before it answers, or talks over people, feels broken no matter how good its answers are.

Zoom is a little different. It offers a Meeting SDK, so a bot does not have to drive a browser, but the SDK is low-level. The open-source Attendee project points out that features like per-participant audio are only in the C++ versions of it.

Inside a talking Google Meet bot
JoinChrome opens the linkasks to joinadmitted
Meet call audio in Speechto text words Model + tools reply Text tospeech voice out The botChrome, signed in
After the callrecordingtranscriptrubric scores
Joining gets the bot into the room. The loop from hearing to speaking runs on every turn, and it is where the quality lives.

Every one of these jobs has to work on every call. That is the real cost of a meeting bot, and it is the useful way to look at the choice below.

Three ways to build a Google Meet bot

How you build one comes down to how much of that stack you want to own.

1. Write it yourself

Start with Puppeteer or Playwright for the joining, then add speech-to-text, a model, and text-to-speech. Recall.ai has open-sourced a small Playwright bot that joins a Google Meet, scrapes the live captions, and summarizes them. It is a good way to see the moving parts.

You get full control, and you own every problem. Each bot needs its own isolated container so audio from two meetings never mixes. The Google accounts your bots sign in with need looking after. The join flow breaks when Google changes the Meet interface, and someone has to fix it that day. For a bot that holds a real conversation, plan for two to three months of engineering before it is reliable.

2. Use a meeting-bot API

Recall.ai is a hosted option, and Attendee and Vexa are open-source ones you can run yourself. They handle joining, recording, and transcripts across Google Meet, Zoom, and Microsoft Teams, and several can also play audio into the call. You send one API call and a bot shows up.

What they do not give you is the agent: what it says, when it says it, how it handles being interrupted, and how the call gets scored. You still build that part, and it is the part people in the meeting notice.

3. Use a no-code agent platform

This is the path we built Tough Tongue AI for. You describe the agent in plain language: its role, its agenda, and how to score the call. The platform handles joining Google Meet or Zoom, the real-time voice, an optional video avatar, the recording, and the analysis after the call. You give up some low-level control, and in return you can test a working agent the same day.

What you build on each path
Write it yourselfPuppeteer + your own voice stack
  • joining
  • audio in and out
  • recording
  • voice agent
  • avatar
  • scoring
You build 6 of 6Plan for two to three months.
Meeting-bot APIRecall.ai, Attendee, Vexa
  • joining
  • audio in and out
  • recording
  • voice agent
  • avatar
  • scoring
You build 3 of 6You build the agent on top.
No-code agentTough Tongue AI
  • joining
  • audio in and out
  • recording
  • voice agent
  • avatar
  • scoring
You build 0 of 6You write the scenario.
dashedyou build and maintain itsolidhandled for you
The further right you go, the less you build, and the less low-level control you keep.

If you were about to hire a freelancer

Many people looking into this are about to hire someone to build it. That can be the right call, but scope it first. A bot that only joins and records is a modest project on top of a meeting-bot API. A bot that talks back is a much bigger one: real-time voice, turn-taking, interruptions, one isolated bot per meeting, and someone on call when Google changes the Meet interface and joins start failing. Ask how they will handle each of those, and who fixes it in month four.

If what you need is an agent that runs interviews, discovery calls, or coaching sessions, try the no-code path first. In an afternoon you will know whether the agent is good enough. If it is not, you will have a much sharper spec to hand a developer.

P
ParisAI interviewer, in your Google Meet
Live
Google MeetZoomScreening call

“Hi, I’m Paris, the AI interviewer. Can you hear me okay?”

Send to a meeting
Try it yourself
Send an agent into your next Google Meet

Describe the agent in plain language, paste a Meet or Zoom link, and read the scored report when the call ends.

  1. Write a scenario: the role, the questions, and the rubric.
  2. Open the Meeting Bot tab and paste your Google Meet or Zoom link.
  3. Get the transcript and scores in your inbox after the call.
The meeting bot is included on the $20 Premium plan.

What your agent can do in the meeting

Tough Tongue AI has two kinds of meeting agents, and the difference is whether the agent talks.

Streaming agents join with a video avatar and take part in the conversation. They listen, answer, ask follow-up questions, and can use tools like slides, a whiteboard, or image generation while they talk. If you want an agent that runs a screening interview or a discovery call on its own, this is the one.

Notetaker agents join with the camera and microphone off. They do not speak. They listen, record, and score the conversation against your rubric, then send a report when the call ends. This is the one for coaching sales calls or reviewing interviews your team runs.

Two kinds of meeting agents
Streaming agent
Ava (AI interviewer)Camera on, mic on
  • “Walk me through a product you launched.”
  • “What would you change if you did it again?”
Talks, listens, and follows up.
Notetaker agent
Sales call scorerCamera off, mic off
RepWhat does that cost you in engineering hours?
ProspectWe already have something for that.
strong questionmissed follow-up
Stays silent and scores the call.
Same scenario format, one setting apart: the streaming agent runs the conversation, and the notetaker grades it.

Some of the ways teams use them:

  • First-round screening interviews. A streaming agent asks your questions, follows up on vague answers, and scores the candidate. You read the report instead of sitting through the call.
  • Sales call coaching. A notetaker joins discovery calls and demos and scores the opening, the discovery questions, objection handling, and next steps, each backed by quotes from the call.
  • Investor pitch review. A notetaker sits in on fundraising meetings and scores narrative clarity, financial fluency, team credibility, and the close.
  • Roleplay training. A streaming agent plays the difficult customer, the tough negotiator, or the skeptical buyer, so your team can rehearse before the real call.

All of these are set up the same way, as a scenario: a plain-language description of the agent’s role, what it should do in the call, and how to score it. If you are building one specifically for sales calls, I wrote a longer guide on AI meeting agents for sales that covers the business context the agent needs.

Can an AI agent attend a meeting for you?

Partly, and it is worth being clear about where the line is. An agent can attend as itself. It joins under its own name, posts a short chat message when it arrives so people know an AI is in the call, and does a specific job: runs an intake conversation, answers product questions, or takes scored notes. It should not pretend to be you. People in a meeting deserve to know who they are talking to, and a named AI participant with a clear job is also easier to trust.

So the useful version of “attend my meeting for me” is to send an agent to the meetings that follow a repeatable pattern, like screening calls, first discovery calls, or practice sessions, and read the report afterward.

Build a Google Meet agent step by step

This is the no-code path. You need a Tough Tongue AI account on the Premium or Business plan.

Step 1: Write the scenario

Go to the Scenario Library and click Create New Scenario. A scenario defines three things:

  1. Role. Who the agent is: “a senior PM interviewer” or “a silent note-taker for sales calls.”
  2. Agenda. What it does in the call: the questions to ask, the coaching flow, or what to watch for.
  3. Rubric. How the conversation is scored afterward: the dimensions, and what good looks like on each.

You write all of it in plain language. Here is a talking agent that runs a first-round screen:

Scenario: first-round screening interviewer
ROLE
You are Ava, an AI interviewer for a product manager role at Acme.
Be warm, direct, and brief. Say at the start that you are an AI.

AGENDA
1. Ask the candidate to walk you through their current role.
2. Ask about a product they launched: the problem, their decisions, the result.
3. If an answer is vague, ask one follow-up for a specific example.
4. Leave time for the candidate's questions, then close politely.

RUBRIC
Score each dimension from 1 to 10 and quote the answer behind each score.
- Product sense
- Clarity of communication
- Ownership and impact

And here is a silent agent that scores sales discovery calls:

Scenario: silent sales call scorer
ROLE
You are a sales discovery call coach. Stay silent for the whole call.

WATCH FOR
- Opening and agenda setting
- Discovery depth
- Talk-to-listen ratio
- Closing and next steps

RUBRIC
Score each dimension from 1 to 10. After the call, give the rep's top
strength, the biggest missed opportunity, and one concrete drill to practice.

For a silent agent like the second one, turn on Notetaker Mode and Audit Mode in the meeting settings. That keeps it quiet and focused on observation.

Step 2: Open the Meeting Bot tab

Go to Library, open your scenario, and click the Meeting Bot tab. This is where you send the agent into meetings.

Step 3: Send the bot into a meeting

There are two modes in the dashboard.

Custom Meeting mode is for one-off calls. Pick Google Meet or Zoom, paste the meeting link or create a fresh Google Meet room, optionally choose a time for the bot to join, and deploy. The agent joins the call.

Calendar mode is for meetings that repeat. Connect your Google Calendar, which gives read access so the platform can see your meetings. Then add keyword filters like “interview” or “discovery”, and the agent joins any meeting whose title matches. Each scenario has its own calendar connection and keywords, so different agents can cover different kinds of meetings.

Keyword filters send the right agent to each meeting
Interview: PM candidate→matches “interview”→Screening agent joins
Discovery call: Acme→matches “discovery”→Sales coach joins
Weekly team standup→no keyword match→no bot
Each scenario keeps its own calendar connection and keywords, so one calendar can feed several agents.

If the bot should join as part of your own product, for example when a candidate books an interview slot in your app, use the API. If you would rather ask an AI assistant to do it, use MCP. Both are covered below.

Getting the bot into private meetings

Getting in is the step people ask about most. On Google Meet, the bot joins as a signed-in Google account rather than an anonymous guest, and how it gets in depends on the meeting’s access settings.

Open meetings. If anyone with the link can join, the bot joins directly. There is nothing else to do.

Private meetings. Google Meet holds the bot in the waiting room, like any guest who was not invited. You have two options:

  • Admit it. Someone in the call sees “someone wants to join” and clicks Admit. This works well for notetakers, where a person is already in the meeting and expects the bot.
  • Invite it. Add ttai@toughtalkai.com as an attendee on the calendar event. Google then treats the bot as an invited participant, and it joins without knocking.
How the bot gets into a Google Meet
Can anyone with the link join?
Yes→The bot joins directly.
No→It waits in the lobby, like any guest.
↓
Is someone in the call to click Admit?
Yes→They admit it. Good for notetakers.
No, the bot runs alone→Invite ttai@toughtalkai.com to the event. It joins without knocking.
The invite is what lets an agent run a meeting with nobody from your side in the room.

The invite matters most for autonomous agents. If the agent is running a first-round interview and the candidate is the only human in the room, nobody is there to click Admit.

On Zoom, paste the meeting link in Custom Meeting mode. If the meeting has a waiting room turned on, the host admits the bot the same way they would admit a person.

A word on access, since people ask. The bot never needs your Google password. Calendar mode asks for read access to your calendar so it can see meeting titles and times. Custom Meeting mode needs no calendar access at all, only the link. And because the bot shows up as a named participant and posts a short chat message when it joins, everyone in the call knows an AI agent is there.

What you get after the call

When the call ends, the platform processes the session:

  1. Transcript. The full conversation, generated automatically.
  2. Analysis. The call is scored against the rubric in your scenario. Each dimension gets a score, evidence in the form of quotes and timestamps, and coaching notes.
  3. Email report. The scores and analysis go to the scenario admin.
  4. Session dashboard. Every session, with its recording, transcript, and evaluation, is on the Sessions page.

The analysis points at specific moments. For the sales scorer above, a report might give opening and agenda setting a 7 out of 10, discovery depth an 8, talk-to-listen ratio a 5, and closing a 6. It then quotes the moment at 4:32 when the rep asked what the problem cost in engineering hours, a question that turned a vague complaint into a $180K-a-year pain point. It names the biggest miss: when the prospect said “we already have something for that,” the rep moved to the next feature instead of asking what the current tool does well. And it ends with one drill for the next call.

Example report: sales discovery call
Opening and agenda7/10
Discovery depth8/10
Talk-to-listen ratio5/10
Closing and next steps6/10
Each score is out of 10 and links back to a moment in the call.
Top strength4:32“What does that cost you in engineering hours?”Turned a vague complaint into a $180K-a-year pain point.
Biggest missMoved on after “we already have something for that.”Should have asked what the current tool does well.
One drillAcknowledge, clarify, address.“That’s a fair point. What’s working with your current approach?”
Every score comes with the moment that earned it, so the rep knows what to repeat and what to fix.

If you want the results somewhere else, you can pull them with the API, have them pushed to your server with webhooks, or send them to Google Sheets with the Apps Script integration. The reference below has the details.

Run it from Claude, ChatGPT, Codex, or Cursor

You can also do everything in this post by asking an AI assistant. Tough Tongue AI runs a hosted MCP server, so Claude, ChatGPT, Codex, Cursor, GitHub Copilot, Windsurf, and Gemini CLI can write scenarios, schedule meeting bots, and pull session results for you. There is nothing to install. You add one URL and sign in through your browser.

Claude Code
claude mcp add --transport http ttai https://api.toughtongueai.com/api/public/mcp
Codex
codex mcp add ttai --url https://api.toughtongueai.com/api/public/mcp
codex mcp login ttai

In claude.ai, add it under Settings > Connectors > Add custom connector with the same URL. In ChatGPT, turn on Developer mode, then create an app with that URL under Settings > Apps. Scheduling a bot is a write action, so in ChatGPT it needs a Business, Enterprise, or Edu workspace. The setup guide has the exact steps for each client.

Then ask for what you want in plain language:

Ask your assistant
Create a first-round screening scenario for a product manager role at Acme.
Then send it to https://meet.google.com/abc-defg-hij tomorrow at 3 pm
as "Ava (AI interviewer)".

After the call, a follow-up like “How did yesterday’s candidate score, and where were they weakest?” pulls the session and its rubric scores. In Claude Code and Codex, the Tough Tongue plugin adds skills on top of the server for writing scenarios, fixing them from real sessions, and analyzing results.

Developer reference: the meeting bot API

Use the REST API when the bot should join as part of your own product. Requests go to https://api.toughtongueai.com/api/public with a Bearer key from Developer Settings. You need a Premium or Business plan and edit access to the scenario.

What you wantEndpoint
Send a bot to a meetingPOST /v2/meeting-bots
List bots and their statusGET /v2/meeting-bots
Cancel a scheduled botDELETE /v2/meeting-bots/{bot_id}
List sessions with scoresGET /v2/sessions
Get one session’s transcript and analysisGET /sessions/{session_id}

Send a bot into a meeting

Schedule a meeting bot
curl -X POST https://api.toughtongueai.com/api/public/v2/meeting-bots \
  -H "Authorization: Bearer $TTAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "scenario_id": "YOUR_SCENARIO_ID",
    "meeting_url": "https://meet.google.com/abc-defg-hij",
    "meeting_provider": "google-meet",
    "bot_name": "Ava (AI interviewer)",
    "scheduled_ts": "2026-10-01T15:00:00Z"
  }'

The response gives you a bot_id and a session_id right away:

Response
{
  "success": true,
  "bots": [{ "bot_id": "67bf57183f44cdf6055a8166", "session_id": "67bf57183f44cdf6055a8167" }]
}

Keep the session_id. That is where the transcript and scores will be once the call ends.

FieldRequiredWhat it does
scenario_idYesThe agent to send.
meeting_urlYesA Google Meet or Zoom link. Put several links on separate lines to send several bots.
meeting_providerYesgoogle-meet or zoom.
bot_nameYesThe name people see in the call. Make it clear that it is an AI.
scheduled_tsNoWhen to join, in ISO 8601. Leave it out to join right away.
login_requiredNoSet to true when the Google Meet only admits signed-in accounts.
dynamic_varsNoValues passed into the scenario, like a candidate’s name.

Microsoft Teams support is coming. Until then, stick to google-meet and zoom.

Check on bots, or cancel one

List and cancel bots
# Bots that finished their call since September 1
curl "https://api.toughtongueai.com/api/public/v2/meeting-bots?status=call_ended&from_date=2026-09-01" \
  -H "Authorization: Bearer $TTAI_API_KEY"

# Cancel a bot that has not joined yet
curl -X DELETE https://api.toughtongueai.com/api/public/v2/meeting-bots/BOT_ID \
  -H "Authorization: Bearer $TTAI_API_KEY"

A bot’s status is pending, scheduled, in_call_recording, call_ended, or failed. You can filter the list by status, scenario_id, and a date range with from_date and to_date. Only bots that are still pending or scheduled can be canceled.

Get the results

When the call ends, fetch the session:

Get the transcript and scores
curl https://api.toughtongueai.com/api/public/sessions/SESSION_ID \
  -H "Authorization: Bearer $TTAI_API_KEY"

The response includes transcript_url, evaluation_results with a report_card that has a score and a note for each rubric topic, and improvement_results with the coaching notes. GET /v2/sessions?scenario_id=... lists every session for a scenario with the same scores, which is handy for a dashboard.

Polling works, but webhooks are cleaner. Register an endpoint under Developer > Webhooks and subscribe to session.completed (the call ended), session.analyzed (the scores are saved), or post-session.done (everything you configured has finished). Deliveries are signed with the Standard Webhooks scheme and carry the session_id. They fire only for sessions that belong to an organization, and they are not retried. So verify the signature, return a 2xx within 10 seconds, and do the real work in the background.

webhook.py (FastAPI)
import json, os
from fastapi import BackgroundTasks, FastAPI, Request
from standardwebhooks import Webhook

app = FastAPI()
wh = Webhook(os.environ["TTAI_WEBHOOK_SECRET"])

def save_scores(session_id: str) -> None:
    ...  # GET /api/public/sessions/{session_id}, then store evaluation_results

@app.post("/webhooks/ttai")
async def ttai_webhook(request: Request, tasks: BackgroundTasks):
    body = await request.body()
    wh.verify(body, dict(request.headers))  # raises on a bad signature
    event = json.loads(body)
    if event["event"] == "session.analyzed":
        tasks.add_task(save_scores, event["data"]["session_id"])
    return {"ok": True}

Embed a “Start meeting” button on your site

If you want visitors on your website to start a meeting with your agent, add one script tag:

index.html
<script
  src="https://app.toughtongueai.com/widget/meeting-bot.js"
  data-scenario-id="YOUR_SCENARIO_ID"
  data-mode="button"
  data-title="Talk to Sales"
  data-button-text="Start Meeting"
  data-t-company="Acme">
</script>

It adds a floating button, or a bar across the bottom of the page with data-mode="strip". When a visitor clicks it, the platform creates a meeting, the agent joins, and the visitor lands in the Google Meet room in a new tab. The widget renders inside a Shadow DOM container and loads an iframe from Tough Tongue AI’s domain, so your page’s CSS does not leak into it and there is no CORS setup on your side.

AttributeWhat it does
data-scenario-idThe agent that joins the meeting.
data-modebutton for a floating button, or strip for a bar across the bottom.
data-themelight or dark.
data-title, data-subtitleThe card’s heading and the line under it.
data-button-textThe label on the start button.
data-avatar-video, data-avatar-urlA looping video or a still image for the agent. The video wins if you set both.
data-t-*Variables passed into the scenario. data-t-company="Acme" passes company.
data-configA base64-encoded JSON config, such as a list of allowed emails.

FAQ

How do I build a Google Meet bot?

Google has no API that lets a bot speak in a meeting, so a Google Meet bot joins like a person: a headless Chrome browser opens the meeting link and its microphone is wired to a voice AI model. You can build that yourself with Puppeteer or Playwright, use a meeting-bot API such as Recall.ai or the open-source Attendee, or use a no-code platform like Tough Tongue AI, where you describe the agent in plain language and paste the meeting link.

Can an AI agent join a Google Meet call and talk?

Yes. A voice AI agent joins as a named participant, listens, and answers out loud in real time, with an optional video avatar. In Tough Tongue AI you write a scenario with the agent’s role, agenda, and scoring rubric, then send it to a Google Meet or Zoom link from the Meeting Bot tab, the API, or an AI assistant connected over MCP.

Does the meeting bot work with Zoom and Microsoft Teams?

Google Meet and Zoom are supported today. Paste a Zoom link in Custom Meeting mode, or set meeting_provider to zoom in the API. Microsoft Teams support is coming but is not live yet.

How do I let the bot into a private Google Meet?

A participant can click Admit when the bot knocks, or you can add ttai@toughtalkai.com as an attendee on the calendar event so the bot joins as an invited guest without knocking. Open meetings need neither step. The bot never needs your Google password. Calendar mode only asks for read access to your calendar, and Custom Meeting mode needs only the link.

Can an AI agent attend a meeting for me?

It can attend as itself, not as you. The agent joins under its own name, posts a short chat message when it arrives, and does a defined job, such as running a screening interview, handling a first discovery call, or silently scoring the conversation. You get the transcript and analysis afterward.

Should I hire a freelancer to build a Google Meet bot?

It depends on the bot. One that only joins and records is a modest project on top of a meeting-bot API. One that talks back needs a real-time voice pipeline, turn-taking, one isolated bot per meeting, and ongoing fixes when Google Meet changes, which is closer to two to three months of work. If you need an agent that runs interviews or sales calls, test a no-code platform first.

Is there an API to send a bot into a meeting?

Yes. Send POST /v2/meeting-bots to https://api.toughtongueai.com/api/public with a Bearer API key, a scenario_id, the meeting_url, the meeting_provider, and a bot_name. The response returns a bot_id and a session_id. You fetch the transcript and scores from GET /sessions/{session_id}, or get them pushed to you with webhooks.

How much does the meeting bot cost?

The meeting bot is included on the Premium plan at $20 per month and on Business plans from $99 per month. It uses your existing platform minutes, with no separate meeting-bot fee.

Getting started

  1. Sign up at app.toughtongueai.com and choose the Premium or Business plan.
  2. Write a scenario with the agent’s role, agenda, and rubric.
  3. Send it to a meeting from the Meeting Bot tab, the API, or your AI assistant.
  4. Read the results in the session dashboard, in your inbox, or in your own system.

Meeting bots used to mean notetakers. What changed is that the voice loop got good enough for an agent to hold up its end of a conversation, and a lot of real work happens in meetings. Start with one meeting that repeats, like a first-round screen or a first discovery call. Read the reports for a week, and tighten the scenario based on what you see.

If you want help setting one up, book 15 minutes with me. For more detail, see the Google Meet agent docs, the API reference, the webhooks guide, or the video demo. For a look at how avatar companies are moving into meetings, see the post on Tavus PALs joining Google Meet.

A
Ajitesh
Tough Tongue AI
Share