Can an AI agent use Browserless?
As of 6 Oct 2026, an AI agent gets into Browserless on its own and does 100% of the core work.
- Find: Docs for agents: llms.txt, an OpenAPI and an MCP server.
- Access: Sign-up in a browser.
- Use: 100% of the work.
- Pay: Payment not reached.
- Leave: Leaves on its own: Cancels on its own, deletes its account.
To reach L5 · Autonomous: pay without a person.
What the levels meanDriven 6 Oct 20261 drive so farRules of 15 Oct 2026Claim this page
Written and checked by our agents from this drive's record. How we write.
Who gets in
- Agents on a serverGet in on their own.
- Signed agentsThe sign-up page opens.
- Agents in a person's browserNot measured yet.
Sign-up page checked 12 Oct 2026. Signed agents: the ones Cloudflare verifies. Where agents come from
What an agent can do in Browserless.
On its own
- Take screenshots and PDFs of any web page
- Read the fully loaded content of a page, including JavaScript-rendered parts
- Pull specific pieces of data off a page into structured results
6 more
- Run its own custom browser scripts on Browserless's servers
- Fill out and submit web forms automatically
- Search the web, map a site's pages, and crawl an entire site
- Use residential proxies by country
- Run a plain-English browsing task and get a written answer back
- Check its own account balance, usage, and error logs
What it can't, and why
- Sign up for an account without using the web sign-up formno automated registration exists, only the dashboard form
- Get an API key without opening the dashboardkeys are only shown on the account page
- Pay for a paid plan by itselfno agent payment method; the dashboard's Continue to Checkout did not open a checkout
2 more
- Cancel or delete the account without the web dashboardno API exists for cancel or delete
- Keep saved login data across a restarted browser sessioncookies and storage were empty after reconnecting, unlike the docs promised
Can an AI agent sign up for Browserless on its own?
Yes, in a browser, without a human. Web form /signup/email?plan=free: email -> 6-digit OTP -> name/company/ToS. No CAPTCHA met, no card. No signup API, auth.md or device flow.
Does Browserless have an MCP server, and can an agent connect to it?
Yes. Browserless has an official MCP server. The server is hosted, lists 16 tools and speaks the older 25 Nov 2025 MCP spec.
A new agent can get in on its own: in the drive of 6 Oct 2026, our agent signed up, verified and got its key without a person. Through the MCP server, 8 of our agent's 12 attempts worked.
What the drive found
APIOpenAPIMCP · officialCLISDKllms.txt–Webhooks–SandboxHow does an AI agent get a Browserless API key?
In the drive of 6 Oct 2026, our agent got its Browserless API key in a browser, without a person. API token only on dashboard home (masked until revealed); no key-create API. MCP OAuth (DCR) also needs a browser login.
Can an AI agent delete its Browserless account?
Yes, in a browser, without a human. Delete Account appears after cancelling; confirmed in web UI; old token then returns 401 Invalid API key. No API/CLI/MCP route.
Not tested in this drive: paying. Every checkpoint, in detail
For the team behind Browserless.
Where agents stop in Browserless today, and the fixes that get them further, highest impact first.
The fixes, highest impact first
- Let agents get an API token headlessStep-by-step guide
- Move MCP to the 28 Jul 2026 spec and CIMDStep-by-step guide
- Add an agent payment rail for unitsStep-by-step guide
3 more fixes
- Fix session state restore on reconnect
- Return clear plan-gate errors
- Offer cancel and delete via API
- Claim it free and reply next to the result.
- A Drive, $49: your private report, with where agents stop, the evidence and the fixes that move your level.
- Fixed something? Order a Drive ($49) any time, or the Monthly drive ($29/month).
Details
Your API, MCP server or CLI is the product? An Audit ($299) also checks every documented route, MCP tool and CLI command against your docs. Compare plans.
Already claimed it? Open it in your dashboard.
Rather not be driven? Block AgentDrivesAgent in robots.txt or write to us. We stop driving it ourselves; this page stays, with its date.
Embed the badge on your site
Behind the level.
The part scores and the measures behind them.
Part scores and the measures · paid plans
Part scores
Agent-ready setup
- llms.txt: found
- OpenAPI: found
- MCP server: found
- CLI: found
Not measured in this drive: Holds up, Docs match (part of an Audit).
The measures
- Work done100
- Reliability82
- Crash test–
Needs a paid plan
Not counted in the level. Our drive used free plan.
| Capability | Plan |
|---|---|
| Record a video of a browser session | Prototyping |
For agents and builders.
The drive as data, every checkpoint and all 53 attempts.
How an agent connects · 5 tips
/api/tools/browserless.json/tools/browserless.mdMCP get_tool {"slug":"browserless"}
- Start with docs.browserless.io/llms.txt; REST APIs with ?token= on production-sfo.browserless.io are the simplest route
- /scrape fails the whole request (408) when one selector is missing; BQL returns partial data with per-field errors
- The MCP server needs initialize (2025-11-25) and Mcp-Session-Id; browserless_agent's sessionId is in the prose text
- Use browserless_logs with the requestId from an error body to debug
- The dashboard API key field is masked until you click reveal
Every checkpoint, in detail · 9 checkpoints
- DocsHeadlessllms.txt (text/markdown) with agent instructions, llms-full.txt, .md pages, Accept: text/markdown negotiation, OpenAPI 3.0.0 at www.browserless.io/swagger.json
- Sign upIn a browserWeb form /signup/email?plan=free: email -> 6-digit OTP -> name/company/ToS. No CAPTCHA met, no card. No signup API, auth.md or device flow.
- VerifyIn a browserOTP mail arrived in ~1 min (valid 15 min), read headless from our inbox, typed into the web form
- KeyIn a browserAPI token only on dashboard home (masked until revealed); no key-create API. MCP OAuth (DCR) also needs a browser login.
- First callHeadlessPOST /screenshot?token= 200 image/png
- First actionHeadlessPOST /session created a persistent session, connected via Puppeteer, DELETE stop URL removed it
- PayNot reachedNo 402/x402/MPP/L402/UCP; paid routes answer 401. Not in x402 Bazaar or mpp.dev. Upgrade page found (/account/upgrade, Prototyping $35/mo); Continue to Checkout did not open a checkout in our agent's browser. No billing API/CLI.
- CancelIn a browserFree plan, nothing recurring. Cancel Account is web UI only, behind a 3-question required survey and a confirm step.
- DeleteIn a browserDelete Account appears after cancelling; confirmed in web UI; old token then returns 401 Invalid API key. No API/CLI/MCP route.
The attempt log · 53 attempts
| Capability | Route | Result | Evidence |
|---|---|---|---|
| MCP discover: POST server/discover 2026-07-28 to https://mcp.browserless.io/mcp unauthenticated | mcp | done ✓ | 401 application/json, WWW-Authenticate: Bearer resource_metadata="https://mcp.browserless.io/.well-known/oauth-protected-resource"; JSON-RPC error -32000 No Browserless API token provided |
| cards and well-known: Probe server-card, ai-catalog, agent-card, PRM, AS metadata, api-catalog, ucp, auth.md, SKILL.md | api | done ✓ | mcp.browserless.io/mcp/server-card 404; www /.well-known/ai-catalog.json 404 html; /.well-known/mcp/server-card.json 200 application/json (schema 2025-09, streamable-http + stdio npx @browserless.io/mcp); agent-card.json & agent.json 404; api-catalog 200 application/linkset+json -> swagger.json; mcp PRM 200 {authorization_servers:[https://mcp.browserless.io]}; mcp AS metadata has registration_endpoint (DCR), no client_id_metadata_document_supported, PKCE S256+plain, iss param supported; www AS metadata issuer data.browserless.io/auth/v1 (no device grant); ucp/auth.md/SKILL.md 404 |
| robots/aipref/markdown/openapi: robots.txt Content-Usage, markdown negotiation, llms.txt, OpenAPI version | api | done ✓ | robots.txt: Content-Signal: search=yes, ai-input=yes, ai-train=no (Cloudflare Content Signals scheme, parses), no aipref Content-Usage line, no Content-Usage header; docs Accept: text/markdown -> content-type text/markdown, vary: Accept-Encoding, Accept; .md URL 200 text/markdown; docs.browserless.io/llms.txt 200 text/markdown (88 KB); www.browserless.io/swagger.json openapi 3.0.0, 87 paths, no x-payment-info |
| pay step probes: Probe 402 rails, well-knowns, registries, pricing | api | done ✓ | Unauthenticated POST production-sfo /screenshot and /chromium/bql -> 401 text/html (no 402, no PAYMENT-REQUIRED, no WWW-Authenticate Payment); x402./mpp./agents.browserless.io resolve (wildcard) but TLS cert does not match -> no service; /.well-known/ucp 404; swagger.json has no x-payment-info; x402 Bazaar and mpp.dev/api/services: no browserless entries; llms-full.txt has 0 mentions of x402/402/machine payments/Stripe Projects; pricing page: Free $0 (1k units, no credit card per sign-up page), Prototyping $25/mo billed annually, Starter, Scale; Switch plans or cancel anytime |
| docs: Read llms.txt, markdown docs, OpenAPI | api | done ✓ | docs.browserless.io/llms.txt 200 text/markdown with explicit agent instructions; .md pages; swagger.json 3.0.0 |
| signup: Sign up for free plan headless | none | blocked | No documented signup API/CLI/agent registration; www /.well-known/oauth-authorization-server lists only authorization_code+refresh_token; sign-up is a web form (/signup/email?plan=free) with email OTP (Supabase-style auth/v1 in JS bundle) |
| signup: Sign up via web form in browser: email -> 6-digit OTP -> name/company/ToS -> Create my account | browser | done ✓ | Landed on https://www.browserless.io/account/home showing Units 0 / 1k, Free plan, API Key section |
| verify: Verify email with OTP code from inbox | browser | done ✓ | Mail [Action required] Verify your email address from no-reply@browserless.io arrived within ~1 min, 6-digit code, expires in 15 minutes; code accepted in form |
| credentials: Copy API token from dashboard home | browser | done ✓ | account/home API Key field (password input), 49-char token; saved to secrets.env |
| The first call: POST /screenshot with token | api | done ✓ | 200 image/png 59156 bytes, PNG 800x600 of example.com (out/shot.png) |
| screenshot: Screenshot example.com | api | done ✓ | POST /screenshot 200 image/png 59156 bytes; file reports PNG 800x600 |
| pdf: PDF from raw HTML | api | done ✓ | POST /pdf {html} 200 application/pdf 13089 bytes; PDF 1.4, 1 page |
| rendered HTML: Rendered HTML of example.com | api | done ✓ | POST /content 200 text/html 2374 bytes, <title>Example Domain</title> |
| scrape: Extract h1 and links from example.com | api | failed | POST /scrape elements [h1,a] -> 408 application/json {error: Timed out waiting for selector "h1" (requestId ...)} |
| scrape: Extract title and links from example.com | api | done ✓ | 200 application/json data[title].results[0].text=Example Domain; data[a] href https://iana.org/help/example-domains (matches /content HTML) |
| function: Run puppeteer code returning title + links + computed value | api | done ✓ | POST /function application/javascript -> 200 {data:{title:Example Domain,links:[https://iana.org/help/example-domains],sum:42},type:application/json}; earlier attempt with h1 selector returned 400 text/plain with stack trace and requestId |
| BQL: BQL goto + text | api | partial ✓ | POST /chromium/bql 200 data.goto {status:200,time:862}; h:null with errors[0] Timeout of 30000ms waiting for DOM selector h1 (path [h]) |
| form fill: BQL: type name, pick radio, check box, submit httpbin.org/forms/post, read echoed form | api | done ✓ | POST /chromium/bql 200; result page <pre> shows form {custname: [redacted], size: medium, topping: cheese} |
| BQL: BQL multi-step script with type/click/checkbox/text | api | done ✓ | Same /chromium/bql call: each mutation alias returned {time}, text(pre) returned server-echoed form data |
| search: Search browserless.io docs, 3 results | api | done ✓ | POST /search 200 application/json success:true, data.web 3 results with title/url/description/position; unresponsiveEngines lists brave timeout |
| map: Map URLs of docs.browserless.io (limit 5) | api | done ✓ | POST /map 200 {success:true,links:[docs.browserless.io/search, /, /ai-integrations/agent-browser, ...]} 5 links; example.com returned links:[] (single-page site) |
| export: Export example.com with resources as zip | api | done ✓ | POST /export includeResources:true 200 application/zip 4537 bytes; unzip: index.html (2372) + s.js (1963) |
| lighthouse: Lighthouse audit example.com | api | done ✓ | POST /performance 200 application/json 542 KB; categories performance 1, accessibility 0.96, best-practices 1, seo 0.8, agentic-browsing 1 |
| download: Trigger a browser download and get the file | api | done ✓ | POST /download (code clicks a data: link with download attr) 200 text/plain 25 bytes: AgentDrives download test |
| connect puppeteer: puppeteer-core connect to wss://production-sfo.browserless.io/chromium, open example.com | sdk | done ✓ | browser.version Chrome/153.0.8010.12; page.title Example Domain |
| The first action: Create a persistent browser session (POST /session ttl 180000) | api | done ✓ | POST /session 200 {id,connect,cloudEndpointId,ttl,stop,browserQL}; connected via connect URL; DELETE stop&force=true 200 {success:true, message: Session ... was successfully removed} |
| persistent session: Set localStorage + cookie in session, browser.close, reconnect, read back | sdk | failed ✓ | Two tries: after reconnect to session.connect and goto https://example.com, localStorage.getItem(ad)=null and document.cookie empty (first try used disconnect, second browser.close as in docs) |
| liveURL: Get a live view URL mid-session via CDP Browserless.liveURL | sdk | partial | cdp.send(Browserless.liveURL) returned {liveURLId, timeout:30000, liveURL: https://production-sfo.browserless.io/e/...} |
| MCP version: server/discover with token, then initialize offering 2026-07-28 | mcp | done ✓ | server/discover with Bearer token -> 400 JSON-RPC -32000 Bad Request: No valid session ID provided (legacy); initialize -> 200 text/event-stream, mcp-session-id header, protocolVersion 2025-11-25, serverInfo browserless-mcp 1.36.0, capabilities tools/resources/prompts/logging/completions |
| account: MCP browserless_account billing | mcp | done ✓ | Plan Free (cloud-unit-based), period ends 2026-11-06, Remaining 977, Used 13, Included 1000 - matches dashboard 0/1k at start + our calls |
| usage: MCP browserless_usage timeframe day | mcp | done ✓ | Used 13 units; Successful 8, Errored 1, peak concurrency 1 - consistent with our REST calls |
| logs: MCP browserless_logs filtered by requestId of the failed /scrape | mcp | done ✓ | requestId 5bbe9897... returns 5 entries ending target_error/operation_timeout 30690ms Error: Timed out waiting for selector h1, 2 units - same id as the 408 body |
| active sessions: MCP browserless_sessions action active | mcp | partial | No browsers are running on this account right now (called when no session was open) |
| skills: MCP browserless_skill site ebay.com | mcp | partial | Returned 2 ebay.com recipes (ebay.com/find-a-product-ef49sf, ebay.com/search-products) with load ids; recipe not loaded yet |
| agent run: Agent Run: read the link text on example.com | api | done ✓ | POST /agent/run 200 {id:run_9f7d8e54be18,status:pending}; GET /agent/run/{id} after ~13 s status succeeded, data.answer The link text is Learn more., final_url https://example.com/, 4 units - matches /scrape result (a text Learn more) |
| crawl: Crawl example.com limit 2 | api | done ✓ | POST /crawl 200 {success:true,id:crawl_75778f778945,url}; GET /crawl/{id} status completed total 1, data[0] metadata title Example Domain statusCode 200, contentUrl presigned S3 JSON |
| unblock: POST /unblock content:true | api | partial | 200 {browserWSEndpoint:null, content:<html>...Example Domain} |
| captcha solve: BQL solve(type: recaptcha) on Google public reCAPTCHA demo page | api | done ✓ | POST /chromium/bql 200 data.solve {found:true, solved:true, time:20821} |
| proxy: BQL with proxy=residential&proxyCountry=us, read ipinfo.io/json | api | done ✓ | 200; ipinfo shows country US, Comcast residential AS7922 (not a datacenter IP) |
| stealth: Compare /stealth/bql vs /chromium/bql on bot.sannysoft.com | api | partial ✓ | Both routes: webdriver missing (passed); UA HeadlessChrome absent in both (Chrome/154 stealth vs Chrome/153 default) |
| multi-turn MCP browser: browserless_agent: turn 1 goto+snapshot keepSessionAlive, turn 2 type name+submit+read result with sessionId, turn 3 close | mcp | done ✓ | Turn 1 snapshot 16 elements with refs and sessionId s:a5b7...; browserless_sessions active listed agent sessions; turn 2 text(pre) shows form custname [redacted] from httpbin echo; close -> Browser session closed. |
| active sessions: browserless_sessions active while agent session kept alive | mcp | done ✓ | Active sessions (2): chromium (agent) started 00:29:08 and 00:29:17 - our two kept-alive agent calls; after close only 1 remained |
| skills: Load ebay.com/search-products recipe | mcp | done ✓ | browserless_skill {id: ebay.com/search-products} returned SITE SKILL frontmatter (name search-products, title eBay Listing Finder, read-only) and guidance |
| profiles: browserless_agent createProfile {name: ad-test} | mcp | failed | isError: Failed to connect to browser agent (HTTP 404): Session ID "7a48..." was not found. (requestId 758fb286...); string form rejected with -32602 expected object |
| video recording: browserless_agent record:true startRecording/goto/stopRecording | mcp | plan_gated ✓ | Response: Recording is not supported; pricing page lists Access to screen recording under Prototyping ($25/mo billed annually), not Free |
| pay step checkout: Find upgrade path in dashboard (no payment) | browser | done ✓ | account/settings Change Plan -> /account/upgrade: Prototyping $35/mo monthly, Continue to Checkout; app JS references Stripe; clicking Continue to Checkout showed no navigation in our agent's browser; no billing API/CLI in docs; MCP tools browserless_link_connect/link_checkout manage a Stripe Link wallet for checkouts on other sites, not for buying Browserless |
| cancel: Cancel account (free plan, nothing recurring) | browser | done ✓ | Settings > Cancel Account: required reason combobox, sub-reason radio, a "When do you expect to need Browserless again?" month select, then confirm; after reload Undo Cancellation + Delete Account buttons shown |
| delete: Delete account and data | browser | done ✓ | Delete Account -> confirm dialog -> logged out; afterwards POST /content with old token 401 Invalid API key; MCP browserless_account isError Could not load account |
| session replay: session replay | none | skipped | |
| extensions: extensions | none | skipped | |
| 1Password secrets: 1Password secrets | none | skipped | |
| self-host via Docker: self-host via Docker | none | skipped | |
| Claude Code plugin: Claude Code plugin | none | skipped |
Also in Browser infrastructure.
SteelL4Gets in on its ownBrowserless vs Steel
Anchor BrowserL4Gets in on its ownBrowserless vs Anchor Browser
BrowserbaseL2Gets in on its ownBrowserless vs Browserbase