Contact Details Scraper
Pricing
$1.50 / 1,000 websites
Contact Details Scraper
Extract public emails, phones, social profiles, addresses, contact forms, and organization or person data from one or many websites. Fast HTTP crawling, same-site limits, robots.txt support, optional proxy, and no charges for empty or failed sites.
Pricing
$1.50 / 1,000 websites
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Extract public contact information from one website or a list of websites. The Actor follows a small set of high-value, same-site pages and returns one consolidated record per site.
The default crawler uses fast HTTP requests rather than a browser. It is designed for predictable cost at a planned pay-per-result price of $0.0015 per successful site, below the current $0.002 competitor baseline. Empty, blocked, invalid, robots-disallowed, and no-contact sites produce an uncharged diagnostic row.
What it extracts
- Public email addresses, including
mailto:links and common[at]/[dot]obfuscation - Phone numbers from
tel:links and visible page text, with optional country normalization - LinkedIn, Facebook, Instagram, X, YouTube, TikTok, Pinterest, GitHub, Threads, and Bluesky links
- Visible and JSON-LD postal addresses
- Contact forms with action, method, field names, and field types
- JSON-LD Organization, LocalBusiness, and Person data
- Website title and meta description
- Every source page for every extracted value
- Per-page crawl metadata and clear error diagnostics
The crawler prioritizes the home, contact, about, team, company, legal, privacy, terms, and impressum pages. It also discovers equivalent pages from link text and paths.
Input
| Field | Type | Default | Description |
|---|---|---|---|
websites | string array | Apify website in UI | Domains or full URLs. Values without a scheme use HTTPS. |
startUrls | request-list sources | empty | Alternative Apify-compatible URL input. Can be combined with websites. |
maxPagesPerSite | integer | 6 | Maximum page attempts per site, from 1 to 20. |
maxConcurrency | integer | 5 | Websites processed in parallel, from 1 to 20. |
requestTimeoutSecs | integer | 12 | Timeout for each HTTP request. |
maxResponseSizeKb | integer | 1536 | Maximum downloaded HTML size per page. |
respectRobotsTxt | boolean | true | Skip pages disallowed for the Actor user agent. |
defaultCountry | string | empty | Optional two-letter country code for local phone numbers, such as US, GB, or CA. |
proxyConfiguration | proxy | off | Optional Apify or custom proxy. Direct HTTP is the profitable default. |
Example:
{"websites": ["apify.com","https://www.example.org"],"maxPagesPerSite": 6,"respectRobotsTxt": true,"proxyConfiguration": {"useApifyProxy": false}}
startUrls also accepts objects:
{"startUrls": [{ "url": "https://www.apify.com" },{ "url": "https://example.org/contact" }]}
Output
One successful row is stored for each site with useful public contact data:
{"ok": true,"siteUrl": "https://example.org/","requestedUrl": "https://example.org/","domain": "example.org","title": "Example Organization","description": "Example website description.","emails": [{"email": "hello@example.org","sourcePages": ["https://example.org/contact"]}],"phones": [{"phone": "+1 202 555 0100","e164": "+12025550100","country": "US","sourcePages": ["https://example.org/contact"]}],"socialLinks": [{"platform": "linkedin","url": "https://www.linkedin.com/company/example","sourcePages": ["https://example.org/about"]}],"addresses": [],"contactForms": [],"jsonLdOrganizations": [],"jsonLdPeople": [],"sourcePages": ["https://example.org/contact","https://example.org/about"],"crawledPages": [{"url": "https://example.org/","status": 200,"title": "Example Organization","contactsFound": 3}],"pagesCrawled": 4,"pagesAttempted": 6,"emailCount": 1,"phoneCount": 1,"socialLinkCount": 1,"addressCount": 0,"contactFormCount": 0,"robotsTxtRespected": true,"pageErrors": []}
Values contain their own sourcePages, which makes the result easier to verify than a flat list of contacts.
Billing and diagnostics
The code emits the pay-per-event event site once, and only after a real successful row has been stored. The intended future event price is $0.0015 per site.
These rows are never charged:
_sample: true: empty input preview used by Apify automated testsBAD_INPUTorUNSAFE_URL: invalid or blocked targetNO_CONTACTS: pages loaded, but no useful public contact signal was foundROBOTS_DENIED: relevant pages were excluded by robots.txtBLOCKED,RATE_LIMITED,TIMEOUT,NETWORK, or other request errors
Each requested site is isolated. One blocked or invalid site does not fail the rest of the run, and expected per-site failures exit successfully with diagnostic data.
Security
The Actor is designed for user-supplied URLs:
- Only
http://andhttps://are accepted. - URL credentials are rejected.
- Localhost and local network hostnames are rejected.
- Loopback, private, link-local, carrier-grade NAT, multicast, documentation, benchmark, unspecified, and reserved IP ranges are rejected.
- Every hostname and every redirect is resolved and validated.
- Direct requests use a DNS lookup guard at connection time.
- Redirects are manual, revalidated, and limited to the requested site.
- Crawling is limited by site, page count, timeout, and response body size.
- Binary and common document URLs are not crawled.
When a proxy is enabled, the destination is still resolved and validated before the proxy request. Direct mode provides the strongest DNS pinning and is the recommended default.
Robots.txt
respectRobotsTxt is enabled by default. The Actor fetches each site's robots.txt and checks every candidate URL against its own user agent. If robots.txt is unavailable, normal public-page crawling continues. Set the option to false only when you have permission and a specific reason.
Proxies and profitability
Most public company sites do not need residential proxies, so proxy use is off by default. This keeps the planned $0.0015/site price profitable:
- 512 MiB default memory
- no browser startup
- bounded HTTP responses
- six page attempts by default
- site-level concurrency
- successful-result-only billing
Enable a datacenter or residential proxy only for sites that block direct cloud requests. Residential proxy bandwidth can cost more than the result price on heavy pages, so it should not be the default for this Actor.
JavaScript-heavy websites
This version intentionally does not launch a browser. Browser rendering would make the planned $0.0015/site price unreliable when several pages need JavaScript and residential bandwidth. Many modern sites still expose contact details in server-rendered HTML, metadata, JSON-LD, or footer links, which this Actor extracts.
For a fully client-rendered site, use its public contact page as the start URL or enable a proxy if the issue is IP blocking rather than rendering. A browser fallback should only be added with a separate higher-priced event after measured cloud cost proves it remains profitable.
Run locally
Requires Node.js 20 or newer:
npm cinpm testnpm start
For local Actor input, place INPUT.json in the default Apify key-value store or run with the Apify CLI. Results are written to the default dataset.
Responsible use
Extract only public business contact information you are allowed to collect and process. Follow website terms, robots rules, privacy law, anti-spam law, and data retention requirements applicable to your use case. The Actor does not bypass logins or access controls.