URL → Markdown
Convert company sites into clean markdown for enrichment, scoring, and LLM pipelines.
Most enrichment scripts fail on the modern web due to Cloudflare, dynamic rendering, and geo blocks. BrowserCity gives you a bulletproof extraction primitive so your pipeline has fewer holes.
Convert company sites into clean markdown for enrichment, scoring, and LLM pipelines.
Avoid bot walls that break “simple” enrichment scripts. Stealth defaults mean fewer missing fields.
Move from a list of leads to a pipeline: batch endpoints + concurrency with predictable outputs.
When a site needs clicks or login, switch to Sessions (Playwright connect) or Humanized REST tools.
Enrichment is sensitive. A zero-logs stance helps you keep customer and prospect data out of vendor systems.
Keep your enrichment logic in your stack. browser.city provides the browsing/extraction primitive, nothing else.
Fetch a lead’s website as markdown, then extract signals like emails, social links, pricing, and product keywords.
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', markdown: true }),}).then((r) => r.json());const emails = String(page.content ?? '').match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi) ?? [];console.log([...new Set(emails)]);import os, requests, repage = requests.post( 'https://api.browser.city/v1/requests', headers={'Authorization': f"Bearer {os.environ['BROWSERCITY_API_KEY']}"}, json={'url': 'https://example.com', 'markdown': True},).json()import reemails = set(re.findall(r'[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}', page.get('content') or '', re.I))print(sorted(emails))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", markdown = true })) .Content.ReadFromJsonAsync<Response>();var emails = System.Text.RegularExpressions.Regex.Matches( page?.Content ?? "", @"[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}", System.Text.RegularExpressions.RegexOptions.IgnoreCase) .Select(m => m.Value).Distinct();Console.WriteLine(string.Join(", ", emails));record Response(string? Content);import com.fasterxml.jackson.databind.ObjectMapper;import java.net.URI;import java.net.http.*;public class LeadEnrichment { 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\",\"markdown\":true}")) .build(); var page = new ObjectMapper().readValue( HttpClient.newHttpClient().send(req, HttpResponse.BodyHandlers.ofString()).body(), Response.class); var m = java.util.regex.Pattern.compile("[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}", java.util.regex.Pattern.CASE_INSENSITIVE) .matcher(page.content() == null ? "" : page.content()); var emails = m.results().map(r -> r.group()).collect(java.util.stream.Collectors.toSet()); System.out.println(emails); } record Response(String content) {}} Start for free. No credit card required. Private sessions by default.