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

# Join a Meeting

> Send the bot to a Google Meet, Zoom, Teams, or Webex call, either through the API or by connecting your calendar for automatic joins.

The bot joins your meeting as a visible participant and starts capturing audio. There are two ways to get it into a meeting -- use whichever fits your workflow.

## Choose a Method

|          | Meeting URL                                        | Calendar auto-join                                                 |
| -------- | -------------------------------------------------- | ------------------------------------------------------------------ |
| Setup    | Create a session pointing at a meeting URL         | Connect Google Calendar once                                       |
| Effort   | Build it yourself with `POST /v2/meeting_sessions` | The bot joins automatically, nothing to build                      |
| Control  | Full control over each join, including scheduling  | Per-connection policy, session defaults, and per-meeting overrides |
| Best for | Custom apps and precise scheduling                 | Automatically capturing your own meetings                          |

<CardGroup cols={2}>
  <Card title="Join with a meeting URL" icon="link" href="/docs/meeting/join-meeting/meeting-url">
    Create a session with the REST API. Full control over each join, including scheduled joins with `join_at`.
  </Card>

  <Card title="Calendar auto-join" icon="calendar" href="/docs/meeting/join-meeting/calendar-auto-join">
    Connect Google Calendar once and the bot joins your meetings with a link automatically.
  </Card>
</CardGroup>

## Set a Static Camera Image

`POST /v2/meeting_sessions` accepts an optional `camera_image`: a static image shown as the bot's camera tile for this session. It is not a native account or participant profile photo, and its exact presentation can vary by meeting platform and recording configuration.

Supply exactly one JPEG source -- inline Base64 or an HTTPS URL:

```json theme={null}
{
  "camera_image": {
    "format": "jpeg",
    "base64_data": "<complete RFC 4648 Base64 of the JPEG>"
  }
}
```

```json theme={null}
{
  "camera_image": {
    "format": "jpeg",
    "url": "https://cdn.example.com/bot-camera.jpg"
  }
}
```

The image contract is strict:

* `format` must be `jpeg`. Supplying both `base64_data` and `url`, or neither, is rejected.
* `base64_data` must be canonical plain RFC 4648 Base64 -- no data URIs, whitespace, or URL-safe alphabet. The encoded value is limited to 1,835,008 characters and the decoded JPEG to 1,363,148 bytes; the image itself to 4,096 pixels per dimension and 4 megapixels.
* `url` must be a public HTTPS URL of at most 2,048 characters with no credentials, fragment, or explicit non-default port. The service fetches it once before creating the bot, with a five-second timeout, no redirects, and a required `2xx` `image/jpeg` response. Signed query strings are allowed -- treat a signed URL as a credential.
* `camera_image` is write-only: neither the image bytes nor the source URL are persisted, returned, or logged.

If the session also has a [digital avatar](/docs/meeting/digital-avatars), that live output takes precedence -- the static image is ignored and a URL source is not fetched.
