> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tavus.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Meet

> Give a PAL its own meeting identity so it can be invited to Google Meet calls over Google Calendar and join automatically - including meetings that are already in progress.

The **conferencing layer** gives a PAL its own email identity so it can be invited to meetings just like a human teammate. Schedule it on a future calendar event, or invite it to a meeting that's already running.

## How it works

When you set a `username` on the conferencing layer, Tavus provisions a real, invitable email address for the PAL (for example `ada@tavusinvite.com`). From there:

1. You (or anyone on the PAL's allowlist) **send a Google Calendar invite** to that email, with a Google Meet link attached.
2. Tavus receives the invite, validates the sender, and **replies `Accepted`** to the organizer.
3. For a **scheduled** meeting, the PAL joins the Google Meet call about **one minute before the start time**. For a meeting **already in progress**, it joins shortly after the invite is accepted (see [Joining a meeting that's already in progress](#joining-a-meeting-thats-already-in-progress)).
4. The PAL participates with its face's likeness and voice.

## Prerequisites

* A PAL with a **`default_face_id`**. This is **required** whenever the conferencing layer is provided - the **face** supplies the likeness and voice the PAL uses in the meeting. A request that sets the conferencing layer without a default face is rejected with a `400`.
* A standard `full` pipeline PAL (system prompt, LLM, TTS, etc.) configured as you would for any CVI conversation.

## Configuring the conferencing layer

Add a `conferencing` object to `layers` when you [create a PAL](/api-reference/pals/create-pal):

```json theme={null}
{
  "pal_name": "Anna",
  "system_prompt": "You are Anna, a helpful meeting assistant who takes notes and answers questions.",
  "pipeline_mode": "full",
  "default_face_id": "r90bbd427f71",
  "layers": {
    "conferencing": {
      "username": "anna",
      "allowlist": ["alex@acme.com", ".*@acme\\.com"]
    }
  }
}
```

A successful create returns the derived email so you know what address to invite:

```json theme={null}
{
  "pal_id": "pcb7a34da5fe",
  "pal_name": "Anna",
  "created_at": "2026-06-11T12:00:00Z",
  "conferencing_email": "anna@tavusinvite.com"
}
```

### `username`

The local part of the PAL's meeting email. The full address is rendered as `<username>@tavusinvite.com`.

Rules:

* **Length & characters**: must be **2+ characters**, start and end with an alphanumeric character, and may contain `.`, `_`, or `-` in between (pattern: `^[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]$`).
* **Case-insensitive**: usernames are stored and matched in lowercase. `Anna` and `anna` are the same identity.
* **Reserved names**: usernames matching `botN` (e.g. `bot1`, `bot42`) are reserved for internal use and rejected.
* **Global uniqueness**: see [Username uniqueness & limitations](#username-uniqueness--limitations) below.

### `allowlist`

An optional list controlling **who is allowed to invite the PAL** to meetings. Each entry is either:

* an **exact email address** - e.g. `"alex@acme.com"`, or
* a **regular expression** matched against the sender's email - e.g. `".*@acme\\.com"` to allow anyone at `acme.com`.

Behavior:

* If `allowlist` is **empty or omitted**, any sender can invite the PAL.
* If `allowlist` is **set**, calendar invites from senders that don't match any entry are **rejected** (the PAL declines), and the invite never schedules a join.
* Google's forwarding address (`forwarding-noreply@google.com`) is always permitted internally; you don't need to add it.

<Tip>
  Use the allowlist to keep a PAL's meeting identity private to your team or customers. Pair an exact-match list for known contacts with a domain regex (`.*@yourcompany\.com`) to cover everyone in your org.
</Tip>

### Checking availability before you commit

Before saving a username, you can check whether it's free with [Check Conferencing Username Availability](/api-reference/pals/check-conferencing-username):

```bash theme={null}
curl --request GET \
  --url 'https://tavusapi.com/v2/pals/check-username?username=anna' \
  --header 'x-api-key: <api-key>'
```

```json theme={null}
{ "available": true }
```

If the name is taken or invalid, `available` is `false` with a `reason`:

```json theme={null}
{ "available": false, "reason": "Username is already taken." }
```

## Username uniqueness & limitations

All non-whitelabel PALs share a single email domain (`tavusinvite.com`), so the `username` is a **global namespace**:

* A username must be **unique across the entire `tavusinvite.com` domain**, not just within your account. If another PAL - including one owned by a different customer - already uses `anna`, you cannot also use `anna`; you'll get a `400` telling you to choose a different username.
* This is **first-come, first-served**. Pick a distinctive username (for example, prefix it with your product or company name like `acme-anna`) to avoid collisions and to reserve the identity you want.
* Renaming a PAL's username **frees the old name** and provisions the new one. Any calendar invites that were sent to the old address will no longer reach the PAL, so prefer choosing a stable username up front.

## Join a Google Meet via API

Instead of sending a calendar invite, you can have a PAL join an **existing Google Meet** by passing the Meet link when you [Create Conversation](/api-reference/conversations/create-conversation):

```bash theme={null}
curl --request POST \
  --url https://tavusapi.com/v2/conversations \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: <api-key>' \
  --data '{
    "face_id": "r90bbd427f71",
    "pal_id": "pcb7a34da5fe",
    "meeting_url": "https://meet.google.com/xgq-epxn-ccp"
  }'
```

The PAL begins joining **shortly after** the API returns a successful response.

Use this when you already have a live Google Meet link and want to dispatch the PAL programmatically (for example from your own scheduling UI or an ad hoc demo). The [calendar invite flow](#scheduling-calls-via-google-calendar-invites) below is better when you want the PAL to accept invites and join on a schedule.

<Note>
  This path does not use the conferencing [`allowlist`](#allowlist) - authorization is your API key.
</Note>

## Scheduling calls via Google Calendar invites

Once a PAL has a conferencing email, scheduling it into a meeting is exactly like inviting a coworker:

1. **Create a Google Calendar event** and **add a Google Meet** link to it (Google Calendar's "Add Google Meet video conferencing").
2. **Invite the PAL's email** (e.g. `anna@tavusinvite.com`) as a guest.
3. Send the invite. The PAL **replies `Accepted`** to the organizer once the invite is received and authorized.
4. The PAL **joins the Google Meet call about one minute before the start time** and participates with its face's likeness and voice.

<Note>
  The invite **must include a Google Meet link**. If a calendar invite has no Google Meet link, the PAL replies with a `Declined`, since there is nothing to join.
</Note>

### Joining a meeting that's already in progress

You don't have to schedule the PAL ahead of time. If a Google Meet is **already running**, invite the PAL's conferencing email to that calendar event the same way you would for a future meeting - add the PAL's address (for example `anna@tavusinvite.com`, from its configured `username`) as a guest on the event that holds the active Google Meet link.

The PAL **accepts the invite** and **joins the call shortly after**, rather than waiting until one minute before a future start time. The same rules apply: the event must include a Google Meet link, and the sender must pass the PAL's [`allowlist`](#allowlist) if one is set.

### Recurring meetings

Recurring calendar events are supported. The PAL will join **each occurrence** of the series at its scheduled time. Editing or cancelling occurrences is reflected automatically (see below).

### Updates, reschedules, and cancellations

The system stays in sync with changes you make in Google Calendar:

* **Reschedule (new time) or change the meeting link** → the join is automatically rescheduled to the new time/URL.
* **Other edits** (title, description, guest list) → metadata is updated without disrupting the scheduled join.
* **Cancel the event** → the scheduled join is cancelled. For a recurring series, cancelling a single occurrence cancels only that one; cancelling the series cancels all remaining occurrences.

### Allowlist enforcement at invite time

If the PAL has an [`allowlist`](#allowlist), the **invite's sender** (the calendar event organizer) must match it. Invites from senders not on the allowlist are silently rejected and no join is scheduled. With no allowlist, anyone who can email the PAL's address can schedule it.

### Supported meeting platforms

Currently, PALs can only join **Google Meet** calls. The invite must contain a Google Meet link.

<Note>
  **Zoom and Microsoft Teams support is coming soon.** Invites with Zoom or Teams links are recognized, but the PAL cannot join those calls yet - only Google Meet is live today.
</Note>

## Modifying conferencing on an existing PAL

Use [Patch PAL](/api-reference/pals/patch-pal) to add, change, or remove conferencing settings with JSON Patch operations:

```bash theme={null}
# Give an existing PAL a meeting identity
curl --request PATCH \
  --url https://tavusapi.com/v2/pals/{pal_id} \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: <api-key>' \
  --data '[
    { "op": "add", "path": "/layers/conferencing/username", "value": "anna" }
  ]'

# Update the allowlist
curl --request PATCH \
  --url https://tavusapi.com/v2/pals/{pal_id} \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: <api-key>' \
  --data '[
    { "op": "replace", "path": "/layers/conferencing/allowlist", "value": ["alex@acme.com", ".*@acme\\.com"] }
  ]'
```

<Warning>
  Changing the `username` changes the PAL's email identity. Calendar invites sent to the **previous** address will no longer reach the PAL, so re-invite the PAL using its new email after a rename.
</Warning>

## End-to-end example

```json theme={null}
// 1. Create a PAL with a meeting identity
{
  "pal_name": "Anna",
  "system_prompt": "You are Anna, a meeting assistant. Greet attendees, take notes, and answer questions about the agenda.",
  "pipeline_mode": "full",
  "default_face_id": "r90bbd427f71",
  "layers": {
    "conferencing": {
      "username": "acme-anna",
      "allowlist": [".*@acme\\.com"]
    }
  }
}
```

```json theme={null}
// Response - invite this address from any @acme.com calendar
{
  "pal_id": "pcb7a34da5fe",
  "pal_name": "Anna",
  "conferencing_email": "acme-anna@tavusinvite.com"
}
```

Then, from an `@acme.com` Google account, create a calendar event with a Google Meet link and invite `acme-anna@tavusinvite.com`. Anna replies `Accepted`, and joins the call automatically a minute before it begins.

<Note>
  See [Create PAL](/api-reference/pals/create-pal) and [Patch PAL](/api-reference/pals/patch-pal) for the full request schema.
</Note>
