Comparison

browser.city vs Kernel.sh: speed vs simplicity (and what “stealth” really means)

Kernel.sh is the speed-first BaaS with per-second billing. browser.city is stealth-by-default with Request API + MCP and a zero-logs posture. Here’s how to choose.

Quick verdict: If your top KPI is cold start latency and you want per-second billing with no idle charge, Kernel.sh is compelling. If you want fewer cost/config surprises across mixed workloads (extraction + automation + agents) and you care about stealth-by-default + zero-logs, browser.city is the steadier default.

The real decision: “fastest browser” vs “least friction browser infra”

Kernel.sh’s story is speed: unikernel architecture and extremely fast cold starts (vendor-claimed). That matters when you spin up massive numbers of short-lived sessions.

browser.city’s story is production ergonomics:

  • stealth is enabled by default
  • the system is designed around a zero-logs posture
  • you get multiple access modes (Request API, Playwright sessions, MCP tools)

At a glance

Dimensionbrowser.cityKernel.sh
Cold startsFast (focus on infra UX)Speed-first (unikernels; vendor-claimed sub-150ms cold start)
BillingSimple usage modelPer-second billing (headline advantage for bursty workloads)
StealthDefault“Stealth on all plans” (verify current behavior)
Entry pointsRequest API, Sessions API, Humanized REST, MCP toolsPrimarily browser session workflows + integrations
Best forMixed workloads (extract + automate + agents)High-volume short sessions where cold start dominates

Pricing: per-second is great, but model the whole job

Per-second billing can be a huge win when:

  • sessions are short
  • you can avoid idle time
  • retries are rare

But most real scraping/automation stacks pay for more than compute:

  • proxy bandwidth
  • retries on hostile sites
  • long-running authenticated sessions

If you’re benchmarking cost, do it on “job cost,” not “browser time.”

API surface: extraction vs orchestration

browser.city provides a Request API for “just give me markdown,” which tends to outperform a full browser session for pure extraction jobs.

Example:

request.ts
const apiKey = process.env.BROWSERCITY_API_KEY!;const opts = { method: "POST", headers: { Authorization: `Bearer ${apiKey}` } };const res = await fetch("https://api.browser.city/v1/requests", {  ...opts,  body: JSON.stringify({ url: "https://example.com", markdown: true }),}).then((r) => r.json());console.log(res.content);

When you need orchestration, use sessions and connect with Playwright.

When to pick which

Choose Kernel.sh if:

  • you need the lowest cold-start latency you can get
  • your workload is lots of short-lived sessions (burst, fan-out)
  • per-second billing maps well to your cost model

Choose browser.city if:

  • you want a single set of primitives for extraction + automation + agents
  • you want stealth enabled by default with minimal configuration
  • you care about a zero-logs posture for sensitive workflows
[ 06 / 06 ] — Get Started

Start building in under a minute

Free tier. No credit card. Full stealth from day one.