LinkedIn Hashtag Feed Engagement Scraper
Pull posts published under one or more LinkedIn hashtags, with author name, headline, content, media type and reaction/comment/repost counts. Works without login; a session cookie unlocks more results.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
hashtags | array | required | Hashtags to collect. Accepts #AI, AI, artificial-intelligence, https://www.linkedin.com/feed/hashtag/ai/ or .../feed/hashtag/?keywords=ai. Duplicates are removed. |
maxPostsPerHashtag | integer | optional | Maximum posts to keep for each hashtag after the hashtag check and filters are applied. |
datePosted | string | optional | Restrict posts to a recent window. Applied by the search index and re-checked against each post's published date. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
hashtags | array | required | Hashtags to collect. Accepts #AI, AI, artificial-intelligence, https://www.linkedin.com/feed/hashtag/ai/ or .../feed/hashtag/?keywords=ai. Duplicates are removed. |
maxPostsPerHashtag | integer | optional | Maximum posts to keep for each hashtag after the hashtag check and filters are applied. |
datePosted | string | optional | Restrict posts to a recent window. Applied by the search index and re-checked against each post's published date. |
postedAfter | string | optional | Keep posts published on or after this date (YYYY-MM-DD, UTC day). Leave empty to disable. |
postedBefore | string | optional | Keep posts published on or before this date (YYYY-MM-DD, whole UTC day). Leave empty to disable. |
sortBy | string | optional | Order the posts found in this run. Relevance keeps the search index order; date and engagement sort only the posts that were found, not all of LinkedIn. |
mediaTypeFilter | string | optional | Keep only one post type. Text, image, video, article and repost are the types public posts expose most often. |
authorType | string | optional | Keep only posts written by a person or by a company page. Author type is read from the public author profile link. |
minReactions | integer | optional | Drop posts with fewer than this many reactions. A post with no visible reaction count is treated as 0. |
minComments | integer | optional | Drop posts with fewer than this many comments. A post with no visible comment count is treated as 0. |
includeComments | boolean | optional | Include the first public page of comments (up to 10) with each post. No extra request is made. |
includeVideoTranscript | boolean | optional | Add the public transcript and caption URL when a video post publishes them. |
excludeReposts | boolean | optional | Drop posts that reshare another post. |
dedupeAcrossHashtags | boolean | optional | Return each post once even when it appears under several requested hashtags. By default a post is returned once per hashtag. |
Download the published input schema
View complete JSON
{
"description": "Collect public LinkedIn posts for one or more hashtags. No LinkedIn login or cookie is needed.",
"properties": {
"authorType": {
"default": "",
"description": "Keep only posts written by a person or by a company page. Author type is read from the public author profile link.",
"editor": "select",
"enum": [
"",
"PERSON",
"COMPANY"
],
"enumTitles": [
"Anyone",
"People",
"Companies"
],
"prefill": "",
"title": "Author Type",
"type": "string"
},
"datePosted": {
"default": "",
"description": "Restrict posts to a recent window. Applied by the search index and re-checked against each post's published date.",
"editor": "select",
"enum": [
"",
"r86400",
"r604800",
"r2592000"
],
"enumTitles": [
"Any time",
"Past 24 hours",
"Past week",
"Past month"
],
"prefill": "",
"title": "Date Posted",
"type": "string"
},
"dedupeAcrossHashtags": {
"default": false,
"description": "Return each post once even when it appears under several requested hashtags. By default a post is returned once per hashtag.",
"prefill": false,
"title": "Dedupe Across Hashtags",
"type": "boolean"
},
"excludeReposts": {
"default": false,
"description": "Drop posts that reshare another post.",
"prefill": false,
"title": "Exclude Reposts",
"type": "boolean"
},
"hashtags": {
"description": "Hashtags to collect. Accepts #AI, AI, artificial-intelligence, https://www.linkedin.com/feed/hashtag/ai/ or .../feed/hashtag/?keywords=ai. Duplicates are removed.",
"editor": "stringList",
"maxItems": 20,
"minItems": 1,
"prefill": [
"AI"
],
"title": "Hashtags",
"type": "array",
"uniqueItems": true
},
"includeComments": {
"default": true,
"description": "Include the first public page of comments (up to 10) with each post. No extra request is made.",
"prefill": true,
"title": "Include Comments",
"type": "boolean"
},
"includeVideoTranscript": {
"default": false,
"description": "Add the public transcript and caption URL when a video post publishes them.",
"prefill": false,
"title": "Include Video Transcript",
"type": "boolean"
},
"maxPostsPerHashtag": {
"default": 50,
"description": "Maximum posts to keep for each hashtag after the hashtag check and filters are applied.",
"maximum": 500,
"minimum": 1,
"prefill": 3,
"title": "Max Posts Per Hashtag",
"type": "integer"
},
"mediaTypeFilter": {
"default": "",
"description": "Keep only one post type. Text, image, video, article and repost are the types public posts expose most often.",
"editor": "select",
"enum": [
"",
"text",
"image",
"video",
"article",
"document",
"repost",
"poll"
],
"enumTitles": [
"All types",
"Text only",
"Image",
"Video",
"Article",
"Document",
"Repost",
"Poll"
],
"prefill": "",
"title": "Media Type",
"type": "string"
},
"minComments": {
"default": 0,
"description": "Drop posts with fewer than this many comments. A post with no visible comment count is treated as 0.",
"maximum": 1000000,
"minimum": 0,
"prefill": 0,
"title": "Minimum Comments",
"type": "integer"
},
"minReactions": {
"default": 0,
"description": "Drop posts with fewer than this many reactions. A post with no visible reaction count is treated as 0.",
"maximum": 1000000,
"minimum": 0,
"prefill": 0,
"title": "Minimum Reactions",
"type": "integer"
},
"postedAfter": {
"default": "",
"description": "Keep posts published on or after this date (YYYY-MM-DD, UTC day). Leave empty to disable.",
"editor": "datepicker",
"prefill": "",
"title": "Posted After",
"type": "string"
},
"postedBefore": {
"default": "",
"description": "Keep posts published on or before this date (YYYY-MM-DD, whole UTC day). Leave empty to disable.",
"editor": "datepicker",
"prefill": "",
"title": "Posted Before",
"type": "string"
},
"sortBy": {
"default": "relevance",
"description": "Order the posts found in this run. Relevance keeps the search index order; date and engagement sort only the posts that were found, not all of LinkedIn.",
"editor": "select",
"enum": [
"relevance",
"date",
"engagement"
],
"enumTitles": [
"Relevance (index order)",
"Newest first",
"Most engagement first"
],
"prefill": "relevance",
"title": "Sort By",
"type": "string"
}
},
"required": [
"hashtags"
],
"schemaVersion": 1,
"title": "LinkedIn Hashtag Posts Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
posts | string | optional | Dataset containing every hashtag post collected in the run. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "One record per public LinkedIn post found for a hashtag, with author, followers, text, media, engagement and first-page comments.",
"properties": {
"posts": {
"description": "Dataset containing every hashtag post collected in the run.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "LinkedIn Hashtag Posts",
"type": "string"
}
},
"title": "LinkedIn Hashtag Posts Scraper Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"title": "LinkedIn Hashtag Posts",
"views": {
"overview": {
"display": {
"component": "table",
"properties": {
"authorFollowers": {
"format": "number",
"label": "Followers"
},
"authorName": {
"format": "text",
"label": "Author"
},
"commentsCount": {
"format": "number",
"label": "Comments"
},
"content": {
"format": "text",
"label": "Content"
},
"hashtag": {
"format": "text",
"label": "Hashtag"
},
"mediaType": {
"format": "text",
"label": "Media Type"
},
"postUrl": {
"format": "link",
"label": "Post URL"
},
"postedAt": {
"format": "datetime",
"label": "Posted At"
},
"reactionsCount": {
"format": "number",
"label": "Reactions"
}
}
},
"title": "Posts",
"transformation": {
"fields": [
"hashtag",
"authorName",
"authorFollowers",
"postedAt",
"content",
"mediaType",
"reactionsCount",
"commentsCount",
"postUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
LinkedIn Hashtag Post Monitor Scraper
Track what a professional community is publishing under a LinkedIn hashtag. Give this actor one or more hashtags and it returns the public posts behind them: full text, author identity and followers, media, reactions, comment totals and the first page of comments. No LinkedIn account, session cookie or proxy setup is required.
What it does
- Hashtag monitoring, not keyword guessing — every returned post is checked to carry the requested hashtag in its own public text, so off-topic index results are dropped
- Batch hashtags — collect several tags in one run, or return each post once across them with
dedupeAcrossHashtags - Date precision — combine a quick recency window (
datePosted) with exactpostedAfter/postedBeforedates - Engagement and audience filters — minimum reactions, minimum comments, person vs company authors, media type, and an optional repost exclusion
- Post depth — author followers and avatar, images or video, video transcript on request, repost origin, and up to 10 public comments
- Local sorting — order by relevance, newest first, or highest total engagement
- Empty fields are omitted from each record rather than written as
nullor0
Services
- Hashtag discovery across the public web index for
linkedin.com/posts - Public post hydration for text, author, date, media and engagement
- First-page comment capture without a login
- Video transcript and caption extraction for posts that publish them
- Repost detection with the original author and text
- Hashtag verification so a post is only attributed to a tag it actually uses
How it works
LinkedIn does not publish a cookieless hashtag feed, so this actor finds posts through a public search index and then opens each post's public page. During that second step it reads the post's structured public data, re-checks the hashtag in the text, and applies your date, media, author and engagement filters locally. If a post's page is sign-up walled or deleted, that post is skipped; the run never inserts placeholder or status rows.
Input
| Field | Type | Default | Description |
|---|---|---|---|
hashtags |
array | – | Required. #AI, AI, artificial-intelligence, or a LinkedIn hashtag URL. Up to 20, deduplicated. |
maxPostsPerHashtag |
integer | 50 |
Posts to keep per hashtag after verification and filters (1–500). |
datePosted |
string | any time | r86400 (24h), r604800 (week) or r2592000 (month). |
postedAfter |
date | – | Keep posts on or after this UTC day. |
postedBefore |
date | – | Keep posts on or before this UTC day. |
sortBy |
string | relevance |
relevance, date (newest first) or engagement. |
mediaTypeFilter |
string | all | text, image, video, article, document, repost or poll. |
authorType |
string | anyone | PERSON or COMPANY. |
minReactions |
integer | 0 |
Drop posts below this reaction count. |
minComments |
integer | 0 |
Drop posts below this comment count. |
includeComments |
boolean | true |
Add the first public comment page (max 10). |
includeVideoTranscript |
boolean | false |
Add transcript and caption URL when published. |
excludeReposts |
boolean | false |
Drop reshared posts. |
dedupeAcrossHashtags |
boolean | false |
One row per post across all requested hashtags. |
Example: weekly AI pulse
{
"hashtags": ["AI", "MachineLearning"],
"datePosted": "r604800",
"sortBy": "engagement",
"minReactions": 25,
"maxPostsPerHashtag": 100
}
Example: company voices in an exact date range
{
"hashtags": ["ProductManagement"],
"postedAfter": "2026-10-01",
"postedBefore": "2026-10-31",
"authorType": "COMPANY",
"excludeReposts": true
}
Example: video posts with transcripts
{
"hashtags": ["https://www.linkedin.com/feed/hashtag/generativeai/"],
"mediaTypeFilter": "video",
"includeVideoTranscript": true,
"maxPostsPerHashtag": 20
}
Output
| Field | Description |
|---|---|
postId |
LinkedIn activity ID |
postUrl |
Canonical public post URL |
hashtag |
The requested hashtag that produced this row (lowercase, no #) |
hashtags |
Every hashtag found in the post text |
matchedHashtags |
Requested hashtags that appear in this post |
authorName |
Author display name |
authorProfileUrl |
Canonical LinkedIn profile or company URL |
authorType |
person, company, school or unknown |
authorAvatar |
Author image URL when public |
authorFollowers |
Author follower count when public |
authorHeadline |
Author headline, only when the public post includes one |
postedAt |
Publication time, ISO 8601 UTC |
content |
Full public post text |
headline |
Post headline or title |
mediaType |
text, image, video, article, document or repost |
imageUrls |
Image URLs on the post |
videoUrl |
Public MP4 URL for video posts |
videoDuration |
ISO 8601 duration (e.g. PT3M36S) |
videoTranscript |
Transcript text when requested and published |
videoCaptionUrl |
Caption file URL when requested and published |
reactionsCount |
Total reactions |
commentsCount |
Total comments on the post |
comments |
Up to 10 public comments: authorName, text, postedAt, likes |
isRepost, repostOf |
Repost flag and the original authorName, authorProfileUrl, content, postUrl |
mediaItems, mediaUrls |
Structured media list and flat URL list |
articleTitle, articleUrl |
Article details when the post shares an article |
scrapedAt |
When this row was collected |
Usage cost
This actor is billed per delivered result plus normal Apify platform usage (compute and storage). The daily test uses a tiny prefill, and the actor stops as soon as it reaches maxPostsPerHashtag. Larger hashtag sets, deep caps and transcript collection take longer and therefore use more compute. See the Store listing for the current per-result price.
Use cases
- Community listening — see what practitioners post under an industry tag this week
- Creator and expert discovery — rank authors by engagement and follower count on a topic
- Campaign tracking — follow a branded hashtag and compare post volume and reactions over time
- Content benchmarking — collect the top posts in a niche before planning your own
- Competitive voice analysis — separate company-page posts from individual posts
- Research datasets — export hashtag posts with dates and engagement for analysis
FAQ
Do I need a LinkedIn account or cookie? No. The actor reads public post pages only and never asks for credentials.
Why does a hashtag return few or zero posts? LinkedIn's hashtag feed is login-gated, so discovery relies on a public search index that is not exhaustive and lags behind the site. Popular tags and wider date windows return more. The run status explains whether the index was empty, the post pages were walled, the hashtag check failed, or your filters removed everything.
Why is the comment list capped at 10?
Public post pages expose only the first comment page. The total is still in commentsCount; older comments require a signed-in session, which this actor does not use.
Why are repostsCount, viewsCount or a reaction breakdown missing?
LinkedIn does not publish share counts, view counts or per-reaction splits on public posts. Those fields are omitted rather than filled with invented zeros.
Why is authorHeadline missing on many rows?
Headlines live on profile pages, not on public post pages, and profile pages are frequently blocked. The field appears only when the post itself publishes it.
Can I get posts from several hashtags at once?
Yes. Add up to 20 tags. By default each post is returned once per matching hashtag; set dedupeAcrossHashtags to return it once.
Is sorting global?
No. Sorting applies to the posts found in this run. The public index has no sort parameter, so date and engagement order the collected set, not all of LinkedIn.
How fresh is the data? The index can take days to pick up new posts. Use the past week or month for monitoring, and treat the 24-hour window as best-effort.
Does a hashtag URL work?
Yes. Paste https://www.linkedin.com/feed/hashtag/ai/ or .../feed/hashtag/?keywords=ai; it is normalized to ai.
Is this affiliated with LinkedIn? No. It is an independent third-party actor that reads public pages. It is not affiliated with or endorsed by LinkedIn Corporation.
Notes
- Hashtag matching is case-insensitive and ignores hyphens/underscores, so
#MachineLearningand#machine-learningare treated as the same tag. - A post with no visible reaction or comment count is treated as
0when a minimum filter is set. postedBeforeincludes the whole chosen UTC day; timestamps inside the input are used exactly.- Reposts are returned by default with
mediaType: repostand the original post inrepostOf. - A zero-result run is a valid result: the dataset stays empty and the status message explains why.
Limitations
- No direct hashtag feed. LinkedIn login-gates every hashtag page, so coverage depends on the public search index and is not guaranteed to be complete.
- Index lag. Very recent posts may not be indexed yet; the 24-hour filter can be sparse.
- First comment page only. Public pages show up to 10 comments; full threads need a login.
- No repost, view or reaction-type counts. These are not published publicly.
- Author headlines are rare. Profile enrichment is not performed because profile pages are inconsistently reachable.
- Document, poll, carousel and event posts are classified only when the public page exposes a matching shape; document posts are occasionally seen, while poll, carousel and event shapes have not been observed, so the
pollfilter can return no rows. The enum values are kept for forward compatibility. - Set-local sorting. Ordering applies to the posts found in the current run.
- Practical caps. Each hashtag is limited to 500 posts, and the search index itself may stop returning new results before that.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build NnpM3ONrdHeX2rfXi. Documentation is regenerated from the default published build; private drafts are not included.