LinkedIn Jobs Scraper avatar

LinkedIn Jobs Scraper

Pricing

$1.50 / 1,000 job listings

Go to Apify Store
LinkedIn Jobs Scraper

LinkedIn Jobs Scraper

Scrape LinkedIn job listings by keyword, location, search URL, or job ID. Extract titles, companies, locations, posted dates, full descriptions when available, salary signals, criteria, applicant text, Easy Apply status, and job URLs. Export data, run via API, or schedule runs.

Pricing

$1.50 / 1,000 job listings

Rating

0.0

(0)

Developer

Chronometrica

Chronometrica

Maintained by Community

Actor stats

2

Bookmarked

2

Total users

0

Monthly active users

a day ago

Last modified

Share

πŸ’Ό What does LinkedIn Jobs Scraper do?

LinkedIn Jobs Scraper extracts clean, deduplicated data from public LinkedIn job listings: job title, company name, location, posted date, applicant text, employment criteria, salary signals, full description text and HTML when available, Easy Apply status, LinkedIn job URLs, and more.

To get that data, enter a job title or keyword, paste a LinkedIn Jobs search URL, or add known LinkedIn job IDs or URLs. Locations are optional, so you can run broad keyword searches or narrow them to specific markets. You can also run the scraper through the Apify API, schedule it, or connect it to other tools. It saves one row per job by default, so overlapping keywords, locations, search URLs, job IDs, and pages do not fill your dataset with duplicate listings.

With LinkedIn Jobs Scraper, you can:

  • Scrape LinkedIn job listings by job title, keyword, company, role family, and location.
  • Extract detailed job posting data, including description text and HTML when available.
  • Collect company names, company URLs, logo URLs, locations, salary signals, applicant text, job criteria, Easy Apply status, and LinkedIn job URLs.
  • Filter LinkedIn jobs by posting date, radius, job type, workplace type, experience level, employer exclusions, title filters, and sort order.
  • Run keyword/location searches, paste LinkedIn search URLs, or enrich known job IDs from the form, JSON, or API input.
  • Enrich known LinkedIn job IDs or job URLs without running search discovery.
  • Save clean unique job listings with duplicate skips, title filters, and run-summary counters.
  • Download LinkedIn job data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.
  • Check the run summary to see how many jobs were found, saved, skipped, duplicated, filtered, blocked, or stopped.

πŸ“¦ What job listing data can I extract?

With this Actor, you can extract the following data from public LinkedIn job postings:

πŸ’Ό Job title🏒 Company nameπŸ“ Job location
πŸ“ Full description text🧾 Description HTMLπŸ”Ž Description status
πŸ’° Salary rangeπŸ’΅ Salary currency⏱️ Salary period
πŸ§‘β€πŸ’» Employment typeπŸͺœ Seniority🏠 Workplace / remote
🧰 Job function🏷️ IndustriesπŸ‘₯ Applicant text
πŸ”— Company URLπŸ–ΌοΈ Company logo URL⚑ Easy Apply status
🌐 LinkedIn job URLπŸ” Search keyword🧭 Search location
πŸ“Š Jobs saved♻️ Duplicates skipped🚦 Stop reason

Here are the main output groups:

Data groupExample fields
πŸ’Ό Job detailsjobId, title, employmentType, seniority, jobFunction, industries, isEasyApply
🏒 Company detailscompanyName, companyUrl, companyLogoUrl
πŸ“ LocationlocationRaw, locationCity, locationRegion, locationCountry, workplaceType, isRemote
πŸ’° SalarysalaryRaw, salaryMin, salaryMax, salaryCurrency, salaryPeriod
πŸ“ DescriptiondescriptionSnippet, descriptionText, descriptionHtml, descriptionStatus
πŸ”— Links and enrichmentjobUrl, isEasyApply, isExpired
🧭 Search provenancequery, searchLocation, searchPosition, pageNumber
πŸ“Š Run summarycandidateItemsSeen, jobsSaved, duplicateCandidatesSeen, duplicatesSkipped, warnings, stopReason

Salary, applicant counts, Easy Apply signals, and full descriptions depend on what LinkedIn exposes for each public job listing. If full job descriptions matter for your workflow, check the descriptionStatus field in the output and the detail counters in the run summary.

βš™οΈ Can I use this Actor through an API?

Yes. You can run LinkedIn Jobs Scraper manually in Apify Console or use it as an API for LinkedIn job data.

Developers can call this Actor through:

  • Apify API
  • Python SDK
  • Node.js SDK
  • Webhooks
  • Scheduled runs
  • Apify integrations

This makes it useful for recruiting pipelines, job-board enrichment, hiring dashboards, warehouse loads, agents, and automated labor-market research.

Clean, duplicate-free LinkedIn job datasets

LinkedIn job results can overlap across related keywords, locations, search URLs, known job IDs, and pages. For normal datasets, keep saveOnlyUniqueItems enabled so the Actor saves one row per job and skips duplicate candidates before they become saved rows.

The OUTPUT summary shows candidateItemsSeen, duplicateCandidatesSeen, duplicatesSkipped, and jobsSaved, so you can see how many matching rows were found, how many were duplicates, and how many unique job listings were saved. Turn unique-job mode off only when you intentionally want to measure keyword overlap or search ranking behavior.

πŸ“Š Why scrape LinkedIn jobs?

LinkedIn is a major source of job market data. Scraping LinkedIn jobs can help you track hiring demand, role language, salary signals, employer activity, and remote-work patterns across markets.

Here are just some of the ways you could use LinkedIn job data:

Use caseHow LinkedIn job data helps
πŸ“ˆ Monitor hiring trendsTrack demand by role, skill, location, company, seniority, or workplace type.
πŸ’° Benchmark salariesCompare salary signals across markets and job families where available.
🧲 Build recruiting workflowsCollect active job listings for sourcing, staffing, and lead generation.
🏒 Track competitorsWatch hiring activity, expansion signals, and technology adoption.
πŸ§ͺ Research labor marketsAnalyze job descriptions, criteria, applicant text, and company demand.
🧱 Enrich job boardsFeed clean LinkedIn job data into apps, databases, and career tools.

LinkedIn jobs scraper with no login or cookies

LinkedIn Jobs Scraper works with public LinkedIn Jobs surfaces. You do not need to provide a LinkedIn account, login session, or browser cookies. Paste a role and optional location, a LinkedIn Jobs search URL, or known LinkedIn job IDs and run the Actor from Apify Console or API.

Scrape LinkedIn jobs by job ID or URL

Use jobIds when you already know the LinkedIn job IDs or job URLs you want to enrich. This mode skips search discovery and focuses on the known job listings, which is useful for job-board enrichment, saved lead lists, and repeatable data refreshes.

Use startUrls when you already built a LinkedIn Jobs search in the LinkedIn UI and want to preserve those search filters in the Actor run.

If you provide more than one source type in the same run, the Actor combines them, removes duplicate jobs when saveOnlyUniqueItems is enabled, and applies one shared maxItems cap across the whole run.

LinkedIn Easy Apply, salary, and criteria data

When public job details are available, the Actor can add Easy Apply status, salary signals, applicant text, seniority, employment type, workplace type, job function, industries, full description text, and description HTML. Check descriptionStatus and the run summary to see which detail fields were exposed for each run.

πŸ’΅ How much does scraping LinkedIn jobs cost?

LinkedIn Jobs Scraper uses a Pay-Per-Event pricing model. You are charged for saved job listings.

The current price is $1.50 per 1,000 saved job listings, or $0.0015 per job listing. For example:

Saved job listingsEstimated Actor charge
100 jobs$0.15
1,000 jobs$1.50
10,000 jobs$15.00

Start with maxItems between 10 and 100 if you want to test the output before running larger searches. The run summary shows how many candidate jobs were seen, how many unique jobs were saved, and why the run stopped. For normal runs, keep Unique jobs only enabled so duplicate candidates are skipped before they become saved rows.

πŸš€ How do I use LinkedIn Jobs Scraper?

LinkedIn Jobs Scraper was designed for an easy start even if you've never extracted data from the web before. Here's how you can scrape LinkedIn job data with this tool:

  1. Create or log in to your Apify account.
  2. Open LinkedIn Jobs Scraper.
  3. Choose a source: add job titles or keywords, paste LinkedIn Jobs search URLs, or add known LinkedIn job IDs or URLs.
  4. Optionally add one or more locations for keyword searches. Location narrows the keyword search.
  5. Set the maximum number of job listings to collect.
  6. Add filters such as posted date, radius, job type, workplace type, experience level, employer exclusions, or title filters if needed.
  7. Click Start and wait for the data to be extracted.
  8. Download your data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.

⬇️ Input

The input needs at least one way to choose jobs:

  • Option 1: Keywords - Search LinkedIn by job titles/keywords, optionally with locations.
  • Option 2: LinkedIn search URLs - Paste a LinkedIn Jobs search URL when you already configured filters in LinkedIn and want to preserve them.
  • Option 3: Job IDs or job URLs - Provide known LinkedIn job IDs/URLs to enrich specific listings without search discovery.

They can also be mixed in one run. If mixed, the actor combines results, deduplicates them, and applies one shared Job listings to collect cap.

Locations are optional for keyword searches. If filled, LinkedIn searches for Keywords AND each Location. LinkedIn search URLs keep their own filters, and job IDs or job URLs target exact listings.

You can also add optional filters for date, radius, job type, workplace type, experience level, page depth, employer exclusions, and title filters.

Here's a simple input example for a broad software engineer search:

{
"searchTerm": "software engineer",
"location": "",
"postedWithin": "7d",
"distance": 25,
"sortBy": "relevance",
"maxItems": 25,
"maxPagesPerSearch": 2,
"balanceKeywordCoverage": true,
"saveOnlyUniqueItems": true,
"fetchJobDetails": true,
"jobType": "any",
"workplaceType": "any",
"experienceLevel": "any"
}

Click on the Input tab for a full explanation of input in JSON.

πŸ”Ž Search terms

Use one job title, skill, company, or role family per line. This field is optional when you use LinkedIn search URLs or job IDs. Multiple distinct search terms can help you collect broader job market data.

Good search terms:

data engineer
analytics engineer
data scientist
software engineer
product manager

Overlapping search terms can return the same job more than once. Keep saveOnlyUniqueItems enabled unless you are measuring keyword overlap or search ranking.

If LinkedIn returns broad results for a role, add title filters. This is useful for searches like backend engineer, CTO, or data analyst, where broad keyword matching can include off-target roles.

{
"searchTerm": "backend engineer",
"location": "Germany",
"titleMustInclude": "backend engineer\nplatform engineer",
"titleExclude": "frontend\nrecruiter\nsales",
"maxItems": 100
}

πŸ“ Locations

Add one city, region, country, or remote-friendly location per line. Locations are only used with keyword searches. Leave the field blank for broader LinkedIn results. LinkedIn handles geography from each location value you provide.

Good locations:

Toronto, ON, Canada
New York, NY
San Francisco Bay Area
Remote
United States

JSON/API users can run a location matrix by passing locations as an array. For example, three keywords and two locations create six keyword/location searches:

{
"searchTerm": "data scientist",
"locations": ["Toronto, ON, Canada", "New York, NY", "Seattle, WA"],
"maxItems": 300
}

πŸŽ›οΈ Filters, quality controls, and run tuning

OptionWhat it does
πŸ“… postedWithinSearches jobs from the selected freshness window.
πŸ“ distanceSearches around the selected location.
πŸ”€ sortBySorts LinkedIn results by relevance or date.
πŸ§‘β€πŸ’» jobTypeFilters full-time, part-time, contract, temporary, internship, or volunteer.
🏠 workplaceTypeFilters on-site, remote, or hybrid jobs.
πŸͺœ experienceLevelFilters by LinkedIn seniority level when available.
πŸ“„ maxPagesPerSearchSets the page depth for each keyword/location or search URL.
🚫 excludeCompaniesSkips matching employers and counts skipped rows in the run summary.
🎯 titleMustIncludeSaves jobs whose title contains at least one required word or phrase.
🧹 titleExcludeSkips jobs whose title contains off-target words or phrases.
♻️ saveOnlyUniqueItemsSaves one row per job across overlapping keywords, locations, URLs, pages.
βš–οΈ balanceKeywordCoverageSpreads results across keywords and locations before going deeper.
πŸ“ fetchJobDetailsAdds full descriptions, criteria, applicant text, and Easy Apply signals.
⏱️ requestDelayMillisControls delay between requests. The Actor enforces a 500 ms minimum.

πŸ”— LinkedIn search URLs and job IDs

You can also start from LinkedIn search URLs or known job IDs.

Use startUrls when you already built a search in LinkedIn and want to preserve its filters:

{
"startUrls": [
{
"url": "https://www.linkedin.com/jobs/search/?keywords=data%20engineer&location=Toronto%2C%20ON"
}
],
"maxItems": 50,
"fetchJobDetails": true
}

Use jobIds when you already have LinkedIn job IDs or job URLs and only want detail enrichment:

{
"jobIds": ["<linkedin-job-id-or-url>"],
"maxItems": 1,
"fetchJobDetails": true
}

Leave jobIds empty unless you already have known listings to enrich. The form does not include seeded job IDs.

⬆️ Output sample

The results will be wrapped into a dataset which you can find in the Output tab. Each result is one saved LinkedIn job listing.

For easier postprocessing, export the results to one of the supported formats: JSON, JSONL, CSV, Excel spreadsheet, XML, RSS, or HTML table.

Here's an example of the exported JSON output:

{
"jobId": "4428089436",
"title": "Data Engineer - Python, ETL",
"companyName": "Example Company",
"companyUrl": "https://www.linkedin.com/company/example",
"companyLogoUrl": "https://media.licdn.com/example-logo",
"locationRaw": "Toronto, Ontario, Canada",
"locationCity": "Toronto",
"locationRegion": "Ontario",
"locationCountry": "Canada",
"workplaceType": "hybrid",
"isRemote": false,
"salaryRaw": "$110,000-$130,000 CAD",
"salaryMin": 110000,
"salaryMax": 130000,
"salaryCurrency": "CAD",
"salaryPeriod": "year",
"employmentType": "fulltime",
"seniority": "Mid-Senior level",
"jobFunction": "Information Technology",
"industries": ["IT Services and IT Consulting"],
"postedAtRaw": "5 days ago",
"postedAt": "2026-06-16T20:35:49.490Z",
"applicantsRaw": "Be among the first 25 applicants",
"descriptionSnippet": "Build reliable data systems...",
"descriptionText": "Full job description text...",
"descriptionHtml": "<p>Full job description HTML...</p>",
"descriptionStatus": "full",
"jobUrl": "https://www.linkedin.com/jobs/view/example-4428089436",
"query": "data engineer",
"searchLocation": "Toronto, ON, Canada",
"verifiedAt": "2026-06-21T20:35:49.490Z",
"isExpired": false,
"verificationSource": "detail",
"scrapedAt": "2026-06-21T20:35:49.490Z"
}

πŸ“Œ Run summary

LinkedIn Jobs Scraper also saves an OUTPUT summary in the default key-value store. Use it to see why the final number of saved jobs changed.

{
"stopReason": "max_items_reached",
"searchesQueued": 6,
"pagesParsed": 18,
"requestedMaxItems": 100,
"candidateItemsSeen": 142,
"jobsSaved": 100,
"detailRequests": 100,
"detailPagesParsed": 99,
"detailFailures": 1,
"duplicateCandidatesSeen": 12,
"duplicatesSkipped": 12,
"rowsExcludedByCompany": 0,
"rowsExcludedByDate": 0,
"rowsExcludedByJobType": 0,
"rowsExcludedByWorkplace": 0,
"rowsExcludedByExperience": 0,
"rowsExcludedByTitle": 0,
"blockedRequests": 1,
"failedRequests": 0,
"warnings": [],
"statusMessage": "Saved 100 LinkedIn job listings."
}

❓ Why did I get fewer jobs than requested?

maxItems is a cap on saved rows, not a guarantee that every search has that many matching jobs.

If your run saves fewer jobs than requested, check the OUTPUT summary. It shows whether rows were skipped because of duplicates, employer exclusions, date filters, job-type filters, workplace filters, experience filters, title filters, source exhaustion, page limits, failed requests, or blocked detail pages.

Common reasons include:

  • The selected role and location have fewer available jobs than maxItems.
  • Strict filters removed many candidate rows.
  • Title include/exclude filters removed broad or off-target LinkedIn matches.
  • Multiple keywords returned the same jobs and unique-job mode skipped duplicates.
  • LinkedIn did not expose a detail page for every discovered job.
  • The search depth limit was reached before enough unique matching jobs were found.

If you need more rows, increase maxPagesPerSearch, relax strict filters, add more distinct keywords, expand the search radius, or search broader locations.

βœ… Tips for scraping LinkedIn jobs

  • Start with a small test run and inspect the dataset before increasing maxItems.
  • Use distinct keywords instead of near-duplicates.
  • Keep saveOnlyUniqueItems enabled for normal datasets.
  • Use balanceKeywordCoverage for market maps across multiple role families.
  • Use titleMustInclude and titleExclude when LinkedIn returns broad or off-target roles.
  • Use postedWithin for fresh job monitoring.
  • Keep fetchJobDetails enabled when full descriptions matter.
  • Increase maxPagesPerSearch gradually for larger runs.
  • Check descriptionStatus when full job descriptions are important.
  • Check the run summary for duplicates, detail failures, blocked requests, and stop reason.

❓ FAQ

Does LinkedIn Jobs Scraper need login or cookies?

No. You do not need to provide a LinkedIn account, login session, or browser cookies.

Can I use LinkedIn Jobs Scraper through an API?

Yes. Run it with the Apify API, Python SDK, Node.js SDK, webhooks, schedules, or integrations. The dataset contains saved job rows and the OUTPUT key-value store record contains the run summary.

Can I scrape LinkedIn jobs by job ID?

Yes. Use the jobIds input with LinkedIn job IDs or job URLs when you already know which listings you want to enrich.

Why are salaries, applicant text, or full descriptions sometimes missing?

Those fields depend on what LinkedIn exposes publicly for each listing. Use descriptionStatus, salary fields, and run-summary detail counters to separate complete rows from partial rows.

How do I avoid duplicate jobs?

Keep saveOnlyUniqueItems enabled. The Actor saves one row per job across overlapping keywords, locations, search URLs, job IDs, and pages. The OUTPUT summary reports candidateItemsSeen, duplicateCandidatesSeen, duplicatesSkipped, and jobsSaved, so you can audit how many candidates were found, skipped as duplicates, and saved as unique job listings.

How much does it cost?

The current Actor charge is $1.50 per 1,000 saved job listings. Check the Pricing tab before production runs because live Store pricing is the source of truth.

This Actor extracts public job listing data. You are responsible for making sure your use case complies with applicable laws, platform terms, and privacy rules.

Job listings can sometimes include personal data or contact details. You should not scrape, store, or process personal data unless you have a legitimate reason and the right legal basis. If you're unsure whether your reason is legitimate, consult your lawyers.

LinkedIn is a trademark of its owner. This Actor is independent and is not affiliated with, endorsed by, or sponsored by LinkedIn.

  • LinkedIn Jobs Scraper for LinkedIn job search, search URLs, known job IDs, Easy Apply signals, and job criteria.
  • Indeed Jobs Scraper for Indeed salaries, full descriptions, benefits, skills, and apply links.

πŸ›Ÿ Support

If a run does not return what you expected, open an issue with the run ID and the input you used. The run summary shows saved rows, skipped rows, filters, warnings, detail counters, and stop reason so support can be specific.

Related searches: LinkedIn scraper, LinkedIn jobs scraper, scrape LinkedIn jobs, LinkedIn job listings, remove duplicate jobs, duplicate-free job scraper, unique job listings, deduped job listings, job board deduplication, LinkedIn job descriptions, LinkedIn jobs no cookies, LinkedIn job ID scraper, LinkedIn jobs search URL scraper, LinkedIn Easy Apply scraper, LinkedIn salary data, job market data, recruiting data, HR analytics, salary benchmarking, job board data, company hiring signals.