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

# Viewer and screenshots

> Choose interactive video or a still image for your workflow.

## Interactive browser viewer

The [dashboard](https://phone-harness.com/dashboard) opens the interactive viewer for an owned, ready session. It sends mouse and keyboard interactions to that phone while displaying live video.

`GET /sessions/{sid}/owner-viewer` returns an authenticated viewer URL and its expiry:

```json Illustrative response theme={null}
{
  "url": "https://viewer.example.com/opaque-viewer-capability",
  "expires_at": 1800000900
}
```

The response URL is opaque and contains access authority. Do not construct it yourself, alter its query, log it, or share it publicly. It is bounded by the phone's existing deadline. Obtain another URL when reconnecting; doing so does not create a new session or extend its duration.

<Note>
  The current owner viewer is configured for the Phone Harness dashboard's embedding origin. The endpoint is not a general-purpose SDK for embedding a controllable phone on any website. Use the dashboard for hands-on access and the operations API for your automation.
</Note>

Reloading the dashboard reconnects to an existing session. API readiness alone does not prove that video has arrived or rendered in your browser.

## Download a snapshot

```bash theme={null}
curl --fail-with-body -sS \
  "https://api.phone-harness.com/sessions/$SESSION_ID/frame.png" \
  -H "Authorization: Bearer $PHONE_HARNESS_API_KEY" \
  -o screenshot.png
```

The current Android service returns a PNG. The endpoint can also return `image/jpeg` for compatible providers, so inspect `Content-Type` when building a general client.

This is a still-image endpoint. It coalesces captures, attempts to refresh at most once every two seconds, and can return a cached image while another operation is running. It does not keep a session alive and is not a real-time streaming endpoint.

`409` means the session is not ready or is closing. `503` with `no frame yet` means no snapshot is available yet.

## Capture over ADB

Once [connected with ADB](/docs/guides/connect-adb), a screenshot is one command:

```bash theme={null}
adb -s live.phone-harness.com:22220 exec-out screencap -p > screen.png
```

## Read-only sharing

`watch_url` opens the same live video as the dashboard, without control: the page cannot tap, type or install anything. It carries a limited view grant, valid for six hours, that also allows reading the session's metadata and snapshots, so share it only with intended viewers.

Behind the page is `GET /sessions/{sid}/viewer`, which mints the view-only viewer URL. The owner may call it with a bearer credential; the watch link passes its grant as `token`. The URL is opaque and bounded by the phone's deadline, like the owner viewer.

Legacy `/stream`, `/ws`, and control-ticket transports are retired. Use the owner viewer or snapshots instead.
