Extract emails, phone numbers, social media profiles, and the tech stack of any website — 100% free and open source.
Perfect for lead generation and enrichment: feed it a list of websites, get back sales-ready contact data as structured JSON.
- Rated Excellent — 4.6 based on 25 reviews on Trustpilot. Our open source work is sponsored by 1000+ devs on GitHub.
Use it two ways — both documented below:
- Hosted API — one GET request, no installs, no browsers, no infrastructure. 100 Requests Free.
- Open source — this repo. Run it on your machine with a UI dashboard, free forever for unlimited websites extraction.
The same scraper is also available on Apify and RapidAPI:
One request to the contact scraper API:
GET https://website-email-contact-scraper.omkar.cloud/contacts?website=vercel.com
{
"domain": "vercel.com",
"title": "Agentic Infrastructure - Vercel",
"description": "The autonomous stack for every app and agent.",
"emails": [
{
"value": "privacy@vercel.com",
"sources": [
"https://vercel.com/legal/privacy-notice",
"https://vercel.com/legal/cookie-policy"
],
"is_likely_official": true
},
{
"value": "security@vercel.com",
"sources": ["https://vercel.com/legal/terms"],
"is_likely_official": false
}
],
"phones": [],
"phones_uncertain": [
{ "value": "800.352.5267", "sources": ["https://vercel.com/legal/terms"] }
],
"linkedins": [
{
"value": "https://www.linkedin.com/company/vercel",
"sources": ["https://vercel.com", "https://vercel.com/contact/sales"],
"is_likely_official": true
}
],
"twitters": [
{
"value": "https://x.com/vercel",
"sources": ["https://vercel.com", "https://vercel.com/contact/sales"],
"is_likely_official": true
}
],
"instagrams": [
{
"value": "https://www.instagram.com/vercel",
"sources": ["https://vercel.com", "https://vercel.com/contact/sales"],
"is_likely_official": true
}
],
"youtubes": [
{
"value": "https://www.youtube.com/@VercelHQ",
"sources": ["https://vercel.com", "https://vercel.com/contact/sales"],
"is_likely_official": true
}
],
"githubs": [
{
"value": "https://github.com/vercel",
"sources": ["https://vercel.com", "https://vercel.com/contact/sales"],
"is_likely_official": true
}
],
"blueskys": [
{
"value": "https://bsky.app/profile/vercel.com",
"sources": ["https://vercel.com/docs/accounts"],
"is_likely_official": true
}
],
"technologies": [
{ "name": "Next.js", "versions": [], "categories": ["Web frameworks", "Web servers"] },
{ "name": "Node.js", "versions": [], "categories": ["Programming languages"] },
{ "name": "React", "versions": [], "categories": ["JavaScript frameworks"] },
{ "name": "Vercel", "versions": [], "categories": ["Web servers"] }
],
"error": null
}Trimmed for readability — the full response covers 17 social platforms. See the sample response in the API reference.
Run this exact request in the Playground — no signup, no key →
The playground comes prefilled with this request and runs it against the live API in your browser.
Use the playground to try any website you go through the effort of installing open source version on your machine.
This repo is the complete scraper — the same crawler and extraction rules that power the API — and it runs on your machine for free, unlimited extractions.
1️⃣ Clone the repository:
git clone https://github.com/omkarcloud/website-email-contact-scraper
cd website-email-contact-scraper2️⃣ Install dependencies (this takes a few minutes — it also builds the UI dashboard):
python -m pip install -r requirements.txt3️⃣ Run the scraper via the UI dashboard:
python run.pyYour browser opens http://localhost:3000. Enter websites, hit Run, filter results ("Has Emails", "Has LinkedIn"), and export CSV/JSON/Excel — without writing a line of code.
Prefer the terminal? Edit the website list in main.py and run:
python main.pyResults are saved to output/scrape_contacts.json.
from src.contact_scraper import scrape_contacts
results = scrape_contacts(["vercel.com", "stripe.com", "shopify.com"])Websites are scraped in parallel (5 at a time), and every result has the same fixed schema — unreachable or broken sites return the schema with an error string instead of raising, so batch runs never die halfway.
docker-compose build && docker-compose upThe open source scraper is perfect for lists you run on your laptop. Reach for the hosted API when you want contacts inside a product or pipeline — no Chrome to babysit, no servers to maintain, results in one GET request from any language. Try it free in the Playground →
- 📧 Emails — including Cloudflare-protected and JavaScript-obfuscated emails that simple regex scrapers miss.
- 📞 Phone numbers — validated with Google's libphonenumber, region-aware based on the site's country domain. Uncertain matches are kept separate in
phones_uncertain, so your CRM stays clean. - 🔗 17 social platforms — LinkedIn, Twitter/X, Instagram, Facebook, YouTube, TikTok, Pinterest, Discord, Snapchat, Threads, Telegram, Reddit, WhatsApp, GitHub, Bluesky, Medium, and Calendly.
- 🛠️ Technology detection — know if a site runs Shopify, WordPress, React, and hundreds of other technologies (great for segmenting leads).
- 🎯 Official-contact ranking — every email/phone/profile carries its source URLs, and the most prominent one per list is flagged
is_likely_official: true. - 🕷️ Smart crawling — contact and about pages are prioritized, so it usually finds the goods within a handful of pages instead of blindly crawling the whole site.
- 🥷 Handles tough websites — fast HTTP requests first, with automatic escalation to a real Chrome browser for JavaScript-rendered sites and bot-protected pages.
▶ Try it live in the Playground — no key needed →
GET https://website-email-contact-scraper.omkar.cloud/contacts?website=vercel.com
Accepts a bare domain (vercel.com) or a full URL (https://vercel.com/). The crawl stays on the site's registrable domain, subdomains included, and is capped at 20 pages / 120 seconds — so a response can take up to ~2 minutes for slow or bot-protected sites.
Returns the site's title and description, every email, phone number, and social profile found (with source pages and the is_likely_official flag), plus the detected technology stack. The shape is identical for unreachable sites: all lists come back empty and error holds a short reason string.
Sample Response (click to expand)
{
"domain": "vercel.com",
"title": "Agentic Infrastructure - Vercel",
"description": "The autonomous stack for every app and agent.",
"emails": [
{
"value": "privacy@vercel.com",
"sources": [
"https://vercel.com/legal/privacy-notice",
"https://vercel.com/legal/cookie-policy"
],
"is_likely_official": true
},
{
"value": "security@vercel.com",
"sources": [
"https://vercel.com/legal/terms"
],
"is_likely_official": false
}
],
"phones": [],
"phones_uncertain": [
{
"value": "800.352.5267",
"sources": [
"https://vercel.com/legal/terms"
]
}
],
"linkedins": [
{
"value": "https://www.linkedin.com/company/vercel",
"sources": [
"https://vercel.com",
"https://vercel.com/contact/sales"
],
"is_likely_official": true
}
],
"twitters": [
{
"value": "https://x.com/vercel",
"sources": [
"https://vercel.com",
"https://vercel.com/contact/sales"
],
"is_likely_official": true
}
],
"instagrams": [
{
"value": "https://www.instagram.com/vercel",
"sources": [
"https://vercel.com",
"https://vercel.com/contact/sales"
],
"is_likely_official": true
}
],
"facebooks": [],
"youtubes": [
{
"value": "https://www.youtube.com/@VercelHQ",
"sources": [
"https://vercel.com",
"https://vercel.com/contact/sales"
],
"is_likely_official": true
}
],
"tiktoks": [],
"pinterests": [],
"discords": [],
"snapchats": [],
"threads": [],
"telegrams": [],
"reddits": [],
"whatsapps": [],
"githubs": [
{
"value": "https://github.com/vercel",
"sources": [
"https://vercel.com",
"https://vercel.com/contact/sales"
],
"is_likely_official": true
}
],
"blueskys": [
{
"value": "https://bsky.app/profile/vercel.com",
"sources": [
"https://vercel.com/docs/accounts"
],
"is_likely_official": true
}
],
"mediums": [],
"calendlys": [],
"technologies": [
{
"name": "Next.js",
"versions": [],
"categories": [
"Web frameworks",
"Web servers"
]
},
{
"name": "Node.js",
"versions": [],
"categories": [
"Programming languages"
]
},
{
"name": "React",
"versions": [],
"categories": [
"JavaScript frameworks"
]
},
{
"name": "Vercel",
"versions": [],
"categories": [
"Web servers"
]
},
{
"name": "webpack",
"versions": [],
"categories": [
"Miscellaneous"
]
}
],
"error": null
}Every result — from the API and the open source scraper alike — contains these keys, always in this order:
| Key | Description |
|---|---|
domain |
Final resolved host of the website after redirects (e.g. entering docker.com gives www.docker.com) |
title / description |
Homepage title and meta description |
emails |
[{value, sources, is_likely_official}], best first |
phones |
Validated numbers in E.164 (+14155551234) format |
phones_uncertain |
Number-like strings that could not be fully validated |
linkedins, twitters, instagrams, facebooks, youtubes, tiktoks, pinterests, discords, snapchats, threads, telegrams, reddits, whatsapps, githubs, blueskys, mediums, calendlys |
Social profile URLs, one list per platform |
technologies |
[{name, versions, categories}] detected on the homepage |
error |
null on success, or a short reason ("dns: no such host: ...") |
| Plan | Price | Requests/Month |
|---|---|---|
| Free | $0 | 100 |
| Grow | $48 | 15,000 |
| Scale | $148 | 75,000 |
1 API call = 1 website scraped
Free Plan Available — create your API key →. No credit card for the free tier.
Rather not pay at all? Run the open source scraper — it's the same code, free forever.
- Crawl — starts at the homepage and follows same-domain links in priority order:
/contact,/impressum,/about,/supportpages first, capped at 20 pages and 2 levels deep. Crawling exits early once emails and phones have been found and no promising pages remain. - Escalate — pages are fetched with fast HTTP requests. If the site blocks bots or renders content with JavaScript, the crawler automatically switches to a real Chrome browser for the rest of that site (and reuses the earned cookies to keep subsequent pages fast).
- Extract — emails (including
mailto:, Cloudflare-encoded, and obfuscated forms likename [at] company [dot] com), phones via libphonenumber with the site's region, social links via battle-tested per-platform regexes ported from the Apify SDK, plus JSON-LD structured data. - Rank — findings are deduped across pages and scored by prominence (homepage/footer/contact-page presence) and similarity to the site's domain. The top entry of each list is flagged
is_likely_official.
Yes. The playground runs live requests in your browser — free, no account, no API key. Try it in the Playground →
Both use same source code and return same JSON. Use the open source scraper when you're comfortable running Python locally and want unlimited free scraping on your own machine. Use the API when you want contacts inside a product, a no-maintenance pipeline, or a language other than Python.
It gives you the same core data — emails, phones, and social profiles crawled from company websites — with extras most paid tools don't include, like technology detection and official-contact ranking. And unlike per-credit tools, you can always fall back to the open source version at zero cost.
Every email, phone, and social profile includes sources (the pages it was found on), and the highest-scoring entry per list is flagged is_likely_official: true. Prominence on the homepage/footer/contact page and similarity to the site's domain drive the score.
Yes. Sites are first fetched with fast HTTP requests; when a site renders client-side (React/Next.js/Angular shells) or sits behind a bot wall (Cloudflare "Just a moment...", PerimeterX, Incapsula), the scraper automatically escalates to a real Chrome browser for that site.
With the open source scraper, the requests-first + real-Chrome escalation handles the vast majority of sites without any proxy setup.
You still get the full schema: all lists empty and error holding a short reason string ("dns: no such host: ..."). Batch runs never die halfway — a dead site costs you one record, not the run.
With the open source scraper there are no artificial limits — it's your machine, and websites are processed 5 at a time in parallel. With the API, see Pricing.
Please open an issue with the website URL — real-world edge cases are how the extraction rules got this good.
Also whatsapp us about it here.
- Google Maps Scraper (3100+ Github Stars) — the perfect first step before this scraper: search Google Maps for any niche and location ("dentists in New York") and get every business with its name, address, phone, ratings, and website — then feed those websites straight into this contact scraper to build a complete lead list. Super Generous Free Tier: easily get 100K Leads/month free.
- G2 Scraper API — turn any G2 product page into clean JSON: 40+ fields including reviews, pricing, ratings, and company details. Great for enriching the leads you just scraped contacts for. 62+ Github Stars.
- Capterra Scraper API — the same clean JSON, pointed at Capterra: 5-dimension rating breakdowns, pricing plans, integrations, pros/cons for 108,726 products.
- Trustpilot Scraper API — real-time Trustpilot data for 1.6M+ companies: search companies by keyword, full profiles with rating distributions, every review for any domain. 200 free requests/month.
Built by developers, for developers — when you reach out, you talk to the engineers who built the scraper, not a support script. Message us anytime and we'll solve your query within 1 working day.
Email: happy.to.help@omkar.cloud
From one developer to another: if this scraper saved you time, please star the repo.
Here's why it matters: most developers judge a scraper by its stars before trying it. Your star helps the next developer — someone deciding whether the contact data here is real and reliable — try it with confidence.
It takes only 1 second, and means the world to me.
Made with ❤️ using Botasaurus


