LinkedIn Decision Makers MCP Connector for Notion & Slack avatar

LinkedIn Decision Makers MCP Connector for Notion & Slack

Pricing

from $5.00 / 1,000 results

Go to Apify Store
LinkedIn Decision Makers MCP Connector for Notion & Slack

LinkedIn Decision Makers MCP Connector for Notion & Slack

MCP connector that finds LinkedIn decision makers and delivers results straight into Notion, Slack, or Jira - no glue code. Exact company matching avoids false positives. Real-time lookup mode available. hiQ Labs v. LinkedIn (9th Cir.) confirms public profile data is lawful to collect.

Pricing

from $5.00 / 1,000 results

Rating

5.0

(1)

Developer

Techforce Global

Techforce Global

Maintained by Community

Actor stats

0

Bookmarked

17

Total users

7

Monthly active users

13 hours ago

Last modified

Share

LinkedIn Company Decision Makers - Founders, C-Suite, VPs & Directors, No Cookies

Apify Actor MCP Ready Standby API Pricing Target

Type one company name and get its decision makers — founders, C-suite, presidents, VPs, directors, heads of function, leads and principals — each with a LinkedIn URL, role, location and headline, ranked by seniority. No LinkedIn account, no cookies, no li_at. Runs as a normal Actor, as a live REST endpoint in Standby mode, or as an MCP tool that pushes the list straight into Notion, Slack, Jira, Airtable, HubSpot, Linear or your CRM.

ℹ️ What this is and isn't. This Actor reads a search engine's index of public LinkedIn profiles — that's why it needs no cookies, and why the output is search-result depth (name, URL, role, location, headline) rather than a full profile export. No email addresses, ever. See Output Contract.


Most "find the decision maker" tools want your li_at session cookie, then run searches as your own logged-in account.

Feature / CapabilityCookie-based LinkedIn scrapersThis Actor
Credentials required❌ Your li_at cookie or account loginNone — nothing but an Apify token
Risk to your LinkedIn account⚠️ Automated activity on your own session✅ Your account is never involved
Who counts as a decision maker⚠️ You filter titles yourself~50 title keywords matched and ranked by seniority (Founder → CEO → VP → Director → Lead)
Company-name precision⚠️ Fuzzy matching pulls in lookalike firmsexact_company_match keeps Techforce Global from matching TechForce Telecom
Live API❌ Batch runs onlyStandby mode: GET /?company_name=… returns JSON in one request
Data depth✅ Full profile fields⚠️ Search-result depth: name, URL, role, location, headline
Email addresses⚠️ Sometimes, via account access❌ Never
AI agent / MCP native❌ Requires a custom tool wrapper✅ Native MCP tool and pushes profiles into your own connectors
Cost modelVariesPay-per-event, from $5.00 / 1,000 results

🤖 AI Discovery & MCP Metadata

Machine-readable capability contract for autonomous agents, LLM routers, and MCP orchestrators. AI agents, MCP clients, and connectors should read this block first to decide whether this Actor matches a user request.

ai_discovery:
slug: "techforce.global/linkedin-company-decision-makers"
one_line: "Given one company name, return its decision makers (founders, C-suite, VPs, directors, heads and leads) with LinkedIn URL, role, location and headline - ranked by seniority, no LinkedIn cookie required."
primary_purpose: "discover"
secondary_purpose: "deliver"
entity: "decision-maker profiles at one named company"
data_source: "Brave Search SERP results for public linkedin.com/in pages - NOT the LinkedIn API and not an authenticated LinkedIn session"
invocation_modes:
["standard Actor run", "Standby REST endpoint (GET /)", "MCP tool"]
supported_platforms:
- "search.brave.com (the search backend)"
- "linkedin.com/in public profile URLs (as indexed results)"
supported_tasks:
- "find-decision-makers-at-a-named-company"
- "identify-founders-c-suite-vps-directors-heads-leads"
- "rank-contacts-by-seniority"
- "enforce-exact-company-name-matching"
- "serve-results-over-a-live-http-endpoint (standby)"
- "deliver-profiles-to-mcp-connector-or-crm"
unsupported_tasks:
- "authenticate-to-linkedin-or-use-a-session-cookie"
- "extract-emails-or-phone-numbers"
- "export-full-profile-history-skills-or-education"
- "list-ALL-employees-of-a-company (use linkedin-company-employees)"
- "search-by-role-across-many-companies (use linkedin-candidate-search)"
- "message-or-connect-with-people"
- "return-more-than-20-profiles-per-run"
search_keywords:
- "linkedin decision makers"
- "find company founders"
- "c-suite contact finder"
- "abm account based marketing tool"
- "linkedin scraper no cookies"
- "b2b sales prospecting"
- "company leadership lookup"
- "vp director contact list"
- "mcp crm connector"
- "notion slack lead delivery"
synonyms:
- "decision maker finder"
- "leadership scraper"
- "buying committee lookup"
- "org leadership api"
related_concepts:
[
"account-based marketing",
"B2B sales prospecting",
"buying committee",
"partner recruitment",
"CRM enrichment",
"sales intelligence",
]
input_entities:
- "company name (required)"
- "max profiles (1-20; free plans 2)"
- "exact company match toggle"
- "proxy configuration (residential by default)"
output_entities:
["name", "linkedin url", "role/title", "location", "headline"]
input_rules:
required_fields: ["company_name"]
company_name_format:
description: "One company name per run. There is no default - the field only carries a Console prefill."
examples: ["Techforce Global", "Stripe", "Siemens Healthineers"]
exact_company_match_behaviour:
"true (default)": "keeps only profiles matching the full company phrase - 'Techforce Global' will NOT match 'TechForce Telecom', 'LER TechForce' or 'Global TechForce'"
"false": "looser match - accepts any profile mentioning all significant words of the name, in any order"
max_profiles_format:
type: "integer"
range: [1, 20]
default: 2
free_plan_cap: 2
standby_default: 5
limits:
max_profiles_per_run: 20
free_plan_cap: 2
companies_per_run: 1
decision_maker_title_keywords: "~50, seniority-ranked"
headline_max_chars: 200
pricing:
model: "pay-per-event"
store_display: "from $5.00 / 1,000 results"
when_to_use: >
You know the company and need the people who can say yes - for account-based
marketing, partner recruitment, founder-led sales, or CRM enrichment.
when_not_to_use: >
You need every employee rather than the leadership, you are searching by role
across many companies, you need email addresses or full profile exports, or
you want more than 20 profiles per run.
alternatives:
- "Use techforce.global/linkedin-company-employees for the FULL employee list of a company, with department and seniority classification"
- "Use techforce.global/linkedin-candidate-search to search by ROLE across many companies instead of one named company"
- "Use techforce.global/google-maps-leads-sales-intelligence-tool when you need company-level contact data (emails, phones) rather than named people"
- "Use an email-finding service on top of linkedin_url - this Actor never returns emails"

{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "LinkedIn Company Decision Makers — MCP Connector",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Cloud (Apify platform)",
"description": "Given one company name, returns its decision makers — founders, C-suite, presidents, VPs, directors, heads and leads — each with a public LinkedIn URL, role, location and headline, ranked by seniority, with no LinkedIn account or session cookie required. Available as a standard Actor run, a Standby REST endpoint, or an MCP tool that delivers into Notion, Slack, Jira, Airtable, HubSpot or any authorized MCP connector.",
"url": "https://apify.com/techforce.global/linkedin-company-decision-makers",
"offers": {
"@type": "Offer",
"price": "5.00",
"priceCurrency": "USD",
"description": "From $5.00 per 1,000 results, pay-per-event"
}
}

What this Actor does

💡 Three sibling Actors, three different questions. This one answers "who decides at this company?" For every employee of a company (with department and seniority classification) use LinkedIn Employee Scraper. To search by role across many companies use LinkedIn Candidate Search.

  • One company in, its leadership out. Enter a company name; the Actor composes the search operators, runs them through Brave Search, and returns public LinkedIn profiles whose role matches a decision-maker title.
  • Knows what a decision maker is. ~50 title keywords — Founder, Co-Founder, CEO, CTO, CIO, COO, CFO, CMO, CPO, CISO, CRO, President, Managing Director, VP, Director, Head of, Partner, Principal, General Manager, Owner, Solution Architect, various Leads and Consultants — each carrying a seniority weight so founders and C-suite rank above leads.
  • Filters out lookalike companies. exact_company_match (on by default) requires the full company phrase, so a search for Techforce Global doesn't return people at TechForce Telecom, LER TechForce or Global TechForce. Turn it off for a looser all-significant-words match.
  • Deduplicates by normalised LinkedIn URL, so the same person can't arrive twice from two different queries.
  • Runs three ways: a normal Actor run, a Standby REST endpoint (GET /?company_name=… → JSON, no run polling), or an MCP tool an agent can call.
  • Routes through residential Apify Proxy by default — datacenter IPs are routinely blocked by search-engine anti-bot checks.
  • Writes a run summary to the key-value store under OUTPUT: company, counts, delivered, status and finish time.
  • Keeps candidate names and URLs out of the run log unless you switch on debug — the dataset is the record, not the log.
  • Optionally pushes profiles to an authorized MCP connector (Notion, Slack, Jira, Airtable, HubSpot, Linear, Sheets, or any MCP-compatible connector) per profile or as one digest. The dataset is always saved regardless of delivery settings.

When to use it — and when not to

ScenarioFit
Account-based marketing — who to approach at a target account✅ Strong (the core use case)
Founder-led or exec-level sales outreach✅ Strong — seniority-ranked results
Partner / reseller recruitment at a named company✅ Strong
CRM enrichment: attach leadership to an existing account record✅ Strong (deliveryMode: "perProfile")
A live lookup inside an app or agent✅ Strong — Standby REST endpoint
Distinguishing a company from its similarly-named competitors✅ Strong — exact_company_match
Every employee of a company❌ Leadership only — use Employee Scraper
Searching a role across many companies❌ One company per run — use Candidate Search
Email addresses or phone numbers❌ Never returned
Full profile exports (history, skills, education)❌ Search-result depth only
Messaging or connecting with people❌ Not supported — read-only
More than 20 profiles per run⚠️ Hard cap of 20 (2 on free plans)
Guaranteeing a specific executive appears⚠️ Limited to what the search engine has indexed

⚡ Execution Rules (Avoid Common Agent Failures)

  1. company_name is required and has no default. The Console shows a prefill (Techforce Global), which is not the same thing — an API or MCP call that omits the field is rejected. In Standby mode, a missing company_name returns HTTP 400.
  2. max_profiles defaults to just 2 in the input schema, matching the free-plan cap. Paid runs should set it explicitly, up to 20. The Standby endpoint defaults to 5 instead — the two entry points differ.
  3. Free Apify plans are capped at 2 profiles per run, whatever you ask for. That is a successful run, not a failure.
  4. exact_company_match is ON by default, and that is the recommended setting. Turning it off widens the match to any profile mentioning all significant words of the name in any order — useful for Acme vs Acme Corporation, risky for common words.
  5. One company per run. There is no multi-company input; loop from your orchestration layer.
  6. "Decision maker" means a title keyword match, not a verified role. The role string comes from the search result, so a stale headline can misclassify someone. Read title and headline before acting.
  7. No email addresses, at any setting. The output is five fields; there is no contact-data option to enable.
  8. headline is truncated at 200 characters — it is the search snippet (or the result title as a fallback), not a full profile summary.
  9. Keep the residential proxy on. The default is Apify Proxy with the RESIDENTIAL group; datacenter IPs get blocked by search-engine anti-bot checks. Residential groups require a paid Apify plan.
  10. debug prints candidate names and LinkedIn URLs into the run log. It is off by default for exactly that reason — switch it on only while diagnosing a zero-result run, and remember run logs are retained.
  11. deliveryMode defaults to perProfile, not none. With a connector selected, a 20-profile run makes 20 connector calls. For dataset-only runs leave mcpConnector empty or set deliveryMode: "none". There is no chunked mode here — only perProfile, summary, none.
  12. The run also writes OUTPUT to the key-value store. If your pipeline wants counts and status rather than the rows, read that key instead of the dataset.
dependencies:
- rule: "company_name is required (400 in standby, validation error in a normal run)"
note: "the Console prefill is not a default"
- rule: "max_profiles default differs by entry point"
detail: "input schema default 2; standby endpoint default 5; both capped at 20 and at 2 on free plans"
- rule: "exact_company_match ON requires the full company phrase"
on_violation: "turning it OFF admits lookalike companies that share significant words"
- rule: "delivery requires mcpConnector AND mcpTool"
on_violation: "delivery step is skipped with a warning; the dataset is still written in full"
- rule: "mcpArguments must reference {message} for the rendered template to appear anywhere"
on_violation: "message body is empty; the tool is still called"
- rule: "mcpConnector only resolves when the Actor runs on the Apify platform"
on_violation: "local runs log 'APIFY_MCP_PROXY_URL is not set' and skip delivery; the dataset is unaffected"
- rule: "debug logging writes personal data (names, LinkedIn URLs) to the run log"
note: "leave it off outside active troubleshooting"
authentication:
actor_input: none
platform: "Apify API token required for API / SDK / MCP / standby invocation; paid plan required for residential proxy groups"
target_site: "no LinkedIn account, cookie or session token required - and none is accepted"

📥 Input Contract

.actor/input_schema.json is authoritative — if any table on this page disagrees with the schema files, the schema files win.

Parameters

FieldTypeRequiredDefaultAllowed Values / FormatExample
company_namestringYesnone (Console prefill only)One company nameStripe
max_profilesinteger⬜ No2120; free plans capped at 220
exact_company_matchboolean⬜ Notruetrue = full-phrase match · false = all-significant-wordsfalse
proxyConfigurationobject⬜ NoApify Proxy, RESIDENTIALApify proxy editor objectsee below
debugboolean⬜ NofalseVerbose per-result decisions — logs names and URLstrue

Recommended proxy block (also the default):

{
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

What counts as a decision maker

A profile is kept when its role matches one of ~50 title keywords, grouped roughly by seniority:

TierTitles matched
Founders (highest rank)Founder · Co-Founder · Cofounder · Owner · Proprietor
C-suiteCEO / Chief Executive · CTO / Chief Technology · CIO · COO · CFO · CMO · CPO · CISO · CRO (and their Chief … long forms)
Senior leadershipPresident · Managing Director / MD · General Manager / GM · Partner · Principal
Function headsVP / Vice President · Director · Head of
Leads & deliveryProject Lead · Technical Lead / Tech Lead · Engineering Lead · Team Lead · Delivery Lead · Practice Lead · Project Manager (incl. Senior/Sr.)
Advisory & architectureSolution(s) Architect · Consultant (incl. Senior/AI/ML) · Advisor · Strategic Advisor

Results are sorted by seniority weight, so founders and C-suite come first and leads/consultants last. If you only want the top of the house, take the first few rows rather than raising max_profiles.

Examples

Default posture — highest-ranked handful at one company:

{
"company_name": "Stripe",
"max_profiles": 10,
"exact_company_match": true,
"deliveryMode": "none"
}

Full leadership sweep, paid plan:

{
"company_name": "Siemens Healthineers",
"max_profiles": 20,
"exact_company_match": true,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
},
"deliveryMode": "none"
}

Looser matching for a company whose name is often abbreviated:

{
"company_name": "Acme Corporation",
"exact_company_match": false,
"max_profiles": 15,
"deliveryMode": "none"
}

Diagnosing a zero-result run (writes names and URLs to the log):

{
"company_name": "Some Small Studio",
"max_profiles": 5,
"exact_company_match": false,
"debug": true,
"deliveryMode": "none"
}

MCP Delivery Configuration (Optional)

Delivery pushes profiles into your own tools. It never contacts anyone.

ParameterTypeDefaultDescription
mcpConnectorstring""Authorized MCP connector on your Apify account (Notion, Slack, Jira, Airtable, HubSpot, Linear, Sheets, …). Leave empty for dataset-only runs.
deliveryModeenumperProfileperProfile (one call per decision maker) · summary (one call with all profiles) · none.
mcpToolstring""Tool name on the connector: create_page, send_message, create_record, create_issue. Run once with a connector selected — the log lists the connector's available tools.
mcpArgumentsobject{}Arguments passed to the tool. String leaves support {placeholders}.
mcpMessageTemplatestring""Template rendered and exposed to mcpArguments as {message}.

Placeholders: {name}, {linkedin_url}, {location}, {title}, {headline}, {message} — the same five output fields, per profile.

One Notion page per decision maker:

{
"company_name": "Stripe",
"max_profiles": 15,
"mcpConnector": "<your-authorized-notion-connector>",
"deliveryMode": "perProfile",
"mcpTool": "notion-create-pages",
"mcpArguments": {
"parent": { "page_id": "<your-page-id>" },
"pages": [
{
"properties": { "title": "{name} — {title}" },
"content": "{headline}\n{linkedin_url}"
}
]
}
}

One Slack digest for the account:

{
"company_name": "Siemens Healthineers",
"max_profiles": 20,
"mcpConnector": "<your-authorized-slack-connector>",
"deliveryMode": "summary",
"mcpTool": "send_message",
"mcpArguments": { "channel": "#account-research", "text": "{message}" },
"mcpMessageTemplate": "Decision makers found:\n\n{message}"
}

One CRM record per decision maker:

{
"company_name": "Acme Corporation",
"max_profiles": 20,
"mcpConnector": "<your-authorized-airtable-connector>",
"deliveryMode": "perProfile",
"mcpTool": "create_record",
"mcpArguments": {
"fields": {
"Name": "{name}",
"Role": "{title}",
"Location": "{location}",
"LinkedIn": "{linkedin_url}",
"Context": "{headline}"
}
}
}

📤 Output Contract & Data Structure

Storage: Apify Dataset (one JSON object per decision maker) plus a run summary in the key-value store under OUTPUT. Pagination: limit & offset on the dataset items endpoint. Duplicates: deduplicated within a run by normalised LinkedIn URL. Across runs, dedupe on linkedin_url.

Dataset item — five fields

FieldTypeMeaning
namestringPerson's name, extracted from the search-result title
linkedin_urlstringNormalised public LinkedIn /in/ URL — use as the dedupe key
locationstringLocation as exposed by the search result
titlestringThe role string that matched a decision-maker keyword
headlinestringSearch snippet, truncated to 200 characters (falls back to the result title)

That is the whole record. No email, no phone, no company field (you supplied the company), no skills or history.

Key-value store OUTPUT — run summary

KeyMeaning
companyThe company name searched
total_foundDecision makers collected
decision_makersSame count, named for readability
deliveredSuccessful MCP connector calls
statuscompleted
finished_atISO-8601 UTC finish time

Useful when a pipeline wants "did this account have leadership we could find?" without reading every row.

Example dataset item

{
"name": "Priya Raman",
"linkedin_url": "https://www.linkedin.com/in/priya-raman-b2c4d6",
"location": "Bengaluru, Karnataka, India",
"title": "VP of Engineering",
"headline": "VP of Engineering at Acme Corporation · Scaling platform teams across India and EMEA · ex-Infra lead"
}

What a successful run looks like

{
"status": "SUCCEEDED",
"defaultDatasetId": "<datasetId>",
"stats": { "itemCount": 12 }
}

The terminal status message reads Done — collected <n> decision maker(s) for <company>. plus the connector count when delivery ran. itemCount below max_profiles is normal — a small company may simply have few indexed leadership profiles, or exact_company_match correctly excluded lookalikes. itemCount: 0 is a valid empty result: try exact_company_match: false, or check the company name spelling. On free plans, itemCount stops at 2.


▶️ Invocation & Integration

Lifecycle: Discover → Understand → Configure → Execute → Retrieve → Validate. Authenticate every call with Authorization: Bearer <APIFY_TOKEN>.

Standby mode — a live REST endpoint

This Actor runs in Standby mode, so you can query it like an API instead of starting a run and polling for results. It answers a readiness probe and serves one endpoint:

GET /?company_name=<name>&max_profiles=<1-20>
ParameterRequiredDefaultNotes
company_name✅ YesMissing or empty → HTTP 400
max_profiles⬜ No5120 — note this differs from the input schema's default of 2
curl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \
'https://techforce-global--linkedin-company-decision-makers.apify.actor/?company_name=Stripe&max_profiles=10'

Response:

{
"company": "Stripe",
"count": 2,
"decision_makers": [
{
"name": "Priya Raman",
"linkedin_url": "https://www.linkedin.com/in/priya-raman-b2c4d6",
"location": "Bengaluru, Karnataka, India",
"title": "VP of Engineering",
"headline": "VP of Engineering at Stripe · Scaling platform teams"
}
]
}

ℹ️ Copy the exact Standby URL from the Actor’s Standby tab in the Console. The <username>--<actor-name>.apify.actor form above follows Apify's Standby convention, but the hostname for your account and build is shown there.

Apify Console

Open the Actor → Input tab → type a Company Name → set Max Profiles → leave Exact company match on → keep the residential proxy → (optional) pick an MCP connector, tool and template → Start → export from the Dataset tab (JSON, CSV, Excel, XML).

Model Context Protocol (MCP)

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=techforce.global/linkedin-company-decision-makers"

Python (apify-client)

import os
from apify_client import ApifyClient
client = ApifyClient(os.getenv("APIFY_TOKEN"))
run = client.actor("techforce.global/linkedin-company-decision-makers").call(run_input={
"company_name": "Stripe",
"max_profiles": 15, # 20 is the ceiling; free plans stop at 2
"exact_company_match": True,
"deliveryMode": "none",
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(f"{len(items)} decision makers")
# Results arrive seniority-ranked: founders and C-suite first.
for person in items:
print(f'{person["title"]:<28} {person["name"]:<24} {person["location"]}')
print(f' {person["linkedin_url"]}')
# The run summary lives in the key-value store, not the dataset.
summary = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("OUTPUT")
print(summary["value"])

JavaScript / TypeScript (apify-client)

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client
.actor("techforce.global/linkedin-company-decision-makers")
.call({
company_name: "Siemens Healthineers",
max_profiles: 20,
exact_company_match: true, // keeps lookalike companies out
deliveryMode: "none",
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const cSuite = items.filter((i) =>
/chief|^c[teiofmpr]o\b|founder|president/i.test(i.title ?? ""),
);
console.log(
`${items.length} decision makers, ${cSuite.length} at C-suite or founder level`,
);

cURL — synchronous run (returns items directly; 300s limit)

curl -X POST \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \
-d '{"company_name":"Stripe","max_profiles":10,"exact_company_match":true,"deliveryMode":"none"}' \
'https://api.apify.com/v2/acts/techforce.global~linkedin-company-decision-makers/run-sync-get-dataset-items'

For a single lookup, the Standby endpoint above is simpler — no run lifecycle at all.

# 1. Start execution with a hard spend limit
curl -X POST -H 'Content-Type: application/json' \
-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \
-d '{"company_name":"Acme Corporation","max_profiles":20,"deliveryMode":"none"}' \
'https://api.apify.com/v2/acts/techforce.global~linkedin-company-decision-makers/runs?maxTotalChargeUsd=0.20'
# 2. Poll
curl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \
'https://api.apify.com/v2/actor-runs/<runId>'
# 3. Retrieve when SUCCEEDED
curl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \
'https://api.apify.com/v2/datasets/<DATASET_ID>/items?clean=true&format=json'

⚠️ Autonomous Agent Error Handling & Resolution Matrix

Error CodeDetection ConditionUnderlying CauseDeterministic Agent Action
AUTH_INVALIDHTTP 401Missing or malformed APIFY_TOKENAbort & Prompt User: request a valid API token.
RATE_LIMITEDHTTP 429Apify API rate / concurrency limitsRetry: exponential backoff (2s, 4s, 8s).
SYNC_TIMEOUTHTTP 408 on the sync endpointRun exceeded the 300s synchronous ceilingReconfigure: use Standby, or async POST /runs + polling.
MISSING_COMPANY_NAMEInput validation rejection, or HTTP 400 in Standbycompany_name is required and has no defaultModify Input: send company_name.
STANDBY_DEFAULT_DRIFTStandby returns 5 profiles when you expected 2 (or vice versa)The Standby endpoint defaults max_profiles to 5; the input schema defaults to 2Modify Input: always pass max_profiles explicitly.
FREE_PLAN_CAPitemCount stops at 2 with the upgrade banner in the logFree Apify plan caps the run at 2 profilesPrompt User: upgrade for full-volume runs.
EMPTY_RESULTSSUCCEEDED, itemCount: 0Nothing indexed matched, or exact_company_match excluded every candidateRetry once with exact_company_match: false; then verify the company name.
LOOKALIKE_COMPANYResults are people at a similarly-named firmexact_company_match was set to falseModify Input: set it back to true.
WRONG_GRANULARITY_ALL_STAFFUser wanted every employee, not just leadershipThis Actor returns decision makers onlyRe-route: LinkedIn Employee Scraper.
WRONG_GRANULARITY_ROLE_SEARCHUser wanted a role across many companiesThis Actor takes one companyRe-route: LinkedIn Candidate Search.
NO_CONTACT_DATANo email / phone in any itemNever returned — the output is 5 fieldsFix Expectation: enrich from linkedin_url elsewhere.
STALE_ROLEtitle disagrees with the person's current roleThe role string comes from a search snippet, which can lagVerify on the profile before outreach.
MISCLASSIFIED_SENIORITYSomeone junior matched on a keyword like Consultant or LeadTitle matching is keyword-based, not verifiedFilter downstream on title, and read headline.
PROXY_BLOCKEDThin or empty results, search pages not loadingDatacenter IP hit a search-engine anti-bot checkReconfigure: enable the RESIDENTIAL proxy group (the default).
PROXY_UNAVAILABLEProxy setup warning in the logResidential groups need a paid Apify planPrompt User: upgrade, or accept a higher block rate.
DEBUG_PII_IN_LOGCandidate names and LinkedIn URLs appear in the run logdebug: true was setModify Input: turn debug off outside troubleshooting; run logs are retained.
DELIVERY_SKIPPEDLog no tool name was providedmcpConnector set but mcpTool emptyModify Input: set mcpTool; the dataset is already saved.
DELIVERY_TOOL_UNKNOWNLog Tool 'x' is not available on this connectorWrong tool name for that connectorModify Input: pick a name from the Available tools: list in the same log line.
DELIVERY_EMPTYConnector called, body emptymcpArguments omitted the {message} placeholderModify Input: map {message} inside mcpArguments.
DELIVERY_FLOODUp to 20 connector calls per rundeliveryMode defaults to perProfileReconfigure: use summary.
MCP_PROXY_MISSINGLog APIFY_MCP_PROXY_URL is not setRunning locally instead of on the platformReconfigure: apify push and run on the platform.
CHARGE_LIMITRun aborted before max_profiles reachedmaxTotalChargeUsd spend threshold reachedPrompt User: confirm a higher spend cap.

Reading run status: SUCCEEDED with an empty dataset is a valid outcome here, not a failure — only a FAILED status is a platform-level problem. Every Actor-side row, quoted message and field condition in the table above comes from this Actor’s own behaviour; the 401/408/429 rows are standard Apify API responses.


🗣️ Natural Language → Actor Mapping

User saysIntentConstructed Actor input
"Who are the decision makers at Stripe?"ABM research{"company_name":"Stripe","max_profiles":15}
"Find the founders of Acme Corporation"Founder outreach{"company_name":"Acme Corporation","max_profiles":10} then read the top rows
"Get me the C-suite at Siemens Healthineers"Exec outreach{"company_name":"Siemens Healthineers","max_profiles":20} then filter title
"Who runs engineering at this company?"Function head{"company_name":"<company>"} then filter title for VP / Head of / Director
"I keep getting people from a different company with a similar name"Precision fix{"exact_company_match":true}
"This company's name is abbreviated everywhere — loosen the match"Recall fix{"exact_company_match":false}
"Look up decision makers live from our app"Live API➡️ Use the Standby endpoint: GET /?company_name=…
"Push the leadership into our CRM"CRM delivery{"mcpConnector":"airtable","deliveryMode":"perProfile","mcpTool":"create_record"}
"Post the buying committee to Slack"Digest delivery{"mcpConnector":"slack","deliveryMode":"summary","mcpTool":"send_message"}
"Save each contact as a Notion page"Notion delivery{"mcpConnector":"notion","deliveryMode":"perProfile","mcpTool":"notion-create-pages"}
"Why did this company return zero people?"Diagnosis{"exact_company_match":false,"debug":true} — note debug logs names and URLs
"List everyone who works at Acme"Full org➡️ Route to LinkedIn Employee Scraper
"Find senior Java developers in Pune"Role search➡️ Route to LinkedIn Candidate Search
"Get their email addresses"Contact enrichment❌ Out of scope — five fields, no contact data
"Message these people for me"Outreach❌ Out of scope — read-only

Should NOT route here: every employee of a company (→ Employee Scraper) · a role searched across many companies (→ Candidate Search) · email addresses or phone numbers · full profile exports · messaging, connecting or InMail · anything requiring a LinkedIn session cookie · more than 20 profiles in one run.


🧭 Agent Execution & Routing Logic

[Input User Query]
1. Is the goal finding PEOPLE at a company? NO → Route to a company/lead Actor
│ YES
2. What granularity?
├── the LEADERSHIP of one named company → stay here
├── EVERY employee of one named company → Route to LinkedIn Employee Scraper
└── a ROLE across many companies → Route to LinkedIn Candidate Search
3. Needs emails / full profiles / messaging? YES → Abort (none are supported)
│ NO
4. Do we have an exact company name? NO → Ask the user. company_name is REQUIRED
│ YES (400 in standby, validation error otherwise)
5. Does the company have common-word lookalikes?
├── YES → exact_company_match: true (the default - keeps 'TechForce Telecom' out)
└── the name is abbreviated in the wild → exact_company_match: false, then sanity-check results
6. One lookup, or a batch?
├── one live lookup → use the STANDBY endpoint: GET /?company_name=…&max_profiles=…
└── a batch / pipeline → normal run; loop one company per run
7. Set max_profiles EXPLICITLY (schema default 2, standby default 5, ceiling 20, free plans 2)
8. Deliver to a connector? YES → mcpConnector + mcpTool + {message}
│ perProfile (≤20 calls) or summary
│ NO → set deliveryMode "none" (it defaults to perProfile)
9. Leave debug OFF unless diagnosing — it writes names and URLs to the run log
[Execute]
├──► SUCCEEDED ──► itemCount == 0? → retry once with exact_company_match false, then verify the name
│ else → results are seniority-ranked; dedupe on linkedin_url;
│ read OUTPUT in the key-value store for run counts
└──► FAILED / 400 ──► missing company_name is the usual cause

💰 Cost Control & Pricing Transparency

  • Pay-per-event pricing: from $5.00 per 1,000 results on the entry tier, discounted at higher Apify subscription tiers. No monthly subscription.
  • Free Apify plans are capped at 2 profiles per run.
  • Autonomous spend caps: pass maxTotalChargeUsd as a query parameter on the run endpoint for a hard per-execution ceiling.
Profiles returnedCost at $5.00 / 1,000
2 profiles (free-plan cap)$0.01
10 profiles$0.05
20 profiles (per-run ceiling)$0.10
200 profiles (10 companies)$1.00
1,000 profiles (50 companies)$5.00

Platform usage is billed on top at your plan's rates. Two things drive it here: this Actor runs a real browser against a search engine, and residential proxy traffic is metered per GB. A company that yields 2 profiles costs nearly as much in platform usage as one yielding 20, because the search work is the same.

Cost levers: set max_profiles to what you will actually use; prefer Standby for one-off lookups (no cold-start browser per request); and set maxTotalChargeUsd for a hard ceiling.

ℹ️ Always confirm the live rate on the Actor’s Apify Store page before committing to a large run. The Store listing is what bills you; the figures above are a worked example at the advertised rate. Apify platform usage is billed separately.


🔍 Companion machine-readable files

FilePurpose
.actor/actor.jsonIdentity, version, memory limits (2048–4096 MB), usesStandbyMode: true, and an inline dataset view definition
.actor/input_schema.jsonAuthoritative typed input contract — company_name (required), max_profiles (1–20), exact_company_match, proxy, deliveryMode enum, debug
.actor/openapi.jsonThe Standby REST contractGET / (findDecisionMakers), its query parameters and response shape
.actor/dataset_schema.jsonStandalone dataset view (note: actor.json also declares the dataset inline)
.actor/key_value_store_schema.jsonDeclares the OUTPUT run-summary record
.actor/output_schema.jsonDeclares where results are stored
my_actor/main.pyQuery composition, Brave Search navigation, title/company matching, seniority ranking, standby web server, MCP delivery
my_actor/connector.pyMCP connector session handling through the Apify MCP Proxy

Note: this Actor has no pay_per_event.json — billing is configured entirely on the Store listing.

If any table on this page disagrees with the schema files, the schema files win.


🛠️ Troubleshooting

#Symptom you seeMost likely causeFix
1Input rejected, or HTTP 400 from Standbycompany_name is required and has no default — the Console prefill isn't oneAlways send company_name.
2Exactly 2 profiles every runFree Apify plan capUpgrade the plan; the log prints the upgrade banner.
3Only 2 profiles on a paid planmax_profiles defaults to 2 in the input schemaSet it explicitly, up to 20.
4Standby returned 5 when you expected 2The Standby endpoint defaults max_profiles to 5Pass max_profiles in the query string.
5Zero results for a company you know existsexact_company_match excluded everything, or nothing is indexedRetry with exact_company_match: false, then check the spelling.
6People from a similarly-named companyexact_company_match was falseSet it back to true — that's what it's for.
7Junior people in the resultsTitle matching is keyword-based: Consultant, Lead, Advisor all matchFilter downstream on title; results are seniority-ranked, so take the top rows.
8title disagrees with the person's current roleThe role comes from a search snippet, which can lag the live profileVerify before outreach.
9No email or phone anywhereThe output is five fields — contact data is never returnedEnrich from linkedin_url with a separate service.
10Thin results, search pages not loadingDatacenter IP hit a search-engine anti-bot checkKeep the RESIDENTIAL proxy group (the default).
11Proxy warning in the logResidential groups require a paid Apify planUpgrade, or expect a higher block rate.
12Names and LinkedIn URLs in the run logdebug: trueTurn it off — run logs are retained.
13headline looks truncatedIt is capped at 200 charactersExpected. Open the profile for the full text.
14You wanted counts, not rowsThe run summary is in the key-value store under OUTPUTRead OUTPUT instead of the dataset.
15Up to 20 connector calls per rundeliveryMode defaults to perProfileSwitch to summary.
16Slack / Notion / Airtable received nothingDelivery needs both mcpConnector and mcpToolSet both. The dataset is still written in full.
17Connector fired but the message body is emptymcpArguments did not reference {message}Map {message} in mcpArguments and populate mcpMessageTemplate.
18Log: APIFY_MCP_PROXY_URL is not setYou ran locally; connectors only resolve on the platformDeploy with apify push and run on the platform.
19HTTP 408 on run-sync-get-dataset-itemsThe synchronous endpoint has a hard 300-second ceilingUse Standby, or async POST /runs → poll → fetch.
20HTTP 401 / 403Missing, expired, or malformed APIFY_TOKENRegenerate in Apify Console → Settings → API & Integrations.
21HTTP 429Apify account concurrency / rate limitsRetry with exponential backoff (2s → 4s → 8s).

Diagnostic checklist before opening an issue

  1. Baseline run. A well-known company, max_profiles: 5, exact_company_match: true, residential proxy, deliveryMode: "none".
  2. Results returned? If yes, the pipeline is fine — the earlier company was either misspelled or thinly indexed.
  3. Still zero? Retry with exact_company_match: false. If that works, the company's name matching was the issue.
  4. Still zero? Set debug: true for one run to see exactly which results were considered and why each was dropped — then turn it back off.
  5. Check the proxy — a residential group is the default for a reason; a blocked search page yields nothing to parse.

If the issue survives all five steps, open an Issues ticket on the Actor page (or email support) with the run ID, the exact input JSON, and the company name you searched.

❓ FAQ

Setup & access

Do I need a LinkedIn account, cookie or li_at token?

No — and none is accepted. The Actor reads a search engine's index of public profile pages, so your LinkedIn account is never involved.

Where does the data come from?

Brave Search results for public linkedin.com/in pages. The Actor composes the operators, runs the search in a real browser through a residential proxy, and parses the results.

Is this the official LinkedIn API?

No. This is an independent Actor, not affiliated with, endorsed by, or sponsored by LinkedIn or Brave.

Can I use it as a live API?

Yes — that's what Standby mode is for: GET /?company_name=…&max_profiles=… returns JSON in one request, with no run to start or poll.

Can I plug it into Claude, Cursor, or a LangChain agent?

Yes — it is a native MCP tool:

claude mcp add --transport http apify "https://mcp.apify.com?tools=techforce.global/linkedin-company-decision-makers"

Matching & results

How does it decide who is a "decision maker"?

By matching the role string against ~50 title keywords — founders, C-suite, president, MD, VP, director, head of, partner, principal, GM, owner, architects, leads and senior consultants — then ranking by seniority so founders and C-suite appear first.

Why did I get people from a different company?

Because exact_company_match was off. With it on (the default), only profiles matching the full company phrase are kept, so Techforce Global won't match TechForce Telecom, LER TechForce or Global TechForce.

When should I turn exact matching off?

When the company is habitually abbreviated or written inconsistently — Acme Corporation vs Acme Corp vs Acme. Sanity-check the results afterwards.

Why so few profiles for a small company?

Only leadership profiles that a search engine has actually indexed can be returned. Small firms often have very few.

Can I search several companies at once?

No — one company per run. Loop from your orchestration layer, or use Standby for rapid sequential lookups.

Output & data

Can I get email addresses?

No, at any setting. Use an email-finding service on linkedin_url if you need contact data — and mind the applicable privacy rules.

Why is headline cut off?

It is the search snippet, truncated at 200 characters.

Where is the run summary?

In the key-value store under OUTPUT — company, counts, delivered, status and finish time.

Pricing

How is this billed?

Pay-per-event, from $5.00 per 1,000 results, less on higher Apify subscription tiers. Apify platform usage — compute units and residential proxy GB — is billed separately.

Why did a 2-profile run cost nearly as much as a 20-profile one?

Because the search work is the same either way; platform usage tracks browser and proxy traffic, not the number of matches.

How do I guarantee an agent never overspends?

Pass maxTotalChargeUsd as a query parameter on the run endpoint — a hard per-execution ceiling.


All three read public search results rather than an authenticated LinkedIn session. The difference is what you anchor the search on, and how much of the org you want.

ActorAnchored onReturnsWhy pick it over this one
This ActorOne named companyLeadership only, seniority-rankedYou want the people who can say yes (1–20 per run, from $5.00 / 1,000)
LinkedIn Employee ScraperOne named companyEvery employee, plus department and seniority level classificationOrg mapping, competitor headcount, or finding non-leadership staff (1–50 per run, $8.40 / 1,000)
LinkedIn Candidate SearchA role / tech stack, across employersCandidates matching a briefRecruiting and sourcing where the employer doesn't matter (1–50 per run, $1.00 / 1,000)

Pick by intent: who decides at this company → this Actor · the whole org chart → Employee Scraper · a role anywhere → Candidate Search.

Enrichment & downstream pipeline

ActorUse it for
Google Maps Business Leads & Sales IntelligenceCompany-level contact data (emails, phones) and a website grade for the account you're targeting
GOV.UK Business ScraperMatch a UK company against Companies House records, incl. PSC / beneficial ownership — a natural pairing with named directors
Advanced Website Crawling ActorCrawl the company's own site for team pages and context before reaching out

Suggested pipeline patterns

🎯 Account-based marketing Target account list → one run per company → deliveryMode: "perProfile" into your CRM against the account record → a human writes the approach per contact.

🏛️ UK director cross-check This Actor for LinkedIn-visible leadership → GOV.UK Business Scraper for the statutory directors and PSCs → reconcile the two before an exec approach.

🧠 Buying-committee brief deliveryMode: "summary" into Slack per target account → the sales team sees the committee in one message → they pick who to approach.

⚡ Live enrichment Standby endpoint called from your CRM or agent when a new account is created → leadership attached within seconds, no run orchestration.

Browse all Actors by Techforce Global at scraper.techforce.global.


🔐 Compliance & Data Privacy

This is an independent Actor. It is not affiliated with, endorsed by, or sponsored by LinkedIn or Brave Search. "LinkedIn" is a trademark of LinkedIn Corporation.

This Actor reads publicly indexed search results for public LinkedIn profile pages. It does not log in, does not use or accept a session cookie, and does not access anything behind LinkedIn's authentication.

The output is personal data about identifiable individuals — named people, their roles, locations and profile URLs. Three things follow:

  • You become a data controller when you store it. GDPR, UK GDPR and CCPA/CPRA apply. Have a lawful basis (legitimate interest is the usual route for B2B prospecting, and it requires a balancing assessment), record it, set a retention period, and be ready to honour access, objection and erasure requests.
  • B2B outreach is regulated. Before contacting anyone identified here, satisfy the applicable anti-spam and e-marketing rules (GDPR Art. 6/21, ePrivacy/PECR, CAN-SPAM, CASL). Being a work contact is not consent, and several jurisdictions expect a notice at first contact.
  • debug writes personal data into your run log. Run logs are retained and shareable — leave it off outside active troubleshooting, and keep the dataset as the system of record.

You are responsible for ensuring your use complies with LinkedIn's and Brave's terms of service and all applicable data-protection and marketing law.


🆘 Support & Custom Pipeline Engineering

Need batch lookups across an account list, CRM integration, email enrichment on top of the profiles, or a full sales-intelligence pipeline?


Made with ❤️ by Techforce Global Specialists in High-Performance B2B Contact Data Extraction and AI Automation.


🏷️ Structured data for search & AI discovery

{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "LinkedIn Company Decision Makers — MCP Connector",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Cloud (Apify platform)",
"description": "Given one company name, returns its decision makers — founders, C-suite, presidents, VPs, directors, heads and leads — each with a public LinkedIn URL, role, location and headline, ranked by seniority, with no LinkedIn account or session cookie required. Available as a standard Actor run, a Standby REST endpoint, or an MCP tool that delivers into Notion, Slack, Jira, Airtable, HubSpot or any authorized MCP connector.",
"url": "https://apify.com/techforce.global/linkedin-company-decision-makers",
"offers": {
"@type": "Offer",
"price": "5.00",
"priceCurrency": "USD",
"description": "From $5.00 per 1,000 results, pay-per-event"
}
}
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Do I need a LinkedIn account, cookie or li_at token?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No - and none is accepted. The Actor reads a search engine's index of public profile pages, so your LinkedIn account is never involved."
}
},
{
"@type": "Question",
"name": "Where does the data come from?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Brave Search results for public linkedin.com/in pages. The Actor composes the operators, runs the search in a real browser through a residential proxy, and parses the results."
}
},
{
"@type": "Question",
"name": "Is this the official LinkedIn API?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. This is an independent Actor, not affiliated with, endorsed by, or sponsored by LinkedIn or Brave."
}
},
{
"@type": "Question",
"name": "Can I use it as a live API?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes - that's what Standby mode is for: GET /?company_name=&max_profiles= returns JSON in one request, with no run to start or poll."
}
},
{
"@type": "Question",
"name": "Can I plug it into Claude, Cursor, or a LangChain agent?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes - it is a native MCP tool:"
}
},
{
"@type": "Question",
"name": "How does it decide who is a \"decision maker\"?",
"acceptedAnswer": {
"@type": "Answer",
"text": "By matching the role string against ~50 title keywords - founders, C-suite, president, MD, VP, director, head of, partner, principal, GM, owner, architects, leads and senior consultants - then ranking by seniority so founders and C-suite appear first."
}
},
{
"@type": "Question",
"name": "Why did I get people from a different company?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Because exact_company_match was off. With it on (the default), only profiles matching the full company phrase are kept, so Techforce Global won't match TechForce Telecom, LER TechForce or Global TechForce."
}
},
{
"@type": "Question",
"name": "When should I turn exact matching off?",
"acceptedAnswer": {
"@type": "Answer",
"text": "When the company is habitually abbreviated or written inconsistently - Acme Corporation vs Acme Corp vs Acme. Sanity-check the results afterwards."
}
},
{
"@type": "Question",
"name": "Why so few profiles for a small company?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Only leadership profiles that a search engine has actually indexed can be returned. Small firms often have very few."
}
},
{
"@type": "Question",
"name": "Can I search several companies at once?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No - one company per run. Loop from your orchestration layer, or use Standby for rapid sequential lookups."
}
},
{
"@type": "Question",
"name": "Can I get email addresses?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No, at any setting. Use an email-finding service on linkedin_url if you need contact data - and mind the applicable privacy rules."
}
},
{
"@type": "Question",
"name": "Why is headline cut off?",
"acceptedAnswer": {
"@type": "Answer",
"text": "It is the search snippet, truncated at 200 characters."
}
},
{
"@type": "Question",
"name": "Where is the run summary?",
"acceptedAnswer": {
"@type": "Answer",
"text": "In the key-value store under OUTPUT - company, counts, delivered, status and finish time."
}
},
{
"@type": "Question",
"name": "How is this billed?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Pay-per-event, from $5.00 per 1,000 results, less on higher Apify subscription tiers. Apify platform usage - compute units and residential proxy GB - is billed separately."
}
},
{
"@type": "Question",
"name": "Why did a 2-profile run cost nearly as much as a 20-profile one?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Because the search work is the same either way; platform usage tracks browser and proxy traffic, not the number of matches."
}
},
{
"@type": "Question",
"name": "How do I guarantee an agent never overspends?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Pass maxTotalChargeUsd as a query parameter on the run endpoint - a hard per-execution ceiling."
}
}
]
}