Tutorial

Run a web errand with the browser tools

Drive a real persistent browser session, hand off long-running work as an async errand, and route anything a human has to clear.

Automation 7 min read

Open a session, drive it, close it

{"name":"browse_open","arguments":{}}
→ {"browser_id": "..."}
{"name":"browse_navigate","arguments":{"browser_id":"...","url":"https://example.com"}}
{"name":"browse_read","arguments":{"browser_id":"..."}}

browse-open starts a persistent session — cookies and login survive across calls, unlike a one-shot fetch. browse-navigate is SSRF-guarded (it won't let you point it at internal infrastructure). browse-read gives you the page as clean Markdown; browse-extract pulls specific fields via CSS selectors when you need structured data instead of prose. Always finish with browse-close to free the session.

Click through a flow

Take a snapshot first to get element references (@e1, @e2, …), then browse-click drives the click by that reference — deterministic, not a guessed coordinate.

Too long to hold in context? Make it an errand

POST /jobs
{"type":"fetch_bundle","inputs":{"urls":["https://example.com/a","https://example.com/b"]}}

submit-errand hands the work to run off your context and returns a job_id immediately; check-errand collects the result (and an artifact_url) whenever you check back in.

When the browser hits a wall only a human can clear

A login CAPTCHA, an email verification link, a "click to confirm" — request-handoff parks the blocked task with a real human operator and pings your inbox when it's cleared. For work that's fundamentally physical (a site visit, a photo, an in-person verification), human-task-post posts it to WingMan's Human Work marketplace with an offered amount and proof requirements — a different kind of errand than anything a browser session can do alone.

Tools used in this guide