Company Contact Enricher - Website to B2B Leads avatar

Company Contact Enricher - Website to B2B Leads

Pricing

from $0.01 / 1,000 results

Go to Apify Store
Company Contact Enricher - Website to B2B Leads

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

The Howlers

Maintained by Community

Actor stats

4

Bookmarked

170

Total users

1

Monthly active users

7 hours ago

Last modified

Features

Limited permissions

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

  1. 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: and tel: 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.
  2. 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.
  3. 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.
  4. Every site also gets one company contact record: the general email, main phone and LinkedIn page published on the site, plus allEmails, allPhones and linkedInProfiles.

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

ParameterTypeDefaultRequiredDescription
demoModebooleantrueNoReturn sample data for testing (no charges). Set to false for live data.
websiteUrlsarray-NoCompany website URLs to enrich (e.g., https://example.com)
targetTitlesarray["CEO","CTO","Founder","Owner","President","Partner","VP","Director"]NoKeep people whose title matches one of these (fuzzy). Empty = everyone the site lists.
maxContactsPerSiteinteger10NoMaximum contacts to return per company
apolloApiKeystring-NoYour Apollo.io API key for B2B contact lookup
hunterApiKeystring-NoHunter.io API key for email finding (SMB fallback + email verification)
anthropicApiKeystring-NoAnthropic API key for AI-powered contact extraction from the pages already fetched
firecrawlApiKeystring-NoFirecrawl API key, used for AI extraction only when the site could not be read directly
enableHunterFallbackbooleantrueNoUse Hunter.io domain search when Apollo has no results
enableBBBbooleantrueNoSearch Better Business Bureau for owner/principal info
enableSocialLookupbooleanfalseNoCross-reference LinkedIn/Facebook business pages for owner info
enableStateSOSbooleantrueNoSearch 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.
companyCitystring-NoCity for BBB lookup (e.g., Austin)
companyStatestring-NoState code for SOS/BBB lookup (e.g., TX, CA)
gbpDataarray-NoGBP data from google-maps-scraper (auto-populated in pipelines)
socialProfilesobject-NoSocial profiles for cross-reference (linkedin, facebook, instagram, twitter)
decisionMakerModebooleanfalseNoWhen 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).
targetRolesarray[]NoOnly return contacts matching these roles (fuzzy match — 'CEO' matches 'Chief Executive Officer', 'Dir. of Marketing' matches 'Director'). Leave empty to return all roles.
seniorityFilterstring"any"NoOnly 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.
lookupLinkedInbooleanfalseNoCross-reference contacts with LinkedIn (additional charge per lookup)
detectEmailPatternbooleantrueNoGenerate emails using detected company pattern (first.last@domain.com)
includePhoneNumbersbooleantrueNoInclude phone numbers when found
webhookUrlstring-NoURL to send results when complete (Zapier, Make, n8n)
proxyConfigurationobject{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}NoProxy for the stealth browser, used only for sites that block a plain request

Pricing

This actor uses pay-per-event billing:

EventWhen it is chargedPrice
Actor startOnce 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 ScannedCharged for each company website scanned for contact information$0.05
Contact EnrichedCharged for each contact found with email or LinkedIn profile$0.02
LinkedIn LookupCharged when calling LinkedIn Profile Scraper for additional data$0.03
ResultEach 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