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.