Company Contact Enricher - Website to B2B Leads
Pricing
from $0.01 / 1,000 results
Company Contact Enricher - Website to B2B Leads
Transform company website URLs into enriched B2B contact data. Automatically scrapes team pages, detects email patterns, cross-references LinkedIn & identifies decision makers. - Website Scanning - Contact Extraction - Email Pattern Detection - LinkedIn Integration - Title Filtering - Webhooks
Pricing
from $0.01 / 1,000 results
Rating
1.0
(2)
Developer
The Howlers
Maintained by CommunityActor stats
4
Bookmarked
170
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
Features
Share
Transform company website URLs into enriched B2B contact data. Scrapes team pages, detects email patterns, cross-references LinkedIn profiles, and identifies decision makers.
No key needed for the website itself. Apollo, Hunter, Anthropic and Firecrawl keys are optional extra sources (BYOK).
How it finds contacts
- The company's own website (always, no key): the home page plus up to five likely contact pages (contact, about, team, staff, leadership, people). It reads
mailto:andtel:links, Cloudflare-protected emails, schema.org data (Organization, LocalBusiness, Person, founder, employee), team cards (name with the title next to it), image alt text and "founded by" sentences. Testimonials and reviews are skipped, so customers are never listed as staff. - Pages are fetched with a plain HTTP request first. Only a site that blocks it (Cloudflare and similar) or renders with JavaScript is opened in a stealth browser through your proxy setting, and the browser skips images, fonts, media and stylesheets.
- Optional sources merge in: Apollo, Hunter, AI extraction (Anthropic; it reads the pages already fetched, so Firecrawl is optional), GBP data, and BBB and State SOS when you give
companyCity/companyState. When the website names nobody, a Google search for the owner runs. - Every site also gets one company contact record: the general email, main phone and LinkedIn page published on the site, plus
allEmails,allPhonesandlinkedInProfiles.
People are kept when their title matches targetTitles (fuzzy: "CEO" matches "Chief Executive Officer"). Leave targetTitles empty to get everyone listed on the site.
Before You Start
This actor runs in Demo Mode by default, so a default free run returns sample data (free, no key needed) to show you the output format. Set demoMode to false to fetch real data.
Quick Start
Test with Demo Mode (free, no API key needed)
{"demoMode": true,"websiteUrls": ["https://apify.com"],"targetTitles": ["CEO","CTO","Founder","Owner","VP","Director"],"targetRoles": ["CEO","Owner","Founder","Marketing Director"]}
Run with real data
{"demoMode": false,"websiteUrls": ["https://apify.com"],"targetTitles": ["CEO","CTO","Founder","Owner","VP","Director"],"maxContactsPerSite": 10,"apolloApiKey": "YOUR_API_KEY_HERE","hunterApiKey": "YOUR_API_KEY_HERE","anthropicApiKey": "YOUR_API_KEY_HERE","firecrawlApiKey": "YOUR_API_KEY_HERE","enableHunterFallback": true,"enableBBB": true,"enableSocialLookup": false,"enableStateSOS": true,"decisionMakerMode": false,"targetRoles": ["CEO","Owner","Founder","Marketing Director"],"seniorityFilter": "any","lookupLinkedIn": false,"detectEmailPattern": true,"includePhoneNumbers": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Input Parameters
| Parameter | Type | Default | Required | Description |
|---|---|---|---|---|
demoMode | boolean | true | No | Return sample data for testing (no charges). Set to false for live data. |
websiteUrls | array | - | No | Company website URLs to enrich (e.g., https://example.com) |
targetTitles | array | ["CEO","CTO","Founder","Owner","President","Partner","VP","Director"] | No | Keep people whose title matches one of these (fuzzy). Empty = everyone the site lists. |
maxContactsPerSite | integer | 10 | No | Maximum contacts to return per company |
apolloApiKey | string | - | No | Your Apollo.io API key for B2B contact lookup |
hunterApiKey | string | - | No | Hunter.io API key for email finding (SMB fallback + email verification) |
anthropicApiKey | string | - | No | Anthropic API key for AI-powered contact extraction from the pages already fetched |
firecrawlApiKey | string | - | No | Firecrawl API key, used for AI extraction only when the site could not be read directly |
enableHunterFallback | boolean | true | No | Use Hunter.io domain search when Apollo has no results |
enableBBB | boolean | true | No | Search Better Business Bureau for owner/principal info |
enableSocialLookup | boolean | false | No | Cross-reference LinkedIn/Facebook business pages for owner info |
enableStateSOS | boolean | true | No | Search state Secretary of State business registrations for all 50 states. Uses 3-tier cascade: direct HTML scrapers for FL/NJ, Firecrawl+AI extraction for all states (with state-specific URLs + OpenCorporates fallback), and Google SERP for remaining coverage. Filters out corporate registered agents to find real business owners. |
companyCity | string | - | No | City for BBB lookup (e.g., Austin) |
companyState | string | - | No | State code for SOS/BBB lookup (e.g., TX, CA) |
gbpData | array | - | No | GBP data from google-maps-scraper (auto-populated in pipelines) |
socialProfiles | object | - | No | Social profiles for cross-reference (linkedin, facebook, instagram, twitter) |
decisionMakerMode | boolean | false | No | When enabled, prioritizes decision makers and filters out contacts without recognizable decision-making titles. Each contact gets a seniorityLevel and decisionMakerScore (0-100). Results are sorted by score descending (most senior first). |
targetRoles | array | [] | No | Only return contacts matching these roles (fuzzy match — 'CEO' matches 'Chief Executive Officer', 'Dir. of Marketing' matches 'Director'). Leave empty to return all roles. |
seniorityFilter | string | "any" | No | Only return contacts at or above this seniority level. C-Level includes CEO, CTO, CFO, President, etc. VP includes Vice President, SVP, EVP. Director includes Director, Head of. Manager includes Manager, Lead, Supervisor. 'Any' returns all contacts. |
lookupLinkedIn | boolean | false | No | Cross-reference contacts with LinkedIn (additional charge per lookup) |
detectEmailPattern | boolean | true | No | Generate emails using detected company pattern (first.last@domain.com) |
includePhoneNumbers | boolean | true | No | Include phone numbers when found |
webhookUrl | string | - | No | URL to send results when complete (Zapier, Make, n8n) |
proxyConfiguration | object | {"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]} | No | Proxy for the stealth browser, used only for sites that block a plain request |
Pricing
This actor uses pay-per-event billing:
| Event | When it is charged | Price |
|---|---|---|
| Actor start | Once when the run starts, one event per GB of memory (minimum one). At the default 4 GB of memory a run starts at $0.40 | $0.10 per GB |
| Website Scanned | Charged for each company website scanned for contact information | $0.05 |
| Contact Enriched | Charged for each contact found with email or LinkedIn profile | $0.02 |
| LinkedIn Lookup | Charged when calling LinkedIn Profile Scraper for additional data | $0.03 |
| Result | Each item written to the default dataset | $0.00001 |
Demo mode is free -- no charges for sample data.
Troubleshooting
"API key is required"
You have Demo Mode turned off but didn't provide an API key. Either:
- Turn Demo Mode on to test with sample data
- Add your API key in the input
"API error 403" or "Unauthorized"
Your API key is invalid, expired, or doesn't have access to this specific API endpoint. Double-check your key and account permissions.
"API error 429" or "Rate limit"
Too many requests. Wait a minute and try again, or reduce the number of items per run.
No results or empty dataset
Check the run log for error messages. Common causes:
- Invalid input format (check the examples above)
- API key without proper permissions
- The target data doesn't exist or is too small to track
How do I test without an API key?
Enable Demo Mode in the input. This returns realistic sample data so you can verify the output format works for your workflow.
Built by John Rippy | Actor Arsenal