Website Contact Extractor (Browser)
Pricing
from $10.00 / 1,000 contact extracted (browser)s
Website Contact Extractor (Browser)
Extract team contacts from JavaScript-rendered company websites (React, Vue, Angular) using AI + Playwright. Companion to the HTTP-only Website Contact Extractor. Handles the ~28% of sites that need a real browser. Same output format, same quality, same LLM fallback chain.
Pricing
from $10.00 / 1,000 contact extracted (browser)s
Rating
0.0
(0)
Developer
NanoScrape
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
Extract contacts from JavaScript-rendered company websites (React, Vue, Angular SPAs) using AI + Playwright.
This is the browser-based companion to the Website Contact Extractor (HTTP-only). Use this actor when the HTTP version flags companies with js_rendering_suspected status.
When to use this actor
- Team/contact/about pages built with React, Vue, Angular, or other JS frameworks
- Pages that return empty/skeleton HTML without JavaScript execution
- Companies flagged by the HTTP actor's JS-rendering detection
- Auto-chained via
enablePlaywrightFallbackon the HTTP actor
Use with AI Agents (MCP)
Connect this actor to any MCP-compatible AI client — Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.
Apify MCP server URL:
https://mcp.apify.com?tools=santamaria-automations/website-contact-extractor-browser
Example prompt once connected:
"Use
website-contact-extractor-browserto process data with website contact extractor browser. Return results as a table."
Clients that support dynamic tool discovery (Claude.ai, VS Code) will receive the full input schema automatically via add-actor.
How it works
- Link discovery from homepage (HTTP, fast)
- Phase 1: Playwright renders main pages (team, contact, about, impressum)
- Phase 2: Playwright renders team member detail pages
- LLM extraction using Gemini Flash / Groq / OpenRouter
- Anti-hallucination validation against source HTML
- Cross-company dedup to catch LLM-invented names
Same extraction pipeline as the HTTP actor — same output format, same quality.
Input
Same input format as the HTTP actor:
{"companies": [{"company_id": "abc-123","company_name": "TechCorp AG","website_url": "https://techcorp.ch"}],"llmProvider": "gemini","geminiApiKey": "YOUR_KEY"}
Output
Each company result includes browser_extraction: true:
{"company_id": "abc-123","company_name": "TechCorp AG","contacts": [{"name": "Max Mustermann","position": "CTO","email": "max@techcorp.ch","confidence": 0.92}],"status": "success","browser_extraction": true}
| Field | Description |
|---|---|
extraction_mode | Set to no_llm when no LLM key was given (emails, phones and social links only). Absent on normal LLM rows. |
company_data.other_emails, company_data.other_phones | No-LLM mode: further public emails and phones beyond the main ones (arrays). |
Running without an LLM key
If you give no LLM key (geminiApiKey, groqApiKey or openrouterApiKey), the actor still runs and succeeds. It crawls the same pages and extracts emails, phone numbers and social profile links (LinkedIn, Xing, Facebook, Instagram, X/Twitter, YouTube, TikTok), plus the company description and address when the page markup has them. Names and roles need an LLM key, so contacts stays empty and those fields are null. Rows from this mode carry extraction_mode: "no_llm"; extra emails and phones go to company_data.other_emails and company_data.other_phones. Add a key to get person contacts with names and roles. Billing is the same in both modes: browser-company-enriched is charged once per company where an email or phone was found, and browser-contact-result only for person contacts, which this mode does not produce.
Memory requirements
- Minimum: 1024 MB (Playwright + Chrome)
- Recommended: 2048 MB for 5+ companies
- Maximum: 4096 MB
Pricing
Browser-based extraction costs ~2x the HTTP actor:
| Event | Cost |
|---|---|
browser-company-enriched | $0.02 per company with at least one contact, email or phone found (sites with nothing found are returned but not charged) |
browser-contact-result | $0.010/contact |
Troubleshooting: LLM key errors
Runs that fail with LLM provider ... rejected the supplied API key or LLM model ... is unavailable to your ... key almost always fall into one of these three buckets:
- Key has referer / IP restrictions. Common on Gemini keys minted in Google AI Studio. Google returns
API_KEY_INVALIDbecause this actor runs on Apify's AWS us-east-1 IPs, which aren't on your allow-list. Fix: remove restrictions on the key in Google AI Studio, or addapify.comas an allowed referer. - Quota exhausted. Free tiers on Gemini and Groq have daily and per-minute caps. Google returns
RESOURCE_EXHAUSTED, Groq returns HTTP 429. The exact error appears in the log. Fix: wait for the reset, or move to a paid tier. - Model was retired. Vendors deprecate faster than their docs update. Gemini 2.5 Flash was restricted to existing users only. Groq retired Llama 3.3 70B Versatile and Llama 3.1 8B Instant. Fix: set
llmModelto a currently-available model. Actor defaults are refreshed when we detect a retirement, but an explicitllmModeloverrides the default.
One-line workaround: use OpenRouter. Set llmProvider: "openrouter" and llmApiKey: <your OpenRouter key>. OpenRouter accepts calls from any IP, aggregates spend on one balance, and lets you switch model providers via llmModel (for example google/gemini-3.6-flash, openai/gpt-oss-120b). One key, no per-provider restrictions.
Auto-chaining
The HTTP actor can automatically trigger this browser actor:
- Run the HTTP actor with
enablePlaywrightFallback: true - Companies with
js_rendering_suspectedstatus are collected - A browser actor run starts automatically (fire-and-forget)
- The browser run ID is saved in the key-value store
LLM fallback chain
Like the HTTP actor, this actor supports automatic provider fallback. Just provide API keys for the providers you want to use:
{"geminiApiKey": "YOUR_GEMINI_KEY","llmApiKey": "YOUR_GROQ_KEY","openrouterApiKey": "YOUR_OPENROUTER_KEY"}
The system auto-discovers available providers and builds a fallback chain (e.g. Gemini → Groq → OpenRouter). If one provider's quota runs out, it instantly falls back to the next.
End-to-end pipeline
This actor is part of a 5-actor enrichment suite:
| Actor | Purpose | Memory | Link |
|---|---|---|---|
| Google Maps Scraper | Find companies by location | ~80MB | View |
| Website Contact Extractor | Extract contacts (HTTP) | ~256MB | View |
| Website Contact Extractor (Browser) | Extract contacts from JS pages | ~1-4GB | This actor |
| Website Job Extractor | Extract jobs (HTTP) | ~128MB | View |
| Website Job Extractor (Browser) | Extract jobs from JS pages | ~1-4GB | View |
Limitations
- Higher memory usage (~1GB vs ~256MB for HTTP)
- Slower execution (page rendering + wait times)
- Higher cost per result (2x HTTP rates)
- Use the HTTP actor first — only fall back to browser when needed
Data protection
This actor returns only data that is publicly visible on the source pages. Results can include personal data, such as names, phone numbers, email addresses and addresses of private persons, sole traders or contact persons. Where the source labels an entry type, it is included so you can filter the results yourself.
You are responsible for using the data lawfully, including the GDPR/DSGVO, national data-protection laws and unfair-competition rules (e.g. UWG) for marketing and outreach.

