Automate real cloud browsers at any scale.
Rent real browser sessions from Go or TypeScript. browserscale handles fingerprints, proxies, captchas and live debugging while your workers focus on the task.
01import { rentBrowser, BrowserConfig, css } from "browserscale-ts";0203const cfg = new BrowserConfig("sk_...", 300, "", 0, "", "");04const browser = await rentBrowser(cfg);05await browser.navigate("https://example.com");06await browser.wait(css("h1"));0708console.log((await browser.evaluate("document.title")).value);09await browser.stopBrowser();Under the hood
Wired into the engine, not bolted on top.
Playwright and Puppeteer drive the browser from outside, over the DevTools protocol. browserscale control runs below the page — native in the browser engine — which is where both the undetectability and the speed come from.
No JS trace, no side effects
Commands run natively inside Chromium itself, straight in the renderer process. Nothing is injected into the page, no Runtime.enable, no DevTools handshake — page JavaScript cannot observe the automation at all.
Waits without polling
CDP-based stacks ask “is it there yet?” in a round-trip loop over a WebSocket. A browserscale wait is armed once inside the engine, runs fully async and fires the instant the condition is met.
Steady-time built in
An element is only reported back once it exists and holds position in the DOM. Animations and layout shifts are absorbed before your click — not discovered after it missed. And it's all configurable from the SDK — relax the checks to match hidden or off-screen elements when you need to.
every check is a round-trip — and the element can still move right after the last one
one call in, one event out — steady-time check included
Parallelism & spin-up
Thousands of browsers, ready in milliseconds.
No VM to boot, no container to warm. Every session is its own isolated browser context that spins up in under 50 ms — so you can fan out to thousands of unique, fully isolated browsers in parallel without queueing on cold starts.
Contexts, not VMs
A session is an isolated browser context, not a fresh VM or OS process. There's no machine to boot and no cold container to warm, so a browser is ready in under 50 ms instead of seconds.
Unique and fully isolated
Every context carries its own cookies, storage, cache and fingerprint. Nothing leaks between tasks, so thousands of jobs run side by side without ever sharing or colliding on state.
Fan out to thousands
Launch one browser or ten thousand from the same SDK. Spin-up stays flat because there's no per-session VM overhead to amortize — scaling out is just more contexts.
cold spin-up per context
state between contexts
Developer experience
Write the automation, not the plumbing.
With Playwright, Puppeteer or raw CDP the hard part isn't your logic — it's the plumbing: polling loops that race the page, walking the frame tree by hand, awaiting a fresh execution context for every iframe. browserscale folds all of that into single calls in browserscale-go and browserscale-ts.
Find it in any frame
Search the page, nested iframes and OOPIFs at once, then act in the exact frame that matched.
›wait(css("button").inAllFrames())Race real outcomes
Wait for success, error or captcha together and branch on whichever result lands first.
›waitAny([success, error, captcha])Target with JavaScript
Use a JS expression when CSS is not enough, then click with real input instead of DOM events.
›click(js("findButtonByText()"))Run JS in any frame
Evaluate straight inside the page — no execution-context handshake, no waiting for a context to attach per frame.
›evaluate("getToken()")Frames & OOPIFs
Reach into any iframe — no juggling.
With Playwright, Puppeteer or raw CDP you juggle flattened sessions, async Runtime.enable and a fresh execution context for every cross-origin frame. browserscale collapses all of that into one flat frame tree where an OOPIF is just another node.
One flat frame tree
Every frame — main document, same-origin iframe or cross-origin OOPIF — is just a string frameId in one tree. No execution-context bookkeeping, no waiting on Runtime.enable to hand you a context per frame.
Act across all frames at once
Wait and click in every frame with one call, or scope to a single iframe. Whether the target sits in a nested OOPIF or the top document is irrelevant — the SDK resolves the nesting for you.
Wait tells you where it hit
Search across all frames and the WaitResult hands back the frameId that matched, ready to pass straight into the next action. No second lookup, no manual frame switching.
Browser agents
Built for browser agents.
Hand your model a compact view of the page instead of a megabyte of raw HTML. browserscale returns only the visible, interactive elements — as text or JSON — so your agent reasons over what matters and spends tokens where they count.
Prompt-sized snapshots
GetObservation returns the visible, interactive elements as text or JSON, capped to fit a token budget.
Sees inside every frame
Elements from nested iframes and cross-origin OOPIFs show up in the same observation, each tagged with its frame.
Observation to action
Every element carries a backendNodeId and frameId you can hand straight to Node(…) — no second lookup.
Remote browser
See and steer every session live.
Every cloud browser streams straight to your screen over WebRTC. Watch automation run in real time, then grab the controls and finish any flow by hand.
Low-latency H.264 stream
Chromium encodes natively and streams over WebRTC, so the view stays smooth even under load.
Take over with mouse & keyboard
Input rides dedicated data channels, so you can jump in and drive any session by hand.
Debug what your script sees
Spot failed selectors, redirects and surprise popups by watching the real rendered page instead of guessing from logs.
Returning visitor
fp_8a3f2c…
same identity, weeks apart
Session persistence
Come back as the same user.
Pin a fingerprint and reuse it across rentals. The user agent, canvas, WebGL, audio and locale replay alongside cookies and storage, so sites see a returning visitor instead of a brand-new install.
Replayable fingerprints
WithFingerprint(id) restores the whole browser identity, not just cookies.
Cookies & storage that stick
GetCookies/SetCookies and GetStorage/SetStorage carry login state and localStorage across separate rentals.
Reattach from anywhere
ConnectSession picks up a running session from another worker or process.
Real hardware
Rendered on real silicon, not simulated.
Most cloud browsers run on VM cores and answer canvas and WebGL probes from a spoofing layer or a fingerprint database. browserscale sessions execute on real consumer GPUs — our own hardware — so every pixel a site reads back was actually rendered.
Real consumer GPUs, our own hardware
Every session runs hardware-accelerated on real consumer GPUs that browserscale owns and operates — not on VM cores with a WebGL faking layer bolted on. Nothing is simulated; it executes on the silicon.
No fingerprint database to maintain
Spoofing stacks live off stored canvas hashes, toDataURL answers and getImageData lookups — and break when a site probes something new. browserscale has nothing to look up: every readback is real pixels, rendered fresh and replayable on the same real GPU.
Future-proof against new checks
Passive bot protections probe rendering deeper every year. A faking layer has to chase each new check; real execution passes them by default, because there's nothing to unmask.
Captcha
Captchas, solved in the same run.
Passive anti-bot checks pass on their own thanks to real fingerprints, real hardware and clean, CDP-free control. For interactive challenges, browserscale's own AI solver completes the challenge right in the live browser — the provider's own JavaScript issues the token, no external solver API in the loop.
In-house AI solver
Learns the known challenge types — puzzle, OCR, slide, hold and more — on its own, and keeps improving as they evolve. Solving runs inside browserscale, not at an external provider.
No token generation, no external APIs
browserscale never synthesizes a token. The challenge is completed in the live session and the provider's own JavaScript runs untouched in a valid browser, issuing the token exactly as it would for a real user. No extra accounts, keys or per-solve contracts.
Future-proof, even for unknown checks
Because everything runs in a genuine browser on real hardware, protections browserscale has never seen before pass too — there's no emulated environment or synthesized response for a new check to expose.
Network
Every request passes through you.
CDP-based interception hooks in from outside — and races navigations, late-attaching frames and OOPIFs, where requests slip through before the handler lands. browserscale sits directly at the browser's networking source, so every request from every frame is yours to observe, block, mutate or await.
Sits at the source
Interception lives in the browser's network stack itself, so every request from every frame — main document, iframes, cross-origin OOPIFs — flows through one choke point. Nothing slips past unobserved.
No handler races
CDP-based route handlers race navigations and freshly attached frames — a request that fires before the hook lands is gone. A browserscale wait is armed once inside the engine, so even the request that fires a millisecond later is caught.
Block, mock, mutate, await
WaitForAnyRequest and WaitForAnyResponse race URL patterns and resolve on the first hit. ModifyRequest rewrites headers or body in flight, SetBlockList drops what you never want loaded — all with the same wildcard vocabulary.
Bandwidth & cost
Stop re-downloading the same assets.
Repeating a flow usually means pulling the same JavaScript, CSS and images through your proxy on every run. Mark them as static paths once and browserscale serves them from a server-side cache — only the bytes that matter travel through your proxy.
Cache once, reuse forever
SetStaticPaths snapshots JS, CSS and images by wildcard for the whole session.
Less proxy bandwidth
Repeat runs skip the heavy static fetches instead of re-downloading them.
Faster, cheaper loads
Pages render from the server-side cache rather than the network.
Platform
Everything around the browser, handled.
The whole platform at a glance. Rent the browser from your SDK and let browserscale take care of the hard parts: identity, input, proxies, captchas, networking and live inspection.
Isolated sessions
A fresh browser context per task — own cookies, storage, fingerprint and lifecycle — ready in under 50 ms.
Fingerprint surface
Browser properties, canvas, audio, WebGL, codecs, DRM and WebRTC behavior aligned — pinnable and replayable across rentals.
Engine-level control
Commands run natively inside Chromium itself — no DevTools protocol, no injected JS, no trace for pages to detect.
Human-like input
Mouse paths use browserscale's own movement algorithm instead of instant jumps.
Managed proxies
Bring your own or let browserscale allocate one server-side, auth handled — and switch mid-session with SetProxy.
Captcha support
Passive anti-bot checks and supported interactive challenges are handled in-flow.
Network control
Wait for requests, modify headers, block or mock responses — plus a server-side asset cache for repeat runs.
Agent observation
GetObservation hands your model a compact, token-budgeted view of every interactive element, ready to act on.
Live browser view
Watch any session as a WebRTC stream, debug it in real time and take over by hand.
Go and TypeScript
Drive the same browser API from backend workers, scripts or services.
The everyday toolkit
The small commands you need every day, exposed through the same SDK.
FAQ
Questions, answered.
What browserscale is, how it stays undetectable, and how it handles the parts of browser automation that usually break.
What is browserscale?
browserscale is a browser-as-a-service platform that runs real Chromium browsers in the cloud. You rent an isolated session and drive it from Go or TypeScript instead of installing, scaling and babysitting your own headless browser farm.
What is browserscale used for?
browserscale is used for large-scale web scraping and data collection, automated testing, and driving AI browser agents — anywhere you need real Chromium sessions that stay undetectable and scale to hundreds or thousands of parallel tasks, driven from Go (browserscale-go) or TypeScript (browserscale-ts).
How is browserscale different from Playwright or Puppeteer?
Playwright and Puppeteer drive the browser from outside over the DevTools protocol (CDP). browserscale runs natively inside Chromium itself: commands execute in the renderer process, nothing is injected into the page, there is no Runtime.enable and no DevTools handshake. That removes the automation traces sites look for and makes execution faster — and you get undetectable fingerprints, human-like input, captcha solving, proxies and live remote control on top.
Is browserscale a real browser or a headless one?
It's a real, full Chromium engine running in the cloud — real pages, frames, cookies, storage and a complete network stack — not a headless DOM emulator or an HTTP client with a JavaScript shim. Sites get a genuine browser environment, which is part of why automation stays undetectable.
Can I migrate my Playwright or Puppeteer scripts to browserscale?
browserscale isn't a drop-in replacement — you drive it through its own Go (browserscale-go) or TypeScript (browserscale-ts) SDK rather than the Playwright or Puppeteer API. But the concepts map closely: the same click, fill, wait, evaluate and network primitives are there, so porting a script is mostly mechanical. In return you drop the CDP-based stack that sites can detect and gain engine-level control, a flat frame tree and managed proxies.
Will websites detect that I'm automating the browser?
That's the core thing browserscale is built to avoid. Because control happens inside the engine with no injected JavaScript and no CDP control-plane signals, page scripts can't observe the automation. Combined with real, replayable fingerprints (canvas, WebGL, audio, codecs, WebRTC) and human-like mouse movement, sessions look like a genuine user's browser rather than a headless bot.
Does browserscale fake WebGL and canvas fingerprints?
No — and that's the point. browserscale sessions run hardware-accelerated on real consumer GPUs that browserscale owns and operates, so canvas and WebGL readbacks like toDataURL or getImageData return genuinely rendered pixels. There is no spoofing layer and no fingerprint hash database that a new bot-protection probe could unmask, which also makes sessions future-proof as passive checks get deeper.
Will my clicks and typing look human?
Yes. Mouse movement uses browserscale's own motion algorithm with realistic paths instead of teleporting the cursor straight to the target, and input is delivered as genuine browser-level events rather than synthetic DOM dispatches. Together with real fingerprints and engine-level control, interactions read like a person rather than a script.
Which languages have an SDK?
browserscale ships official SDKs for Go (browserscale-go) and TypeScript (browserscale-ts). Both drive the exact same browser API, so you can use the same session concepts and commands from backend workers, scripts or services.
Do I need to install Chromium or run my own browser farm?
No. There is no chromium binary on your machine and no infrastructure to manage. You rent a real browser session over the API and drive it remotely; browserscale handles the browsers, proxies, scaling and lifecycle server-side.
How do I stay logged in across separate runs?
Capture state with GetCookies and GetStorage, then replay it on the next rental with SetCookies and SetStorage to carry the cookie jar and localStorage across sessions. Pair it with a pinned fingerprint so the site sees a returning visitor instead of a brand-new install, and you skip logging in every run.
Can I reuse the same browser identity over time?
Yes. Fingerprints are server-side IDs you can pin and reuse. WithFingerprint(id) restores the whole browser identity — user agent, canvas, WebGL, audio, locale and more — not just cookies, so repeat runs look like the same machine coming back.
My waits are flaky and clicks miss elements that are still moving — does browserscale help?
Yes. browserscale waits are armed once inside the engine and resolve event-driven the instant the condition is met — no polling loop that can race the page. Built-in steady-time checks only report an element back once it exists and holds its position in the DOM, so animations and layout shifts are absorbed before your click. The checks are configurable if you need to match hidden or off-screen elements too.
How do I work with iframes and cross-origin frames (OOPIFs)?
browserscale collapses the main document, same-origin iframes and cross-origin OOPIFs into one flat frame tree — every frame is just a frameId. No flattened CDP sessions, no waiting on Runtime.enable for a per-frame execution context. Wait and Click can act across all frames at once or scope to a single iframe, and Wait hands back the frameId that matched so you can act on it directly.
Can browserscale solve captchas?
Yes. Passive anti-bot checks tend to pass on their own thanks to real fingerprints, real hardware and clean, CDP-free control. For interactive challenges, a single SolveCaptcha call detects, solves and wires the token back into the page within the same run. Solving is done by browserscale's own AI solver, which learns the known challenge types — puzzle, OCR, slide, hold and more — on its own and keeps improving as they evolve. browserscale never synthesizes a token: the challenge is completed in the valid live browser and the provider's own JavaScript issues the token itself. That's also why it's future-proof — protections browserscale has never seen before pass too, because there's no emulated environment or synthesized response for a new check to expose.
Can I inspect, modify, mock or block network traffic?
Yes — and unlike CDP-based route handlers that race navigations and late-attaching frames, browserscale interception sits in the browser's network stack itself. Every request from every frame, including cross-origin OOPIFs, passes through it; nothing slips by. From the SDK you can wait for specific requests or responses as part of the flow, modify headers, mock responses, or block matching requests by pattern — without leaving your script.
How do I cut proxy bandwidth and cost on repeat runs?
Mark repeated JS, CSS and image paths as static once with SetStaticPaths. browserscale then serves them from a server-side cache, so repeat runs skip re-downloading the heavy static assets through your proxy — only the bytes that actually change go over the network.
Do I have to bring my own proxies?
Either way works. Pass your own host, port and credentials, or leave them empty and browserscale allocates a managed proxy server-side. You can also switch the proxy mid-session with SetProxy without relaunching the browser.
Can I run many browsers in parallel, and how fast do they start?
Yes — that's what browserscale is built for. Each session is an isolated browser context rather than a fresh VM or OS process, so there's no machine to boot: a browser spins up in under 50 ms. Every context has its own cookies, storage, cache and fingerprint, so large queues never share or collide on state. You can fan out from one job to thousands of concurrent sessions without managing browsers yourself.
Can another worker pick up a running session?
Yes. The browser lives server-side, so ConnectSession lets any other worker, process or machine attach to a running session by its sessionId and gRPC URL. The browser survives a worker restart or redeploy instead of dying with the process that launched it.
Can I use browserscale with AI browser agents?
Yes. GetObservation returns a compact, token-budgeted view of the visible, interactive elements — as text or JSON — across every frame, each tagged with a node handle you can hand straight to an action. Your model reasons over what matters instead of a megabyte of raw HTML.
Can I watch a session live and take control?
Every cloud browser streams to your screen over WebRTC as a low-latency H.264 video. You can watch automation run in real time to debug failed selectors, redirects or surprise popups, and take over with mouse and keyboard over data channels to finish any step by hand.
How much does browserscale cost?
Pricing is pay-as-you-go and credit-based: you top up, earn bonus credits at higher tiers, and scale without per-seat fees or a monthly minimum. See the pricing page for the current tiers.
How do I get started?
Install the Go or TypeScript SDK, grab an API key from your dashboard, rent a browser and drive it — your first script runs in under five minutes. The Quickstart walks through the whole flow.