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

# Cameras

> Receive camera motion and doorbell events, retrieve the clip and thumbnail for each event, and stream live video in the browser.

With the Seam camera APIs, your application can react to what happens at a property's doors and entryways. You use the same connected accounts, devices, events, and webhooks that you already use for locks and thermostats. Seam handles each camera provider's cloud or local protocol for you.

The camera APIs cover three things:

* **Events.** Seam emits a `camera.activated` event when a camera detects motion and a `device.doorbell_rang` event when someone presses a video doorbell.
* **Event media.** Each event lists the IDs of the clip and thumbnail captured for it. You exchange an ID for a short-lived URL with [`/media/get`](/docs/api/media/get).
* **Live video.** You play a camera's live feed in your user's browser over WebRTC with the [`/cameras/live_views`](/docs/api/cameras/live_views/object) endpoints.

<Info>
  Cameras are in **public beta** and available in every workspace. The request and response shapes for event media and live video may change before general availability.
</Info>

***

## Supported Providers

| Provider | Connection | Events | Event clips and thumbnails | Live video |
| - | - | - | - | - |
| [Ring](/docs/device-and-system-integration-guides/ring-cameras) | Ring cloud | Motion and doorbell presses | ✅ From Ring's cloud. Requires a Ring Protect subscription. | Not available |
| [Arlo](/docs/device-and-system-integration-guides/arlo-cameras) | Arlo cloud, with email and password plus an email or SMS verification code | Motion | ✅ From the Arlo cloud library. Requires an Arlo subscription with cloud recording. | ✅ |
| [Tapo](/docs/device-and-system-integration-guides/tapo-cameras) | Local network, through a [Seam Bridge](/docs/capability-guides/seam-bridge) | Motion | ✅ From the camera's microSD card. | ✅ With optional audio. The Bridge must be online. |

Each camera reports its capabilities on the device object. Check `can_stream_live_video` before you offer a live view. It's `true` only for cameras whose provider supports live video and that are currently online. Ring cameras and doorbells always report `false`.

***

## Event Media

When a camera detects motion or a doorbell is pressed, the event's `media_ids` array lists one ID for each piece of media Seam expects for it, usually a video clip and a thumbnail image.

```mermaid theme={"dark"}
flowchart LR
  A[Motion or doorbell press] --> B["Event with media_ids"]
  B --> C[Your webhook stores the media IDs]
  C --> D["/media/get"]
  D --> E[Short-lived signed URL]
```

1. Subscribe a [webhook](/docs/developer-tools/webhooks) to `camera.activated` and `device.doorbell_rang`.
2. Store each event's `media_ids` with its `event_id` and `device_id`.
3. When you need the media, call `/media/get` with a `media_id`. The response includes the media's `status` and, once it's `available`, a signed `url` that expires within minutes.
4. To download the file from a server-side client, pass `format=redirect`. Seam responds with a `302` to the signed URL.

Store the media ID, not the URL. Call `/media/get` again whenever you need a fresh URL.

See [Retrieve Event Media](/docs/capability-guides/cameras/retrieve-event-media) for the full workflow, statuses, and errors.

***

## Live Video

Live video streams straight from the camera to your user's browser. Your servers never handle the video, and your API key never reaches the browser.

```mermaid theme={"dark"}
sequenceDiagram
  participant Backend as Your backend
  participant Browser as User's browser
  participant Seam
  Backend->>Seam: /client_sessions/create
  Seam-->>Backend: client session token
  Backend-->>Browser: client session token
  Browser->>Seam: /cameras/live_views/create
  Browser->>Seam: /cameras/live_views/offer (WebRTC offer)
  Seam-->>Browser: WebRTC answer
  Browser->>Seam: /cameras/live_views/stop
```

1. On your backend, create a [client session](/docs/core-concepts/authentication/client-session-tokens) that has access to the camera's connected account, and send its token to the browser.
2. In the browser, call [`/cameras/live_views/create`](/docs/api/cameras/live_views/create) for a camera whose `can_stream_live_video` is `true`.
3. Send the browser's WebRTC offer to [`/cameras/live_views/offer`](/docs/api/cameras/live_views/offer), then apply the answer to play the video.
4. Call [`/cameras/live_views/stop`](/docs/api/cameras/live_views/stop) when your user closes the player.

See [Stream Live Video](/docs/capability-guides/cameras/stream-live-video) for a complete browser example.

***

## Next Steps

* [Retrieve Event Media](/docs/capability-guides/cameras/retrieve-event-media) — Fetch the clip and thumbnail for a camera event.
* [Stream Live Video](/docs/capability-guides/cameras/stream-live-video) — Play a camera's live feed in the browser.
* [Ring Cameras](/docs/device-and-system-integration-guides/ring-cameras) — Connect Ring cameras and video doorbells.
* [Arlo Cameras](/docs/device-and-system-integration-guides/arlo-cameras) — Connect an Arlo account.
* [Tapo Cameras](/docs/device-and-system-integration-guides/tapo-cameras) — Connect Tapo cameras through a Seam Bridge.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.