Website Email & Phone Scraper with Branch Matching
Pricing
$5.00 / 1,000 website analyzeds
Website Email & Phone Scraper with Branch Matching
Extract public business emails and phone numbers from websites. Match contacts to the right branch by city and address, distinguish company-wide numbers, and get source URLs with confidence and crawl coverage. Export to JSON, CSV or Excel for lead enrichment and workflows.
Pricing
$5.00 / 1,000 website analyzeds
Rating
0.0
(0)
Developer
Eduard Kalyta
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Extract published business emails and phone numbers from company websites, then identify which contacts belong to the location you need. Every contact includes a source URL and is classified as branch, company-wide, or unknown.
What you get
- Emails and phone numbers from public HTTPS pages, contact links, and structured business data.
- Branch matching using a city and optional street, postal code, country, or known location page.
- Source evidence and confidence for each contact, plus explicit crawl errors and coverage limits.
- One Dataset row per unique target, ready to export as JSON, CSV, or Excel and use through the Apify API, Make, or n8n.
Useful for enriching business directories, preparing location-specific contact lists, and separating a local branch from a company's main number. No external AI key or proxy subscription is required by the code.
Input example
{"targets": [{"id": "my-business-1","url": "https://company.example/","city": "London","street": "10 High Street","locationUrl": "https://company.example/locations/london"}],"maxPagesPerSite": 12,"maxTargets": 20}
Replace the example domain with the business website you want to analyze. Only url is required. Omit city to discover general company contacts. A known locationUrl must use the same website host; www redirects are supported.
Understanding your results
Each row includes id, url, target, status, branchMatch, contacts, coverage, and sourcePages. Contact entries contain type, value, scope, confidence, and source evidence. The SUMMARY record reports successful sites, failures, branch matches, duplicates, charges, and budget stops.
- COMPLETE: the selected crawl queue completed.
- PARTIAL: the crawl hit a cap, stopped early, or encountered a page error. Inspect coverage.
- FAILED: no page was successfully fetched.
- branchMatch is true only when at least one contact meets the branch matching rules. A fetched site without a branch match can still return useful company contacts.
How branch matching works
The crawler prioritizes contact and location pages. It extracts mailto and tel links, visible emails and international phone numbers, and Schema.org business data. A branch claim requires a matching structured address with an attached contact, or a city-matching location page or heading with a contact not repeated elsewhere. Repeated footer contacts are classified as company-wide; weak evidence stays unknown.
Limits
Up to 100 targets and 25 pages per site can be configured; defaults are 20 targets and 12 pages. The crawler checks a 90-second site deadline between requests. It supports public HTTPS pages, validates and pins DNS addresses, and rejects private networks, credentials, nonstandard ports, oversized pages, and unrelated-host redirects.
JavaScript-only locators, PDFs, images, separate location domains, and bot-protected pages may not work. The Actor does not verify email deliverability or whether a phone answers. Results are published contact information, not verified leads. Respect website restrictions and applicable data-use rules.
Billing
When pay-per-event pricing is enabled, the site-analyzed event is charged once per unique target with at least one successfully fetched page. Failed targets are not charged this event. A branch match is not guaranteed. Check the Store pricing panel for the current rate. Without pay-per-event pricing, successful results are still saved without event charges.
Local development
Requires Node.js 22+. Install with npm ci, put input in storage/key_value_stores/default/INPUT.json, and run npm start. Run npm test for deterministic extraction, matching, network-safety, and billing tests.