Skip to content
flatbrowser

hosted chromium · eu infrastructure

Dedicated headless browsers.
Flat price. No metering.

Your own browser workers in the cloud. Point your existing Puppeteer or Playwright code at one WebSocket URL and never think about browser-minutes again.

connect.mjs — the change you make
import puppeteer from 'puppeteer-core';

const browser = await puppeteer.connect({
  browserWSEndpoint:
    'wss://gw.flatbrowser.com?token=flat_live_YOUR_KEY',
});

works with puppeteer-core, playwright-core, and anything that speaks CDP▍

Pricing

Solo

€19/month net, flat

plus VAT · for businesses only (§14 BGB)

  • 1 dedicated browser worker
  • 2 concurrent sessions
  • unmetered hours & pages
  • cancel monthly

Team

€49/month net, flat

plus VAT · for businesses only (§14 BGB)

  • 3 dedicated browser workers
  • 6 concurrent sessions
  • unmetered hours & pages
  • cancel monthly

Scale

€149/month net, flat

plus VAT · for businesses only (§14 BGB)

  • 10 dedicated browser workers
  • 20 concurrent sessions
  • unmetered hours & pages
  • cancel monthly

each block is a dedicated worker · each pip a concurrent session · net prices plus VAT, no add-ons

For businesses only (§14 BGB). All prices net, plus VAT.

how it works

From signup to connected in minutes

  1. step 1/3

    Pick a plan

    We provision your dedicated Chromium workers on our hardware. They’re yours alone — no shared browser pools.

  2. step 2/3

    Create an API key

    One click in the dashboard. The key is shown once, stored hashed, revocable anytime.

  3. step 3/3

    Swap one URL

    Replace puppeteer.launch() with puppeteer.connect() pointed at your endpoint. Deploy. Done.

plain cdp

Keep your CDP code. Change the endpoint.

The gateway speaks raw Chrome DevTools Protocol — no SDK to install, no wrapper API to learn. There’s also a small REST API for one-shot jobs like screenshots and PDFs.

Moving from Browserless? Most code works by changing the endpoint. What does not — built-in proxy pools, persistent profiles, a few REST options — is refused with an error that says why, never silently ignored. See the compatibility table and the quickstart.

puppeteer.mjs
import puppeteer from 'puppeteer-core';

const browser = await puppeteer.connect({
  browserWSEndpoint: 'wss://gw.flatbrowser.com?token=flat_live_YOUR_KEY',
});

const page = await browser.newPage();
await page.goto('https://example.com');

the honest math

One browser, held open for a month

Metered pricing makes the most ordinary thing you can do — keeping one browser open around the clock — the most expensive. That is exactly what monitoring, scraping pipelines and long-running agents do, so it is the number worth comparing. Here it is at each vendor’s published rate for 730 hours, one month.

cost of one always-on browser · 730 h = one month
providerhow they chargeone always-on browser / month
flatbrowserflat subscription — Solo €19/mo net, 2 concurrent€9.50€19 minimum — Solo covers 2 browsers
Anchor Browserbrowser-hours + per-browser creation fee≈ $37 + $0.01 per launch
Steel.devbrowser-hours≈ $58–73, depending on plan
Hyperbrowsercredits (browser-hours)≈ $73
Browserbasebrowser-hours≈ $73–88, depending on plan
Browserlessunits (1 unit = up to 30 s of runtime)≈ $131–175 at the overage rate, depending on plan
Cloudflare Browser Renderingbrowser-hours; the first 10 concurrent browsers are included≈ $66

methodology — one browser held open for 730 hours (one month) at each vendor’s own published list rate, read from their public pricing pages and verified on 2026-10-04. Where a vendor’s rate differs by plan, we show the range across its plans. Our figure is the flat Solo price of €19 (net) divided by the 2 concurrent sessions it includes — we meter nothing, so hours do not enter into it. It assumes you use both: the least you can spend with us is €19 a month.

These are our own arithmetic, not vendor quotes. USD figures are left in USD and not converted. Plan minimums, included allowances, proxy traffic and add-ons are excluded on the vendors’ side, so a real bill can land higher or lower. Vendor pricing changes, so check their current pricing before you decide — and tell us if anything here is out of date and we will correct it.

And what you are actually buying

aspectmetered cloud browsersflatbrowser
You pay forbrowser-seconds + concurrency units + bandwidth + add-onsa fixed number of dedicated workers
A heavy month costsmore — the meter runs while your scraper doesthe plan price
A quiet month costsless, but you’re still doing the maththe plan price
Budgeting meansa pricing calculator and a guessreading one number off this page
Always-on browserusually the most expensive thing you can do€9.50 per browser per month (net, from €19) — €0.013 a browser-hour, and nobody counts them

scale plan: 10 workers · 20 concurrent sessions · €149/month net — the twelfth month costs the same as the first.

faq

Fair questions

What exactly do I get for the monthly price?
A fixed number of dedicated browser workers — containers running Chromium that only your account uses — plus the concurrency they support (2 sessions per worker). Run them one hour a month or all month; the price is the same.
Is there really no metering?
No browser-minutes, no per-page fees, no bandwidth charges. The main limit is concurrency: a Solo plan can run 2 sessions at once, Scale can run 20. If you hit it, new connections get a clear 429 with a Retry-After header and you retry or upgrade. On top of that sit the fair-use guardrails in the Terms — an idle timeout, a 12-hour cap per session, and a fair-use rule on sustained traffic volume.
Who can buy?
Businesses only — companies, freelancers and anyone else buying for their trade or profession (§14 BGB). We do not sell to consumers. All prices are net: VAT is added at checkout, or the EU reverse charge applies when you give a valid VAT ID from another EU country.
Does my existing Puppeteer/Playwright code work?
CDP code does. We expose a standard Chrome DevTools Protocol WebSocket: puppeteer.connect() and chromium.connectOverCDP() work as-is — you change the endpoint URL and delete your launch() call. Coming from Browserless, most code works by changing the endpoint; a few Browserless-only features (built-in residential proxies, persistent profiles, Playwright’s own wire protocol) are refused with a clear error instead of being silently ignored. The compatibility table lists every path and parameter.
What are you not good at?
Sites with aggressive bot management. We run ordinary Chromium: no fingerprint manipulation, no automated challenge solving, and we will not add them. That is a deliberate line, not a gap in the roadmap — under German case law, advertising those capabilities is itself what turns a lawful general-purpose tool into a liability, and collecting from a site that objects by technical means also undermines your own legitimate-interest assessment under the GDPR. If your targets sit behind heavy anti-bot protection, use a specialist unblocking vendor such as Bright Data or Zyte; that is their product, not ours. We are built for automation you control: your own applications and staging environments, uptime and content monitoring, screenshot and PDF pipelines, test runs, agent workloads, and public pages that do not object to being read by a machine.
Can I route traffic through my own proxy?
Yes. Pass an upstream proxy per session (?proxy=… on the WebSocket URL or proxyUrl in the REST API) and the browser egresses through it, credentials included, with WebRTC confined to the proxy so it cannot reveal the worker’s own address. We do not sell proxy traffic ourselves. Details in the proxy docs.
What happens to idle browsers?
Sessions with no connected client are closed after an idle timeout (default 5 minutes, configurable per session) and every session has a 12-hour hard cap, so a forgotten script can’t wedge a worker. Your workers themselves stay provisioned and ready.
Where does this run, and what about the paperwork?
On servers we rent from Hetzner Online GmbH in Falkenstein and Nuremberg (Germany) and Helsinki (Finland). Your workers are containers dedicated to your account — never a shared browser pool — and data stays in the EU. We publish the paperwork instead of making you ask for it: an Art. 28(3) data processing agreement with named subprocessors, an acceptable use policy, a Data Act switching and export page, and the abuse-detection process our terms are required to describe. All of it is in the footer. The texts are drafts that a lawyer has not reviewed yet, so none of them is in force.
How do I cancel or change plans?
Billing runs through Stripe. From the dashboard you can open the billing portal to switch plans or cancel at the end of the current billing period. No calls, no forms. After your service ends, your data stays exportable for 30 days before it is erased, and leaving costs nothing — see billing & refunds and switching & export.