Skip to main content
Wait for browser.ready as soon as you create the run so the URL is available while the browser is live:
These examples poll immediately, then every three seconds (Python uses seconds; TypeScript uses milliseconds). Setting the interval explicitly also reduces traffic on older SDK releases whose event default is one second. Event reads share the project’s general request budget; stagger concurrent waits and leave room for other calls. The helper advances the event cursor and times out after five minutes. See run events for the full event stream and custom polling.

Embed the live browser

The URL is hosted on live.browser-use.com. Add that origin to your Content Security Policy’s frame-src directive when needed. Treat the URL as a credential: anyone with it can interact with the active browser.

Read-only embeds

To let users watch without clicking, typing, or scrolling the remote page, make the iframe non-interactive in your application. This works with V4 today and provides the same UI-level restriction as the V2 dashboard’s view-only mode. No API request parameter is needed. Use ready.data.live_view_url from the V4 browser.ready event above. For REST integrations, read that event from GET /api/v4/runs/{run_id}/events. Standalone POST /api/v4/browsers responses return the URL as liveUrl.
The preview keeps streaming. The inert wrapper prevents focus and keyboard input, while pointer-events: none blocks pointer interaction with the iframe. Use a browser that supports inert. To allow human takeover, remove inert, tabindex="-1", and pointer-events: none when your application enables control.
ui=false only hides the tabs and toolbar; it does not disable interaction. View-only embeds are a UI restriction, not a server-enforced permission. Anyone who opens the live URL directly or uses the underlying CDP URL can still control the browser. Keep both URLs private.

Read-only URL option (staging)

The staging viewer also supports readOnly=true. It blocks browser controls and page input while keeping connection and screencast Retry buttons usable:
This option is not yet available on live.browser-use.com; use the iframe wrapper above in production. It is a viewer URL option, not a field in the browser or run creation request. Omitting it or setting it to false keeps the viewer interactive, and /session/{id} links preserve it when redirecting. Like the wrapper, it prevents UI input without changing CDP access permissions.

Recording

Enable recording when the run creates its browser:
The MP4 becomes available in the Dashboard after the browser stops. API runs default to recording off, and Zero Data Retention projects never record. For standalone browsers, use enableRecording: true in POST /api/v4/browsers (enable_recording=True in the Python SDK). For agent-created browsers, use browserSettings.record: true as above. These are different request shapes. After stopping a standalone browser, poll GET /api/v4/browsers/{id} for recordingUrl. The stop response and browser-list response do not contain a ready recording URL. Stop polling when recordingAvailable is false; the video cannot appear for that session. If the installed SDK does not expose that field, use the REST response and the current API reference.