LinkedIn Founder & Executive Content Monitor
Pricing
from $2.40 / 1,000 post-results
LinkedIn Founder & Executive Content Monitor
Monitor public LinkedIn posts from founders, executives, and senior leaders. Returns clean post-level rows with engagement metrics, media/link indicators, and lightweight business-signal tags - no LinkedIn login or cookies required.
Pricing
from $2.40 / 1,000 post-results
Rating
0.0
(0)
Developer
Delowar Munna
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Share

Monitor public LinkedIn posts from founders, CEOs, and senior executives, and turn them into clean, flat, CSV-ready rows — with engagement metrics, media/link indicators, and lightweight business-signal tags (hiring, funding, product, growth, partnership, event, thought leadership). Built for B2B sales teams, founder-led agencies, VC/PE research, and competitive-intelligence teams.
No LinkedIn login, no cookies, no session IDs. The actor uses LinkedIn's public guest-visible surfaces over HTTP, so it stays fast and cost-predictable. You pay one flat event per saved unique post that passes your filters.
✨ Why this scraper
- Executive-content focused — not a generic LinkedIn post extractor. You bring the founders/executives you care about; the actor returns their visible recent posts with light signal tagging.
- One input, one type — public profile URLs in, post-level rows out. No scraping of comments, reactions, follower lists, or private content.
- 30 flat fields — profile context, author info, post text, engagement counts, media/link indicators, and signal tags. No nested objects, drops straight into Sheets/Excel/CRMs.
- Pay-Per-Event — one flat
post-resultevent per saved unique post. Duplicates and filtered rows are never charged. - No login / cookies / sessions — V1 stays on no-cookie public surfaces.
- Transparent signal tagging — rule-based (no AI), explained below.
⚠️ V1 coverage & proxy reality
Without a logged-in session, this actor extracts whatever posts LinkedIn renders to anonymous visitors on the profile page plus per-post permalinks. Two things to know up front:
- Coverage varies by profile. Some public profiles (e.g.,
williamhgates) render 20–30 recent posts to guests; others render very few. The actor reports per-profile counts inRUN_SUMMARY(successful_inputs,profiles_with_no_posts,failed_inputs). - LinkedIn aggressively blocks Apify shared Datacenter Proxy IPs. You will see HTTP 999 (LinkedIn's anti-bot block) on most requests if you run with the default
useApifyProxy: true. The actor handles 999 gracefully (counts it underblocked_requests, retries with session rotation), but on Datacenter the success rate is low. For production-grade throughput, supply your own residential proxy viaproxyConfiguration.proxyUrls. See the Proxy policy section below.
🚀 Quick start — sample input
{"profileUrls": ["https://www.linkedin.com/in/williamhgates/", "https://www.linkedin.com/in/satyanadella/"],"profileLabels": {"https://www.linkedin.com/in/williamhgates/": "Notable founders","https://www.linkedin.com/in/satyanadella/": "Big-tech CEOs"},"maxPostsPerProfile": 30,"maxResults": 100,"postedAfter": "2026-01-01","includeKeywords": ["hiring", "launch", "funding", "partnership"],"minReactions": 10,"includeSignalTags": true,"deduplicate": true,"proxyConfiguration": { "useApifyProxy": true }}
Provide at least one public LinkedIn profile URL (
https://www.linkedin.com/in/{slug}/). Per-profile labels are optional and free-text. The URLs above are real, public profiles you can use for a smoke test.
📦 Output
The dataset has one view: Executive posts — a 30-column flat table.

Output fields (30)
input_profile_url, input_profile_label, profile_url, profile_slug, author_name, author_headline, author_company, post_id, post_url, post_text, post_text_preview, posted_at, posted_date, post_type, has_link, link_url, link_domain, has_image, has_video, has_document, reaction_count, comment_count, repost_count, engagement_total, engagement_label, signal_tags, matched_keywords, source_type, scraped_at.
Sample record
Real row from a local smoke run against Bill Gates' public profile:
{"input_profile_url": "https://www.linkedin.com/in/williamhgates/","input_profile_label": "Notable founders","profile_url": "https://www.linkedin.com/in/williamhgates/","profile_slug": "williamhgates","author_name": "Bill Gates","author_headline": "Co-chair, Gates Foundation","author_company": "Gates Foundation","post_id": "7464513181265125376","post_url": "https://www.linkedin.com/posts/williamhgates_making-a-podcast-helped-one-family-talk-about-activity-7464513181265125376-jf6a","post_text": "I felt so powerless and scared when my dad was diagnosed with Alzheimer's. It's hard to process, and even harder to talk about, when it's your loved one going through it. Colby's episode captures that reality beautifully.","post_text_preview": "I felt so powerless and scared when my dad was diagnosed with Alzheimer's. It's hard to process, and even harder to talk about, when it's your loved one going through it. Colby's episode captures that reality beautifully.","posted_at": "2026-05-25T03:10:26.000Z","posted_date": "2026-05-25","post_type": "image","has_link": false,"link_url": "","link_domain": "","has_image": true,"has_video": false,"has_document": false,"reaction_count": 2041,"comment_count": 333,"repost_count": 0,"engagement_total": 2374,"engagement_label": "very_high","signal_tags": "thought_leadership","matched_keywords": "","source_type": "profile_posts","scraped_at": "2026-05-28T00:32:08.588Z"}
🎛️ Inputs
| Field | Type | Default | Purpose |
|---|---|---|---|
profileUrls | array of strings | required | Public LinkedIn profile URLs (/in/{slug}/). |
profileLabels | object | {} | Optional per-profile label, keyed by profile URL (company, list, segment, executive role). |
maxPostsPerProfile | integer | 25 | Per-profile cap (1–200). |
maxResults | integer | 500 | Global cap on saved unique posts (1–5000). |
postedAfter | ISO date | null | Keep only posts on or after this date. |
postedBefore | ISO date | null | Keep only posts on or before this date. |
includeKeywords | array | [] | Keep only posts whose text contains at least one term. |
excludeKeywords | array | [] | Remove posts whose text contains any term. Exclusion wins. |
postTypes | array | all | Limit to detected types: text, link, image, video, document, poll, unknown. |
minReactions | integer | 0 | Minimum visible reactions. |
includeSignalTags | boolean | true | Derive lightweight business-signal tags. |
deduplicate | boolean | true | Remove duplicates by post id / canonical URL / content hash. |
proxyConfiguration | object | Apify proxy | Apify proxy or custom proxy URLs. |
🏷️ Signal tags (PRD §7)
When includeSignalTags is on, signal_tags is a pipe-separated list drawn from these rules — no AI, no LLM:
| Tag | Triggers |
|---|---|
hiring_signal | "we're hiring", "hiring", "open role", "join our team", "recruiting" |
funding_signal | "raised", "funding", "seed", "series a/b/c", "investment" |
product_signal | "launch", "released", "shipping", "new product/feature", "beta" |
growth_signal | "milestone", "revenue", "growth", "users", "customers", "ARR/MRR" |
partnership_signal | "partner", "partnership", "collaboration", "integration" |
event_signal | "conference", "webinar", "speaking", "panel", "meet us" |
thought_leadership | No commercial trigger + post >800 chars OR engagement ≥ 100 |
📈 Engagement label
engagement_total = reaction_count + comment_count + repost_count.
0–9→low10–99→moderate100–499→high500+→very_high
🚦 Proxy policy
- Apify Datacenter Proxy is the default — fine for trying the actor, but LinkedIn returns HTTP 999 (anti-bot block) for most Datacenter IPs. Expect a low success rate.
- Apify Residential Proxy is NOT supported — the run fails at startup with a clear message. The actor explicitly rejects
apifyProxyGroups: ["RESIDENTIAL"]. - Custom residential proxy via
proxyConfiguration.proxyUrlsis the production path. Requests routed through your own provider bypass Apify billing entirely and have a dramatically higher success rate against LinkedIn. Example:"proxyConfiguration": {"useApifyProxy": false,"proxyUrls": ["http://user:pass@your.residential.provider:port"]} - Block handling. HTTP
999,403,429, and404from LinkedIn flow through the request handler (not through Crawlee's parse-error path), so each block is counted underblocked_requestsand the request is retried with a fresh session / proxy.
🧮 Pricing
- Pricing model: Pay-Per-Event (
post-result). - Charged once per saved unique post row that survived all filters and was successfully pushed to the dataset.
- Never charged for: invalid profile inputs, failed profiles, blocked requests / retries, filtered-out posts, duplicates, or rows where
Actor.charge()itself errored (those are tracked separately undercharge_failures). - Per-event price is configured on the Apify Console (not in
actor.json), so it can be tuned without a new build.
📋 Run summary
The actor stores a RUN_SUMMARY entry in the default key-value store:
{"inputs_total": 3,"successful_inputs": 2,"failed_inputs": 1,"profiles_with_no_posts": 0,"raw_results_found": 78,"results_saved": 42,"duplicates_removed": 6,"filtered_out": 30,"charged_events": 42,"charge_failures": 0,"blocked_requests": 2,"retry_count": 5,"runtime_seconds": 184,"scraped_at": "2026-05-25T05:10:00.000Z"}
🛠️ Troubleshooting
"No output" / empty dataset:
- All requests returning
status=999? That's LinkedIn's anti-bot block on Apify Datacenter IPs. Switch to a custom residential proxy viaproxyConfiguration.proxyUrls(see Proxy policy above). This is the single most common cause. failed_inputsequal toinputs_total? Verify every URL is a real, public LinkedIn profile (https://www.linkedin.com/in/{slug}/) — open one in a private/incognito browser window without logging in; if you see only a login wall, the profile isn't public enough for V1.- High
profiles_with_no_posts? The profile loaded but the guest HTML didn't expose any post permalinks. Some profiles render fewer (or zero) posts to anonymous visitors. Not a bug — a coverage limitation of the no-cookie surface. - High
filtered_out? YourpostedAfter/postedBefore,includeKeywords,minReactions, orpostTypesfilter is excluding everything. Try a run with all filters cleared to confirm extraction works, then re-add filters one at a time. - Saved task input not updating after a new build? Apify keeps your previously-saved input on the actor/task — it does NOT auto-pick-up new
prefill/defaultvalues from an updatedinput_schema.json. Manually edit the input form (or "Reset to default") if you want the new prefill values.
🚫 Out of scope (V1)
- Login / cookies / session-based scraping
- Private or connection-only posts
- LinkedIn messaging, comments inbox, follower lists
- Full profile / company enrichment
- Email / phone / contact enrichment
- Downloading media files
- Scraping full comment/reaction lists by default
- AI-generated insight summaries
- Sentiment analysis
- Historical archive extraction beyond visible public posts
- CRM integrations
- Multi-platform executive monitoring
These are on the roadmap — see PRD §18.