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

# Browser sessions

> The history of managed browsers driven beside a computer, and a view-only live view of one.

<Info>See [Browser](/docs/api/browser) for driving the browser itself — actions, close, saved logins. This page is the dashboard's read of what ran.</Info>

Every browser opened beside a computer — by an agent's `browser` tool or by `POST /v1/computers/{id}/browser/actions` — is a [browser session](/docs/api/browser#the-browser-session-object) row. These routes list a computer's rows, closed ones included, and mint a live view of one that is still open.

## The browser session object

The same object [Browser](/docs/api/browser#the-browser-session-object) returns: `id` (`brw_…`), `object: "browser_session"`, `computer_id`, `session_id` (the [agent session](/docs/api/sessions) that opened it, or `null` for one opened over the API), `status` (`creating`, `active`, `closed`, `error`), `allowed_domains`, `region`, `context_id`, `context_backed`, `timeout_at`, `opened_at`, `closed_at`, `created_at`. It never carries a provider reference.

## List browser sessions

`GET /v1/computers/{id}/browser_sessions` — scope `computers:write`

Every browser session opened beside the computer, newest first, closed sessions included. The list is **not paginated** — a computer drives a handful — so `has_more` is always `false`. `404 not_found` for a computer that is not yours.

<CodeGroup>
  ```bash cURL theme={"system"}
  curl -fsSL https://api.vetta.sh/v1/computers/cmp_01H.../browser_sessions \
    -H "authorization: Bearer sk_live_..."
  ```

  ```typescript TypeScript theme={"system"}
  const { data } = await vetta.browserSessions.list("cmp_01H...");
  ```
</CodeGroup>

<ResponseExample>
  ```json Response theme={"system"}
  {
    "object": "list",
    "data": [
      {
        "id": "brw_3f9c1a2b4d5e6f708192a3b4c5d6e7f8",
        "object": "browser_session",
        "computer_id": "cmp_01H...",
        "session_id": "ses_01H...",
        "status": "active",
        "allowed_domains": ["docs.example.com"],
        "region": "us-west",
        "context_id": null,
        "context_backed": false,
        "timeout_at": "2026-09-08T10:15:00Z",
        "opened_at": "2026-09-08T10:00:00Z",
        "closed_at": null,
        "created_at": "2026-09-08T10:00:00Z"
      }
    ],
    "has_more": false,
    "next_cursor": null
  }
  ```
</ResponseExample>

## Open a live view

`POST /v1/computers/{id}/browser_sessions/{bid}/live_view` — **dashboard session only**

Mints a short-lived URL that shows the remote browser as it runs. Takes no body. On an API key: `403 forbidden` — the same rule as [`GET /v1/computers/{id}/browser/live-view`](/docs/api/browser#live-view), which returns the same object for the one browser currently open.

<Warning>
  The URL is a **bearer credential**: anyone holding it controls the browser until it expires, with no further authentication. It is minted on demand for the person looking at the dashboard, never stored, never written to the audit trail, never returned inside any other object, and withheld from the [MCP catalogue](/docs/api/mcp) — the agent that drives the browser never sees its own live view. Hold it in memory, render it, and let it expire.
</Warning>

`404 not_found` once the session has closed, or for a session that was not opened beside this computer. Audited as `browser.live_view_opened` — who, when, and for which session, never the URL.

<ResponseExample>
  ```json Response theme={"system"}
  {
    "object": "browser_live_view",
    "url": "https://...",
    "expires_at": "2026-09-08T10:15:00Z"
  }
  ```
</ResponseExample>
