Session Persistence
Browser state persists across steps. Cookies, localStorage, and auth sessions carry through your entire workflow.
Robotic process automation with stealth cloud browsers. Automate form filling, data entry, monitoring, and multi-step web workflows.
Browser state persists across steps. Cookies, localStorage, and auth sessions carry through your entire workflow.
Built-in solving for reCAPTCHA, hCaptcha, and Turnstile. Automate workflows that require human verification.
Every session gets anti-detection. Run automations on sites with bot protection without getting blocked.
Sessions up to 4 hours on Scale tier. Handle complex multi-step workflows without timeouts.
Rotate through residential, mobile, and datacenter proxies. Different IP per session or per request.
Get notified when sessions complete, fail, or hit milestones. Integrate with your existing orchestration.
Connect your existing Playwright scripts to stealth cloud browsers in one line.
import { chromium } from "playwright";const apiKey = process.env.BROWSERCITY_API_KEY!;const opts = { method: "POST", headers: { Authorization: `Bearer ${apiKey}` } };const session = await fetch("https://api.browser.city/v1/sessions", { ...opts, body: JSON.stringify({ browser: "chromium" }),}).then((r) => r.json());const browser = await chromium.connect(session.endpoint, { headers: { Authorization: `Bearer ${session.token}` },});const context = await browser.newContext();const page = await context.newPage();await page.goto("https://app.example.com/login");await page.fill("#email", "user@example.com");await page.fill("#password", "secret");await page.click("button[type=submit]");import osimport requestsfrom playwright.sync_api import sync_playwrightapi_key = os.environ["BROWSERCITY_API_KEY"]session = requests.post( "https://api.browser.city/v1/sessions", headers={"Authorization": f"Bearer {api_key}"}, json={"browser": "chromium"},).json()with sync_playwright() as p: browser = p.chromium.connect( session["endpoint"], headers={"Authorization": f"Bearer {session['token']}"}, ) context = browser.new_context() page = context.new_page() page.goto("https://app.example.com/login") page.fill("#email", "user@example.com") page.fill("#password", "secret") page.click("button[type=submit]")using Microsoft.Playwright;using System.Net.Http.Headers;using System.Net.Http.Json;var apiKey = Environment.GetEnvironmentVariable("BROWSERCITY_API_KEY")!;var http = new HttpClient();http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);var res = await http.PostAsJsonAsync( "https://api.browser.city/v1/sessions", new { browser = "chromium" });var session = await res.Content.ReadFromJsonAsync<Session>() ?? throw new Exception("bad response");using var pw = await Playwright.CreateAsync();var browser = await pw.Chromium.ConnectAsync(session.endpoint, new() { Headers = new Dictionary<string, string> { ["Authorization"] = $"Bearer {session.token}", },});var context = await browser.NewContextAsync();var page = await context.NewPageAsync();await page.GotoAsync("https://app.example.com/login");await page.FillAsync("#email", "user@example.com");await page.FillAsync("#password", "secret");await page.ClickAsync("button[type=submit]");public record Session(string endpoint, string token);import com.microsoft.playwright.*;import java.net.URI;import java.net.http.*;// Create session via your preferred HTTP clientvar apiKey = System.getenv("BROWSERCITY_API_KEY");var auth = "Bearer " + apiKey;var http = HttpClient.newHttpClient();var res = http.send( HttpRequest.newBuilder() .uri(URI.create("https://api.browser.city/v1/sessions")) .header("Authorization", auth) .POST(HttpRequest.BodyPublishers.ofString("{\"browser\":\"chromium\"}")) .build(), HttpResponse.BodyHandlers.ofString());var session = res.body();try (var pw = Playwright.create()) { var browser = pw.chromium().connect( extractEndpoint(session), new BrowserType.ConnectOptions().setHeaders( java.util.Map.of("Authorization", "Bearer " + extractToken(session)))); var context = browser.newContext(); var page = context.newPage(); page.navigate("https://app.example.com/login"); page.fill("#email", "user@example.com"); page.fill("#password", "secret"); page.click("button[type=submit]");}static String extractEndpoint(String json) { return ""; }static String extractToken(String json) { return ""; } Free tier. No credit card. Full stealth from day one.