Scrape LinkedIn jobs by keywords and location or by LinkedIn search URLs, or both. Export to JSON, CSV or Excel. No login or cookies needed. Filter jobs, filter with AI, remove duplicates, add company data, and automate with n8n, Make, Zapier or AI agents.
One or more URLs of the pages where the crawler will start. Note that the Actor will additionally crawl job page data.
Type:array
Keywords
keyword
Optional
Keyword to search for. (e.g., Software Engineer)
Type:array
Locations
locations
Optional
One or more locations to search in (e.g. Montreal, Canada). Each location is combined with every keyword to generate one search per pair. When set alongside the legacy Location field, both are merged.
Type:array
Location (Legacy)
location
Optional
Single location to search in. Use the Locations field instead to search multiple locations at once.
Type:string
Distance (Search Radius)
distance
Optional
Search radius from the location in miles. Leave empty for default.
Type:string
Default:
Options:
510152550
Published At
publishedAt
Optional
How old publications should be in Days. Default is ANY.
Type:string
Default:
Options:
r86400r604800r2592000
Job Type
jobType
Optional
Filter by job type (Full-time, Part-time, Contract, etc.). Multiple selections allowed. When LinkedIn serves its classic search engine this filter works normally. When LinkedIn serves its AI search engine the filter is ignored, so the scraper instead embeds it into the search query itself, which the AI search understands: the search is retried once with e.g. 'Full-time ' for a single selection or '(Full-time OR Contract) ' for multiple selections.
Type:string[]
Experience Level
experienceLevel
Optional
Filter by experience level. Multiple selections allowed. When LinkedIn serves its classic search engine this filter works normally. When LinkedIn serves its AI search engine the filter is ignored, so the scraper instead embeds it into the search query itself, which the AI search understands: the search is retried once with e.g. 'Entry level ' for a single selection or '(Entry level OR Associate) ' for multiple selections.
Type:string[]
Work Type
workType
Optional
Filter by work location type (On-site, Remote, Hybrid). Multiple selections allowed. When LinkedIn serves its classic search engine this filter works normally. When LinkedIn serves its AI search engine the filter is ignored by LinkedIn and job pages have no field to verify it, so the scraper instead embeds the work type into the search query itself, which the AI search understands: the search is retried once with e.g. 'Remote ' for a single selection or '(Remote OR "On-Site") ' for multiple selections.
Type:string[]
Only These Companies
companyInclude
Optional
Restrict the search to specific companies. Add one company name per entry (e.g. Google, Shopify). Each name is resolved to a LinkedIn company ID and added to the search URL — LinkedIn will only return jobs from those companies.
If a name cannot be matched, it is silently skipped.
Type:array
Under 10 Applicants Only
filterUnder10Applicants
Optional
When enabled, LinkedIn will only return jobs with fewer than 10 applicants. Appends f_EA=true to the search URL. Keyword-based search only — does not affect URL-based search.
Type:boolean
Default:false
Easy Apply Only
filterEasyApply
Optional
When enabled, LinkedIn will only return jobs that support Easy Apply (apply directly on LinkedIn without leaving the site). Appends f_AL=true to the search URL. Keyword-based search only — does not affect URL-based search.
Type:boolean
Default:false
Skip These Cities / Areas
subLocationExclude
Optional
Exclude jobs from specific cities or areas. Add each city name as a separate entry — any job whose location contains that name will be skipped (e.g. add "Laval" to exclude all jobs in Laval). Works independently of the Locations field. Also works with URL-based search.
Type:array
Exclude These Companies
companyExclude
Optional
Skip jobs from specific companies. Add one company name per entry — any job whose company name exactly matches (case-insensitive) will not be collected. Works for both keyword-based and URL-based searches.
Type:array
Exclude Job Titles Containing
jobTitleExclude
Optional
Skip jobs whose title contains any of these keywords (whole-word, case-insensitive). For example, entering "senior" will exclude "Senior Software Engineer" but not "seniority". Works for both keyword-based and URL-based searches.
Type:array
Include Industries
jobIndustryInclude
Optional
Only keep jobs where the industry matches one of the selected values.
Note: This takes priority over Exclude Industries when both are set.
Jobs are still collected and counted toward billing. Use dynamicFilterMatch to filter them in your results. Non-matching jobs are saved with dynamicFilterMatch: false.
Exclude jobs whose industry matches any of the selected values. Only applies when "Include Industries" is not set.
Jobs are still collected and counted toward your billing — use dynamicFilterMatch to filter them out in your results. You can find all the Linkedin industries at LinkedIn Industry Codes
Type:string[]
Exclude Recruiting Agencies
excludeRecruitingAgencies
Optional
When enabled, jobs posted by staffing and recruiting agencies will be flagged with dynamicFilterMatch: false. Jobs are still collected and counted toward your billing — use dynamicFilterMatch to filter them out in your results.`
Type:boolean
Default:false
Company Min Employees
companySizeMin
Optional
Only keep jobs from companies with at least this many employees. Jobs that do not match are still collected and counted toward your billing — use dynamicFilterMatch to filter them out.
Type:integer
Minimum:1
Company Max Employees
companySizeMax
Optional
Only keep jobs from companies with at most this many employees. Jobs that do not match are still collected and counted toward your billing — use dynamicFilterMatch to filter them out.
Type:integer
Minimum:1
Include Company Organization Types
companyOrganizationTypeInclude
Optional
Only keep jobs from companies whose LinkedIn company page organization type matches one of the selected values. Takes priority over "Exclude Company Organization Types" when both are set.
Jobs are still collected and counted toward your billing — use dynamicFilterMatch to filter them out in your results. Non-matching jobs are saved with dynamicFilterMatch: false.
Flag jobs from companies whose LinkedIn company page organization type matches any of the selected values as dynamicFilterMatch: false. Only applies when "Include Company Organization Types" is not set. Jobs are still collected and counted toward your billing — use dynamicFilterMatch to filter them out in your results.
Only keep jobs from companies founded in or after this year. Jobs from companies whose founding year is not available always pass.
Jobs are still collected and counted toward your billing — use dynamicFilterMatch to filter them out in your results.
Type:integer
Minimum:1800
Company Founded Before (year)
companyFoundedDateMax
Optional
Only keep jobs from companies founded in or before this year. Jobs from companies whose founding year is not available always pass.
Jobs are still collected and counted toward your billing — use dynamicFilterMatch to filter them out in your results.
Type:integer
Minimum:1800
Company Min Followers
companyFollowersCountMin
Optional
Only keep jobs from companies with at least this many LinkedIn followers. Jobs from companies whose follower count is not available always pass.
Jobs are still collected and counted toward your billing — use dynamicFilterMatch to filter them out in your results.
Type:integer
Minimum:0
Company Max Followers
companyFollowersCountMax
Optional
Only keep jobs from companies with at most this many LinkedIn followers. Jobs from companies whose follower count is not available always pass.
Jobs are still collected and counted toward your billing — use dynamicFilterMatch to filter them out in your results.
Type:integer
Minimum:0
Recruiter Profile Required
requireRecruiterProfile
Optional
When enabled, only jobs that have a recruiter profile associated with the posting will have dynamicFilterMatch: true. Jobs without a recruiter profile are still collected and billed — use dynamicFilterMatch to filter them out.
Type:boolean
Default:false
Salary Info Required
requireSalaryInfo
Optional
When enabled, only jobs that include salary information in the posting will have dynamicFilterMatch: true. Jobs without salary info are still collected and billed — use dynamicFilterMatch to filter them out.
Type:boolean
Default:false
Use AI Job Description Parsing (paid plans only)
useAiJobDescriptionParsing
Optional
⚠️ Premium users only. When enabled, the AI answers the questions below for every job that passed the other dynamic filters, and each analysed job is billed with the ai-job-analysis event. When disabled (default), the questions are ignored and no AI is used.
Type:boolean
Default:false
AI Questions (paid plans only)
aiQuestions
Optional
⚠️ Premium users only — used only when Use AI Job Description Parsing is enabled. Add up to 10 multiple-choice questions asked about each job description. Each question has an ID, the question, its answer choices and optional expected answers. Questions without expected answers only add information to the output.
How it works
The AI runs only on jobs that passed every other dynamic filter, so you are only charged for those.
The AI must pick one of your answer choices — add something like unknown yourself if the description may not answer the question.
Write each answer choice on its own line as answer | optional description. The description helps the AI tell similar options apart (e.g. Remote | Work fully from home). Without a |, there is no description. An answer itself cannot contain |.
Expected answers list the answer texts (the part before the |) that keep the job matching; any other answer sets dynamicFilterMatch to false.
Every job gets aiStatus and aiAnswers (each answer carries your question id, the probability of the answer and whether it matched your expected answers).
Only the first 15,000 characters of each description are analysed.
Limits: ID up to 40 characters (letters, numbers, _, -, unique); question up to 200 characters; 2 to 10 answer choices with an answer of up to 50 characters and an optional description of up to 200 characters. Invalid questions stop the run before any scraping.
Type:object[]
Max. items:10
Skills and Keywords
resumeKeywords
Optional
Each entry has a required keyword and optional aliases for abbreviations (e.g. JavaScript → JS). Each job in the output will include matchedKeywords, unmatchedKeywords, and keywordMatchScorePercentage (0–100).
Type:object[]
Maximum Results
maxItems
Optional
Maximum number of job listings to scrape. Leave empty for no limit.
Type:integer
Minimum:1
Save Only Unique Items
saveOnlyUniqueItems
Optional
If enabled, only unique items will be saved. Default is false.
Type:boolean
Default:false
Enrich Company Data
enrichCompanyData
Optional
When disabled, the scraper runs significantly faster by skipping additional company page requests. When enabled, the scraper fetches extra company details including: company description, full address (street, city, region, postal code, country), employee count, and company website. Default is disabled for optimal performance.
Type:boolean
Default:false
Minimum Salary
salaryBase
Optional
Filter by minimum salary. Only one value allowed. 🛠️ In maintenance: this filter currently only works when LinkedIn serves its classic search engine. When LinkedIn serves its new AI-powered search, it silently ignores this filter, and since salary cannot be verified reliably from job postings, the scraper has no workaround - results will include jobs below this salary. It will be restored once LinkedIn supports it again.
Type:string
Options:
400006000080000100000120000
Include Job Functions (Deprecated)
jobFunctionInclude
Optional
⚠️ Deprecated, no longer available: LinkedIn no longer exposes the job function on public job pages, so the scraper cannot read it anymore (the output field workType is empty). Using it flags every job with dynamicFilterMatch: false. Do not use it. Only keep jobs where the job function matches one of the selected values.
Note: This takes priority over Exclude Job Functions when both are set.
Jobs are still collected and counted toward billing. Use dynamicFilterMatch to filter them in your results. Non-matching jobs are saved with dynamicFilterMatch: false.
Applies to both URL-based and keyword-based searches.
⚠️ Deprecated, no longer available: LinkedIn no longer exposes the job function on public job pages, so the scraper cannot read it anymore (the output field workType is empty). Using it has no effect (no job is ever excluded). Do not use it. Exclude jobs whose job function matches any of the selected values. Only applies when "Include Job Functions" is not set.
Jobs are still collected and counted toward your billing — use dynamicFilterMatch to filter them out in your results. Non-matching jobs are saved with dynamicFilterMatch: false.