Home / Tools / Contact Scraper

Lead & company data

Contact Scraper

Extract emails, phone numbers and social media profiles (LinkedIn, Facebook, Instagram, X, YouTube, TikTok...) from any list of company websites or domains. One clean row per website, contact-page aware, email provider (MX) detection. Pay only for websites with contacts.

Run it on Apify API & MCP

Sample output

DomainEmailPhoneLinkedInInstagram
levainbakery.com[email protected]+18779322161linkedin.com/company/levain-bakeryinstagram.com/levainbakery
katzsdelicatessen.com[email protected]+12122542246–instagram.com/katzsdeli

Real rows from the prefilled example run (Oct 19, 2026), 5 of 43+ fields shown. Export as JSON, CSV, Excel or HTML, or read them through the API.

Full JSON of one real output row (3 rows in the example dataset)
{
  "input": "apify.com",
  "domain": "apify.com",
  "url": "https://apify.com/",
  "status": "ok",
  "companyName": "Apify",
  "primaryEmail": "[email protected]",
  "emails": [
    "[email protected]",
    "[email protected]",
    "[email protected]",
    "... 1 more"
  ],
  "primaryPhone": null,
  "phones": [],
  "linkedin": "https://www.linkedin.com/company/apify",
  "facebook": null,
  "instagram": null,
  "twitter": "https://x.com/apify",
  "youtube": "https://www.youtube.com/c/Apify",
  "tiktok": "https://www.tiktok.com/@apifytech",
  "pinterest": null,
  "github": "https://github.com/apify",
  "threads": null,
  "whatsapp": null,
  "telegram": null,
  "discord": "https://discord.com/invite/jyEM2PRvMU",
  "yelp": null,
  "trustpilot": null,
  "socialProfiles": [
    "https://www.linkedin.com/company/apify",
    "https://x.com/apify",
    "https://www.youtube.com/c/Apify",
    "... 5 more"
  ],
  "address": "Na Příkopě 959/27, Prague, 11000, CZ",
  "contactPageUrl": "https://apify.com/contact",
  "hasContactForm": true,
  "emailProvider": "Google Workspace",
  "emailSecurityGateway": null,
  "mxRecords": [
    "aspmx.l.google.com",
    "alt1.aspmx.l.google.com",
    "alt2.aspmx.l.google.com",
    "... 2 more"
  ],
  "emailDetails": [
    {
      "email": "[email protected]",
      "type": "role",
      "onDomain": true,
      "source": "mailto",
      "page": "https://apify.com/contact",
      "domainAcceptsMail": true
    },
    {
      "email": "[email protected]",
      "type": "role",
      "onDomain": true,
      "source": "mailto",
      "page": "https://docs.apify.com/legal",
      "domainAcceptsMail": true
    },
    {
      "email": "[email protected]",
      "type": "role",
      "onDomain": true,
      "source": "mailto",
      "page": "https://docs.apify.com/legal",
      "domainAcceptsMail": true
    },
    "... 1 more"
  ],
  "phoneDetails": [],
  "title": "Apify: Marketplace of ready-to-run tools for AI",
  "description": "Thousands of tools to automate your business. Get real-time web data, track competitors, generate leads, and integrate your apps and AI agents.",
  "language": "en",
  "logo": "https://apify.com/img/apify-logo/apify-symbol-200x200.svg",
  "legalName": "Apify Technologies s.r.o.",
  "pagesCrawled": 6,
  "crawledUrls": [
    "https://apify.com/",
    "https://apify.com/contact",
    "https://apify.com/contact-sales",
    "... 3 more"
  ],
  "pagesFailed": 0
}

Output fields

From the Actor's dataset schema. Every row has the same flat shape, so it drops straight into a spreadsheet, a database or an agent's context.

FieldTypeDescription
inputstringWebsite or domain as given
domainstringRegistrable domain (after redirects)
urlstringHomepage URL after redirects
statusstringok (charged) | no_contacts | error | invalid_input | robots_disallowed (all free)
companyNamestringName from structured data, og:site_name or page title
primaryEmailstringBest email: own domain, explicit mailto, contact page first
emailsarrayAll emails found, best first
primaryPhonestringBest phone in E.164
phonesarrayAll phone numbers in E.164
linkedinstringLinkedIn company/profile URL
facebookstringFacebook page
instagramstringInstagram profile
twitterstringX / Twitter profile
youtubestringYouTube channel
tiktokstringTikTok profile
pintereststringPinterest profile
githubstringGitHub org/user
threadsstringThreads profile
whatsappstringWhatsApp click-to-chat link
telegramstringTelegram link
discordstringDiscord invite
yelpstringYelp business page
trustpilotstringTrustpilot review page
socialProfilesarrayAll social profile URLs

Pricing

Pay per result, billed by Apify. No subscription and no minimum. Discount tiers apply automatically on paid Apify plans.

EventFree planBronzeSilverGold
Website with contacts main
Charged once for each website that returned at least one email, phone number, or social profile. Websites with no contacts, errors, invalid inputs, and robots-disallowed sites are free.
$0.004$0.0035$0.003$0.0025

Examples on the Free plan: 100 website with contactss = $0.40, 1,000 website with contactss = $4, 10,000 website with contactss = $40. Apify's Free plan includes $5 of monthly usage credit. Prices read from the Apify API at build time (2026-10-19).

Example input

This is the prefilled input on the Store page. Keep it and click Start to see real data in seconds.

{
  "urls": [
    "apify.com",
    "https://www.katzsdelicatessen.com",
    "levainbakery.com"
  ],
  "maxPagesPerDomain": 6,
  "extractPhones": true,
  "extractSocials": true,
  "defaultCountry": "US",
  "onlyRoleEmails": false,
  "onlyOwnDomainEmails": false,
  "checkMx": true,
  "respectRobotsTxt": true,
  "maxConcurrency": 30,
  "proxyMode": "fallback",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "residentialFallback": false
}

Use it from code, no-code or an AI agent

cURL (one request, returns rows)
curl -X POST \
  "https://api.apify.com/v2/acts/wrenfield-data~website-contact-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["apify.com", "https://www.katzsdelicatessen.com", "levainbakery.com"], "maxPagesPerDomain": 6, "extractPhones": true, "extractSocials": true, "defaultCountry": "US", "onlyRoleEmails": false, "onlyOwnDomainEmails": false, "checkMx": true, "respectRobotsTxt": true, "maxConcurrency": 30, "proxyMode": "fallback", "proxyConfiguration": {"useApifyProxy": true}, "residentialFallback": false}'
Python
# pip install apify-client
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("wrenfield-data/website-contact-scraper").call(
    run_input={
    "urls": [
        "apify.com",
        "https://www.katzsdelicatessen.com",
        "levainbakery.com"
    ],
    "maxPagesPerDomain": 6,
    "extractPhones": True,
    "extractSocials": True,
    "defaultCountry": "US",
    "onlyRoleEmails": False,
    "onlyOwnDomainEmails": False,
    "checkMx": True,
    "respectRobotsTxt": True,
    "maxConcurrency": 30,
    "proxyMode": "fallback",
    "proxyConfiguration": {
        "useApifyProxy": True
    },
    "residentialFallback": False
},
    max_total_charge_usd=1.00,  # hard cap for this run
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
JavaScript / Node
// npm i apify-client
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('wrenfield-data/website-contact-scraper').call({
  "urls": [
    "apify.com",
    "https://www.katzsdelicatessen.com",
    "levainbakery.com"
  ],
  "maxPagesPerDomain": 6,
  "extractPhones": true,
  "extractSocials": true,
  "defaultCountry": "US",
  "onlyRoleEmails": false,
  "onlyOwnDomainEmails": false,
  "checkMx": true,
  "respectRobotsTxt": true,
  "maxConcurrency": 30,
  "proxyMode": "fallback",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "residentialFallback": false
}, { maxTotalChargeUsd: 1 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
MCP (Claude, Cursor, VS Code, any MCP client)
{
  "mcpServers": {
    "wrenfield-website-contact-scraper": {
      "url": "https://mcp.apify.com?tools=wrenfield-data/website-contact-scraper"
    }
  }
}

Remote MCP server hosted by Apify. Sign in with OAuth on first use, or send Authorization: Bearer <APIFY_TOKEN>. The tool appears as wrenfield-data--website-contact-scraper. More client setups on the MCP page.

n8n, Make, Zapier

Use the official Apify node or app, pick Run Actor, enter wrenfield-data/website-contact-scraper and paste the input JSON above. Then read the run's dataset items. Ready-made n8n workflows are on the n8n templates page.

FAQ

How much does Contact Scraper cost?

$0.004 per website with contacts on the Apify Free plan ($4 per 1,000), billed per result by Apify with no subscription. Higher Apify plans get the discounted tiers shown in the pricing table. You can cap any run with a maximum cost.

Do I need a login, cookies or an API key?

No. The Actor only reads public company websites.

Why did a website return no emails?

Many companies publish only a contact form or a phone number. Others hide the email in an image or load it with JavaScript after the page renders, and this Actor doesn't run a browser. You still get phones, socials, hasContactForm and contactPageUrl when available. If nothing at all is found, the row is free.

Does it find personal emails of employees?

Only if the company publishes them on its own website (for example a team page). It doesn't guess email patterns, query third-party databases, or scrape LinkedIn. Use Only role-based emails to keep just info@/sales@/support@-style addresses.

Can I enrich my Google Maps results?

Yes. Put the Google Maps run's dataset ID into Enrich an existing dataset. The website field is read automatically, and each row gets sourceName (the place name) and sourceIndex so you can join the results back.

How accurate is the email provider?

It comes straight from the domain's public MX records. When a security gateway (Proofpoint, Mimecast...) sits in front of the mailbox provider, emailSecurityGateway is set and emailProvider may be empty.

Are the emails verified?

Each email's domain is checked to accept mail (MX record), which removes typos and dead domains. Individual mailboxes are not SMTP-probed. Run a dedicated email verifier before large cold-email sends.

Related tools

Compare and plan

Try Contact Scraper now

Open it on Apify, keep the prefilled example and click Start. The Apify Free plan includes $5 of monthly credit, no card needed.

Open on Apify