Decision-Maker Contacts - Founders, CEOs, Execs from Sites
Pricing
from $4.80 / 1,000 decision-maker contacts
Decision-Maker Contacts - Founders, CEOs, Execs from Sites
Find founders, CEOs and department heads on company websites: names, titles, seniority, public profile links and emails from team, about and imprint pages. Pattern-guessed emails are clearly flagged. No LinkedIn scraping. Pay per contact.
Pricing
from $4.80 / 1,000 decision-maker contacts
Rating
0.0
(0)
Developer
Andrew Boiko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
Decision-Maker Contacts - Founders, CEOs and Executives from Company Websites
Paste a list of company websites and get the founders, owners, C-level executives, VPs, heads and directors that each company publishes on its own site: name, job title, seniority, department, public profile links, and an email address (found on the page, or a clearly flagged pattern-based guess). One row per person.
Only the company's own public pages are read (team, about, leadership, management, contact and imprint/Impressum pages). No LinkedIn pages are visited, scraped or logged into. If a company links to a person's LinkedIn profile on its own site, that link is returned as a profile URL.
Who is it for
- Sales and outbound teams that need a named person to contact at a target company.
- Recruiters and investors mapping leadership teams.
- Agencies and freelancers building prospect lists from a list of domains.
- Analysts who want a structured view of who runs which company.
What you get
| Field | Meaning |
|---|---|
personName, firstName, lastName | Name as published on the page |
title | Job title as published (any language) |
seniority | founder, owner, c-level, president, board, partner, vp, head, director, manager, staff |
department | executive, technology, marketing, sales, finance, operations, hr, legal, product, design, support, other |
email | An address published on the site and matched to this person (profile card, structured data, or the name appears in the address) |
emailGuess, emailIsGuess, emailSource, emailBasis | A guess built from the company's observed address pattern. Always flagged: emailIsGuess: true, emailSource: "pattern-guess", with the evidence in emailBasis. Never presented as a verified mailbox |
emailStatus | verified_mx (domain can receive mail), unverified (domain has no mail server), none |
companyEmails | Generic company addresses seen on the site (info@, sales@ ...) |
linkedinUrl, profileLinks | Personal LinkedIn/Xing/X/GitHub profile links that the site itself shows next to the person |
sourceUrl, sourceType | The page and extraction method (jsonld, microdata, card, line, imprint) |
confidence | 5-97 heuristic score (structured data scores highest; see below) |
Input
| Field | Type | Default | Description |
|---|---|---|---|
domains | array | required | Domains or any URL on the company site. Up to 2000. |
roles | array | founder, ceo, cto, cfo, coo, cmo, owner, president, vp, head of, director, partner, managing | Keep only people whose title contains one of these words. Understands abbreviations and translations (ceo = chief executive officer = Geschäftsführer). |
maxPeoplePerDomain | integer | 10 | 1-100. Most senior people first. |
findEmails | boolean | true | Match published emails to people and guess the rest from the learned pattern. |
includeFailed | boolean | false | Add free rowType: "status" rows for domains that were unreachable, blocked or empty. |
Role keywords are matched as whole words, so president also matches "Vice President". Use vp or head of for narrower lists.
Output example
{"rowType": "contact","id": "acme.com|jane-doe","domain": "acme.com","companyName": "Acme Corp","personName": "Jane Doe","firstName": "Jane","lastName": "Doe","title": "Chief Executive Officer","seniority": "c-level","department": "executive","email": "jane.doe@acme.com","emailGuess": null,"emailIsGuess": false,"emailSource": "page","emailStatus": "verified_mx","emailBasis": null,"companyEmails": ["info@acme.com"],"linkedinUrl": "https://www.linkedin.com/in/janedoe/","profileLinks": ["https://www.linkedin.com/in/janedoe/"],"sourceUrl": "https://acme.com/team","sourceType": "card","confidence": 87,"source": "Company website (public pages)","scrapedAt": "2026-10-14T09:30:00.000Z"}
Each run also writes OUTPUT (per-domain status, counts, skipped reasons, charged events, stoppedReason) and RESULTS_MD to the key-value store.
Pricing
Pay only for results (pay per event). No monthly rental.
| Event | Price | When |
|---|---|---|
contact | $0.006 | One person with a name and a job title found on the company's own site, after your role filter. |
1,000 contacts cost $6. Apify adds volume discounts on paid plan tiers (Bronze, Silver, Gold), and free-plan users can try it with the free monthly credit. You are never charged for unreachable or blocked domains, domains with no matching people, duplicates, failed rows, or anything beyond the maximum cost per run you set.
How it works
- For each domain the actor reads the homepage, then up to 5 more pages chosen by link text and path (team, our-team, leadership, management, people, founders, about, company, who we are, imprint/Impressum, contact, plus translations) and hints from
/sitemap.xml. If the navigation gives little, common paths such as/teamand/aboutare tried. - People are extracted from JSON-LD (
Person,founder,employee), schema.org microdata, repeated team-card layouts (name next to a title), "Name, Title" lines and imprint lines such as "Geschäftsführer: ..." (German, English, French, Spanish, Italian and Ukrainian basics). - False positives are filtered hard: navigation labels, product names and sentences are rejected; a person needs a plausible name (two to four capitalised words) and a recognisable job title.
- Titles are classified into seniority and department and matched against your role keywords.
- Emails on the pages are matched to people. If the address format of the company can be learned (for example
first.last@), other people get a flagged guess. Domains are MX-checked. - Progress is saved so a restarted run never charges or outputs the same person twice.
Limits and honest caveats
- Only what the company publishes. Small companies often list nobody; many sites build team pages with JavaScript that a plain page fetch cannot see. Such domains return no rows and are not charged.
- Names and titles come from page text and can be outdated.
confidenceis a heuristic, not a probability. - Emails: found addresses are published ones; guesses are guesses. A pattern guess has not been checked against the mail server, and we do not probe mailboxes (no SMTP).
verified_mxonly says that the domain can receive mail. - Latin and Cyrillic names are supported. Names in Chinese, Japanese, Arabic and other scripts are not extracted yet.
- Titles are understood in English, German, French, Spanish, Italian and Ukrainian basics; other languages may be missed.
- No LinkedIn, Xing or social network scraping, no data from paid databases.
Legal and ethical notes
- Only public pages are read, politely: robots.txt is respected, one request at a time per site with a pause, small page limits, honest user agent.
- Names, titles and business emails of identifiable people are personal data under GDPR and similar laws, even when public. You are responsible for a lawful basis (for example legitimate interest with a clear opt-out), purpose limitation, data minimisation and honouring removal requests. Follow anti-spam rules (CAN-SPAM, GDPR/PECR, CASL) when you write to people.
- Do not use guessed addresses for bulk mailing without verification. Bounces damage your sender reputation.
- Respect the terms of the websites you process.
FAQ
Does it scrape LinkedIn? No. It never requests LinkedIn. A LinkedIn URL appears only when the company's own page links to it.
Why did a domain return nothing? The site may list no people, hide them behind JavaScript, require a login, or block robots. Check OUTPUT.domains or enable includeFailed.
Are emails verified? Found emails are published ones and are MX-checked at domain level. Guesses are flagged with emailIsGuess and are not verified mailboxes.
Can I search by role only (no domains)? No. Provide company domains; the actor is not a people search engine.
Which titles are included by default? Founder, CEO, CTO, CFO, COO, CMO, owner, president, VP, head of, director, partner, managing and equivalents such as Geschäftsführer or Gérant. Change roles to include engineers, managers or any other keyword.
Why do I see the same person only once? People are de-duplicated per domain by name; the most reliable source (structured data, then team cards, then lines, then imprint) provides the title.
How are costs controlled? Set a maximum cost per run in Apify. The actor stops softly when it is reached and records stoppedReason: "budget".
Use it via API
Replace YOUR_USERNAME; the actor ID is YOUR_USERNAME~decision-maker-contacts.
curl -X POST "https://api.apify.com/v2/acts/YOUR_USERNAME~decision-maker-contacts/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"domains":["acme.com","example.org"],"roles":["ceo","founder","head of marketing"],"maxPeoplePerDomain":5}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('YOUR_USERNAME/decision-maker-contacts').call({domains: ['acme.com', 'https://www.example.org/about'],maxPeoplePerDomain: 5,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.filter((p) => p.email));
from apify_client import ApifyClientclient = ApifyClient("APIFY_TOKEN")run = client.actor("YOUR_USERNAME/decision-maker-contacts").call(run_input={"domains": ["acme.com", "example.org"],"roles": ["founder", "ceo"],})for p in client.dataset(run["defaultDatasetId"]).iterate_items():print(p["personName"], p["title"], p["email"] or p["emailGuess"])
Integrations
Works with Make, n8n, Zapier, Google Sheets, Airtable, Slack and webhooks via the standard Apify integrations. A common flow: a company list in a sheet -> run this actor -> keep rows with emailStatus = verified_mx and emailIsGuess = false -> push to your CRM. Exports: JSON, CSV, Excel, XML.
Support
If a site layout is not recognised, open an issue on the actor page with the domain and the people you expected to see.
More tools by the same author
- Website Contact Extractor: Emails, phones and social links from any list of websites
- B2B Email Verifier: Verify business emails and guess address patterns
- Domain to Company Enrichment: Turn domains into company profiles
- Hiring Signals Monitor: Track which companies are hiring: new jobs and hiring surges