LinkedIn Jobs Scraper
Pricing
$1.50 / 1,000 job listings
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
Maintained by CommunityActor stats
2
Bookmarked
2
Total users
0
Monthly active users
a day ago
Last modified
Categories
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 group | Example fields |
|---|---|
| πΌ Job details | jobId, title, employmentType, seniority, jobFunction, industries, isEasyApply |
| π’ Company details | companyName, companyUrl, companyLogoUrl |
| π Location | locationRaw, locationCity, locationRegion, locationCountry, workplaceType, isRemote |
| π° Salary | salaryRaw, salaryMin, salaryMax, salaryCurrency, salaryPeriod |
| π Description | descriptionSnippet, descriptionText, descriptionHtml, descriptionStatus |
| π Links and enrichment | jobUrl, isEasyApply, isExpired |
| π§ Search provenance | query, searchLocation, searchPosition, pageNumber |
| π Run summary | candidateItemsSeen, 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 case | How LinkedIn job data helps |
|---|---|
| π Monitor hiring trends | Track demand by role, skill, location, company, seniority, or workplace type. |
| π° Benchmark salaries | Compare salary signals across markets and job families where available. |
| π§² Build recruiting workflows | Collect active job listings for sourcing, staffing, and lead generation. |
| π’ Track competitors | Watch hiring activity, expansion signals, and technology adoption. |
| π§ͺ Research labor markets | Analyze job descriptions, criteria, applicant text, and company demand. |
| π§± Enrich job boards | Feed 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 listings | Estimated 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:
- Create or log in to your Apify account.
- Open LinkedIn Jobs Scraper.
- Choose a source: add job titles or keywords, paste LinkedIn Jobs search URLs, or add known LinkedIn job IDs or URLs.
- Optionally add one or more locations for keyword searches. Location narrows the keyword search.
- Set the maximum number of job listings to collect.
- Add filters such as posted date, radius, job type, workplace type, experience level, employer exclusions, or title filters if needed.
- Click Start and wait for the data to be extracted.
- 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 engineeranalytics engineerdata scientistsoftware engineerproduct 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, CanadaNew York, NYSan Francisco Bay AreaRemoteUnited 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
| Option | What it does |
|---|---|
π
postedWithin | Searches jobs from the selected freshness window. |
π distance | Searches around the selected location. |
π sortBy | Sorts LinkedIn results by relevance or date. |
π§βπ» jobType | Filters full-time, part-time, contract, temporary, internship, or volunteer. |
π workplaceType | Filters on-site, remote, or hybrid jobs. |
πͺ experienceLevel | Filters by LinkedIn seniority level when available. |
π maxPagesPerSearch | Sets the page depth for each keyword/location or search URL. |
π« excludeCompanies | Skips matching employers and counts skipped rows in the run summary. |
π― titleMustInclude | Saves jobs whose title contains at least one required word or phrase. |
π§Ή titleExclude | Skips jobs whose title contains off-target words or phrases. |
β»οΈ saveOnlyUniqueItems | Saves one row per job across overlapping keywords, locations, URLs, pages. |
βοΈ balanceKeywordCoverage | Spreads results across keywords and locations before going deeper. |
π fetchJobDetails | Adds full descriptions, criteria, applicant text, and Easy Apply signals. |
β±οΈ requestDelayMillis | Controls 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
saveOnlyUniqueItemsenabled for normal datasets. - Use
balanceKeywordCoveragefor market maps across multiple role families. - Use
titleMustIncludeandtitleExcludewhen LinkedIn returns broad or off-target roles. - Use
postedWithinfor fresh job monitoring. - Keep
fetchJobDetailsenabled when full descriptions matter. - Increase
maxPagesPerSearchgradually for larger runs. - Check
descriptionStatuswhen 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.
βοΈ Is it legal to scrape LinkedIn jobs?
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.
π Related job scrapers
- 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.