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 noisy diffs. When something changes, 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 apiKey = process.env.BROWSERCITY_API_KEY!;const opts = { method: "POST", headers: { Authorization: `Bearer ${apiKey}` } };const res = await fetch("https://api.browser.city/v1/requests", { ...opts, body: JSON.stringify({ url: "https://example.com/terms", markdown: true }),}).then((r) => r.json());const md = String(res.content ?? "");const hash = createHash("sha256").update(md).digest("hex");console.log({ hash });// Store hash; if it changes, alert + attach screenshot evidence.import hashlibimport osimport requestsapi_key = os.environ["BROWSERCITY_API_KEY"]res = requests.post( "https://api.browser.city/v1/requests", headers={"Authorization": f"Bearer {api_key}"}, json={"url": "https://example.com/terms", "markdown": True},).json()md = str(res.get("content", ""))h = hashlib.sha256(md.encode("utf-8")).hexdigest()print({"hash": h})# Store hash; if it changes, alert + attach screenshot evidence.using System.Net.Http.Headers;using System.Net.Http.Json;using System.Security.Cryptography;using System.Text;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/requests", new { url = "https://example.com/terms", markdown = true });var json = await res.Content.ReadFromJsonAsync<RequestResponse>() ?? throw new Exception("bad response");var md = json.content ?? "";var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(md));var hash = Convert.ToHexString(bytes).ToLowerInvariant();Console.WriteLine(hash);public record RequestResponse(string? content);import java.net.URI;import java.net.http.*;import java.nio.charset.StandardCharsets;import java.security.MessageDigest;var apiKey = System.getenv("BROWSERCITY_API_KEY");var auth = "Bearer " + apiKey;var http = HttpClient.newHttpClient();var req = HttpRequest.newBuilder() .uri(URI.create("https://api.browser.city/v1/requests")) .header("Authorization", auth) .POST(HttpRequest.BodyPublishers.ofString( "{\"url\":\"https://example.com/terms\",\"markdown\":true}")) .build();var res = http.send(req, HttpResponse.BodyHandlers.ofString());var json = res.body();var md = extractField(json, "content");var dig = MessageDigest.getInstance("SHA-256");var hashBytes = dig.digest(md.getBytes(StandardCharsets.UTF_8));System.out.println(toHex(hashBytes));static String extractField(String json, String key) { // Use a proper JSON parser in production. This is intentionally minimal. var i = json.indexOf("\"" + key + "\""); if (i < 0) return ""; var start = json.indexOf('"', i + key.length() + 2); var end = json.indexOf('"', start + 1); return (start >= 0 && end > start) ? json.substring(start + 1, end) : "";}static String toHex(byte[] bytes) { var sb = new StringBuilder(bytes.length * 2); for (byte b : bytes) sb.append(String.format("%02x", b)); return sb.toString();} Free tier. No credit card. Full stealth from day one.