LinkedIn Jobs Scraper avatar

LinkedIn Jobs Scraper

Pricing

$0.80 / 1,000 linkedin jobs

Go to Apify Store
LinkedIn Jobs Scraper

LinkedIn Jobs Scraper

Scrape public LinkedIn jobs without login or cookies. Batch keywords, locations, job URLs, and IDs; filter by date, workplace, experience, and job type; optionally fetch full descriptions. Direct requests first, residential fallback only when blocked.

Pricing

$0.80 / 1,000 linkedin jobs

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Collect public LinkedIn job listings without login, cookies, or a LinkedIn account. The actor uses LinkedIn's lightweight public guest jobs endpoints, starts with direct datacenter traffic, and activates rotating Apify residential proxy sessions only after a block or rate limit.

It supports batch keyword and location searches, direct job URLs and IDs, pagination, global deduplication, server-side LinkedIn filters, and optional full job descriptions.

Why this actor

  • No login, cookies, or LinkedIn account.
  • Batch every query against every location in one run.
  • Mix search results with direct LinkedIn job URLs and IDs.
  • Filter by country/location, date posted, workplace type, experience level, and job type.
  • Choose fast card-only output or full descriptions and job criteria.
  • Deduplicate all jobs globally by LinkedIn job ID.
  • Use direct requests first to avoid residential bandwidth cost.
  • Receive explicit, uncharged diagnostics for blocked, empty, invalid, or failed sources.

Input

FieldDescription
searchQueriesJob titles or keywords. Each query is paired with each location.
locationsCities, regions, or countries. Leave empty for an unrestricted location search.
countryOptional country name appended to every location or used alone.
jobUrlsDirect public LinkedIn /jobs/view/ URLs.
jobIdsDirect numeric LinkedIn job IDs.
datePostedany, past24h, pastWeek, or pastMonth.
workplaceTypeany, onSite, remote, or hybrid.
experienceLevelsOne or more of internship, entry, associate, midSenior, director, executive.
jobTypesOne or more of fullTime, partTime, contract, temporary, internship, volunteer, other.
sortByrelevance or recent.
includeDetailsFetch descriptions, seniority, employment type, job function, industries, and applicant text. Direct IDs and URLs always fetch details.
maxItemsGlobal unique job limit across every source. Default 100, maximum 5,000.
maxPagesPerSearchPer query/location pagination limit. Default 10.
countryCodeOptional two-letter country for residential fallback, such as US, CA, GB, or DE.
proxyConfigurationFallback proxy configuration. It is not used until direct traffic is blocked or rate-limited.
maxProxyRetriesFresh residential sessions tried per blocked request. Default 3.
requestTimeoutSecsPer-request timeout. Default 20 seconds.

No field is required. An input with no query, URL, or ID returns exactly one clearly labeled _sample: true row and does not charge.

Batch search example

This creates four searches: two queries multiplied by two locations.

{
"searchQueries": ["software engineer", "data engineer"],
"locations": ["Toronto, Ontario", "Vancouver, British Columbia"],
"country": "Canada",
"datePosted": "pastWeek",
"workplaceType": "remote",
"experienceLevels": ["entry", "associate", "midSenior"],
"jobTypes": ["fullTime", "contract"],
"sortBy": "recent",
"includeDetails": false,
"maxItems": 100
}

Direct job example

{
"jobUrls": [
"https://www.linkedin.com/jobs/view/example-role-1234567890"
],
"jobIds": ["9876543210"],
"maxItems": 10
}

Output

Each successful real job row contains:

  • jobId, title, company, companyUrl, and companyLogo
  • location, salary, postedAt, and postedText
  • workplaceType, employmentType, and seniorityLevel
  • jobFunction, industries, and applicants
  • description and descriptionHtml when details are fetched
  • canonical LinkedIn url
  • sourceType, searchQuery, searchLocation, and detailFetched

Example:

{
"ok": true,
"sourceType": "search",
"jobId": "1234567890",
"title": "Senior Software Engineer",
"company": "Example Company",
"companyUrl": "https://www.linkedin.com/company/example",
"companyLogo": "https://media.licdn.com/example.png",
"location": "Toronto, Ontario, Canada",
"salary": null,
"postedAt": "2026-07-24",
"postedText": "1 day ago",
"workplaceType": "remote",
"employmentType": "Full-time",
"seniorityLevel": "Mid-Senior level",
"jobFunction": ["Engineering"],
"industries": ["Software Development"],
"applicants": "25 applicants",
"description": "Build reliable systems...",
"descriptionHtml": "<p>Build reliable systems...</p>",
"url": "https://www.linkedin.com/jobs/view/1234567890",
"searchQuery": "software engineer",
"searchLocation": "Toronto, Ontario, Canada",
"detailFetched": true
}

LinkedIn does not expose every field on every job. Card-only searches usually leave detail fields as null or empty arrays. Enable includeDetails when those fields matter.

Pricing and cost control

The intended pay-per-event price is $0.0008 per successful job row, below the current $0.001/job benchmark. The actor calls the job billing event only after a real row is successfully written to the dataset.

Sample rows, no-result rows, blocked requests, parse failures, invalid direct jobs, and network errors are diagnostic output and are not charged.

The default search mode downloads only small guest-search HTML fragments. Full detail pages are much larger, so includeDetails is off by default. Direct traffic is tried first; residential traffic is a fallback, not a baseline cost. This keeps the $0.0008 target viable for normal batched searches while still providing recovery when LinkedIn blocks a cloud IP.

Residential proxy cost depends on response size and the customer's Apify plan. Keep includeDetails off for high-volume discovery, use narrow date filters, and set a matching countryCode only when fallback is needed.

Diagnostics

Diagnostic rows have ok: false, _diagnostic: true, and an errorCode:

  • BLOCKED or RATE_LIMITED: direct traffic and configured residential retries were exhausted.
  • NO_RESULTS: LinkedIn returned an empty result page for that query/location.
  • NOT_FOUND: a direct job no longer exists or is not public.
  • PARSE_ERROR: LinkedIn returned HTML without the expected public job structure.
  • NETWORK or SERVER_ERROR: a transient request failure.

Diagnostics never trigger the job billing event. A failed source does not prevent other batch sources from completing.

Limits and responsible use

This actor accesses public guest job pages only. It does not log in, use cookies, bypass private access controls, or collect private profile data. LinkedIn can change or throttle its public endpoints. Use reasonable limits, respect applicable law and LinkedIn's terms, and process personal data only when you have a lawful basis.