Linkedin Smart Talent Scraper | Recruitment Tool
Pricing
from $8.00 / 1,000 results
Linkedin Smart Talent Scraper | Recruitment Tool
Collect LinkedIn people-search summaries and optionally visible profile details using your session cookie. Deduplicates profiles and reports partial results and access failures.
Pricing
from $8.00 / 1,000 results
Rating
0.0
(0)
Developer
coolinbex
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
LinkedIn Talent Scraper
Collect people-search results from LinkedIn and optionally visit each profile for visible details. Results are deduplicated by profile URL across searches and saved to an Apify dataset for JSON, CSV, or Excel export.
You need your own active LinkedIn session. Results depend on what that account can see. Profile visits collect visible sections; they do not guarantee a complete work history, education history, or skills list.
Quick start
- Log into LinkedIn in your browser. Open DevTools > Application > Cookies >
https://www.linkedin.comand copy the value ofli_at. - Paste it into LinkedIn session cookie. Enter at least one search in the form.
- Start with 10 profiles, 1 concurrent page, and profile details disabled. The default residential proxy requires Apify proxy access and adds proxy charges.
- Run the actor. Open Output > Profiles to review the people collected. Use Run summary to check completion and errors.
- Enable Collect visible profile details if needed, and set the enrichment limit to control additional requests.
Treat the session cookie as a password: paste only its value, never share it in logs or support requests. Apify stores this input as a secret. Local input files are plain text and must remain private. LinkedIn may restrict automated activity; use only accounts and data you are authorized to access. The actor stops at login and verification pages.
Example input
Replace the placeholder cookie before running:
{"liAtCookie": "REPLACE_WITH_YOUR_COOKIE_VALUE","searchQueries": [{ "keywords": "senior backend engineer", "location": "Berlin" }],"maxProfiles": 10,"scrapeFullProfiles": false,"maxConcurrency": 1,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Text fields are keywords, not exact filters. keywords, title, company, and location are joined into one search phrase. For exact location, current-company, or other LinkedIn filters, configure the search in LinkedIn and paste its people-search URL:
{"directSearchUrl": "https://www.linkedin.com/search/results/people/?keywords=engineer&geoUrn=%5B%22101165590%22%5D"}
A direct URL overrides all text fields in that query. Only HTTPS LinkedIn people-search URLs are accepted. Existing filters are preserved; start and page are reset so pagination begins at the first page. Do not use a Sales Navigator, company, profile, or login URL. Multiple searches share the result and enrichment limits. The first search to discover a profile supplies its source label; ordering across concurrent searches is not guaranteed.
Inputs
| Input | Default | Allowed values and behavior |
|---|---|---|
liAtCookie | Required | Your session cookie value, without li_at= or other cookies. |
searchQueries | Required | 1–100 objects containing non-empty text fields or a directSearchUrl. The example in the form is a prefill, not an automatic API search. Invalid entries fail the run with their array index. |
maxProfiles | 100 | Integer, 1–5,000. Maximum unique people across all searches. |
scrapeFullProfiles | false | Whether to visit profiles for visible details. |
maxProfilesToEnrich | 50 | Integer, 0–5,000. Also bounded by maxProfiles; 0 means summaries only. |
maxPagesPerQuery | 10 | Integer, 1–100. Maximum search pages per query. |
maxRunTimeSecs | 240 | Integer, 60–86,400. Stops early and saves results before the platform timeout. Set the Apify timeout at least 30 seconds higher. |
minDelayMs | 2,500 | Integer, 500–60,000. Minimum wait before navigation. |
maxDelayMs | 6,000 | Integer, 500–60,000; at least minDelayMs. |
maxConcurrency | 1 | Integer, 1–5. Maximum pages open at once. |
maxRequestRetries | 3 | Integer, 0–10. Retries after transient failures. Login and verification failures stop the run. |
proxyConfiguration | Apify residential | Standard Apify proxy settings; custom proxy URLs are supported. Set {"useApifyProxy": false} to disable proxies. |
Navigation starts are spaced across concurrent pages, including retries and enrichment. Concurrency can overlap page loading, but does not bypass the delay. More profiles, enrichment, retries, and proxy traffic increase cost. Empty searches, repeated pages, account visibility, and the page limit may return fewer people than requested. The default page limit is 10, and pagination stops after two consecutive pages add no unique profiles. Reaching maxProfiles stops new searches while allowing collected profiles to finish enrichment.
Output and exports
Every profile has the same fields. The Profiles view shows names, headlines, locations, links, connection degree, source, and enrichment status. Profile details shows the visible sections. Data quality shows visit failures, parsing warnings, and collection time. Download JSON to preserve nested experience and education entries; CSV and Excel are convenient for a shortlist.
{"fullName": "Jane Doe","headline": "Senior Backend Engineer at Acme Corp","location": "Berlin, Germany","connectionDegree": "2nd","profileUrl": "https://www.linkedin.com/in/jane-doe-123/","profileImageUrl": null,"sourceSearchQuery": "senior backend engineer | Berlin","scrapedAt": "2026-09-12T10:00:00.000Z","about": null,"experience": [],"education": [],"skills": [],"connectionsCount": null,"openToWork": null,"profileEnriched": false,"enrichmentStatus": "not_requested","enrichmentError": null,"_parseWarnings": []}
| Fields | Meaning |
|---|---|
fullName, headline, location, connectionDegree, profileImageUrl | Visible search-card values; unavailable values are null. Profile details can improve name, headline, and location. Private names remain unavailable. |
profileUrl | Canonical LinkedIn profile URL with tracking parameters removed. |
sourceSearchQuery, scrapedAt | First discovering query and UTC time the summary was collected. |
about | Visible About text, or null. |
experience | Array of { "title": string or null, "company": string or null, "duration": string or null }. Duration is source text. |
education | Array of { "school": string or null, "degree": string or null }. |
skills | Array of visible skill names. |
connectionsCount | Displayed integer or null. 500+ connections becomes 500, a lower bound. |
openToWork | true when a visible indicator is found; otherwise null. Absence does not establish availability. |
profileEnriched | Whether the profile page was successfully parsed; does not promise complete sections. |
enrichmentStatus | not_requested, limit_reached, enriched, or failed. |
enrichmentError | Reason a requested visit failed or could not finish, otherwise null. The search summary is retained. |
_parseWarnings | Missing core fields or parsing issues. Export without clean=true to retain this underscore-prefixed field. |
Empty arrays mean no items were collected, not that the person has no experience, education, or skills. This actor does not fetch contact information, email addresses, phone numbers, or private profile sections. Selectors and English-language page messages are tested against fixtures; other languages and future LinkedIn layouts may need adjustments.
Run report and failures
RUN-SUMMARY in the default key-value store contains status, startedAt, finishedAt, profilesFound, profilesSaved, profilesEnriched, failedRequests, searchPages, limitReached, runTimeLimitReached, fatalError, and errors (objects with url, label, and message). The output schema links directly to it.
When LinkedIn returns a login wall, verification challenge, empty page, or unknown layout, the actor also creates DIAGNOSTIC.json and DIAGNOSTIC.png. They contain the final URL, page title, link count, a short visible-text preview, and a private screenshot of the last failed page. Review them from the Output tab. They may contain visible LinkedIn account or profile information, so do not publish or share them without checking their contents.
A successful empty search is different from a page that failed to load: an explicit no-results message ends that search; an unrecognized page is retried. Request errors are recorded in the report instead of being mixed into the profile dataset. A run with some usable records and exhausted requests reports partial; Apify may still mark it successful, so integrations should check the report. Fatal access errors or a run with only failed requests fail the Apify run. Setup/input errors can occur before the report exists.
On normal failure, pending profiles are saved as summaries. Crawl state is periodically persisted and existing dataset rows are reconciled after migration. Abrupt termination during a storage write cannot provide transactional exactly-once delivery; consumers requiring that guarantee should deduplicate on profileUrl.
| Problem | Next step |
|---|---|
| Login wall | Log into LinkedIn manually, copy a fresh cookie, and start a new run. |
| Verification checkpoint | Resolve the challenge in your browser before starting a new run. |
| Proxy setup failure | Check residential proxy access or supply a working proxy configuration. |
| Empty or unrecognized page | Check account access and page language. If it persists, the page layout may have changed. |
| Too few profiles | Check the report, filters, page limit, and account visibility; use exact filters through a direct URL. |
| Profile visit failed | Use the retained summary and inspect enrichmentError; the profile may be unavailable. |
| Missing sections or parsing warnings | The field may be hidden, not loaded, or affected by a layout change. Enrichment does not expand every section. |
Development
Requires Node.js 22 or later. Install the locked dependencies and run the offline checks:
npm cinpm testnpm run check
On Windows with PowerShell script execution disabled, use npm.cmd in place of npm. Tests use HTML fixtures and injected storage operations; they do not log into LinkedIn or spend proxy credits. Schema tests use Apify's official validators and check emitted records against the dataset contract.
For a local live run, install Chrome, put your private input at storage/key_value_stores/default/INPUT.json, and run npm start. Set APIFY_TOKEN privately if using Apify proxy locally. The Docker build uses Apify's Node 22 Playwright/Chrome image and npm ci. Local storage, dependencies, caches, and environment files are excluded from the image.
Before publishing, build and run a small test on Apify with a valid cookie and proxy. Verify both summary-only and enriched results against the actual pages. Offline fixtures validate known layouts, not current live-site compatibility.
The schema setup follows Apify input schemas, output schemas, and dataset schemas.