Linkedin Smart Talent Scraper | Recruitment Tool avatar

Linkedin Smart Talent Scraper | Recruitment Tool

Pricing

from $8.00 / 1,000 results

Go to Apify Store
Linkedin Smart Talent Scraper | Recruitment Tool

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

coolinbex

Maintained by Community

Actor 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

  1. Log into LinkedIn in your browser. Open DevTools > Application > Cookies > https://www.linkedin.com and copy the value of li_at.
  2. Paste it into LinkedIn session cookie. Enter at least one search in the form.
  3. Start with 10 profiles, 1 concurrent page, and profile details disabled. The default residential proxy requires Apify proxy access and adds proxy charges.
  4. Run the actor. Open Output > Profiles to review the people collected. Use Run summary to check completion and errors.
  5. 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

InputDefaultAllowed values and behavior
liAtCookieRequiredYour session cookie value, without li_at= or other cookies.
searchQueriesRequired1–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.
maxProfiles100Integer, 1–5,000. Maximum unique people across all searches.
scrapeFullProfilesfalseWhether to visit profiles for visible details.
maxProfilesToEnrich50Integer, 0–5,000. Also bounded by maxProfiles; 0 means summaries only.
maxPagesPerQuery10Integer, 1–100. Maximum search pages per query.
maxRunTimeSecs240Integer, 60–86,400. Stops early and saves results before the platform timeout. Set the Apify timeout at least 30 seconds higher.
minDelayMs2,500Integer, 500–60,000. Minimum wait before navigation.
maxDelayMs6,000Integer, 500–60,000; at least minDelayMs.
maxConcurrency1Integer, 1–5. Maximum pages open at once.
maxRequestRetries3Integer, 0–10. Retries after transient failures. Login and verification failures stop the run.
proxyConfigurationApify residentialStandard 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": []
}
FieldsMeaning
fullName, headline, location, connectionDegree, profileImageUrlVisible search-card values; unavailable values are null. Profile details can improve name, headline, and location. Private names remain unavailable.
profileUrlCanonical LinkedIn profile URL with tracking parameters removed.
sourceSearchQuery, scrapedAtFirst discovering query and UTC time the summary was collected.
aboutVisible About text, or null.
experienceArray of { "title": string or null, "company": string or null, "duration": string or null }. Duration is source text.
educationArray of { "school": string or null, "degree": string or null }.
skillsArray of visible skill names.
connectionsCountDisplayed integer or null. 500+ connections becomes 500, a lower bound.
openToWorktrue when a visible indicator is found; otherwise null. Absence does not establish availability.
profileEnrichedWhether the profile page was successfully parsed; does not promise complete sections.
enrichmentStatusnot_requested, limit_reached, enriched, or failed.
enrichmentErrorReason a requested visit failed or could not finish, otherwise null. The search summary is retained.
_parseWarningsMissing 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.

ProblemNext step
Login wallLog into LinkedIn manually, copy a fresh cookie, and start a new run.
Verification checkpointResolve the challenge in your browser before starting a new run.
Proxy setup failureCheck residential proxy access or supply a working proxy configuration.
Empty or unrecognized pageCheck account access and page language. If it persists, the page layout may have changed.
Too few profilesCheck the report, filters, page limit, and account visibility; use exact filters through a direct URL.
Profile visit failedUse the retained summary and inspect enrichmentError; the profile may be unavailable.
Missing sections or parsing warningsThe 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 ci
npm test
npm 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.