Skip to navigation

Google Signed-In Bots

Sign bots in to your own Google Workspace so they join Google Meet as named, invited participants
View as Markdown

A signed-in bot joins Google Meet as a real Google Workspace user, so it can join meetings that require a Google account and skip the lobby when it is on the calendar invite.

This guide applies to Google Meet only. For Microsoft Teams, see Microsoft Teams Signed-In Bots. For how guest bots join, see Google Meet Bots.

When to use a signed-in bot

SituationGuest botSigned-in bot
The organizer’s Workspace only admits signed-in Google accountsFails with SignInRequiredJoins
Trusted or Restricted meeting, bot account on the calendar inviteWaits for a host to admit itJoins directly
Nobody is around to admit the botTimes out with NotAllowedJoins directly if invited
You want a consistent name and photo in the participant listShows bot_nameShows the Google account’s name and photo
The meeting has Google Meet’s Waiting room turned onWaitsAlso waits (the Waiting room holds everyone)

Signed-in bots can’t bypass a policy that only admits people from the organizer’s own organization, unless the bot account belongs to that organization.

How it works

You create a small, dedicated Google Workspace that holds only bot accounts, and point its single sign-on (SSO) at MeetStream. MeetStream then acts as the SAML identity provider (IdP) for that Workspace: when a bot signs in with one of your bot accounts, Google hands the sign-in to MeetStream, and MeetStream answers with a response signed by the private key you uploaded. No passwords are stored or typed.

MeetStream only completes sign-ins for bots it launched with a registered login. Anyone else sent to the sign-in URL is refused.

Use a Workspace that contains only bot accounts. Google’s legacy SSO profile applies to every user in the Workspace except the org units or groups you exempt, and MeetStream only signs in bot logins, so regular users in that Workspace could no longer sign in. Your company’s main Workspace should not be used.

Before you start

  • A Google Workspace for a domain you use only for bot accounts. This guide uses example.com.
  • A super administrator for that Workspace who is not one of the bot accounts. Google does not send super administrators to the third-party IdP when they sign in at admin.google.com, so this account keeps working after SSO is on (Google: super administrator SSO).
  • One or more regular (non-admin) user accounts for the bots, for example notetaker@example.com. Give each the name and photo you want Meet to show.
  • OpenSSL on your machine, to create the signing key and certificate.
  • A MeetStream API key and access to the MeetStream dashboard.

Part 1: Set up Google Workspace

1

Create the bot accounts

In the Google Admin console of your bot Workspace, add a user for each bot login. The account’s first and last name become the name shown in Meet, and its profile photo becomes the bot’s avatar.

Plan one account per 30 bots you expect to run at the same time (see How many logins you need).

2

Generate a signing key and certificate

Run this once. It creates a private key (key.pem) and a self-signed certificate (cert.pem) valid for 10 years:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem \
-sha256 -days 3650 -nodes -subj "/CN=MeetStream Google SSO"
  • cert.pem goes to Google (Part 1, step 5) and to MeetStream (Part 2, step 3).
  • key.pem goes only to MeetStream. Keep it private.

Use this same pair for every bot account in the domain: Google checks every sign-in against the one certificate in your SSO profile.

3

Open the SSO settings

Sign in to admin.google.com as the super administrator. Go to Security > Authentication > SSO with third party IdP.

Google Admin console home with Security and Authentication highlighted in the left menu
In the Admin console menu, open Security (1), then Authentication (2).
Google Admin console left menu with Authentication expanded and SSO with third-party IdP highlighted
Under Authentication (1), open SSO with third-party IdP (2).
4

Open the legacy SSO profile

Under Third-party SSO profiles, click Legacy SSO Profile if it is listed. If it is not, click Add SAML profile, then at the bottom of the IdP details page click Go to legacy SSO profile settings (Google: set up SSO).

MeetStream supports the legacy SSO profile. Google’s console recommends newer SSO profiles; MeetStream sign-in is documented and tested with the legacy profile only.

Google Admin SSO with third-party IdPs page showing the Legacy SSO Profile row and the Manage SSO profile assignments section
Open the Legacy SSO Profile (1). You will assign it to your bot accounts later in Manage SSO profile assignments (2). Organization names are blurred.
5

Point the profile at MeetStream

On the Legacy SSO profile page:

  1. Check Enable legacy SSO profile. (Google’s help calls this box Enable SSO with third-party identity provider.)
  2. Sign-in page URL:
    https://api.meetstream.ai/api/v1/bot/gmeet-sign-in
  3. Sign-out page URL (Google requires a value):
    https://api.meetstream.ai/api/v1/bot/gmeet-sign-out
  4. Verification certificate: upload cert.pem.
  5. Check Use a domain-specific issuer. Google then identifies your domain in every sign-in request (as google.com/a/<your-domain>), which MeetStream uses to match the request to your logins.
  6. Click Save.
Google Admin Legacy SSO profile page with Enable legacy SSO profile checked and the MeetStream sign-in and sign-out URLs entered
Enable the profile (1), enter the Sign-in page URL (2) and Sign-out page URL (3), and upload cert.pem as the verification certificate (4).
Google Admin Legacy SSO profile page with the verification certificate uploaded and Use a domain-specific issuer checked
After the certificate is uploaded (1), check Use a domain-specific issuer (2).
6

Assign the profile to the bot accounts

Back on SSO with third party IdP, click Manage SSO profile assignments, then Get started (first time) or Manage assignments. Select the organizational unit or group that contains the bot accounts and assign the Legacy SSO profile to it. Click Save.

In a Workspace that only holds bots, assigning it to the top-level organizational unit is simplest. Google may take a little while to apply the change.

Part 2: Register the domain and logins in MeetStream

1

Open Signed Bots

In the MeetStream dashboard, go to Integrations > Signed Bots and click Add domain.

MeetStream dashboard Integrations page with the Signed Bots tab selected and the Add domain button highlighted
Open Integrations (1), select the Signed Bots tab (2) and click Add domain (3).
2

Add your bot domain

  • Domain (1): the bot Workspace domain, exactly as it appears after the @ in the bot emails, in lowercase (for example example.com). You will send the same value as google_login_domain.
  • Name (2): any label you like.
  • Login mode (3): leave Always. See Login mode.
  • Click Add domain (4).

A domain can be registered by one MeetStream account only. Registering it again returns HTTP 409 Domain <domain> already registered.

MeetStream Add domain dialog filled in with the domain example.com, the name Example Bots and Login mode Always
Enter the domain (1) and a name (2), keep Login mode on Always (3), then click Add domain (4).
3

Add each bot account and upload the key pair

Open the domain (click its row or View), then click Add email. For every bot account:

  1. Email: the bot account, for example notetaker@example.com.
  2. Active: leave on. Only active logins are used.
  3. SSO private key (PEM): upload key.pem.
  4. SSO certificate / public key (PEM): upload cert.pem.
  5. Click Add email.

Upload the same key.pem and cert.pem for every email in the domain.

MeetStream Add email dialog with fields for the email address, an Active switch, and PEM uploads for the SSO private key and SSO certificate
The Add email dialog (shown here in a previous dashboard design; the current layout may differ): Email (1), Active (2), private key (3), certificate (4), Add email (5). The domain is blurred.

Or use the API

The same setup is available with your API key (Google Signed-In Bots endpoints):

# Register the domain
curl -X POST "https://api.meetstream.ai/api/v1/google-login-domains" \
-H "Authorization: Token <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{"sso_workspace_domain": "example.com", "name": "Example Bots", "login_mode": "always"}'
# Add a login (PEM contents as strings, newlines escaped as \n)
curl -X POST "https://api.meetstream.ai/api/v1/google-logins" \
-H "Authorization: Token <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"domain": "example.com",
"email": "notetaker@example.com",
"sso_private_key_pem": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----",
"sso_cert_pem": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
"is_active": true
}'

Part 3: Send a signed-in bot

Add a google_meet block to Create Bot:

{
"meeting_link": "https://meet.google.com/abc-defg-hij",
"bot_name": "Notetaker",
"video_required": false,
"bot_message": "Hi everyone, I'm taking notes for this meeting.",
"bot_image_url": "https://example.com/bot-avatar.png",
"google_meet": {
"login_required": true,
"google_login_domain": "example.com",
"sign_in_email": "notetaker@example.com",
"strict_email": true
},
"callback_url": "https://example.com/webhooks/meetstream",
"custom_attributes": {
"customer_id": "cus_123"
},
"automatic_leave": {
"waiting_room_timeout": 300,
"everyone_left_timeout": 120
}
}

Request fields

FieldTypeRequiredWhat it does
google_meet.login_requiredbooleanYes, to sign intrue signs the bot in. Omit the google_meet block, or set false, for a guest bot.
google_meet.google_login_domainstringWhen login_required is trueA domain registered to your MeetStream account.
google_meet.sign_in_emailstringNoUse this exact login. Its domain must equal google_login_domain; gmail.com and googlemail.com addresses are rejected.
google_meet.strict_emailbooleanNo (default true)Only allowed with sign_in_email. true: fail if that login is missing, inactive or full. false: fall back to the least busy login in the domain.

The google_meet block is only accepted for Google Meet links. With a signed-in bot, bot_name is not shown in Meet (the Google account’s name is), but bot_image_url is still used as the bot’s camera image.

How MeetStream picks a login

  1. Only logins marked Active are candidates.
  2. If you set sign_in_email, that login is used when it has room. Otherwise the request fails (strict_email: true) or falls back to step 3 (strict_email: false).
  3. Otherwise MeetStream picks the login with the fewest bots currently joining or in a meeting.
  4. Each login carries up to 30 bots at the same time.

For scheduled bots, the login is picked when the bot is about to join, not when you schedule it.

How many logins you need

logins = peak concurrent signed-in Meet bots / 30, rounded up

30 is the hard ceiling per login, so add headroom. Planning on 20 bots per login leaves room for spikes. For example, a peak of 100 concurrent signed-in bots needs at least 4 logins; 5 is safer.

Errors when creating the bot

Errors return a JSON body of the form {"message": "..."}.

HTTPWhenmessage
400google_login_domain is not registeredgoogle_meet.google_login_domain '<domain>' is not registered. Register it via the admin Google login domains API first.
403The domain is registered to a different MeetStream accountgoogle_meet.google_login_domain '<domain>' is not registered to this account
429No active logins in the domainNo active Google logins are registered under domain '<domain>'
429sign_in_email is not an active login (with strict_email: true)Requested sign_in_email '<email>' is not a registered active login under domain '<domain>'
429sign_in_email already has 30 bots (with strict_email: true)Requested sign_in_email '<email>' is at capacity (30 active sessions)
429Every login is at 30 botsAll <n> active logins under domain '<domain>' are at capacity (30 active sessions each)
400Invalid google_meet blockFor example google_meet.google_login_domain is required when login_required is true, google_meet.sign_in_email domain must equal google_meet.google_login_domain, google_meet.strict_email is only valid when sign_in_email is provided, google_meet configuration is only valid for Google Meet (GMeet) platform

A 429 here means “no login is free right now”. Retry after bots finish, add logins, or drop strict_email.

If sign-in fails, the bot does not join as a guest

A signed-in bot never falls back to guest mode. If Google sign-in does not complete, the bot stops before opening the meeting:

FieldValue
StatusFailed
MessageFailed: Configured Google sign-in failed
ErrorReasonGoogleSignInFailed
Webhookevent: bot.stopped, bot_event: bot.failed, failure_reason: google_sign_in_failed, status_code: 500

See Troubleshooting for what to check.

What participants see

  • The Google account’s name and photo. Change them on the account in Google Admin.
  • The bot’s camera tile shows your bot_image_url.
  • Status webhooks for signed-in bots include profile_image_url (the account’s photo) when available.

Skip the lobby with the calendar invite

Add the bot account’s exact email as a guest on the Google Calendar event, and send the bot with sign_in_email set to that address (keep strict_email: true). Meet then treats the bot as an invited participant:

  • Open and Trusted or Restricted meetings: the invited bot joins directly.
  • Waiting room on: the bot waits like everyone else until a host brings it in.

The full admission matrix is on the Google Meet page.

Login mode

The Login mode on a domain (Always or Optional in the dashboard, always or if_required in the API) is saved with the domain but does not change Google Meet bots today. A bot signs in exactly when its request sets google_meet.login_required: true, and joins as a guest otherwise. Choose Always.

Troubleshooting

Work through this list:

  1. The email exists as a user in the bot Workspace and is not suspended.
  2. The user is in the org unit or group that has the Legacy SSO profile assigned.
  3. The user is not a super administrator. In the normal sign-in flow, Google does not send super administrators to a third-party IdP.
  4. The certificate in Google Admin matches the cert.pem uploaded for that email in MeetStream, and the key.pem belongs to the same pair.
  5. The Sign-in page URL is exactly https://api.meetstream.ai/api/v1/bot/gmeet-sign-in.
  6. Use a domain-specific issuer is checked.
  7. The login is Active in MeetStream, and the domain registered in MeetStream matches the email’s domain.

Register the domain under Integrations > Signed Bots (or POST /api/v1/google-login-domains) with the same API account you use to create bots. Use the domain in lowercase in both places.

The domain belongs to another MeetStream account. Create bots with an API key from the account that registered the domain.

No login could take the bot: none are active, the sign_in_email login is missing or full (with strict_email: true), or all logins already carry 30 bots. Add logins, activate them, or set strict_email: false.

Check that the invited email is exactly the login the bot used (pin it with sign_in_email), and that the event does not have the Waiting room turned on. For recurring events, check that the specific occurrence still lists the bot as a guest.

Signed-in bots always show the Google account’s profile. Update the user’s name or photo in Google Admin; bot_name does not apply.

Yes, as an external participant, as long as the host’s organization lets external Google accounts join. It skips the lobby only when its email is on that meeting’s invite and the meeting is not using a Waiting room.

Generate a new key pair, upload the new cert.pem in the Legacy SSO profile (Replace certificate), then update every login in MeetStream with the new key.pem and cert.pem (remove and re-add the email in the dashboard, or PATCH /api/v1/google-logins/{login_id}). Do this when no signed-in bots are running, because sign-ins fail while Google and MeetStream hold different certificates.