Zero-Logs Posture
Compliance monitoring often touches sensitive pages and datasets. Keep run history out of vendor logs.
Monitor policy pages, disclosures, and regulated content changes without drowning in diff noise. When a policy updates, automatically capture screenshot proof and route the alert to a reviewer.
Compliance monitoring often touches sensitive pages and datasets. Keep run history out of vendor logs.
Normalize pages into markdown so “diff noise” doesn’t overwhelm real policy changes.
Many compliance pages sit behind bot walls, geo gates, or WAF rules. Stealth defaults keep monitors alive.
When something changes, capture a screenshot/PDF as an audit artifact for review.
For strict enterprise routing, bring your own proxy (BYOP) while keeping the same API and semantics.
If a page requires login or multi-step flow, switch to Sessions (Playwright connect) without changing vendors.
Extract markdown, hash it, store the hash, and alert when it changes. When alerts fire, pair them with a screenshot/PDF.
import { createHash } from 'node:crypto';const authorization = ['Bearer', process.env.BROWSERCITY_API_KEY].join(' ');const page = await fetch('https://api.browser.city/v1/requests', { method: 'POST', headers: { Authorization: authorization, 'Content-Type': 'application/json' }, body: JSON.stringify({ url: 'https://example.com/terms', markdown: true }),}).then((r) => r.json());const hash = createHash('sha256').update(String(page.content ?? '')).digest('hex');console.log({ hash }); // Store and alert when it changes.import os, requests, hashlibpage = requests.post( 'https://api.browser.city/v1/requests', headers={'Authorization': f"Bearer {os.environ['BROWSERCITY_API_KEY']}"}, json={'url': 'https://example.com/terms', 'markdown': True},).json()import hashlibhash = hashlib.sha256((page.get('content') or '').encode()).hexdigest()print({'hash': hash}) # Store and alert when it changes.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 page = await (await http.PostAsJsonAsync( "https://api.browser.city/v1/requests", new { url = "https://example.com/terms", markdown = true })) .Content.ReadFromJsonAsync<Response>();var hash = Convert.ToHexString(System.Security.Cryptography.SHA256.HashData( System.Text.Encoding.UTF8.GetBytes(page?.Content ?? ""))).ToLower();Console.WriteLine(hash); // Store and alert when it changes.record Response(string? Content);import com.fasterxml.jackson.databind.ObjectMapper;import java.net.URI;import java.net.http.*;public class Compliance { public static void main(String[] args) throws Exception { var req = HttpRequest.newBuilder(URI.create("https://api.browser.city/v1/requests")) .header("Authorization", "Bearer %s".formatted(System.getenv("BROWSERCITY_API_KEY"))) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString("{\"url\":\"https://example.com/terms\",\"markdown\":true}")) .build(); var page = new ObjectMapper().readValue( HttpClient.newHttpClient().send(req, HttpResponse.BodyHandlers.ofString()).body(), Response.class); var digest = java.security.MessageDigest.getInstance("SHA-256") .digest((page.content() == null ? "" : page.content()).getBytes(java.nio.charset.StandardCharsets.UTF_8)); System.out.println(java.util.HexFormat.of().formatHex(digest)); } record Response(String content) {}} Start for free. No credit card required. Private sessions by default.