SFOLN

Catalogue / Company & lead intelligence

Website Contact Details Scraper

sfoln/company-contacts-finder · Lead generation, Developer tools, Automation On request

Scrape emails, phone numbers, social profiles and addresses from company websites by domain. Every email gets a free DNS pre-check; add mailbox verification, company name, mail provider and tech stack. $6 per 1,000 domains, or $3 per 1,000 in contacts-only mode.

About

What it does

Give it a list of company domains and get back the contact details published on each company's website: emails, phone numbers, social profiles (LinkedIn, X, Facebook, Instagram, YouTube, TikTok) and address hints, read from the homepage and up to two contact / about / imprint / team pages linked from it. In the default full mode each record also carries the company name, description and language, the domain's mail provider (Google Workspace, Microsoft 365, ...), a free DNS pre-check of every email and, if you want, mailbox verification of up to three addresses per domain and the tech stack. Built for sales teams, recruiters, agencies and AI agents enriching a list of accounts.

Price

Price per delivered record

EventPricePer 1,000Charged for
Company contact card
company-contacts
$0.006$6 / 1,000Charged once per website reached in mode "full": company name, description, emails with a DNS pre-check, phones, social profiles, address hints and mail provider (plus the tech stack when includeTech is on).
Contact details record
contact-details
$0.003$3 / 1,000Charged once per website reached in mode "contacts": emails, phones, social profiles and address hints from up to 3 pages, without company profile, DNS checks or verification.
Verified email
contact-email-verified
paid plans only
$0.004$4 / 1,000Charged once per email address verified at mailbox level (mode full with verifyEmails on; at most 3 per domain). Addresses the free DNS pre-check already settles are never sent for verification.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~company-contacts-finder/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains":["apify.com"],"verifyEmails":false}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/company-contacts-finder"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~company-contacts-finder/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Find the contact emails, phone numbers and LinkedIn pages of apify.com and wordpress.org, and tell me which addresses are valid.

Input

Input fields

List company domains or website URLs. Each domain produces one dataset record with contacts found on the company's own website.

FieldTypeDefaultMeaning
domains *arrayrequiredDomains or website URLs
Company domains (apify.com) or website URLs (https://www.apify.com/about), one per line. Duplicates are removed. Accounts on the Apify free plan can process up to 10 domains per run.
modestring"full"Mode
full: the company contact card (company name, description, emails with a free DNS pre-check and optional mailbox verification, phones, social profiles, address hints, mail provider, optional tech stack), $6 per 1,000 domains. contacts: emails, phones, social profiles and address hints only (no DNS, verification or tech), $3 per 1,000 domains. One of "full", "contacts".
verifyEmailsbooleantrueVerify emails
Mode full: check found email addresses at mailbox level (valid / invalid / catch-all / unknown), own-domain addresses first. Addresses the free DNS pre-check already settles (invalid syntax, unknown domain, no mail server, disposable) are never sent. Charged per verification ($4 per 1,000 verified emails); paid Apify plans only.
maxVerificationsPerDomaininteger3Max verifications per domain
Upper limit of email verifications per domain (0–3). Emails on the company's own domain are verified first; addresses settled by the pre-check do not count. Range 0–3.
stopAtFirstValidbooleantrueStop at first valid email
Stop verifying a domain's emails once one is confirmed valid (saves verification charges).
maxPagesinteger3Pages per domain
Homepage plus up to 2 contact / about / imprint / team pages linked from it (1–3). Range 1–3.
includeTechbooleanfalseInclude tech stack
Mode full: add the tech stack detected on the fetched pages and in the MX records (CMS, e-commerce platform, analytics, advertising, live chat, CRM, mail provider; 3,500+ technologies with versions and evidence). No extra charge.
maxDomainsinteger1000Max domains
Safety cap on how many domains are processed in this run. Range 1–10000.
concurrencyinteger5Concurrency
Domains processed in parallel (1–10). Range 1–10.
Example input
{
  "domains": [
    "apify.com"
  ],
  "verifyEmails": false
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The input item this record corresponds to.
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan
chargedbooleanCharged
Whether the record's main event was charged.
chargedEventstring | nullCharged event
Event charged by the runner for this record, if any.
sourcestringSource
Upstream data source.
fetchedAtstringFetched at
ISO timestamp.
warningsarray | nullWarnings
Non-fatal problems (pages not reachable, truncation, budget limits).
errorobject | nullError
{ code, message, provider?, status? } when status is not ok.
domainstring | nullDomain
Registrable domain analysed (e.g. apify.com).
websitestring | nullWebsite
Final homepage URL after redirects.
modestring | nullMode
full (company contact card, event company-contacts) | contacts (contacts only, event contact-details).
companyNamestring | nullCompany name
From og:site_name, JSON-LD Organization name or the page title. Mode full.
descriptionstring | nullDescription
Meta description / og:description / JSON-LD description. Mode full.
languagestring | nullLanguage
Homepage language (html lang). Mode full.
emailsarray | nullEmails
[{ email, status, sourcePage, precheck, role }]. status: valid | invalid | catch_all | unknown | disposable | no_mx | not_verified | verification_failed (invalid, no_mx and disposable come from the free pre-check and are never sent for verification). precheck: the local verdict (invalid_syntax | domain_not_found | no_mail_server | disposable | role | ok | unknown; contacts mode checks syntax, unknown TLDs and disposable domains without DNS). role: a role address such as info@ or sales@. Own-domain emails first.
bestEmailstring | nullBest email
First valid, else catch-all, else first unverified own-domain email (never an unverified address on another domain).
bestEmailStatusstring | nullBest email status
Status of bestEmail.
phonesarray | nullPhones
Phone numbers from tel: links and JSON-LD (digits, + prefix when international).
socialsobject | nullSocial profiles
{ linkedin, x, facebook, instagram, youtube, tiktok } profile URLs or null.
addressHintsarray | nullAddress hints
Postal address fragments from JSON-LD, <address> elements and microdata.
mxProviderstring | nullMail provider
google | microsoft | zoho | proton | ... | other; none for a null MX; null when the domain has no MX. Mode full.
mxRecordsarray | nullMX records
MX hosts by priority. Mode full.
pagesFetchedinteger | nullPages fetched
Number of pages fetched (homepage + contact/about pages).
sourcesarray | nullSources
URLs of the fetched pages.
emailsSettledByPrecheckinteger | nullEmails settled by pre-check
Addresses the free local pre-check settled (invalid syntax, unknown domain, no mail server, disposable): never sent for paid verification. Mode full.
emailVerificationsChargedinteger | nullVerifications charged
Number of contact-email-verified events charged for this domain (0 in contacts mode).
techobject | nullTech stack
When includeTech is on (mode full): { generator, server, cms, ecommercePlatform, analytics[], advertising[], marketingAutomation[], crm[], liveChat[], emailProvider, hints[] (technology names), jsonLdTypes[], technologies[{ name, slug, categories, version, confidence, evidence, website }] }.
Example record
{
  "input": "acmeroofing.com",
  "domain": "acmeroofing.com",
  "website": "https://acmeroofing.com/",
  "mode": "full",
  "companyName": "Acme Roofing LLC",
  "description": "Roofing in Philadelphia since 1990.",
  "language": "en",
  "emails": [
    {
      "email": "info@acmeroofing.com",
      "status": "catch_all",
      "sourcePage": "https://acmeroofing.com/",
      "precheck": "role",
      "role": true
    },
    {
      "email": "sales@acmeroofing.com",
      "status": "valid",
      "sourcePage": "https://acmeroofing.com/contact-us/",
      "precheck": "role",
      "role": true
    },
    {
      "email": "jane.doe@acmeroofing.com",
      "status": "not_verified",
      "sourcePage": "https://acmeroofing.com/about",
      "precheck": "ok",
      "role": false
    },
    {
      "email": "bob@old-roofing-domain.com",
      "status": "no_mx",
      "sourcePage": "https://acmeroofing.com/about",
      "precheck": "domain_not_found",
      "role": false
    }
  ],
  "bestEmail": "sales@acmeroofing.com",
  "bestEmailStatus": "valid",
  "phones": [
    "+12155550199",
    "+12155550100"
  ],
  "socials": {
    "linkedin": "https://www.linkedin.com/company/acme-roofing",
    "x": "https://x.com/acmeroofing",
    "facebook": null,
    "instagram": null,
    "youtube": null,
    "tiktok": null
  },
  "addressHints": [
    "1 Main St, 19103 Philadelphia, US"
  ],
  "mxProvider": "google",
  "mxRecords": [
    "aspmx.l.google.com",
    "alt1.aspmx.l.google.com"
  ],
  "pagesFetched": 3,
  "sources": [
    "https://acmeroofing.com/",
    "https://acmeroofing.com/contact-us/",
    "https://acmeroofing.com/about"
  ],
  "emailsSettledByPrecheck": 1,
  "emailVerificationsCharged": 2,
  "status": "ok",
  "charged": true,
  "chargedEvent": "company-contacts",
  "source": "website+millionverifier",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

FAQ

Questions

Which pages are scanned?
The homepage and up to two contact, about, imprint or team pages linked from it on the same site (maxPages). Emails come from mailto links, the page text, JSON-LD and microdata, including obfuscated forms such as name [at] domain [dot] com; phones from tel: links and JSON-LD; social profiles from links to LinkedIn, X, Facebook, Instagram, YouTube and TikTok.
What is the difference between mode full and mode contacts?
Mode contacts ($3 per 1,000 domains) returns the emails, phones, social profiles and address hints only. Mode full ($6 per 1,000 domains) adds the company name, description and language, the domain's mail provider, a DNS pre-check of every email, optional mailbox verification ($4 per 1,000 verified emails, paid plans) and, with includeTech, the tech stack.
Which emails are sent for verification?
Only addresses the free pre-check cannot settle. Invalid syntax, domains that do not exist, domains without a mail server and disposable providers are marked locally (invalid, no_mx, disposable) and never verified or charged. Up to 3 remaining addresses per domain are verified, own-domain addresses first, stopping at the first valid one by default.

Machine-readable

This page for agents