Website Contact Extractor (Browser) avatar

Website Contact Extractor (Browser)

Pricing

from $10.00 / 1,000 contact extracted (browser)s

Go to Apify Store
Website Contact Extractor (Browser)

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

NanoScrape

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

1

Monthly active users

2 hours ago

Last modified

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 enablePlaywrightFallback on 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-browser to 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

  1. Link discovery from homepage (HTTP, fast)
  2. Phase 1: Playwright renders main pages (team, contact, about, impressum)
  3. Phase 2: Playwright renders team member detail pages
  4. LLM extraction using Gemini Flash / Groq / OpenRouter
  5. Anti-hallucination validation against source HTML
  6. 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
}
FieldDescription
extraction_modeSet 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_phonesNo-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:

EventCost
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_INVALID because 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 add apify.com as 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 llmModel to a currently-available model. Actor defaults are refreshed when we detect a retirement, but an explicit llmModel overrides 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:

  1. Run the HTTP actor with enablePlaywrightFallback: true
  2. Companies with js_rendering_suspected status are collected
  3. A browser actor run starts automatically (fire-and-forget)
  4. 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:

ActorPurposeMemoryLink
Google Maps ScraperFind companies by location~80MBView
Website Contact ExtractorExtract contacts (HTTP)~256MBView
Website Contact Extractor (Browser)Extract contacts from JS pages~1-4GBThis actor
Website Job ExtractorExtract jobs (HTTP)~128MBView
Website Job Extractor (Browser)Extract jobs from JS pages~1-4GBView

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.