browser.ready as soon as you create the run so the URL is available
while the browser is live. A follow-up that reuses the session’s open browser
emits browser.reattached, with the same live_view_url field, instead. The SDK
wait for browser.ready returns either event; see
browser events.
Embed the live browser
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. Useready.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.
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
The live viewer supportsreadOnly=true. It blocks browser controls
and page input while keeping connection and screencast Retry buttons usable:
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:keepAlive
seconds, for follow-ups; finishing the run alone does not finalize the video.
Once you no longer need the browser, stop it with
PATCH /api/v4/browsers/{id} and {"action":"stop"}, then allow time for upload
and processing.
API runs default to recording off. Zero Data Retention (ZDR) projects never
record, even if recording was requested; stopping the browser cannot produce
a recording when ZDR is active.
See Zero Data Retention for result retrieval and cleanup timing.
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.