LinkedIn Profile Activity Time Scraper
Pricing
from $5.52 / 1,000 item extracteds
LinkedIn Profile Activity Time Scraper
Inspect public LinkedIn profiles and export the latest observed public activity timestamp, activity URL and type, observation time, and explicit status.
Pricing
from $5.52 / 1,000 item extracteds
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Turn a list of known prospects into a current linkedin profile activity time snapshot. The Actor inspects supplied public LinkedIn people profiles and writes one structured observation per unique profile: the latest public activity timestamp, canonical activity URL, activity type, observation time, and an explicit status.
No LinkedIn login or customer cookies are required. The Actor uses Apify Residential Proxy sessions because LinkedIn does not reliably deliver public profile pages over direct or datacenter traffic.
What does this LinkedIn activity scraper do?
For every supplied public profile URL, the Actor:
- normalizes the profile URL;
- opens the public recent-activity surface with a bounded, coherent session;
- reads structured public activity metadata;
- selects the newest observed activity;
- records when the observation happened; and
- distinguishes activity found, no activity observed, and access failure.
It does not discover people, log in to LinkedIn, or return a complete historical activity feed.
Who is it for?
- SDRs and sales operations teams prioritizing prospects who recently published public content.
- Recruiters deciding when to follow up with known candidates.
- CRM operators adding an observation timestamp and activity signal to existing lead records.
- RevOps analysts comparing scheduled snapshots in a spreadsheet, warehouse, or automation.
- Developers and AI agents that need a typed, API-friendly result instead of a human-facing profile page.
Why use it?
The output is profile-level and workflow-ready. You do not need to download a full post history just to answer “when was public activity last observed?”
Important reliability details are explicit:
no_activity_observedmeans a usable public page was inspected but no supported activity record was found;access_failedmeans LinkedIn did not return a usable public page after bounded session rotation;- a challenge page is never mislabeled as “no activity”; and
- duplicate profile URLs are processed once.
What data does it extract?
| Field | Meaning |
|---|---|
profileUrl | Canonical public LinkedIn profile URL |
profileSlug | Slug parsed from the supplied profile URL |
status | activity_found, no_activity_observed, or access_failed |
hasActivity | true, false, or null when access failed |
latestActivityAt | Latest exposed ISO 8601 activity timestamp |
latestActivityAge | Relative age text when only a relative value is exposed |
activityUrl | Canonical URL of the latest observed activity |
activityType | Normalized type such as post or article |
observedAt | Time at which this profile was inspected |
sourceUrl | Public LinkedIn activity surface requested |
httpStatus | Final upstream HTTP status when available |
error | Concise access error, otherwise null |
All activity fields can be null when LinkedIn does not expose them. Use status and hasActivity before filtering by a timestamp.
How to get started
- Open the Actor input page.
- Add one or more public URLs in
profileUrls. - Keep
USas the proxy country unless your workflow requires another supported country. - Set
maxItemsto the maximum number of unique profile observations needed. - Run the Actor.
- Open the default dataset or export it as JSON, CSV, Excel, XML, RSS, or JSONL.
- Sort successful observations by
latestActivityAtfor outreach prioritization.
Input parameters
profileUrls (required)
An array of public LinkedIn people profile URLs. Both strings and Apify request-list objects are accepted by the Actor. Only URLs matching linkedin.com/in/<slug> are supported.
{"profileUrls": [{ "url": "https://www.linkedin.com/in/ajjames" },{ "url": "https://www.linkedin.com/in/satyanadella" }]}
maxItems
Maximum number of unique profile observations written during one run. The default is 100 and the allowed range is 1–5,000.
proxyCountryCode
Two-letter country code for Apify Residential Proxy. The tested default is US. The Actor does not expose a direct or unmeasured automatic proxy fallback.
Example input
{"profileUrls": [{ "url": "https://www.linkedin.com/in/ajjames" }],"maxItems": 1,"proxyCountryCode": "US"}
Example output
This representative record is based on the current local implementation:
{"profileUrl": "https://www.linkedin.com/in/ajjames/","profileSlug": "ajjames","status": "activity_found","hasActivity": true,"latestActivityAt": "2026-02-03T00:14:35.000+00:00","latestActivityAge": null,"activityUrl": "https://www.linkedin.com/pulse/speed-becoming-liability-taste-advantage-anthony-j-james-4pyif","activityType": "article","observedAt": "2026-08-30T06:09:25.843Z","sourceUrl": "https://www.linkedin.com/in/ajjames/recent-activity/all/","httpStatus": 200,"error": null}
The source can change after this documentation is written. Always treat observedAt as the freshness boundary.
How much does it cost to inspect LinkedIn profiles?
The Actor uses pay per event:
- a $0.005 start event once per run; and
- one profile observation event for each completed public profile observation.
The provisional BRONZE profile-observation price is $0.0092 per completed profile. Failed-access records are useful diagnostics but do not emit the profile-observation charge.
For a BRONZE run, calculate the total as the start event plus the number of completed profiles multiplied by the BRONZE profile-observation event. Tier pricing can lower the per-profile event price for higher subscription tiers.
Apify platform usage and proxy traffic are included in the Store pay-per-event experience when the Actor is run from the Store; always review the live pricing tab before a large run.
Outreach-prioritization workflow
- Export target profile URLs from your CRM.
- Run this Actor on the list.
- Keep rows with
status = activity_found. - Sort by
latestActivityAtdescending. - Join the results to CRM records using
profileUrl. - Route recently active prospects into a timely, human-reviewed outreach sequence.
The Actor reports a public signal. It does not determine intent, availability, or willingness to be contacted.
Recurring monitoring workflow
Schedule the same Task daily or weekly and store each dataset with its observedAt value. Compare the newest snapshot with the previous snapshot to identify a changed activityUrl or latestActivityAt.
The Actor does not maintain history or send alerts itself. Use Apify schedules, webhooks, Make, Zapier, Google Sheets, or your warehouse to retain and compare snapshots.
API with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~linkedin-profile-recent-activity-time/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"profileUrls": [{"url": "https://www.linkedin.com/in/ajjames"}],"maxItems": 1,"proxyCountryCode": "US"}'
Never commit your Apify token to source control.
API with JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/linkedin-profile-recent-activity-time').call({profileUrls: [{ url: 'https://www.linkedin.com/in/ajjames' }],maxItems: 1,proxyCountryCode: 'US',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
API with Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("automation-lab/linkedin-profile-recent-activity-time").call(run_input={"profileUrls": [{"url": "https://www.linkedin.com/in/ajjames"}],"maxItems": 1,"proxyCountryCode": "US",})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(items)
Use with MCP and AI agents
Add the Actor-specific Apify MCP endpoint to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/linkedin-profile-recent-activity-time"
Claude Desktop
Add this server object to the Claude Desktop MCP configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/linkedin-profile-recent-activity-time"}}}
Cursor
Add the same apify server under Settings → MCP in Cursor.
VS Code
Add the same Actor-specific URL to your VS Code MCP server configuration. Your client opens the Apify OAuth flow the first time it connects.
Example prompts:
- “Inspect these public LinkedIn profile URLs and rank successful observations by latest activity time.”
- “Run a snapshot for this prospect list and return only profiles with a newly observed activity URL.”
- “Export access failures separately so I can retry them later.”
Integrations
- Google Sheets: append one observation row per profile and sort by timestamp.
- Make or Zapier: trigger the Actor from a new CRM list and continue when the run finishes.
- Webhooks: notify an internal pipeline when a scheduled snapshot completes.
- Warehouses: retain
profileUrl,latestActivityAt, andobservedAtfor historical comparisons. - CRM enrichment: join by canonical profile URL and preserve the observation status.
Limits and failure behavior
LinkedIn controls public delivery and can change page structure without notice. Public visibility also varies by profile and geography.
- The Actor requires Apify Residential Proxy access.
- It supports public people profile URLs, not company, school, job, search, or Sales Navigator URLs.
- It reports only activity exposed on the public page; it cannot prove that a person has no private or unexposed activity.
no_activity_observedis an observation, not a claim that no activity exists anywhere.access_failedis not charged as a completed profile observation.- Repeated URLs are deduplicated within the run.
- A timestamp may be null when LinkedIn exposes only relative age text.
- Deleted or visibility-restricted activities may disappear between runs.
Tips for reliable runs
- Supply canonical
https://www.linkedin.com/in/...profile URLs. - Keep
USunless a specific supported geography is important to your workflow. - Use moderate batches and rerun only
access_failedrows instead of blindly repeating the full list. - Store
observedAtwith every downstream record. - Do not interpret a publication timestamp as proof of current buying intent.
Responsible use and legality
Use the Actor only for lawful purposes and data you are permitted to process. Public accessibility does not remove obligations under privacy, data-protection, employment, anti-spam, contractual, or sector-specific rules.
Follow LinkedIn's applicable terms and local law. Minimize collected data, define a retention period, secure exports, honor relevant rights requests, and keep consequential outreach or recruiting decisions under human review. Do not use this Actor for harassment, surveillance, discrimination, or attempts to access non-public information.
Frequently asked questions
Does it require LinkedIn cookies or a login?
No customer cookies or LinkedIn account are required. The Actor uses bounded public-page sessions through Apify Residential Proxy.
Does it return all posts, comments, and reactions?
No. It returns a profile-level latest observed public activity signal. For recent public post records, use the related LinkedIn Profile Posts Scraper.
What does no_activity_observed mean?
A usable public page was inspected, but no supported public activity record was found. It does not prove that the person has never been active.
Why did I receive access_failed?
LinkedIn returned a challenge, an unusable page, or no response after bounded session rotation. Retry that row later. The Actor keeps access failure distinct from no activity and does not charge it as a completed observation.
Can I schedule recurring checks?
Yes. Save the input as an Apify Task, attach a schedule, and retain each run's dataset. Comparison and alerting are downstream workflow steps rather than built-in history.
Why is the latest activity timestamp null?
LinkedIn may expose only relative age text on some public surfaces. In that case, inspect latestActivityAge. If both fields are null, check status and error.
Related automation-lab Actors
- LinkedIn Profile Posts Scraper — extract recent public posts and articles when you need post-level records.
- LinkedIn Public People Profile Scraper — enrich known public profile URLs with identity and career fields exposed publicly.
- LinkedIn Profile URL Finder — resolve known people to likely public profile URLs before activity inspection.
Support
When reporting a problem, include a redacted input, run URL, affected profile URL if it is safe to share, expected status, and observed status. Do not include Apify tokens, private cookies, or confidential CRM data.