Browser Infrastructure

Watch every browser. Replay the ones that failed.

Every cloud browser returns a live URL you can open or embed, read-only or with human takeover. Turn on recording and get an mp4 of the session after it stops.

import { BrowserUse } from "browser-use-sdk/v4"; const client = new BrowserUse();const session = await client.browsers.create({ enableRecording: true }); console.log(session.liveUrl);   // open it, or embed it in an iframe// ... drive session.cdpUrl with Playwright, Puppeteer or an agent ... await client.browsers.stop(session.id); // The mp4 is uploaded after the stop. Poll GET /api/v4/browsers/{id} until it is ready.const url = "https://api.browser-use.com/api/v4/browsers/" + session.id;const headers = { "X-Browser-Use-API-Key": process.env.BROWSER_USE_API_KEY! };let view = await fetch(url, { headers }).then((r) => r.json());while (!view.recordingUrl && view.recordingAvailable !== false) {  await new Promise((r) => setTimeout(r, 5_000));  view = await fetch(url, { headers }).then((r) => r.json());}console.log(view.recordingUrl); // presigned, expiring mp4 link
main.tsliveUrl · recordingUrl
Every browser
returns a liveUrl, for standalone browsers and agent runs
mp4
recording per browser when you set enableRecording, fetched after it stops
Opt-in
recording is off by default; Zero Data Retention projects never record

Embed it in your product.

Put the live URL in an iframe and your users watch the browser work in real time. Add readOnly=true to keep it view-only, or leave it interactive so a person can log in or approve a step and hand the browser back. Add live.browser-use.com to your frame-src policy if you set one.

Debug from the recording, not the logs.

A job that failed at 3am leaves an mp4 of what the page actually showed. It works the same whether the browser was driven by Playwright, Puppeteer or a Browser Use agent.

Live view and recording, exactly

Live URL
liveUrl on POST /api/v4/browsers; live_view_url in an agent run's browser.ready event.
Embedding
Any iframe. Viewer origin live.browser-use.com. readOnly=true blocks input; ui=false hides tabs and toolbar.
Takeover
Interactive by default, so a person can act in the same browser your code is driving.
Recording
mp4, opt-in with enableRecording (browsers) or browserSettings.record (agent runs).
Retrieval
GET /api/v4/browsers/{id} returns recordingUrl once the browser has stopped and the upload is done.
Privacy
Zero Data Retention projects never record. Zero data retention.

Questions people ask

Does every browser have a live view?

Yes. A standalone browser returns liveUrl from POST /api/v4/browsers. An agent run emits the same link in its browser.ready event. Open it in a tab or embed it in an iframe; the viewer is hosted on live.browser-use.com.

Is recording on by default?

No. Recording is opt-in per browser: enableRecording: true on POST /api/v4/browsers (enable_recording=True in Python), or browserSettings.record: true on an agent run. Zero Data Retention projects never record, even when asked.

When is the recording ready?

After the browser stops and the upload finishes. Poll GET /api/v4/browsers/{id} until recordingUrl is set, and stop polling if recordingAvailable is false. The link is a presigned URL that expires.

Can a person take over the browser?

Yes. The live view is interactive unless you make it read-only, so a person can log in, solve a step or approve a payment, and your Playwright script or agent continues on the same browser.

How do I make the embed read-only?

Add readOnly=true to the live URL, or wrap the iframe in an inert element with pointer-events: none. Both are UI restrictions: anyone with the live URL or the CDP URL can still control the browser, so treat both URLs as credentials.

What does it cost?

Browser time is $0.02 per browser-hour, no subscription. The pricing page lists no separate charge for live view or recording.