LinkedIn Profile & Company Posts Scraper Links & Tagged Account
Pricing
$19.99/month + usage
LinkedIn Profile & Company Posts Scraper Links & Tagged Account
Linkedin Profile And Company Posts Scraper extracts public LinkedIn posts from profiles and company pages. Collect structured post data including content, timestamps, reactions, and URLs for lead generation, analytics, recruitment, and competitor research. Scalable and API-ready 🚀
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
ScrapAPI
Maintained by CommunityActor stats
0
Bookmarked
8
Total users
1
Monthly active users
10 days ago
Last modified
Share
LinkedIn Profile & Company Posts Scraper — Outbound Links & Tagged Accounts
Scrape posts from LinkedIn company and profile pages, and get — for every post — the outbound links it sends people to, the link-preview card LinkedIn shows underneath it, the people/companies/showcase pages it tags, and the hashtags it uses. Built on top of the base LinkedIn Profile & Company Posts Scraper: every base output field is still there, unchanged, plus six new fields read from the same page HTML the base already downloads.
Why use this actor
- See where a post's traffic really goes. LinkedIn wraps every link in its own redirect address
(
linkedin.com/redir/redirect?url=…orlinkedin.com/signup/cold-join?session_redirect=…); this actor decodes both wrappers and gives you the real destination URL and domain. - See who a post tags. People, companies and LinkedIn showcase pages mentioned in a post's own text, each as a display name, a real LinkedIn URL, and a type.
- See the campaign hashtags a post uses, each with a working
/feed/hashtag/…URL. - Optionally unmask
lnkd.inshort links to the page they actually open (one extra request per masked link, off by default). - Filter live to only the posts that tag a given account, or that link to a given domain.
- Bulk URLs, proxy fallback, live saving — identical to the base actor (direct → datacenter → residential proxy fallback; posts land in the dataset as soon as they're scraped).
Input
| Field | Type | Required | Description |
|---|---|---|---|
urls | array | Yes | Company or profile URLs to scrape, one per line. |
maxPosts | integer | No | Max posts to collect per URL (default 10, 1–500). |
targetType | string | No | company, profile, or both (default both). |
proxyConfiguration | object | No | Apify proxy settings. Default: no proxy; the actor falls back to datacenter then residential if LinkedIn blocks it. |
includePostLinks | boolean | No | Return outboundLinks and linkPreview (default true). |
includeTaggedAccounts | boolean | No | Return taggedAccounts (default true). |
includeHashtags | boolean | No | Return hashtags (default true). |
resolveShortLinks | boolean | No | Open each masked lnkd.in link once to find its real destination (default false — costs one extra request per masked link). |
mentionsAccounts | array | No | Keep only posts that tag one of these accounts — a name, a slug, or a full LinkedIn URL. Empty = keep every post (default). |
linkDomains | array | No | Keep only posts whose links point at one of these domains. Empty = keep every post (default). |
Example input
{"urls": ["https://www.linkedin.com/company/google/","https://www.linkedin.com/in/ajjames"],"maxPosts": 10,"targetType": "both","proxyConfiguration": { "useApifyProxy": false },"includePostLinks": true,"includeTaggedAccounts": true,"includeHashtags": true,"resolveShortLinks": false,"mentionsAccounts": [],"linkDomains": []}
Output
One dataset row per post. Every base field is unchanged (see the base actor's own docs for the full list —
urn, text, url, postedAtISO, authorType, authorFullName, numLikes, numComments, images,
author{…}, and the rest), plus six new fields:
{// ...all base fields, unchanged..."outboundLinks": [{"url": "https://blog.google/innovation-and-ai/technology/families/kids-summer-screen-time-tips/","asWritten": "https://www.linkedin.com/redir/redirect?url=...&urlhash=Xz2p","source": "card", // "card" = the link-preview card | "text" = a link inside the post text"domain": "blog.google","resolved": false // true only when this URL came from an lnkd.in lookup}],"linkPreview": { // null when the post has no preview card"url": "https://stripe.com/blog/mapping-the-ai-economy","title": "Mapping the AI economy","subtitle": "stripe.com", // LinkedIn's own subtitle text, verbatim"domain": "stripe.com","image": "https://media.licdn.com/dms/image/...","pointsToLinkedIn": false // true when the card points at a LinkedIn Pulse article, not an outside site},"taggedAccounts": [{ "name": "YouTube", "url": "https://www.linkedin.com/company/youtube", "type": "company" }],"hashtags": [{ "tag": "#MadeByGoogle", "url": "https://www.linkedin.com/feed/hashtag/madebygoogle" }],"hasOutboundLink": true, // convenience boolean, not the purpose"taggedAccountCount": 1 // convenience count, not the purpose}
Every added field is present on every row for a stable shape: [] for the three arrays, null for
linkPreview, false/0 for the two convenience fields when there is nothing to report.
How to run
- Open Apify Console → Actors.
- Select this actor.
- Set urls (and optionally the other fields above).
- Click Start.
- Check Log for progress and proxy fallback messages.
- Use the Dataset in the Output tab, or the default table view, which surfaces
hasOutboundLinkandtaggedAccountCountalongside the base columns.
Honest limits
- These fields are real, but sparse — not every post carries one. Across sampled company feeds:
in-text links on roughly 22 of 49 posts, tagged accounts on 18 of 49, link-preview cards on 8 of 49,
hashtags on 7 of 49. Posts with none come back with empty lists/
null, not fabricated placeholders. Both filters default to empty for exactly this reason — a default run must never return an empty dataset. - Frequency swings hard by account. Some company pages carry a link card on most of their posts, others carry none at all. Don't expect a fixed hit rate.
- The base's
attributesfield still comes back empty ([]) — that is correct, not a bug. It is the base actor's own dead mentions extractor, preserved untouched. The real tagged-account data lives in the newtaggedAccountsfield. lnkd.inresolution is opt-in, costs one extra request per masked link, and is not guaranteed to succeed. It tries once, never retries, and never escalates the proxy tier. In our own testing, LinkedIn'slnkd.inshortener returnedHTTP 403to it more often than not; when that happens (or on any timeout or non-match) the maskedlnkd.inaddress is returned exactly as written, withresolved: false— never a guess.- Profile pages that lead with Pulse/newsletter articles return empty new fields for those specific rows. A Pulse article's own URL carries no activity id, so it cannot be matched to a feed card — the fields are left empty rather than guessed. Posts joined to a real feed card (both on company pages and on profile pages that surface short-form posts) do get real data.
- About 10 posts per account per run, logged out — this is a base-actor ceiling (LinkedIn publishes
roughly ten posts to a signed-out visitor), unchanged by this variant. Setting
maxPostshigher will not produce more rows. - Domains are parsed from links LinkedIn published. The preview card's
subtitleis returned verbatim, including the"<Account> on LinkedIn"string LinkedIn itself uses when the card points at a Pulse article rather than an outside site (pointsToLinkedIn: truein that case). - The destination page is never opened. This actor returns the address a post links to; it does not crawl, title-fetch, or download anything from that page.
- Nothing is computed or compared across runs. No score, ranking, or "changed since last run" — every value is read live, in this run.
- Logged out only. No login, no cookie, no API key.
- Personal data. Tagged accounts are real people and companies — handle exports in line with GDPR and LinkedIn's terms.
Cautions
- Data is from publicly available pages only.
- You are responsible for compliance with applicable laws (privacy, data protection, terms of use).