LinkedIn Company URL - Mass Profile Finder: Executive Contacts
Pricing
from $2.99 / 1,000 results
LinkedIn Company URL - Mass Profile Finder: Executive Contacts
LinkedIn Company URL Mass Profile Finder — Find company profiles in bulk from LinkedIn URLs and extract executive names, job titles, company details, LinkedIn profiles, and publicly available contact data. Build targeted executive lead lists for B2B prospecting and research.
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
LinkedIn Company Finder — URLs, Executives and Emails
LinkedIn Company URL Mass Profile Finder: Executive Contacts turns a plain list of company names into their official LinkedIn company pages plus a short list of leadership contacts — name, title, and profile URL — discovered through public search, with a best-effort work-email guess attached to each one. It's built for sales development teams building account lists that need a real decision-maker attached, recruiters sourcing leadership contacts across a target-account list, and lead-generation teams who need company-to-executive mapping at volume rather than one profile at a time. No LinkedIn login is required — company and contact discovery both run through public search. Every section below documents an input, an output field, or exactly how a value (especially the email guess) is derived.
What is LinkedIn Company URL Mass Profile Finder: Executive Contacts?
This Actor is a superset of a plain company-URL finder: for every company you supply, it still resolves the official LinkedIn company page the same way the base Actor does, and adds two features on top — executive/decision-maker discovery via search-engine mining, and a best-effort work-email guess for each contact found.
Key capabilities, read from the source:
- Company page resolution —
_process_company()searches"{name} {querySuffix}"and keeps the highest-ranked genuinelinkedin.com/company/result viafind_company(); a login/feed LinkedIn link is deliberately not treated as a match. - Executive discovery via SERP mining —
_discover_contacts()issues onesite:linkedin.com/in/ "<company>" <title>search per title intitleAllowList, stopping oncemaxContactsPerCompanydistinct profiles are found. - Honest, low-coverage email guessing —
_resolve_email()first tries a SERP search for a real published address on the company's own domain (emailStatus: "serp_found"); failing that, it falls back to afirst.last@domainpattern guess (emailStatus: "pattern_guess"). When there's no resolvable company domain or no usable contact name,guess_email_patterns()returns an empty list and the email isnull— never a fabricated address. - Escalating proxy ladder —
ProxyManagerstarts DIRECT (no proxy), escalates to DATACENTER then RESIDENTIAL the moment a request is blocked or throttled, and sticks with the highest rung reached for the rest of the run. - Separate SERP proxy path for Google —
_google()specifically routessite:linkedin.com/in/and email-backfill queries through theGOOGLE_SERPproxy group (falling back to residential), since DuckDuckGo soft-blocks those queries but Google doesn't via this route. - 1-to-1 input alignment —
includeNotFound(default on) still emits a parent row for a company with no discoverable LinkedIn page, so your output count matches your input count even when a match fails.
What data can I extract with LinkedIn Company URL Mass Profile Finder: Executive Contacts?
Every field below is read directly from build_record(), _process_company(), and the child-row assembly in src/main.py — the dataset's default view surfaces all of them as table columns.
Company (parent) rows
| Field | Example Value | Use Case |
|---|---|---|
mySearch | Stripe | The company name as you supplied it |
queryId | 1 | Position in your input list |
linkedinUrl | https://www.linkedin.com/company/stripe/ | Resolved company page; null if not found |
info | Stripe | LinkedIn | Search result title for the matched page |
companyName | Stripe | Same as mySearch, present for clarity in the child-linked view |
companyDomain | stripe.com | Registrable domain resolved from the company page's own website field, when resolveEmails is on |
contactsFound | 4 | Executive contacts discovered for this company |
type / isChild | "company" / false | Row-type discriminator |
scrapedAt | 2026-07-26T09:00:00Z | UTC capture time |
Executive contact (child) rows
| Field | Example Value | Notes |
|---|---|---|
contactName | Jane Doe | Parsed from the SERP result |
contactTitle | Chief Financial Officer | Matched against your titleAllowList |
profileUrl | https://www.linkedin.com/in/janedoe/ | Public profile link |
email | jane.doe@stripe.com | null when no domain or name could be resolved |
emailStatus | "serp_found" or "pattern_guess" | Discloses exactly how the email was derived |
emailPattern | jane.doe | The local-part pattern used, when emailStatus is pattern_guess |
parentId | 1 | Links this contact back to its company's queryId |
companyDomain | stripe.com | Same domain the email guess was built from |
Why not build this yourself?
Neither company-page resolution nor executive discovery has a public API — LinkedIn's own APIs don't expose a "search by company name" or "list leadership" endpoint for arbitrary companies, and there is no public directory of corporate email addresses at all. Getting from a company name to a matched LinkedIn page and a list of real executive profile URLs means mining search-engine results reliably, which requires handling soft-blocks (DuckDuckGo and Google both return a 200 with no real results when they suspect automation, not a clean error) and routing certain query types through the right proxy pool — this Actor's _search()/_google() split exists specifically because DuckDuckGo and Google block differently for the two query types this Actor needs. Building and maintaining that yourself, plus getting the email-guessing honesty right (labeling a guess as a guess, never presenting it as verified), is most of the actual engineering work here.
How to use data extracted from LinkedIn Company URL Mass Profile Finder: Executive Contacts?
Sales development and outbound teams
Feed a target-account list into companies, set titleAllowList to the buyer personas you sell to (e.g. ["VP Sales", "Head of Revenue"]), and get back a contact list with profile URLs and a best-effort email per account — ready to load into a sequencing tool, with emailStatus telling you which addresses are worth a higher-confidence outreach attempt.
Recruiters and executive search
Search a list of target companies for CEO/Founder/CTO titles to quickly map out who leads each one before a targeted outreach campaign, without opening each company's LinkedIn page individually.
Lead-generation and data-enrichment pipelines
Because every contact row carries companyDomain alongside the guessed or found email, an agent or pipeline can cross-reference against a separate email-verification step before using pattern_guess addresses in an actual send.
Market mapping and competitive research
Run a list of competitors through with findDecisionMakers on and resolveEmails off for a fast, contact-focused leadership map without spending run time on the (much slower) email-resolution step.
🔼 Input sample
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
companies | Yes | array | Company names, LinkedIn company URLs, or slugs — one per line. | ["Stripe", "Notion", "Ramp"] |
findDecisionMakers | No | boolean | Mine public search for leadership contacts. Default true. | true |
titleAllowList | No | array | Titles to search for AND filter contacts by (case-insensitive). Default: a broad C-suite sweep. | ["CEO", "Founder", "VP Sales"] |
maxContactsPerCompany | No | integer (0–100) | Cap on contact rows per company; 0 = unlimited. Caps children only — the company still gets its parent row. Default 10. | 5 |
resolveEmails | No | boolean | Attach a best-effort email to each contact. Coverage is honestly low (~0–10%). Default true. | true |
region | No | string enum | Search region/language: us-en, uk-en, ca-en, au-en, in-en, wt-wt. Default us-en. | "uk-en" |
maxConcurrency | No | integer (1–100) | Companies processed in parallel. Default 10. | 20 |
querySuffix | No | string | Phrase appended to each company name for page resolution. Default "linkedin company". | "linkedin company" |
includeNotFound | No | boolean | Emit a parent row even for companies with no matched page. Default true. | true |
requestTimeout | No | integer (5–120) | Per-request timeout, seconds. Default 20. | 20 |
retryBackoff | No | integer (1–10) | Backoff multiplier between retries. Default 1. | 1 |
maxRetries | No | integer (1–12) | Retries on a blocked/throttled request before giving up. Default 6. | 6 |
proxyConfiguration | No | object | Proxy config; runs with no proxy by default, escalating automatically on a block. | {"useApifyProxy": false} |
{"companies": ["Stripe", "Notion", "Ramp"],"findDecisionMakers": true,"titleAllowList": ["CEO", "Founder", "CFO", "VP Sales"],"maxContactsPerCompany": 5,"resolveEmails": true}
Common pitfall: resolveEmails on doesn't mean every contact gets an email — guess_email_patterns() returns an empty list (and the email stays null) whenever the company's domain couldn't be resolved from its LinkedIn page, or the contact's name can't be split into a usable first/last pair. Coverage of ~0-10% real or plausible addresses is expected behavior, not a malfunction — check emailStatus on every contact row rather than assuming a non-null email means verified.
🔽 Output sample
Output is one JSON row per company, plus one additional row per executive contact — all pushed to the same default dataset, each charged as one row_result event.
{"mySearch": "Stripe","queryId": 1,"linkedinUrl": "https://www.linkedin.com/company/stripe/","info": "Stripe | LinkedIn","type": "company","isChild": false,"companyName": "Stripe","companyDomain": "stripe.com","contactsFound": 4,"scrapedAt": "2026-07-26T09:00:00Z"}
An executive contact child row:
{"type": "contact","isChild": true,"parentId": 1,"mySearch": "Stripe","companyName": "Stripe","linkedinUrl": "https://www.linkedin.com/company/stripe/","contactName": "Jane Doe","contactTitle": "Chief Financial Officer","profileUrl": "https://www.linkedin.com/in/janedoe/","email": "jane.doe@stripe.com","emailStatus": "pattern_guess","emailPattern": "jane.doe","companyDomain": "stripe.com","scrapedAt": "2026-07-26T09:00:00Z"}
How do you target specific executives and titles?
Title scope drives both search and filtering. titleAllowList is used twice: once to build each company's search queries (site:linkedin.com/in/ "<company>" <title>), and again as a case-insensitive filter on the results — a contact only survives if their name/headline actually contains one of your listed titles. Narrow the list to your exact buyer persona (["VP Sales", "Head of Revenue"]) rather than leaving the broad C-suite default if you only care about one function.
Contact volume vs. company coverage. maxContactsPerCompany caps only the child rows — every company in your input still gets its own parent row regardless of this setting, so a low cap is a good way to run a wide company list fast and expand contact depth only on the accounts that matter.
Email resolution is optional and slower. Turn resolveEmails off for a faster, contact-discovery-only run when you plan to verify or find emails through a separate tool anyway — it skips both the company-domain resolution fetch and the extra SERP query per contact.
Three real examples:
{ "companies": ["Stripe", "Notion", "Ramp"], "titleAllowList": ["CEO", "Founder"], "maxContactsPerCompany": 3 }
Fast founder/CEO-only sweep across a target-account list.
{ "companies": ["Acme Corp"], "titleAllowList": ["VP Sales", "Head of Revenue", "CRO"], "resolveEmails": true, "maxContactsPerCompany": 10 }
Deep single-company sales-leadership map with email guesses.
{ "companies": ["CompetitorA", "CompetitorB", "CompetitorC"], "findDecisionMakers": true, "resolveEmails": false }
Fast competitive leadership map without the slower email-resolution step.
▶️ Want to try other LinkedIn scrapers?
| Scraper | What it extracts |
|---|---|
| LinkedIn Jobs Scraper — Employer & Company Details | Job postings with employer profile data |
| LinkedIn Profile Contact Extractor | Contact details parsed from a profile |
| LinkedIn Comments and Reactions Scraper | Post comments, replies and reaction breakdown |
| LinkedIn Phone Region Targeter | Profiles filtered by phone-derived region |
How to extract company and executive data programmatically
This Actor runs as a standard Apify Actor call — one API call in, structured JSON dataset out, using your Apify API token.
Python example
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("<YOUR_USERNAME>/linkedin-company-url-mass-profile-finder-executive-contacts").call(run_input={"companies": ["Stripe", "Notion", "Ramp"],"titleAllowList": ["CEO", "Founder", "CFO"],"resolveEmails": True,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("isChild"):print(item["contactName"], item["contactTitle"], item["email"], item["emailStatus"])
Export to spreadsheets or CRM
Every dataset supports one-click CSV/Excel export from the Apify Console. Filter on isChild to separate company rows from contact rows before loading into a CRM's separate Account and Contact objects.
Is it legal to use LinkedIn Company URL Mass Profile Finder: Executive Contacts?
This Actor discovers company pages and contacts through public search-engine results, not by scraping LinkedIn directly, and requires no LinkedIn login. Executive names, titles, and inferred email addresses are personal data under GDPR/CCPA, so treat outreach and storage of this data accordingly — in particular, be transparent that pattern_guess emails are unverified guesses, not confirmed addresses, before using them in any outbound campaign. Consult legal counsel for commercial applications, especially around unsolicited email outreach regulations (CAN-SPAM, GDPR) in your target regions.
❓ FAQ
How accurate are the guessed email addresses?
Coverage is honestly low by design — roughly 0-10% of contacts get either a SERP-confirmed address (emailStatus: "serp_found") or a pattern guess (emailStatus: "pattern_guess"). LinkedIn exposes no on-platform email data at all, so every email here comes from either a public mention elsewhere or an inferred first.last@domain pattern — never fabricated, and always labeled with which kind it is.
What happens if a company has no LinkedIn page I can find?
With includeNotFound on (the default), that company still gets a parent row with linkedinUrl: null, so your output count matches your input count. Turn it off to only get rows for companies that were actually matched.
Does maxContactsPerCompany limit the company rows too?
No — it only caps executive-contact child rows. Every company in your input list still produces its own parent row regardless of how many (or how few) contacts were found.
Do I need a LinkedIn account or login to use this?
No — company and executive discovery both run through public search-engine results, not a LinkedIn login session.
Why does this need two different search engines internally?
DuckDuckGo and Google soft-block different query types — company-name searches go through DuckDuckGo, while site:linkedin.com/in/ executive-discovery queries and email-backfill searches route through Google via the GOOGLE_SERP proxy group, since that combination is more reliable for this specific query shape.
Can I search for a very specific title, like "Head of Growth Marketing"?
Yes — titleAllowList accepts any free-text title; it's used both to build the search query for that title and to filter which results are kept, so a specific title narrows the search itself, not just the output.
How does this compare to the base company-URL finder?
As observed on the Apify Store on 2026-07-26, the base LinkedIn Company URL Mass Profile Finder listings resolve only the company page itself — no executive discovery or email data. This Actor is a strict superset: every base field is preserved on the parent row, with executive-contact child rows and the honest email-status labeling added on top.
Does this work with AI agent frameworks?
Yes — call it as a standard HTTP endpoint via the Apify API from any agent framework capable of making an API call; there's no MCP-specific integration for this Actor.
Conclusion
LinkedIn Company URL Mass Profile Finder: Executive Contacts turns a company list into matched LinkedIn pages plus a real leadership contact list, with email data honestly labeled by how it was derived rather than presented as universally verified. It fits sales development, recruiting, and lead-generation workflows that need company-to-executive mapping at volume. Start a run from the Apify Console or the Apify API with your target companies to get your first executive-contact export.