Extract emails, phone numbers, social media profiles, and the tech stack of any website — 100% free and open source.
Website Email & Contact Scraper turns any website into a sales-ready contact record. Feed it a domain and get every email, phone number, and social profile the site exposes — across 17 platforms — each with the exact pages it was found on and the company's real contact flagged is_likely_official: true. It even detects the technologies the site runs, so you can segment leads by stack.
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 on RapidAPI — one GET request, no installs, no browsers, no infrastructure. Adds AI extras the open source version doesn't have: sales-email recommendation, email verification, and an AI website finder. 200 requests/month free.
- Open source — this repo. Run it on your machine with a UI dashboard, free forever for unlimited websites.
The same scraper is also available on Apify:
One request to the contact scraper API:
GET https://website-social-scraper-api.p.rapidapi.com/v1/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": [],
"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/", "https://vercel.com/about"],
"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 RapidAPI playground →
The playground comes prefilled with this request and runs it against the live API in your browser (free plan, 200 requests/month).
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, pick a crawl mode, 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"])
# Pick the crawl depth per website: "homepage", "key_pages" or "deep"
results = scrape_contacts([{"query": "vercel.com", "mode": "deep"}])Each website's pages are fetched concurrently, 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 — or when you want the AI extras: sales-email recommendation, email verification, and the AI website finder. Try it free on RapidAPI →
- 📧 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, returned in E.164 format 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.
- 🤖 AI extras (API only) — an AI-picked
best_sales_emailfor cold outreach, real-time email deliverability verification, and an AI website finder that turns a business name into its official website.
Want to check the data before setting anything up? The same scraper is hosted on RapidAPI.
- Subscribe to the free plan — 200 requests/month, no credit card.
- Open the playground — Website Contacts is pre-filled with
vercel.com. Click Test Endpoint to see the full response. - Change the parameters or pick another endpoint. Verify Email and Find Website are there too.
Once you're happy with the data quality, run the open-source version above for unlimited free data.
Python and Node.js integration examples are available for every endpoint in the RapidAPI playground, so you can get contact data in minutes instead of days.
import requests
# Scrape every email, phone, and social profile from a website
response = requests.get(
"https://website-social-scraper-api.p.rapidapi.com/v1/contacts",
params={"website": "vercel.com"},
headers={
"x-rapidapi-key": "YOUR_RAPIDAPI_KEY",
"x-rapidapi-host": "website-social-scraper-api.p.rapidapi.com",
},
)
print(response.json())▶ Try it live in the RapidAPI playground →
GET https://website-social-scraper-api.p.rapidapi.com/v1/contacts?website=vercel.com
Accepts a bare domain (vercel.com) or a full URL (https://vercel.com/). Optional parameters:
| Parameter | Description |
|---|---|
mode |
Crawl depth: homepage (scan just the homepage), key_pages (also crawl the site's top contact-like pages, up to 7 pages), deep (crawl the whole site, up to 20 pages) |
recommend_sales_email |
When true, an AI picks the best email for cold sales outreach and adds it as best_sales_email. Requires your_product_description |
your_product_description |
A short description of YOUR product, used to judge which inbox fits it — e.g. We sell an AI-powered lead enrichment API for sales teams. |
The crawl stays on the site's registrable domain, subdomains included — a response can take up to a couple of 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",
"https://vercel.com/legal/dpa"
],
"is_likely_official": true
},
{
"value": "security@vercel.com",
"sources": ["https://vercel.com/legal/terms"],
"is_likely_official": false
},
{
"value": "legalnotices@vercel.com",
"sources": ["https://vercel.com/legal/terms"],
"is_likely_official": false
}
],
"phones": [],
"linkedins": [
{
"value": "https://www.linkedin.com/company/vercel",
"sources": [
"https://vercel.com/",
"https://vercel.com/contact/sales",
"https://vercel.com/about"
],
"is_likely_official": true
}
],
"twitters": [
{
"value": "https://x.com/vercel",
"sources": [
"https://vercel.com/",
"https://vercel.com/contact/sales",
"https://vercel.com/about"
],
"is_likely_official": true
},
{
"value": "https://x.com/rauchg",
"sources": ["https://vercel.com/", "https://vercel.com/about"],
"is_likely_official": false
}
],
"instagrams": [
{
"value": "https://www.instagram.com/vercel",
"sources": ["https://vercel.com/", "https://vercel.com/contact/sales"],
"is_likely_official": true
}
],
"facebooks": [
{
"value": "https://www.facebook.com/VercelHQ",
"sources": ["https://vercel.com/", "https://vercel.com/about"],
"is_likely_official": true
}
],
"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": [
{
"value": "https://www.reddit.com/r/vercel",
"sources": ["https://vercel.com/", "https://vercel.com/about"],
"is_likely_official": true
}
],
"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/", "https://vercel.com/about"],
"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
}Real-time deliverability check for an email address: mailbox existence, catch-all detection, disposable/role/free-provider classification, and a typo suggestion — perfect for cleaning the emails you just scraped before a campaign.
▶ Try it live in the RapidAPI playground →
GET https://website-social-scraper-api.p.rapidapi.com/v1/emails/verify?email=web@netflix.com
Sample Response (click to expand)
{
"email": "web@netflix.com",
"result": "ok",
"sub_result": "ok",
"quality": "good",
"is_deliverable": true,
"is_role_account": true,
"is_free_provider": false,
"did_you_mean": null
}Guess a business's official website from its name plus any extra context keys you care to pass — the perfect first step before a contact scrape when all you have is a company name. Answers are probe-confirmed live; website is null when the AI isn't confident.
▶ Try it live in the RapidAPI playground →
POST https://website-social-scraper-api.p.rapidapi.com/v1/websites/find
{ "name": "React.js" }name is required; any other key in the body (city, industry, address…) is passed to the AI as extra context.
Sample Response (click to expand)
{
"website": "https://react.dev"
}Every contact 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 |
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 and key pages (contact, careers, blog) |
error |
null on success, or a short reason ("dns: no such host: ...") |
With recommend_sales_email=true, the API also adds best_sales_email — the AI's pick for cold outreach given your product description.
| Plan | Price | Requests/Month |
|---|---|---|
| Basic | $0 | 200 |
| Pro | $16 | 15,000 |
| Ultra | $48 | 75,000 |
| Mega | $148 | 300,000 |
1 API call = 1 request
Free Plan Available — subscribe on RapidAPI →. No credit card for the free plan.
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,/careers,/blogpages first, fetched in concurrent waves.key_pagesmode stops at the site's 7 most promising pages;deepmode goes up to 20 pages and 2 levels deep. - 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. Subscribe to the free plan on RapidAPI — 200 requests/month, no credit card — and run live requests from the playground in your browser.
Both use the same source code and return the 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, a language other than Python — or the AI extras: sales-email recommendation, email verification, and the website finder.
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.
Pass recommend_sales_email=true plus a short your_product_description to the contacts endpoint, and an AI weighs every scraped inbox against your pitch — sales@ beats billing@ for a lead-gen tool — and returns its pick as best_sales_email. Then run it through the Verify Email endpoint to confirm it's deliverable before you hit send.
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. With the API, we handle all of that server-side — you call a normal REST endpoint.
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 each website's pages are fetched concurrently. 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 (3,100+ 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. The free tier alone pulls up to 100K leads a month.
- G2 Scraper API — turn any of G2's 240,000+ product pages into clean JSON: 40+ fields including reviews, pricing, ratings, and company details — with this very contact scraper built in for every product's website.
- 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
⭐ Love It? Star It ⭐!
Star the repo ⭐ and become my star hero!
It's just 1 click, but it means the world to me.



