Quickstarts, API reference, operational guides, and the migration playbooks other teams have already written. All in one place.
From API key to first session in five minutes.
Lifecycle, regions, IP pools, and cleanup.
Store, scope, and rotate credentials safely.
Recording, deterministic rerun, export.
Every endpoint, every field, every error.
Types, async patterns, and examples.
Fully typed, Promise-based API surface.
OpenTelemetry, Datadog, and Sentry setup.
Every BrowserAnvil account starts with 60 free session-minutes a month. Grab an API key from your dashboard, install the SDK, and you are ready to spin up your first session.
pip install browseranvil # Python
npm install @browseranvil/sdk # Node / TypeScript
Every request is authenticated with a bearer token. Keep your ba_live_* keys server-side. Use ba_test_* keys in CI.
curl https://api.browseranvil.com/v1/sessions \
-H "Authorization: Bearer ba_live_..." \
-H "Content-Type: application/json" \
-d '{"region":"us-west","record":true}'
A session is a dedicated Chromium instance in a Firecracker microVM. The response gives you a CDP WebSocket URL that lives as long as the session does.
from browseranvil import Runtime
runtime = Runtime(api_key="ba_live_...")
session = await runtime.create_session(
region="us-west",
ip_pool="residential",
credentials=["acme-okta"],
record=True,
idle_timeout_seconds=120,
)
print(session.cdp_url)
The SDK exposes a Playwright-compatible browser object. Or drop down to raw CDP.
from playwright.async_api import async_playwright
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp(session.cdp_url)
page = await browser.new_page()
await page.goto("https://example.com")
Sessions are live from created through ready, active, ending, and closed. Subscribe to lifecycle events over webhooks or the SDK's event stream.
Store credentials once, reference by handle forever. Vaulted values are injected at the keystroke layer and never appear in prompts, logs, or replays.
runtime.vault.put(
handle="acme-okta",
values={
"username": "agent@example.com",
"password": "...",
"totp_seed": "JBSWY3DP...",
},
)
Every session recorded produces a replay_id. Open it in the dashboard, export it over the API, or pipe it into deterministic rerun mode.
Register a webhook endpoint and a pause condition. When the agent trips the condition, we fire the webhook with a live-session URL.
Metrics flow out over OpenTelemetry. Traces stitch into your existing APM. Logs can be mirrored to S3, Datadog, or Splunk.
Team plan: 500 concurrent sessions, 60 new sessions per minute. Enterprise: negotiated.
session_start_timeout — Chromium did not come up in timeip_pool_exhausted — requested pool has no clean addressesbot_detected — page served a Cloudflare/Akamai challengecredential_not_found — vault handle does not exist or is out of scopeThe minimal diff to route your existing Playwright code through BrowserAnvil.
Residential pool + human handoff. When to use which.
Safe parallelism patterns for scheduling thousands of sessions.
Where your session-minutes go, and what to do about it.
Regex rules and selector-based masking.
Design patterns for graceful agent → operator handoff.
from browseranvil import Runtime
rt = Runtime(api_key="ba_live_...")
async with rt.session() as s:
...
import { Runtime } from "@browseranvil/sdk";
const rt = new Runtime({ apiKey: "ba_live_..." });
await rt.session(async (s) => {
/* ... */
});
Vaulted password + TOTP seed in 15 lines.
10 residential sessions, typed results, rate-limited.
Keep-alive patterns for long-running agents.
Deterministic rerun from a saved session.
Pause an agent and resume from a human action.
Stitch our spans into your existing traces.
True carrier-grade NAT IPs, billed per GB.
Pinned clock, random seed, and network responses for exact reruns.
Wrap replays and vault with your own AWS or GCP KMS key.
Stateful graphs with session lifecycle as a first-class node.
A few hundred agent builders, our engineers, and weekly show-and-tell.
Longer-form questions and architecture debates.
Open Zoom every Thursday. Hard problems get the front of the line.
Published at /openapi.yaml. We use it to generate the SDKs and the reference docs, so it is always current.
Yes — every page has an "Edit on GitHub" link in production. We merge typo fixes within a day.
Yes. Import it from the reference page, or regenerate from the OpenAPI spec.
The quickstart is short. The docs are complete.