LinkedIn Post Scraper: Posting Cadence Analytics
Pricing
$24.99/month + usage
LinkedIn Post Scraper: Posting Cadence Analytics
Scrape LinkedIn posts with text, images, authors, timestamps, reactions, comments, and engagement metrics. Ideal for market research, lead insights, competitor analysis, trend tracking, and content monitoring for recruiters, marketers, sales teams, and analysts.
Pricing
$24.99/month + usage
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
31
Total users
5
Monthly active users
11 days ago
Last modified
Categories
Share
LinkedIn Post Scraper — Posts and Posting Cadence Analytics
LinkedIn Post Scraper: Posting Cadence Analytics collects public posts from any LinkedIn company page, person profile, or post URL — logged out, no LinkedIn account needed — and returns two result types: individual post rows and a per-source cadence summary with posts-per-week, average gap between posts, most-active posting day and hour, and freshness buckets. Every response is structured JSON, ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. Point it at a competitor's page and see exactly how often they publish.
What is LinkedIn Post Scraper: Posting Cadence Analytics?
LinkedIn Post Scraper: Posting Cadence Analytics is a query-driven Actor that takes one or more LinkedIn company, person, or post URLs and returns both the underlying posts and a computed posting-cadence summary for each source. Its differentiator is that the cadence numbers — posts per week, average and median gap between posts, most-active day and hour, and freshness buckets — are calculated locally from each post's exact URN-decoded creation timestamp, not estimated from the relative "2d ago" label shown on the page. It runs entirely logged out: no LinkedIn account, password, or session cookie is required.
- Collects public posts from company pages, person profiles, and post permalinks, following the linked post graph (
crawlLinkedGraph) to build a fuller sample. - Decodes the exact creation timestamp from each post's numeric URN (
activityCreatedAt, accurate to the second) instead of relying on the page's relative time text. - Computes per-source posting cadence:
postsPerWeek,avgGapDays,medianGapDays,longestGapDays,mostActiveDay,mostActiveHour(UTC), and freshness buckets for the last 7/30/90 days. - Filters posts to an exact date window (
oldestDate/newestDate), accepting absolute dates or relative expressions like30 days. - Extracts hashtags, images, and author details from each post's JSON-LD/Open Graph data.
- Batches any number of URLs into a single run, producing one cadence summary per source.
What data can you get with LinkedIn Post Scraper: Posting Cadence Analytics?
The Actor writes two result types into one dataset, distinguished by the isSummary flag.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Post row | urn, activityId, urnType, activityCreatedAt, activityCreatedAtMs, postAgeDays, postAgeHours, text, postContent, url, postedAtTimestamp, postedAtISO, timeSincePosted, isRepost, authorType, authorFullName, authorHeadline, authorProfileUrl, authorProfileId, author (firstName/lastName/occupation/picture), image, images, type, hashtags, sourceUrl, scrapedAt | Feed monitoring, content archiving, per-post text/hashtag analysis |
| Cadence-summary row | sourceUrl, postsAnalyzed, postsWithExactDate, oldestPostDate, newestPostDate, postsPerWeek, avgGapDays, medianGapDays, longestGapDays, mostActiveDay, mostActiveHour, mostRecentPostAgeDays, freshnessBuckets (last7Days/last30Days/last90Days/older), scrapedAt | Posting-frequency benchmarking, trend and freshness monitoring |
Posting cadence analytics
This is the one result competing LinkedIn post scrapers don't compute: a per-source cadence roll-up, built entirely from timestamps the Actor decodes itself. Each post's numeric URN (urn:li:activity:...) carries its creation time in a 41-bit millisecond value in its high bits, so activityCreatedAt is accurate to the second even when the page's JSON-LD omits a published date. Once a source's posts are collected, the Actor sorts their decoded timestamps and computes the gaps between consecutive posts locally — no LinkedIn analytics endpoint involved. The summary only counts posts whose timestamp actually decoded (postsWithExactDate), so the numbers are never based on a guess. A cadence row looks like:
{"isSummary": true,"sourceUrl": "https://www.linkedin.com/company/google/","postsAnalyzed": 20,"postsWithExactDate": 20,"postsPerWeek": 3.5,"avgGapDays": 2.1,"medianGapDays": 1.8,"longestGapDays": 6.4,"mostActiveDay": "Tuesday","mostActiveHour": 15,"freshnessBuckets": { "last7Days": 4, "last30Days": 12, "last90Days": 20, "older": 0 }}
Post rows with exact URN-decoded timestamps
Alongside the cadence summary, every individual post is returned as its own row with text, hashtags, images, author name/type/headline, and both the exact decoded activityCreatedAt and, when the page includes it, the JSON-LD postedAtISO date. postAgeDays is pre-computed so you don't have to diff timestamps yourself. Reaction, comment, and share counts are login-gated on LinkedIn and are returned as null rather than fabricated — this Actor never invents an engagement number it can't see logged out.
How does LinkedIn Post Scraper: Posting Cadence Analytics differ from the official LinkedIn API?
LinkedIn's official API surface for posts — the Marketing Developer Platform and Community Management API — is restricted to approved Partner Program members and, even then, generally scopes post access to Company Pages the requesting app administers. It has no equivalent to pulling a competitor's or a third party's public post history, and it does not expose a posting-cadence computation at all — you'd get raw counts for your own page and have to build the cadence math yourself.
| Feature | LinkedIn official API | LinkedIn Post Scraper: Posting Cadence Analytics |
|---|---|---|
| Access requirements | Partner Program application, use-case review, OAuth app | An Apify account; no LinkedIn credentials |
| Scope of posts | Company Pages/profiles the app is authorized for | Any public company, person, or post URL |
| Posting-cadence metrics | Not provided — raw activity data only | postsPerWeek, avgGapDays, mostActiveDay/Hour, freshness buckets, computed per run |
| Exact post timestamp | Available for owned/authorized content | Decoded from the post URN for any public post, no authorization needed |
| Setup time | Application review and scope approval | Add URL(s) and run |
| Output | LinkedIn's versioned API schema | Normalized JSON dataset, exportable as JSON, CSV, or Excel |
Use the official API when you manage the Page and only need your own analytics inside an approved app. Use this Actor when you need cadence data for public pages you don't administer — your own or a competitor's — without an API approval process.
How to scrape LinkedIn with LinkedIn Post Scraper: Posting Cadence Analytics?
- Open the LinkedIn Post Scraper: Posting Cadence Analytics page on the Apify Store and click Try for free (or Run, if you already have it saved).
- Add one or more LinkedIn company, person, or post URLs to
profileUrls— no field on this Actor is strictly required by the schema, but the run needs at least one URL to produce any rows. - Set
postsPerSourcefor how many posts to pull per URL, andoldestDate/newestDateif you want to bound the cadence window. - Start the run.
- Download or stream the results as JSON, CSV, or Excel once the run finishes.
POST https://api.apify.com/v2/acts/YOUR_USERNAME~linkedin-post-scraper-posting-cadence-analytics/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN{"profileUrls": ["https://www.linkedin.com/company/google/"],"postsPerSource": 20,"oldestDate": "90 days","includeCadenceSummary": true}
How to run multiple queries in one job
profileUrls accepts an array, so a single run can cover many companies or people at once — add each LinkedIn URL as its own entry in the list. The Actor processes each source in turn and, when includeCadenceSummary is on, emits one cadence-summary row per source alongside its post rows, all landing in the same output dataset so you can compare cadence across sources from one export.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
profileUrls | No | array | LinkedIn company, person, or post permalink URLs to measure. Bare company slugs (e.g. google) are accepted too. | ["https://www.linkedin.com/company/google/"] |
postsPerSource | No | integer | How many recent posts to collect and feed into the cadence roll-up for each URL. Default 15. | 20 |
oldestDate | No | string | Only include posts created on/after this date (exact URN-decoded time). Absolute or relative (30 days). | "90 days" |
newestDate | No | string | Only include posts created on/before this date (exact URN-decoded time). Absolute or relative (7 days). | "7 days" |
includeCadenceSummary | No | boolean | Append one cadence-summary row per source. Default true. | true |
crawlLinkedGraph | No | boolean | Follow post URNs discovered on the source page to collect more posts (BFS crawl). Default true. | true |
advancedOptions | No | boolean | Show the advanced settings section (proxy, raw data). Default false. | false |
rawData | No | boolean | Attach the source HTML to each row for debugging. Default false. | false |
proxyConfiguration | No | object | Optional proxy configuration for reliability and to reduce rate-limiting. | {"useApifyProxy": false} |
Example input:
{"profileUrls": ["https://www.linkedin.com/company/google/", "https://www.linkedin.com/in/williamhgates/"],"postsPerSource": 20,"oldestDate": "90 days","includeCadenceSummary": true,"crawlLinkedGraph": true}
Pitfall: none of the nine parameters are marked required in the schema, but profileUrls effectively is — leave it empty and the run logs "No LinkedIn URLs provided" and exits with zero rows. Always supply at least one company, person, or post URL.
⬆️ Output
Results are written to a single Apify dataset, one JSON object per row, exportable as JSON, CSV, Excel, or via the API. Post rows and cadence-summary rows share the same dataset and are told apart by isSummary.
Scraped results
[{"isSummary": false,"urn": "urn:li:activity:7203919097578811392","activityId": "7203919097578811392","urnType": "activity","activityCreatedAt": "2024-06-05T00:42:35.207000Z","postAgeDays": 401.48,"authorFullName": "Google","authorType": "Company","text": "Excited to share our latest research on...","hashtags": ["AI", "CloudComputing"],"url": "https://www.linkedin.com/posts/google_ai-cloudcomputing-activity-7203919097578811392","image": "https://media.licdn.com/dms/image/example1.jpg","sourceUrl": "https://www.linkedin.com/company/google/","scrapedAt": "2026-07-25T09:12:03.000000Z"},{"isSummary": false,"urn": "urn:li:activity:7206482113340928000","activityId": "7206482113340928000","urnType": "activity","activityCreatedAt": "2024-06-11T14:07:52.000000Z","postAgeDays": 395.15,"authorFullName": "Google","authorType": "Company","text": "Congratulations to the teams recognized at this year's...","hashtags": ["Innovation"],"url": "https://www.linkedin.com/posts/google_innovation-activity-7206482113340928000","image": "","sourceUrl": "https://www.linkedin.com/company/google/","scrapedAt": "2026-07-25T09:12:04.000000Z"},{"isSummary": true,"sourceUrl": "https://www.linkedin.com/company/google/","postsAnalyzed": 20,"postsWithExactDate": 20,"oldestPostDate": "2024-04-02T11:30:00.000000Z","newestPostDate": "2024-06-11T14:07:52.000000Z","postsPerWeek": 2.03,"avgGapDays": 3.45,"medianGapDays": 2.9,"longestGapDays": 9.1,"mostActiveDay": "Tuesday","mostActiveHour": 15,"mostRecentPostAgeDays": 395.15,"freshnessBuckets": { "last7Days": 0, "last30Days": 0, "last90Days": 0, "older": 20 },"scrapedAt": "2026-07-25T09:12:05.000000Z"}]
How can I use the data extracted with LinkedIn Post Scraper: Posting Cadence Analytics?
- Thought-leadership monitoring: comms and executive-branding teams can track how consistently a founder or exec profile posts by re-running against the same
profileUrlsand watchingpostsPerWeekandmostRecentPostAgeDaysfor signs a voice has gone quiet. - Content strategy: social teams can benchmark their own
postsPerWeekandmostActiveDay/mostActiveHouragainst competitor company pages to decide when and how often to publish. - AI engineers and LLM developers: an agent can issue a query with a company URL, receive the structured post and cadence JSON, and ground its answer in the actual
text,hashtags, andpostsPerWeekfields rather than a model guess. - Competitive benchmarking: growth and recruiting teams can compare
freshnessBucketsandlongestGapDaysacross a list of competitor or candidate-company pages to spot who is actively publishing versus dormant.
How do you monitor posting cadence over time?
Posting-cadence monitoring means re-running the same set of profileUrls on a schedule and diffing the cadence-summary row each time, rather than reading a single snapshot. Each run recomputes postsPerWeek, avgGapDays, medianGapDays, mostActiveDay/mostActiveHour, and freshnessBuckets from whatever posts are currently public and decodable, so a change between two runs reflects a real change in publishing behavior — a page that goes from postsPerWeek: 3.5 to postsPerWeek: 0.8, or whose longestGapDays climbs sharply, has genuinely slowed down.
The fields worth diffing run-over-run are postsPerWeek, avgGapDays, longestGapDays, mostActiveDay, mostActiveHour, and freshnessBuckets.last7Days. A practical workflow: schedule a run across your watchlist of company or person URLs weekly, keep each run's cadence-summary rows, and alert when postsPerWeek drops by some threshold or last7Days hits zero for a page that normally posts daily.
To automate the schedule, use Apify's built-in Scheduler to trigger runs at a fixed interval and either read the dataset via the API afterward or attach a webhook on run completion — this Actor doesn't have its own scheduler, so the run cadence is controlled at the platform level.
Integrate LinkedIn Post Scraper: Posting Cadence Analytics and automate your workflow
LinkedIn Post Scraper: Posting Cadence Analytics works with any language or tool that can send an HTTP request.
REST API with Python
import requestsrun_input = {"profileUrls": ["https://www.linkedin.com/company/google/"],"postsPerSource": 20,"oldestDate": "90 days","includeCadenceSummary": True,}resp = requests.post("https://api.apify.com/v2/acts/YOUR_USERNAME~linkedin-post-scraper-posting-cadence-analytics/run-sync-get-dataset-items",params={"token": "YOUR_APIFY_TOKEN"},json=run_input,)for row in resp.json():if row.get("isSummary"):print(row["sourceUrl"], row["postsPerWeek"], "posts/week")
MCP for query-grounded AI agents
The Actor is reachable through Apify's MCP server. Run it locally with APIFY_TOKEN=your_token npx -y @apify/actors-mcp-server --actors YOUR_USERNAME/linkedin-post-scraper-posting-cadence-analytics, or connect to the hosted endpoint at https://mcp.apify.com with a Bearer token. An MCP-compatible client — Claude Desktop, Claude Code, Cursor, and similar agent frameworks — can then call the Actor as a tool: the agent sends a LinkedIn URL, gets back post and cadence JSON, and answers grounded in the real numbers instead of a guess.
Scheduled monitoring and delivery
This Actor has no built-in scheduler or webhook of its own; use Apify's platform Scheduler to trigger runs on a recurring interval, and an Apify webhook on the run-succeeded event to push the finished dataset to your own endpoint for storage or alerting.
Is it legal to scrape LinkedIn posts?
Scraping publicly accessible LinkedIn posts — content visible to any logged-out visitor — is generally treated as accessing public data, and this Actor returns only what a logged-out visitor can already see; it never accesses private profiles, gated content, or authenticated sessions. Author names, headlines, and profile URLs returned in post rows are personal data under GDPR and CCPA, so if you store or process this data in the EU/UK or California, you're the data controller for that use and are responsible for a lawful basis, retention limits, and any applicable data-subject rights. Scraping for one-off competitive monitoring carries a different risk profile than bulk collection for AI training or resale — the latter draws far more regulatory and platform-ToS scrutiny. Consult your legal team for commercial use cases involving bulk data storage.
Frequently asked questions
How is posting cadence actually calculated?
Locally, from timestamps this Actor decodes itself: each post's numeric URN encodes its creation time in the high 41 bits, so activityCreatedAtMs is computed with a bit-shift, not scraped from a relative-time label. Once a source's posts are sorted by that decoded time, the Actor computes the gaps between consecutive posts to get avgGapDays, medianGapDays, and longestGapDays, divides post count by the date span in weeks for postsPerWeek, and tallies weekday/hour counts for mostActiveDay/mostActiveHour. Only posts with a successfully decoded timestamp (postsWithExactDate) feed the roll-up.
How many results does LinkedIn Post Scraper: Posting Cadence Analytics return per query?
Up to postsPerSource posts per URL (default 15) — you can request more, and the actual count returned depends on how many distinct posts are discoverable from the source page and its linked post graph, not a fixed platform cap.
Does LinkedIn Post Scraper: Posting Cadence Analytics extract posting cadence for every source?
Yes, when includeCadenceSummary is left on (its default). One isSummary: true row is added per source containing postsPerWeek, avgGapDays, medianGapDays, longestGapDays, mostActiveDay, mostActiveHour, and freshnessBuckets. If a source returns zero posts, no summary row is produced for it.
Can I control which posts are included by date?
Yes — oldestDate and newestDate filter posts against the exact URN-decoded creation time, not the page's displayed relative date. Both accept an absolute date (2026-01-01) or a relative expression like 30 days or 3 months; leave either blank for no bound on that side.
How does LinkedIn Post Scraper: Posting Cadence Analytics handle LinkedIn's anti-bot measures?
It retries failed requests with exponential backoff on rate-limit (429) responses, and accepts an optional Apify proxy configuration (proxyConfiguration) to distribute requests across IPs. It does not solve CAPTCHAs or bypass logged-in-only content — it works entirely from what a logged-out visitor's request returns.
How do I use this Actor to monitor a company's or person's posting cadence over time?
Schedule a run across the same profileUrls on a recurring interval, keep each run's cadence-summary row, and compare postsPerWeek, avgGapDays, and freshnessBuckets.last7Days against the previous run to spot a slowdown or a spike in activity.
Does LinkedIn Post Scraper: Posting Cadence Analytics work with Claude, ChatGPT, and AI agent frameworks?
Yes. It's reachable through Apify's MCP server (npx @apify/actors-mcp-server --actors .../linkedin-post-scraper-posting-cadence-analytics or the hosted https://mcp.apify.com endpoint), and it's callable as a plain HTTP endpoint by any agent framework, which lets an agent retrieve live post and cadence data before generating an answer.
How does LinkedIn Post Scraper: Posting Cadence Analytics compare to other LinkedIn post scrapers?
Most LinkedIn post scrapers return a list of posts and stop there, leaving frequency analysis to the user. This Actor adds the cadence roll-up (postsPerWeek, avgGapDays, mostActiveDay/mostActiveHour, freshness buckets) as a computed, checkable output field rather than a marketing label, and decodes exact post timestamps from the URN instead of relying on the page's relative-time text.
Can I use this Actor without managing proxies or LinkedIn credentials?
Yes. It runs logged out, so no LinkedIn account, password, or cookie is needed. proxyConfiguration is optional — supply your own or an Apify proxy if you hit rate-limiting, but the Actor runs without one.
Does it return engagement metrics like reactions or comments?
No. Reaction counts, comment counts, and share counts are login-gated on LinkedIn; rather than fabricate them, this Actor returns null for reactions, comments, numLikes, numShares, and numComments. If you need engagement counts, they require a cookie-authenticated scraper.
Your feedback
Found a bug or a field that doesn't match what LinkedIn shows? Let Scrapier know through the Actor's Issues tab on Apify or the support contact on its Store listing — reports like this directly shape what gets fixed next.