Session Persistence
Browser state persists across steps. Cookies, localStorage, and auth sessions carry through your entire workflow.
Run robotic process automation (RPA) inside stealth cloud browsers. Handle form filling, data entry, monitoring, and complex multi-step web workflows at scale.
Browser state persists across steps. Cookies, localStorage, and auth sessions carry through your entire workflow.
Proprietary fingerprinting ensures you bypass anti-bot protections entirely, rather than paying to solve puzzles.
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 { endpoint, token, id } = await fetch('https://api.browser.city/v1/sessions', { method: 'POST', headers: { Authorization: `Bearer ${process.env.BROWSERCITY_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ browser: 'chromium' }),}).then((r) => r.json());try { const browser = await chromium.connect(endpoint, { headers: { Authorization: `Bearer ${token}` }, }); const page = browser.contexts().at(0)!.pages().at(0)!; await page.goto('https://app.example.com/login'); await page.fill('#email', 'user@example.com'); await page.click('button[type=submit]');} finally { await fetch(`https://api.browser.city/v1/sessions/${id}`, { method: 'DELETE', headers: { Authorization: `Bearer ${process.env.BROWSERCITY_API_KEY}` }, });}import os, requestsfrom playwright.sync_api import sync_playwrightauth = {'Authorization': f"Bearer {os.environ['BROWSERCITY_API_KEY']}"}session = requests.post( 'https://api.browser.city/v1/sessions', headers=auth, json={'browser': 'chromium'}).json()endpoint = session['endpoint']token = session['token']session_id = session['id']playwright = Nonetry: playwright = sync_playwright().start() browser = playwright.chromium.connect( endpoint, headers={'Authorization': f'Bearer {token}'}, ) page = browser.contexts[0].pages[0] page.goto('https://app.example.com/login') page.fill('#email', 'user@example.com') page.click('button[type=submit]')finally: try: requests.delete(f'https://api.browser.city/v1/sessions/{session_id}', headers=auth) finally: if playwright: playwright.stop()using Microsoft.Playwright;using System.Net.Http.Headers;using System.Net.Http.Json;var http = new HttpClient();http.DefaultRequestHeaders.Authorization = new( "Bearer", Environment.GetEnvironmentVariable("BROWSERCITY_API_KEY"));var session = await (await http.PostAsJsonAsync( "https://api.browser.city/v1/sessions", new { browser = "chromium" })) .Content.ReadFromJsonAsync<Session>();var (id, endpoint, token) = session!;IPlaywright? pw = null;try { pw = await Playwright.CreateAsync(); var browser = await pw.Chromium.ConnectAsync(endpoint, new() { Headers = new() { ["Authorization"] = $"Bearer {token}" } }); var page = browser.Contexts[0].Pages[0]; await page.GotoAsync("https://app.example.com/login"); await page.FillAsync("#email", "user@example.com"); await page.ClickAsync("button[type=submit]");} finally { try { if (session is not null) await http.DeleteAsync($"https://api.browser.city/v1/sessions/{id}"); } finally { pw?.Dispose(); }}record Session(string Id, string Endpoint, string Token);import com.fasterxml.jackson.databind.ObjectMapper;import com.microsoft.playwright.*;import java.net.URI;import java.net.http.*;import java.util.Map;public class Rpa { public static void main(String[] args) throws Exception { var key = System.getenv("BROWSERCITY_API_KEY"); var http = HttpClient.newHttpClient(); var json = new ObjectMapper(); var req = HttpRequest.newBuilder(URI.create("https://api.browser.city/v1/sessions")) .header("Authorization", "Bearer %s".formatted(key)) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString("{\"browser\":\"chromium\"}")) .build(); var created = json.readValue(http.send(req, HttpResponse.BodyHandlers.ofString()).body(), Session.class); var id = created.id(); var endpoint = created.endpoint(); var token = created.token(); Playwright pw = null; try { pw = Playwright.create(); var browser = pw.chromium().connect(endpoint, new BrowserType.ConnectOptions().setHeaders(Map.of("Authorization", "Bearer %s".formatted(token)))); var page = browser.contexts().get(0).pages().get(0); page.navigate("https://app.example.com/login"); page.fill("#email", "user@example.com"); page.click("button[type=submit]"); } finally { try { http.send(HttpRequest.newBuilder(URI.create("https://api.browser.city/v1/sessions/" + id)) .header("Authorization", "Bearer %s".formatted(key)).DELETE().build(), HttpResponse.BodyHandlers.discarding()); } finally { if (pw != null) pw.close(); } } } record Session(String id, String endpoint, String token) {}} Start for free. No credit card required. Private sessions by default.