Skip to main content
A run is one browser-driven attempt: register, login, or connect. Runs are created by POST /v1/registrations, POST /v1/registrations/:id/login, and POST /v1/connections — there is no standalone “create run” endpoint. Observe a run by polling GET /v1/runs/:id or by subscribing to the run.blocked / run.completed / run.failed webhooks. Concepts: Runs and human takeover.

The run object

Run lifecycle

Blocked codes

When a run blocks, error.code is one of:

Failure codes

A blocked-style code (e.g. CAPTCHA_REQUIRED) can also appear on a failed run when the browser session had already ended, so takeover was impossible.

Get a run

GET /v1/runs/:id
Response 200: the run object. 404 {"error": "not found"} otherwise.

Resume a blocked run

POST /v1/runs/:id/resume After a human clears the gate in the live view (completed the CAPTCHA, entered the code, clicked submit), resume hands control back to the agent, which re-checks the page state and continues.
Response 200: the run object with "status": "running" and "error": null. 409 {"error": "run is not blocked", "code": "NOT_BLOCKED", "status": "running"} if the run isn’t blocked.

Take over a live run

POST /v1/runs/:id/intervene Pauses a running or awaiting_verification run so a human can drive the browser via the interactive liveViewUrl. The browser session stays alive. When done, POST /:id/resume hands back to the agent. An unresumed takeover fails BLOCKED_TIMEOUT after the same ~10-minute hold.
Response 200: the run object with "status": "blocked" and "error": { "code": "MANUAL_INTERVENTION", "detail": "paused for manual takeover" }. 409 {"error": "run is not intervenable", "code": "NOT_INTERVENABLE", "status": "queued"} if the run isn’t running/awaiting_verification.

Abort a run

POST /v1/runs/:id/abort Terminates a non-terminal run and stops its browser session. If the run completes concurrently, the completion wins.
Response 200: the run object with "status": "failed" and "error": { "code": "ABORTED", "detail": "aborted by user" }. 409 {"error": "run is already terminal", "code": "ALREADY_TERMINAL", "status": "completed"} if it already ended.

Get the run recording

GET /v1/runs/:id/recording The run’s browser session video, ready shortly after the run ends. Poll while the recording is processing.
Response 200: