LinkedIn Decision Makers MCP Connector for Notion & Slack
Pricing
from $5.00 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
17
Total users
7
Monthly active users
13 hours ago
Last modified
Categories
Share
LinkedIn Company Decision Makers - Founders, C-Suite, VPs & Directors, No Cookies
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.
Cookie-based LinkedIn tooling vs. this Actor
Most "find the decision maker" tools want your li_at session cookie, then run searches as your own logged-in account.
| Feature / Capability | Cookie-based LinkedIn scrapers | This Actor |
|---|---|---|
| Credentials required | ❌ Your li_at cookie or account login | ✅ None — 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 firms | ✅ exact_company_match keeps Techforce Global from matching TechForce Telecom |
| Live API | ❌ Batch runs only | ✅ Standby 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 model | Varies | Pay-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: 2free_plan_cap: 2standby_default: 5limits:max_profiles_per_run: 20free_plan_cap: 2companies_per_run: 1decision_maker_title_keywords: "~50, seniority-ranked"headline_max_chars: 200pricing: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-basedmarketing, partner recruitment, founder-led sales, or CRM enrichment.when_not_to_use: >You need every employee rather than the leadership, you are searching by roleacross many companies, you need email addresses or full profile exports, oryou 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 forTechforce Globaldoesn't return people atTechForce Telecom,LER TechForceorGlobal 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
| Scenario | Fit |
|---|---|
| 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)
company_nameis 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 missingcompany_namereturns HTTP 400.max_profilesdefaults 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.- Free Apify plans are capped at 2 profiles per run, whatever you ask for. That is a successful run, not a failure.
exact_company_matchis 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 forAcmevsAcme Corporation, risky for common words.- One company per run. There is no multi-company input; loop from your orchestration layer.
- "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
titleandheadlinebefore acting. - No email addresses, at any setting. The output is five fields; there is no contact-data option to enable.
headlineis truncated at 200 characters — it is the search snippet (or the result title as a fallback), not a full profile summary.- Keep the residential proxy on. The default is Apify Proxy with the
RESIDENTIALgroup; datacenter IPs get blocked by search-engine anti-bot checks. Residential groups require a paid Apify plan. debugprints 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.deliveryModedefaults toperProfile, notnone. With a connector selected, a 20-profile run makes 20 connector calls. For dataset-only runs leavemcpConnectorempty or setdeliveryMode: "none". There is nochunkedmode here — onlyperProfile,summary,none.- The run also writes
OUTPUTto 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: noneplatform: "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
| Field | Type | Required | Default | Allowed Values / Format | Example |
|---|---|---|---|---|---|
company_name | string | ✅ Yes | none (Console prefill only) | One company name | Stripe |
max_profiles | integer | ⬜ No | 2 | 1–20; free plans capped at 2 | 20 |
exact_company_match | boolean | ⬜ No | true | true = full-phrase match · false = all-significant-words | false |
proxyConfiguration | object | ⬜ No | Apify Proxy, RESIDENTIAL | Apify proxy editor object | see below |
debug | boolean | ⬜ No | false | Verbose per-result decisions — logs names and URLs | true |
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:
| Tier | Titles matched |
|---|---|
| Founders (highest rank) | Founder · Co-Founder · Cofounder · Owner · Proprietor |
| C-suite | CEO / Chief Executive · CTO / Chief Technology · CIO · COO · CFO · CMO · CPO · CISO · CRO (and their Chief … long forms) |
| Senior leadership | President · Managing Director / MD · General Manager / GM · Partner · Principal |
| Function heads | VP / Vice President · Director · Head of |
| Leads & delivery | Project Lead · Technical Lead / Tech Lead · Engineering Lead · Team Lead · Delivery Lead · Practice Lead · Project Manager (incl. Senior/Sr.) |
| Advisory & architecture | Solution(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.
| Parameter | Type | Default | Description |
|---|---|---|---|
mcpConnector | string | "" | Authorized MCP connector on your Apify account (Notion, Slack, Jira, Airtable, HubSpot, Linear, Sheets, …). Leave empty for dataset-only runs. |
deliveryMode | enum | perProfile | perProfile (one call per decision maker) · summary (one call with all profiles) · none. |
mcpTool | string | "" | 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. |
mcpArguments | object | {} | Arguments passed to the tool. String leaves support {placeholders}. |
mcpMessageTemplate | string | "" | 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
| Field | Type | Meaning |
|---|---|---|
name | string | Person's name, extracted from the search-result title |
linkedin_url | string | Normalised public LinkedIn /in/ URL — use as the dedupe key |
location | string | Location as exposed by the search result |
title | string | The role string that matched a decision-maker keyword |
headline | string | Search 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
| Key | Meaning |
|---|---|
company | The company name searched |
total_found | Decision makers collected |
decision_makers | Same count, named for readability |
delivered | Successful MCP connector calls |
status | completed |
finished_at | ISO-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>
| Parameter | Required | Default | Notes |
|---|---|---|---|
company_name | ✅ Yes | — | Missing or empty → HTTP 400 |
max_profiles | ⬜ No | 5 | 1–20 — 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.actorform 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 osfrom apify_client import ApifyClientclient = 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().itemsprint(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 outdeliveryMode: "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.
cURL — asynchronous with a spend cap (recommended for production)
# 1. Start execution with a hard spend limitcurl -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. Pollcurl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \'https://api.apify.com/v2/actor-runs/<runId>'# 3. Retrieve when SUCCEEDEDcurl -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 Code | Detection Condition | Underlying Cause | Deterministic Agent Action |
|---|---|---|---|
AUTH_INVALID | HTTP 401 | Missing or malformed APIFY_TOKEN | Abort & Prompt User: request a valid API token. |
RATE_LIMITED | HTTP 429 | Apify API rate / concurrency limits | Retry: exponential backoff (2s, 4s, 8s). |
SYNC_TIMEOUT | HTTP 408 on the sync endpoint | Run exceeded the 300s synchronous ceiling | Reconfigure: use Standby, or async POST /runs + polling. |
MISSING_COMPANY_NAME | Input validation rejection, or HTTP 400 in Standby | company_name is required and has no default | Modify Input: send company_name. |
STANDBY_DEFAULT_DRIFT | Standby returns 5 profiles when you expected 2 (or vice versa) | The Standby endpoint defaults max_profiles to 5; the input schema defaults to 2 | Modify Input: always pass max_profiles explicitly. |
FREE_PLAN_CAP | itemCount stops at 2 with the upgrade banner in the log | Free Apify plan caps the run at 2 profiles | Prompt User: upgrade for full-volume runs. |
EMPTY_RESULTS | SUCCEEDED, itemCount: 0 | Nothing indexed matched, or exact_company_match excluded every candidate | Retry once with exact_company_match: false; then verify the company name. |
LOOKALIKE_COMPANY | Results are people at a similarly-named firm | exact_company_match was set to false | Modify Input: set it back to true. |
WRONG_GRANULARITY_ALL_STAFF | User wanted every employee, not just leadership | This Actor returns decision makers only | Re-route: LinkedIn Employee Scraper. |
WRONG_GRANULARITY_ROLE_SEARCH | User wanted a role across many companies | This Actor takes one company | Re-route: LinkedIn Candidate Search. |
NO_CONTACT_DATA | No email / phone in any item | Never returned — the output is 5 fields | Fix Expectation: enrich from linkedin_url elsewhere. |
STALE_ROLE | title disagrees with the person's current role | The role string comes from a search snippet, which can lag | Verify on the profile before outreach. |
MISCLASSIFIED_SENIORITY | Someone junior matched on a keyword like Consultant or Lead | Title matching is keyword-based, not verified | Filter downstream on title, and read headline. |
PROXY_BLOCKED | Thin or empty results, search pages not loading | Datacenter IP hit a search-engine anti-bot check | Reconfigure: enable the RESIDENTIAL proxy group (the default). |
PROXY_UNAVAILABLE | Proxy setup warning in the log | Residential groups need a paid Apify plan | Prompt User: upgrade, or accept a higher block rate. |
DEBUG_PII_IN_LOG | Candidate names and LinkedIn URLs appear in the run log | debug: true was set | Modify Input: turn debug off outside troubleshooting; run logs are retained. |
DELIVERY_SKIPPED | Log no tool name was provided | mcpConnector set but mcpTool empty | Modify Input: set mcpTool; the dataset is already saved. |
DELIVERY_TOOL_UNKNOWN | Log Tool 'x' is not available on this connector | Wrong tool name for that connector | Modify Input: pick a name from the Available tools: list in the same log line. |
DELIVERY_EMPTY | Connector called, body empty | mcpArguments omitted the {message} placeholder | Modify Input: map {message} inside mcpArguments. |
DELIVERY_FLOOD | Up to 20 connector calls per run | deliveryMode defaults to perProfile | Reconfigure: use summary. |
MCP_PROXY_MISSING | Log APIFY_MCP_PROXY_URL is not set | Running locally instead of on the platform | Reconfigure: apify push and run on the platform. |
CHARGE_LIMIT | Run aborted before max_profiles reached | maxTotalChargeUsd spend threshold reached | Prompt User: confirm a higher spend cap. |
Reading run status:
SUCCEEDEDwith an empty dataset is a valid outcome here, not a failure — only aFAILEDstatus 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; the401/408/429rows are standard Apify API responses.
🗣️ Natural Language → Actor Mapping
| User says | Intent | Constructed 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
maxTotalChargeUsdas a query parameter on the run endpoint for a hard per-execution ceiling.
| Profiles returned | Cost 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
| File | Purpose |
|---|---|
.actor/actor.json | Identity, version, memory limits (2048–4096 MB), usesStandbyMode: true, and an inline dataset view definition |
.actor/input_schema.json | Authoritative typed input contract — company_name (required), max_profiles (1–20), exact_company_match, proxy, deliveryMode enum, debug |
.actor/openapi.json | The Standby REST contract — GET / (findDecisionMakers), its query parameters and response shape |
.actor/dataset_schema.json | Standalone dataset view (note: actor.json also declares the dataset inline) |
.actor/key_value_store_schema.json | Declares the OUTPUT run-summary record |
.actor/output_schema.json | Declares where results are stored |
my_actor/main.py | Query composition, Brave Search navigation, title/company matching, seniority ranking, standby web server, MCP delivery |
my_actor/connector.py | MCP 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 see | Most likely cause | Fix |
|---|---|---|---|
| 1 | Input rejected, or HTTP 400 from Standby | company_name is required and has no default — the Console prefill isn't one | Always send company_name. |
| 2 | Exactly 2 profiles every run | Free Apify plan cap | Upgrade the plan; the log prints the upgrade banner. |
| 3 | Only 2 profiles on a paid plan | max_profiles defaults to 2 in the input schema | Set it explicitly, up to 20. |
| 4 | Standby returned 5 when you expected 2 | The Standby endpoint defaults max_profiles to 5 | Pass max_profiles in the query string. |
| 5 | Zero results for a company you know exists | exact_company_match excluded everything, or nothing is indexed | Retry with exact_company_match: false, then check the spelling. |
| 6 | People from a similarly-named company | exact_company_match was false | Set it back to true — that's what it's for. |
| 7 | Junior people in the results | Title matching is keyword-based: Consultant, Lead, Advisor all match | Filter downstream on title; results are seniority-ranked, so take the top rows. |
| 8 | title disagrees with the person's current role | The role comes from a search snippet, which can lag the live profile | Verify before outreach. |
| 9 | No email or phone anywhere | The output is five fields — contact data is never returned | Enrich from linkedin_url with a separate service. |
| 10 | Thin results, search pages not loading | Datacenter IP hit a search-engine anti-bot check | Keep the RESIDENTIAL proxy group (the default). |
| 11 | Proxy warning in the log | Residential groups require a paid Apify plan | Upgrade, or expect a higher block rate. |
| 12 | Names and LinkedIn URLs in the run log | debug: true | Turn it off — run logs are retained. |
| 13 | headline looks truncated | It is capped at 200 characters | Expected. Open the profile for the full text. |
| 14 | You wanted counts, not rows | The run summary is in the key-value store under OUTPUT | Read OUTPUT instead of the dataset. |
| 15 | Up to 20 connector calls per run | deliveryMode defaults to perProfile | Switch to summary. |
| 16 | Slack / Notion / Airtable received nothing | Delivery needs both mcpConnector and mcpTool | Set both. The dataset is still written in full. |
| 17 | Connector fired but the message body is empty | mcpArguments did not reference {message} | Map {message} in mcpArguments and populate mcpMessageTemplate. |
| 18 | Log: APIFY_MCP_PROXY_URL is not set | You ran locally; connectors only resolve on the platform | Deploy with apify push and run on the platform. |
| 19 | HTTP 408 on run-sync-get-dataset-items | The synchronous endpoint has a hard 300-second ceiling | Use Standby, or async POST /runs → poll → fetch. |
| 20 | HTTP 401 / 403 | Missing, expired, or malformed APIFY_TOKEN | Regenerate in Apify Console → Settings → API & Integrations. |
| 21 | HTTP 429 | Apify account concurrency / rate limits | Retry with exponential backoff (2s → 4s → 8s). |
Diagnostic checklist before opening an issue
- Baseline run. A well-known company,
max_profiles: 5,exact_company_match: true, residential proxy,deliveryMode: "none". - Results returned? If yes, the pipeline is fine — the earlier company was either misspelled or thinly indexed.
- Still zero? Retry with
exact_company_match: false. If that works, the company's name matching was the issue. - Still zero? Set
debug: truefor one run to see exactly which results were considered and why each was dropped — then turn it back off. - 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.
🔗 Related Actors
LinkedIn people, cookie-free — the same family
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.
| Actor | Anchored on | Returns | Why pick it over this one |
|---|---|---|---|
| This Actor | One named company | Leadership only, seniority-ranked | You want the people who can say yes (1–20 per run, from $5.00 / 1,000) |
| LinkedIn Employee Scraper | One named company | Every employee, plus department and seniority level classification | Org mapping, competitor headcount, or finding non-leadership staff (1–50 per run, $8.40 / 1,000) |
| LinkedIn Candidate Search | A role / tech stack, across employers | Candidates matching a brief | Recruiting 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
| Actor | Use it for |
|---|---|
| Google Maps Business Leads & Sales Intelligence | Company-level contact data (emails, phones) and a website grade for the account you're targeting |
| GOV.UK Business Scraper | Match a UK company against Companies House records, incl. PSC / beneficial ownership — a natural pairing with named directors |
| Advanced Website Crawling Actor | Crawl 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.
debugwrites 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?
- Email: bhavin.shah@techforceglobal.com
- Custom Enterprise Integrations: Book a 15-Minute Technical Consultation
- Maintained by: Techforce Global — Specialists in High-Performance Web Scrapers and Agentic Workflows.
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."}}]}