Geo-Targeted Browsing
Render the same landing page from different countries, cities, and proxy types to validate targeting and localization.
Verify landing pages, redirects, and variants exactly as your customers see them. Grab irrefutable screenshot proof, spot cloaking, and build verification pipelines you can trust.
Render the same landing page from different countries, cities, and proxy types to validate targeting and localization.
Capture full-page screenshots for audits, disputes, and internal debugging. Pair with HTML/markdown snapshots.
Validate mobile consent banners, redirects, and “tap-only” UX. Use fingerprints and modality-aware actions.
Compare what different egress profiles see (datacenter vs residential, US vs EU) to detect cloaking and variant routing.
Drive deterministic steps over HTTP (open, navigate, click, type, screenshot) without running Playwright in your infra.
BYOP, labeling, and a zero-logs posture help you run verification at scale without leaking sensitive ad intel.
Use Humanized REST tools to open a remote session from a specific geo, navigate to a landing page, and capture a full-page screenshot.
const actionUrl = (action: string) => `https://api.browser.city/v1/do/${action}`;const doAction = (action: string, body: unknown) => fetch(actionUrl(action), { method: 'POST', headers: { Authorization: `Bearer ${process.env.BROWSERCITY_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify(body), }).then((r) => r.json());const opened = await doAction('open', { browser: 'chromium', egress: { mode: 'managed', proxyType: 'residential', country: 'US' } });try { await doAction('navigate', { sessionId: opened.sessionId, url: 'https://example.com/landing' }); const shot = await doAction('take_screenshot', { sessionId: opened.sessionId, fullPage: true }); console.log(shot.file.mimeType);} finally { await doAction('close', { sessionId: opened.sessionId });}import os, requestsAPI_BASE = 'https://api.browser.city/v1/do'def do_action(action, body): return requests.post( f'{API_BASE}/{action}', headers={'Authorization': f"Bearer {os.environ['BROWSERCITY_API_KEY']}"}, json=body, ).json()opened = do_action('open', {'browser': 'chromium', 'egress': {'mode': 'managed', 'proxyType': 'residential', 'country': 'US'}})try: do_action('navigate', {'sessionId': opened['sessionId'], 'url': 'https://example.com/landing'}) shot = do_action('take_screenshot', {'sessionId': opened['sessionId'], 'fullPage': True}) print(shot['file']['mimeType'])finally: do_action('close', {'sessionId': opened['sessionId']})using System.Net.Http.Headers;using System.Net.Http.Json;using System.Text.Json.Nodes;var http = new HttpClient();var apiBase = new Uri("https://api.browser.city/v1/do/");http.DefaultRequestHeaders.Authorization = new( "Bearer", Environment.GetEnvironmentVariable("BROWSERCITY_API_KEY"));async Task<JsonNode?> Do(string action, object body) => await (await http.PostAsJsonAsync( new Uri(apiBase, action), body)).Content.ReadFromJsonAsync<JsonNode>();var opened = await Do("open", new { browser = "chromium", egress = new { mode = "managed", proxyType = "residential", country = "US" } });try { await Do("navigate", new { sessionId = (string?)opened!["sessionId"], url = "https://example.com/landing" }); var shot = await Do("take_screenshot", new { sessionId = (string?)opened!["sessionId"], fullPage = true }); Console.WriteLine((string?)shot!["file"]!["mimeType"]);} finally { await Do("close", new { sessionId = (string?)opened!["sessionId"] });}import com.fasterxml.jackson.databind.*;import java.net.URI;import java.net.http.*;import java.util.Map;public class AdCheck { static final URI API = URI.create("https://api.browser.city/v1/do/"); static final HttpClient HTTP = HttpClient.newHttpClient(); static final ObjectMapper JSON = new ObjectMapper(); public static void main(String[] args) throws Exception { var opened = callAction("open", Map.of( "browser", "chromium", "egress", Map.of("mode", "managed", "proxyType", "residential", "country", "US"))); var sessionId = opened.get("sessionId").asText(); try { callAction("navigate", Map.of("sessionId", sessionId, "url", "https://example.com/landing")); var shot = callAction("take_screenshot", Map.of("sessionId", sessionId, "fullPage", true)); System.out.println(shot.get("file").get("mimeType").asText()); } finally { callAction("close", Map.of("sessionId", sessionId)); } } static JsonNode callAction(String action, Object body) throws Exception { var req = HttpRequest.newBuilder(API.resolve(action)) .header("Authorization", "Bearer %s".formatted(System.getenv("BROWSERCITY_API_KEY"))) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(JSON.writeValueAsString(body))).build(); return JSON.readTree(HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body()); }} Start for free. No credit card required. Private sessions by default.