![Nest Cam](https://developers.google.com/nest/device-access/images/device-camera.png)

All legacy Nest Cams are supported in the Smart Device Management (SDM) API:

1. Google Nest Cam Indoor
2. Google Nest Cam Outdoor
3. Google Nest Cam IQ Indoor
4. Google Nest Cam IQ Outdoor

These devices return a device type of CAMERA:

`sdm.devices.types.CAMERA`

The [Google Nest Doorbell (legacy)](https://store.google.com/product/nest_doorbell_wired) and
[Google Nest Hub Max](https://store.google.com/product/google_nest_hub_max) also function
as cameras and feature similar traits, though they return device types of
DOORBELL and DISPLAY, respectively.

Google Nest Cam Indoor and Google Nest Cam Outdoor can be used in either the
Nest app or the Google Home app but not both at the same time. When the camera
is on the Nest app it supports RTSP. And when the camera is on the Google Home app
it supports WebRTC. The `supportedProtocols` field of the
[CameraLiveStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream) trait shows which format
is supported. See the
[Migrate devices to the Google Home app](https://support.corp.google.com/googlenest/answer/13038234)
support article for additional explanation.

See the [Doorbell](https://developers.google.com/nest/device-access/api/doorbell) and
[Display](https://developers.google.com/nest/device-access/api/display) device guides for more
information on features unique to those device types.

## Traits

<br />

### Reference

The following traits, commands, or events are related to this device:

| Trait | Description | Commands | Events |
|---|---|---|---|
| [CameraEventImage](https://developers.google.com/nest/device-access/traits/device/camera-event-image) | This trait belongs to any device that supports generation of images from events. | [GenerateImage](https://developers.google.com/nest/device-access/traits/device/camera-event-image#generateimage) |   |
| [CameraImage](https://developers.google.com/nest/device-access/traits/device/camera-image) | This trait belongs to any device that supports taking images. |   |   |
| [CameraLiveStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream) | This trait belongs to any device that supports live streaming. | [GenerateRtspStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#generatertspstream) [ExtendRtspStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#extendrtspstream) [StopRtspStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#stoprtspstream) [GenerateWebRtcStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#generatewebrtcstream) [ExtendWebRtcStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#extendwebrtcstream) [StopWebRtcStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#stopwebrtcstream) |   |
| [CameraMotion](https://developers.google.com/nest/device-access/traits/device/camera-motion) | This trait belongs to any device that supports motion detection events. |   | [Motion](https://developers.google.com/nest/device-access/traits/device/camera-motion#motion) |
| [CameraPerson](https://developers.google.com/nest/device-access/traits/device/camera-person) | This trait belongs to any device that supports person detection events. |   | [Person](https://developers.google.com/nest/device-access/traits/device/camera-person#person) |
| [CameraSound](https://developers.google.com/nest/device-access/traits/device/camera-sound) | This trait belongs to any device that supports sound detection events. |   | [Sound](https://developers.google.com/nest/device-access/traits/device/camera-sound#sound) |
| [Info](https://developers.google.com/nest/device-access/traits/device/info) | This trait belongs to any device for device-related information. |   |   |

### JSON

The absence of a trait in a GET response indicates that the trait or
feature is not currently available for the device. See
[Device types](https://developers.google.com/nest/device-access/traits#device-types) for more
information.

```
{
  "type" : "sdm.devices.types.CAMERA",
  "traits" : {
    "sdm.devices.traits.CameraEventImage" : {},
    "sdm.devices.traits.CameraImage" : {
      "maxImageResolution" : {
        "width" : 1280,
        "height" : 960
      }
    },
    "sdm.devices.traits.CameraLiveStream" : {
      "maxVideoResolution" : {
        "width" : 640,
        "height" : 480
      },
      "videoCodecs" : ["H264"],
      "audioCodecs" : ["OPUS"],
      "supportedProtocols" : ["WEB_RTC"]
    },
    "sdm.devices.traits.CameraMotion" : {},
    "sdm.devices.traits.CameraPerson" : {},
    "sdm.devices.traits.CameraSound" : {},
    "sdm.devices.traits.Info" : {
      "customName" : "My device"
    }
  }
}
```

<br />

## Handle camera events

The following events may be triggered from a CAMERA device type or a DOORBELL or DISPLAY that features a camera, such as the Google Nest Doorbell (legacy) or Google Nest Hub Max :

<br />

| Type | Element | Description |
|---|---|---|
| Event | [Motion](https://developers.google.com/nest/device-access/traits/device/camera-motion#motion) event of the CameraMotion trait | Motion has been detected by the camera. |
| Event | [Person](https://developers.google.com/nest/device-access/traits/device/camera-person#person) event of the CameraPerson trait | A person has been detected by the camera. |
| Event | [Sound](https://developers.google.com/nest/device-access/traits/device/camera-sound#sound) event of the CameraSound trait | Sound has been detected by the camera. |

For example, here the camera has detected motion:

<br />

<br />

### Payload

    {
      "eventId" : "aacff69c-efef-48a5-a208-f5a87bf9ee0d",
      "timestamp" : "2019-01-01T00:00:01Z",
      "resourceUpdate" : {
        "name" : "enterprises/project-id/devices/device-id",
        "events" : {
          "sdm.devices.events.CameraMotion.Motion" : {
            "eventSessionId" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...",
            "eventId" : "VCfoHy7K2dQ2hdEYQg3JefIXvH...",
          }
        }
      }
      "userId" : "AVPHwEuBfnPOnTqzVFT4IONX2Qqhu9EJ4ubO-bNnQ-yi",
      "resourceGroup" : [
        "enterprises/project-id/devices/device-id"
      ]
    }

The payload of this event contains an `eventId` that can be used with the [GenerateImage](https://developers.google.com/nest/device-access/traits/device/camera-event-image#generateimage) command. This command returns a download URL for the camera image related to the event:

<br />

<br />

### Request

    POST /enterprises/project-id/devices/device-id:executeCommand
    {
      "command" : "sdm.devices.commands.CameraEventImage.GenerateImage",
      "params" : {
        "eventId" : "7F_msuTB6ENUPcJdfUfo2kK51M..."
      }
    }

### Response

```
{
  "results" : {
    "url" : "https://domain/sdm_event_snapshot/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...",
    "token" : "g.0.eventToken"
  }
}
```

<br />

## Download a camera image

Make a GET call to the `url` from a
[GenerateImage](https://developers.google.com/nest/device-access/traits/device/camera-event-image#generateimage) command response,
using the `token` in the HTTP Authorization header with Basic authorization, to
download the camera image:

    curl -H "Authorization: Basic g.0.eventToken" \
          https://domain/sdm_event_snapshot/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...

Use `width` or `height` query parameters to customize the resolution of the
downloaded image. Only one of these parameters need to specified. The other
parameter is scaled automatically according to the camera's aspect ratio.

For example, if the camera's aspect ratio is 4:3, to download the camera image
with a resolution of 480 x 360 specify either the width or the height:

### Width

    curl -H "Authorization: Basic g.0.eventToken" \
          https://domain/sdm_event_snapshot/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...?width=480

### Height

    curl -H "Authorization: Basic g.0.eventToken" \
          https://domain/sdm_event_snapshot/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...?height=360

Other restrictions to the download URL apply:

- If both parameters are provided in the URL, `width` is used and `height` is ignored.
- If neither parameter is provided in the URL, a default value of 480 is chosen for the `width`.

See the [CameraImage](https://developers.google.com/nest/device-access/traits/device/camera-image) trait for
information on image properties.


## Access a live stream

The live stream from a camera can be accessed. The following stream formats are
supported for this device:

- RTSP
- WebRTC

For a full list of cameras and supported stream formats, see
[Supported Devices](https://developers.google.com/nest/device-access/supported-devices).
For the Google Nest Cam Indoor and Google Nest Cam Outdoor cameras migrated to the Google Home app the WebRTC stream format is supported. RTSP is supported with the Nest app only.

To access a live stream, use the appropriate Generate<var translate="no">Format</var>Stream
command of the
[CameraLiveStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream)
trait.

### WebRTC

<br />

For a WebRTC stream, send an `offerSdp` in the
[GenerateWebRtcStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#generatewebrtcstream) command of the CameraLiveStream trait
to get an `answerSdp`:

### Request

    POST /enterprises/project-id/devices/device-id:executeCommand
    {
      "command" : "sdm.devices.commands.CameraLiveStream.GenerateWebRtcStream",
      "params" : {
        "offerSdp" : "offerSdp"
      }
    }

### Response

```
{
  "results" : {
    "answerSdp" : "answerSdp",
    "expiresAt" : "2020-01-04T18:30:00.000Z",
    "mediaSessionId" : "ohxNdfk6C212GMQeVKEzJIoQzw..."
  }
}
```

We recommend using the [Web Application Sample](https://developers.google.com/nest/device-access/samples/web-app) to learn how to generate a successful live stream. This sample
generates a valid `offerSdp` that meets all the SDP offer restrictions for Nest cameras.

An SDP offer for Nest cameras must meet the following restrictions:

- Only the Unified format is supported. Plan B is not supported.
- All media lines (`m=`) must be present in the offer and must be in this order:
  1. audio
  2. video
  3. application
- Trickle ICE is supported, but not required.
- Only the Opus codec is supported for audio.
- The audio setting must be set to `a=recvonly` (receive only).
- The offer must end with a newline character of either `\r\n` or `\n`.

<br />

The `answerSdp` must be used to generate the live stream within 30 seconds of receiving the response, otherwise it expires. If it expires, execute the [GenerateWebRtcStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#generatewebrtcstream) command again to receive a new `answerSdp`.

When opening WebRTC channels for the live stream, make sure to create a data channel as well as a video channel.

#### See an example of a valid offer

Unformatted:

```
v=0\r\no=- 2214114893783582286 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1 2\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:6ReD\r\na=ice-pwd:QBmcZYd/t+InpMVkxQEEXnE4\r\na=ice-options:trickle\r\na=fingerprint:sha-256 DD:7E:6F:CD:B8:13:4E:37:D2:92:6D:8E:30:FB:FE:13:29:C9:F8:FD:78:0B:C4:59:42:61:BC:CF:02:91:6B:3C\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 122 102 121 127 120 125 107 108 109 35 36 124 119 123 118 114 115 116 37\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:6ReD\r\na=ice-pwd:QBmcZYd/t+InpMVkxQEEXnE4\r\na=ice-options:trickle\r\na=fingerprint:sha-256 DD:7E:6F:CD:B8:13:4E:37:D2:92:6D:8E:30:FB:FE:13:29:C9:F8:FD:78:0B:C4:59:42:61:BC:CF:02:91:6B:3C\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:13 urn:3gpp:video-orientation\r\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=recvonly\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=fmtp:98 profile-id=0\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 VP9/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 profile-id=2\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:122 VP9/90000\r\na=rtcp-fb:122 goog-remb\r\na=rtcp-fb:122 transport-cc\r\na=rtcp-fb:122 ccm fir\r\na=rtcp-fb:122 nack\r\na=rtcp-fb:122 nack pli\r\na=fmtp:122 profile-id=1\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f\r\na=rtpmap:121 rtx/90000\r\na=fmtp:121 apt=102\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f\r\na=rtpmap:120 rtx/90000\r\na=fmtp:120 apt=127\r\na=rtpmap:125 H264/90000\r\na=rtcp-fb:125 goog-remb\r\na=rtcp-fb:125 transport-cc\r\na=rtcp-fb:125 ccm fir\r\na=rtcp-fb:125 nack\r\na=rtcp-fb:125 nack pli\r\na=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 H264/90000\r\na=rtcp-fb:108 goog-remb\r\na=rtcp-fb:108 transport-cc\r\na=rtcp-fb:108 ccm fir\r\na=rtcp-fb:108 nack\r\na=rtcp-fb:108 nack pli\r\na=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f\r\na=rtpmap:109 rtx/90000\r\na=fmtp:109 apt=108\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:124 H264/90000\r\na=rtcp-fb:124 goog-remb\r\na=rtcp-fb:124 transport-cc\r\na=rtcp-fb:124 ccm fir\r\na=rtcp-fb:124 nack\r\na=rtcp-fb:124 nack pli\r\na=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0032\r\na=rtpmap:119 rtx/90000\r\na=fmtp:119 apt=124\r\na=rtpmap:123 H264/90000\r\na=rtcp-fb:123 goog-remb\r\na=rtcp-fb:123 transport-cc\r\na=rtcp-fb:123 ccm fir\r\na=rtcp-fb:123 nack\r\na=rtcp-fb:123 nack pli\r\na=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032\r\na=rtpmap:118 rtx/90000\r\na=fmtp:118 apt=123\r\na=rtpmap:114 red/90000\r\na=rtpmap:115 rtx/90000\r\na=fmtp:115 apt=114\r\na=rtpmap:116 ulpfec/90000\r\na=rtpmap:37 flexfec-03/90000\r\na=rtcp-fb:37 goog-remb\r\na=rtcp-fb:37 transport-cc\r\na=fmtp:37 repair-window=10000000\r\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:6ReD\r\na=ice-pwd:QBmcZYd/t+InpMVkxQEEXnE4\r\na=ice-options:trickle\r\na=fingerprint:sha-256 DD:7E:6F:CD:B8:13:4E:37:D2:92:6D:8E:30:FB:FE:13:29:C9:F8:FD:78:0B:C4:59:42:61:BC:CF:02:91:6B:3C\r\na=setup:actpass\r\na=mid:2\r\na=sctp-port:5000\r\na=max-message-size:262144\r\n
```

Formatted:

```
v=0
o=- 2214114893783582286 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 0 1 2
a=extmap-allow-mixed
a=msid-semantic: WMS
m=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:6ReD
a=ice-pwd:QBmcZYd/t+InpMVkxQEEXnE4
a=ice-options:trickle
a=fingerprint:sha-256 DD:7E:6F:CD:B8:13:4E:37:D2:92:6D:8E:30:FB:FE:13:29:C9:F8:FD:78:0B:C4:59:42:61:BC:CF:02:91:6B:3C
a=setup:actpass
a=mid:0
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=recvonly
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:63 red/48000/2
a=fmtp:63 111/111
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 122 102 121 127 120 125 107 108 109 35 36 124 119 123 118 114 115 116 37
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:6ReD
a=ice-pwd:QBmcZYd/t+InpMVkxQEEXnE4
a=ice-options:trickle
a=fingerprint:sha-256 DD:7E:6F:CD:B8:13:4E:37:D2:92:6D:8E:30:FB:FE:13:29:C9:F8:FD:78:0B:C4:59:42:61:BC:CF:02:91:6B:3C
a=setup:actpass
a=mid:1
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=extmap:4 urn:ietf:params:rtp-hdrext:sdes:mid
a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
a=recvonly
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=fmtp:98 profile-id=0
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 VP9/90000
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 transport-cc
a=rtcp-fb:100 ccm fir
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=fmtp:100 profile-id=2
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:122 VP9/90000
a=rtcp-fb:122 goog-remb
a=rtcp-fb:122 transport-cc
a=rtcp-fb:122 ccm fir
a=rtcp-fb:122 nack
a=rtcp-fb:122 nack pli
a=fmtp:122 profile-id=1
a=rtpmap:102 H264/90000
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 transport-cc
a=rtcp-fb:102 ccm fir
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
a=rtpmap:121 rtx/90000
a=fmtp:121 apt=102
a=rtpmap:127 H264/90000
a=rtcp-fb:127 goog-remb
a=rtcp-fb:127 transport-cc
a=rtcp-fb:127 ccm fir
a=rtcp-fb:127 nack
a=rtcp-fb:127 nack pli
a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
a=rtpmap:120 rtx/90000
a=fmtp:120 apt=127
a=rtpmap:125 H264/90000
a=rtcp-fb:125 goog-remb
a=rtcp-fb:125 transport-cc
a=rtcp-fb:125 ccm fir
a=rtcp-fb:125 nack
a=rtcp-fb:125 nack pli
a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
a=rtpmap:107 rtx/90000
a=fmtp:107 apt=125
a=rtpmap:108 H264/90000
a=rtcp-fb:108 goog-remb
a=rtcp-fb:108 transport-cc
a=rtcp-fb:108 ccm fir
a=rtcp-fb:108 nack
a=rtcp-fb:108 nack pli
a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
a=rtpmap:109 rtx/90000
a=fmtp:109 apt=108
a=rtpmap:35 AV1/90000
a=rtcp-fb:35 goog-remb
a=rtcp-fb:35 transport-cc
a=rtcp-fb:35 ccm fir
a=rtcp-fb:35 nack
a=rtcp-fb:35 nack pli
a=rtpmap:36 rtx/90000
a=fmtp:36 apt=35
a=rtpmap:124 H264/90000
a=rtcp-fb:124 goog-remb
a=rtcp-fb:124 transport-cc
a=rtcp-fb:124 ccm fir
a=rtcp-fb:124 nack
a=rtcp-fb:124 nack pli
a=fmtp:124 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0032
a=rtpmap:119 rtx/90000
a=fmtp:119 apt=124
a=rtpmap:123 H264/90000
a=rtcp-fb:123 goog-remb
a=rtcp-fb:123 transport-cc
a=rtcp-fb:123 ccm fir
a=rtcp-fb:123 nack
a=rtcp-fb:123 nack pli
a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032
a=rtpmap:118 rtx/90000
a=fmtp:118 apt=123
a=rtpmap:114 red/90000
a=rtpmap:115 rtx/90000
a=fmtp:115 apt=114
a=rtpmap:116 ulpfec/90000
a=rtpmap:37 flexfec-03/90000
a=rtcp-fb:37 goog-remb
a=rtcp-fb:37 transport-cc
a=fmtp:37 repair-window=10000000
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 0.0.0.0
a=ice-ufrag:6ReD
a=ice-pwd:QBmcZYd/t+InpMVkxQEEXnE4
a=ice-options:trickle
a=fingerprint:sha-256 DD:7E:6F:CD:B8:13:4E:37:D2:92:6D:8E:30:FB:FE:13:29:C9:F8:FD:78:0B:C4:59:42:61:BC:CF:02:91:6B:3C
a=setup:actpass
a=mid:2
a=sctp-port:5000
a=max-message-size:262144
```

### RTSP

For an RTSP stream, the
[GenerateRtspStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#generatertspstream) command of the CameraLiveStream trait command
returns the stream URL and related `streamToken`:

### Request

    POST /enterprises/project-id/devices/device-id:executeCommand
    {
      "command" : "sdm.devices.commands.CameraLiveStream.GenerateRtspStream",
      "params" : {}
    }

### Response

```
{
  "results" : {
    "streamUrls" : {
      "rtspUrl" : "rtsps://someurl.com/CjY5Y3VKaTZwR3o4Y19YbTVfMF...?auth=g.0.streamingToken"
    },
    "streamExtensionToken" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF...",
    "streamToken" : "g.0.streamingToken",
    "expiresAt" : "2018-01-04T18:30:00.000Z"
  }
}
```

Then use the stream URL to access the camera live stream:

```
rtsps://someurl.com/CjY5Y3VKaTZwR3o4Y19YbTVfMF...?auth=g.0.streamingToken
```

RTSP live stream URLs cannot be shared between clients. A stream URL can only be used by one client at a time. If multiple clients want to stream from the same camera at the same time, RTSP commands must be sent for each individual client, and each individual client must use its own stream URL.

### Extend a live stream

Camera live stream sessions are only valid for 5 minutes. If you need to extend the lifetime of a live stream, use the appropriate Extend<var translate="no">Format</var>Stream command of the [CameraLiveStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream) trait for the stream format you generated.

### WebRTC

<br />

Wired

**A WebRTC stream can only be extended on wire-powered cameras.** A battery-powered camera is considered wire-powered while plugged in for charging. If the camera is on battery power, a request to extend an active WebRTC stream will be ignored.

To extend a WebRTC stream, specify the media session ID of the stream
with the
[ExtendWebRtcStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#extendwebrtcstream) command of the CameraLiveStream trait:

### Request

    POST /enterprises/project-id/devices/device-id:executeCommand
    {
      "command" : "sdm.devices.commands.CameraLiveStream.ExtendWebRtcStream",
      "params" : {
        "mediaSessionId" : "ohxNdfk6C212GMQeVKEzJIoQzw..."
      }
    }

### Response

```
{
  "results" : {
    "expiresAt" : "2018-01-04T18:30:00.000Z",
    "mediaSessionId" : "ohxNdfk6C212GMQeVKEzJIoQzw..."
  }
}
```

### RTSP

To extend an RTSP stream, use the
[ExtendRtspStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#extendrtspstream) command of the CameraLiveStream trait command to
get new `streamExtensionToken` and `streamToken`
values:

### Request

    POST /enterprises/project-id/devices/device-id:executeCommand
    {
      "command" : "sdm.devices.commands.CameraLiveStream.ExtendRtspStream",
      "params" : {
        "streamExtensionToken" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF..."
      }
    }

### Response

```
{
  "results" : {
    "streamExtensionToken" : "dGNUlTU2CjY5Y3VKaTZwR3o4Y1...",
    "streamToken" : "g.0.newStreamingToken",
    "expiresAt" : "2018-01-04T18:30:00.000Z"
  }
}
```

Update the stream URL with these new values to continue viewing the
live stream:

```
rtsps://someurl.com/dGNUlTU2CjY5Y3VKaTZwR3o4Y1...?auth=g.0.newStreamingToken
```

### Stop a live stream

Any time you are no longer using a camera live stream, you should stop it and
invalidate the stream. To do so, use the appropriate Stop<var translate="no">Format</var>Stream
command of the
[CameraLiveStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream)
trait for the stream format you generated.

### WebRTC

<br />

To stop a WebRTC stream, specify the media session ID with the
[StopWebRtcStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#stopwebrtcstream) command of the CameraLiveStream trait:

### Request

    POST /enterprises/project-id/devices/device-id:executeCommand
    {
      "command" : "sdm.devices.commands.CameraLiveStream.StopWebRtcStream",
      "params" : {
        "mediaSessionId" : "ohxNdfk6C212GMQeVKEzJIoQzw..."
      }
    }

### Response

```
{}
```

### RTSP

To stop an RTSP stream, use the token to invalidate with the
[StopRtspStream](https://developers.google.com/nest/device-access/traits/device/camera-live-stream#stoprtspstream) command of the CameraLiveStream trait command:

### Request

    POST /enterprises/project-id/devices/device-id:executeCommand
    {
      "command" : "sdm.devices.commands.CameraLiveStream.StopRtspStream",
      "params" : {
        "streamExtensionToken" : "CjY5Y3VKaTZwR3o4Y19YbTVfMF..."
      }
    }

### Response

```
{}
```


## Errors

The following error code(s) may be returned in relation to this device:

| Error Message | RPC | Troubleshooting |
|---|---|---|
| The camera is not available for streaming. | `FAILED_PRECONDITION` | The camera is either offline or not available for streaming due to a technical issue. |
| Command not supported. | `INVALID_ARGUMENT` | Used an RTSP livestream command for a camera that supports WebRTC, or used a WebRTC livestream command for a camera that supports RTSP. |
| Camera image is no longer available for download. | `DEADLINE_EXCEEDED` | Event images expire 30 seconds after the event is published. Make sure to download the image prior to expiration. |
| Event id does not belong to the camera. | `FAILED_PRECONDITION` | Use the correct `eventID` returned by the camera event. |

See the [API Error Code Reference](https://developers.google.com/nest/device-access/reference/errors/api) for
the full list of API error codes.

<br />