Website Contact Extraction - Email & Phone Number Extractor
Pricing
Pay per event
Website Contact Extraction - Email & Phone Number Extractor
Enrich an existing list of company websites with structured email, phone, and social-profile fields while preserving the original rows, except where incoming keys use the Actor's output field names. Contact fields can be empty, and email deliverability is not verified.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Rook DataTools
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
22 days ago
Last modified
Categories
Share
Business Website Contact Extractor
Turn a list of business websites into a structured contact dataset with emails, phone numbers, and social profiles. It is built for lead-generation teams, agencies, researchers, and automation workflows that already have company websites and need usable contact fields for each site.
Use it for a direct list of URLs or to enrich the output dataset from another Apify Actor. Each processed site produces a consistent record that is easy to export, filter, or pass to the next step in your workflow.
What you get
For every site, the Actor returns these fields:
| Field | Type | Meaning |
|---|---|---|
website | string | The website URL associated with the result. |
emails | array of strings | Email addresses found on publicly reachable pages. The array is empty when none are found. |
primaryEmail | string or null | One email selected as the primary result, or null when no email is found. |
phones | array of strings | Phone numbers found for the site. The array is empty when none are found. |
socials | array of strings | Social-profile URLs found for the site. The array is empty when none are found. |
pagesChecked | array of strings | The public page URLs checked for this result. |
contactFound | boolean | true when an email or phone was found; otherwise false. |
scrapedAt | string | ISO 8601 timestamp recording when the site was processed. |
Example output row
This example is shaped like a run against a typical small-business website. Synthetic record used to document the output shape.
{"website": "https://www.example-insurance.example/","emails": ["info@example-insurance.example","sales@example-insurance.example"],"primaryEmail": "info@example-insurance.example","phones": ["555-010-0100","555-010-0101"],"socials": ["https://www.facebook.com/example-insurance"],"pagesChecked": ["https://www.example-insurance.example/","https://www.example-insurance.example/about/","https://www.example-insurance.example/contact/"],"contactFound": true,"scrapedAt": "2026-08-03T01:23:12.855Z"}
The exact values and number of contacts vary by site. If you supply lead objects or another Actor's dataset, the original row fields are retained alongside the contact fields above.
Input examples
Process a list of websites
{"websites": ["https://www.example-insurance.example/","https://example.com/"],"crawlContactPages": true,"maxPagesPerSite": 3,"onlyWithContact": false,"maxSites": 100,"concurrency": 5,"requestDelayMs": 200}
Enrich lead objects
Each lead must include a website, url, or site field. Other fields are kept in the output.
{"leads": [{"company": "Example Insurance Agency","website": "https://www.example-insurance.example/","source": "regional directory"},{"company": "Example Company","website": "https://example.com/","source": "CRM export"}],"crawlContactPages": true,"maxPagesPerSite": 3}
Enrich another Actor's dataset
Paste the source run's dataset ID into inputDatasetId, along with your apifyToken.
{"inputDatasetId": "YOUR_SOURCE_DATASET_ID","apifyToken": "YOUR_APIFY_API_TOKEN","crawlContactPages": true,"maxPagesPerSite": 3,"onlyWithContact": false}
Store the token as a secret in Actor input. Each source row must contain a website, url, or site value.
Input options
| Option | Type | Default | What it controls |
|---|---|---|---|
websites | array of strings | — | Website URLs to process directly. |
leads | array of objects | — | Lead rows containing a website, url, or site field. |
inputDatasetId | string | — | Dataset ID from another Actor run to enrich. |
apifyToken | secret string | — | Required only when using inputDatasetId. See Enrich another Actor's dataset above. |
crawlContactPages | boolean | true | Whether the run may check relevant public pages beyond the homepage. |
maxPagesPerSite | integer | 3 | Maximum pages checked per site, from 1 to 6. |
onlyWithContact | boolean | false | When true, omit results where no email or phone was found. |
maxSites | integer | 1000 | Maximum number of sites processed in the run. Use this as a cost cap. |
concurrency | integer | 5 | Number of sites processed in parallel, from 1 to 15. |
requestDelayMs | integer | 200 | Delay between requests in milliseconds, from 0 to 5000. |
You can provide websites, leads, or inputDatasetId. For audit-friendly results, leave onlyWithContact set to false so sites with no public contact details remain visible as contactFound: false.
Cost guidance
A verified one-site run on August 3, 2026 cost about $0.0035 in execution usage with maxPagesPerSite: 3 and crawlContactPages: true. As a rough execution-usage estimate, multiply the number of sites by $0.0035: 100 similar sites would be about $0.35 and 1,000 would be about $3.50.
This is an observed execution-cost example, not a fixed quote or the Actor's pay-per-event charge. Actual usage varies with the sites, pages checked, settings, and Apify platform pricing. Set maxSites and maxPagesPerSite to keep the scope predictable, and use the current pricing panel for the amount billed for a paid run.
Honest limitations
- It reads publicly reachable pages only.
- It cannot access anything behind a login.
- Sites that block automated access may return nothing.
- Sites that show contact details only through client-side scripts may return nothing.
contactFound: falseis a normal result, not necessarily an error.- Coverage varies by site because businesses publish different information in different ways.
- Email addresses are not verified, and the Actor does not enrich results from third-party contact databases.
- No contact detail or coverage level is guaranteed.
When not to use this
Do not use this Actor when you need data from logged-in pages, guaranteed coverage, verified deliverability, guessed email addresses, or contacts that are not publicly displayed. It is also a poor fit for a single known business when manually checking its website would be faster, or for sources that consistently block automated access or expose contact details only through scripts.
Use it when you already have website URLs and want a structured, honest record of the public contact details available for each site—including normal empty results.