LinkedIn Jobs Scraper - Search, Filter & Detail Extraction
Pricing
from $0.05 / 1,000 jobs
LinkedIn Jobs Scraper - Search, Filter & Detail Extraction
🔥 ~$0.05/1K jobs 🔥 Scrape LinkedIn job listings via the public guest API. Search with filters (job type, experience, remote, salary), fetch full descriptions and criteria. No login required.
Pricing
from $0.05 / 1,000 jobs
Rating
5.0
(1)
Developer
Kai
Maintained by CommunityActor stats
2
Bookmarked
1K
Total users
167
Monthly active users
9.5 hours
Issues response
14 hours ago
Last modified
Categories
Share
LinkedIn Jobs Scraper - Most Comprehensive
Get LinkedIn job listings as structured data. No LinkedIn login or cookie is required. Search by keywords or a plain sentence, by location, by company, or with a LinkedIn search URL. You can also fetch jobs that you already know by ID. Each job has 78 fields: title, company, location, posted date, pay, applicants, full description, criteria, application link, recruiter, related jobs, and more. Add public company profiles and the employer's own job data.
Filter by job type, experience level, posting date, salary, Easy Apply, and more. Sort by relevance or by date. Typical times: a 25-job run takes about 15 to 20 seconds, and 100 jobs with full details take about one to one and a half minutes. Starting at $0.05 per 1,000 jobs.
What can you do with it?
- Job market research. Count and compare open roles by title, location, company, and experience level.
- New-job monitoring. Run on a schedule with a posting window, such as the
last hour, and use
jobIdto skip jobs that you already have. - Salary benchmarking. Read the pay range, currency, and pay period of jobs that publish pay, and filter by a minimum salary.
- Competitor hiring tracking. Collect every open role of one company or of a list of companies, and add the public company profile.
- Lead generation from hiring signals. Use
hiringSignal,isNew, and the applicant counts to find companies that hire now. Add company website, industry, size, and locations. - Job board and aggregator feeds. Get the description as text and HTML, the criteria, the application link, and a stable job ID.
- Application-system research. Read the employer's own job data from 15 hiring systems, such as Greenhouse, Lever, Ashby, and Workday.
- Job alerts. Describe the job in a sentence, add filters, and run the Actor every day.
- Related-role discovery. Collect similar jobs, jobs that people also viewed, and related searches for each job.
- Refreshing known jobs. Fetch a list of job IDs again to see if a job is closed and to update its details.
- Location analysis. Search by location ID, add location IDs to jobs, and parse company addresses.
What data does it extract?
| Data | When you get it |
|---|---|
| Job ID, slug, title, link, company name, company ID, company link, and company logo | Every job |
| Location, search position, posted date, time since posting, new flag, and hiring badge | Every job |
| Salary text from the search result and structured pay (minimum, maximum, currency, pay period) | When the job shows pay |
| Full description as text and as HTML, criteria, experience level, employment type, and industries | With fetchDetails, or in job ID mode |
| Applicants as text, a category, and a count or range | With fetchDetails, or in job ID mode |
| Compensation context, featured benefits, application method, application link, and closure notice | With fetchDetails, or in job ID mode |
| Recruiter name, title, profile link, and photo | When LinkedIn shows a recruiter |
| Workplace type, structured location, education, experience, and skills | When the job page publishes them |
| Jobs that people also viewed, similar searches, and related searches | With fetchDetails |
| Similar jobs | With includeSimilar |
| Company profile: description, website, employee count, industry, headquarters, followers, specialities, founding year, locations, and logos | With fetchCompanyDetails |
| Location IDs for jobs, parsed company addresses, and image dimensions | With resolveLocations, parseCompanyAddresses, and measureImageDimensions |
| The employer's own job data: title, apply link, pay ranges, locations, and dates | With fetchEmployerDetails, when the job links to a supported hiring system |
LinkedIn does not publish every field for every job. A field without data is
null. Search-only results (no fetchDetails) keep the fields from the search
page and set the detail fields to null.
Quick start
- Enter a job title or a sentence in Search query, and a place in Location.
- Set Max jobs. Use
0to get all the jobs that LinkedIn lists for the search, up to 100,000 jobs. Each search returns at most 1,000 jobs. - Click Start. Download the results as JSON, CSV, Excel, or HTML.
The same input as JSON:
{"keywords": "software engineer","location": "Stockholm","maxJobs": 25}
An input with no search term, no filter that can start a search, and no job ID returns an empty Dataset.
Examples by use case
The newest jobs for a role and a place:
{"keywords": "software engineer","location": "Stockholm","sortBy": "recent","maxJobs": 50}
Describe the jobs in a sentence. LinkedIn's public AI job search reads the sentence. See Search with a sentence:
{"keywords": "Entry-level sales jobs in healthcare","location": "United States","datePosted": "past_week","experienceLevel": ["entry_level"],"maxJobs": 25}
Several roles and places in one run. This input makes four searches. The Dataset has no repeated jobs:
{"queries": ["software engineer", "data engineer"],"locations": ["Stockholm", "Gothenburg"],"maxJobs": 100,"maxJobsPerSearch": 30}
Monitor new jobs. Run this every hour. It returns the jobs that LinkedIn
posted in the last 3,600 seconds. Use the jobId field to skip jobs that you
already have:
{"keywords": "software engineer","location": "United States","datePostedSeconds": 3600,"sortBy": "recent","maxJobs": 0}
Every open job of one company. Use an exact company name, a LinkedIn company
URL, or a numeric company ID. A company can have more than 1,000 jobs, and one
search returns at most 1,000. Add keywords or locations to split a large
company into several searches:
{"companies": ["Google"],"sortBy": "recent","maxJobs": 0}
Compare the hiring of several companies. One search returns the jobs of all
the listed companies together. Group the Dataset by companyId. The company
profile gives the size and the website:
{"companies": ["Google", "https://www.linkedin.com/company/microsoft"],"keywords": "machine learning","maxJobs": 200,"fetchCompanyDetails": true}
Salary data. Ask for jobs with a minimum salary, and read salaryDetails.
LinkedIn can filter by salary estimates that the job does not show, so some
returned jobs have no pay fields:
{"keywords": "product manager","location": "United States","salary": "100000","fetchDetails": true,"maxJobs": 100}
Entry-level jobs and internships with Easy Apply:
{"keywords": "marketing","location": "London","experienceLevel": ["internship", "entry_level"],"easyApplyOnly": true,"datePosted": "past_week","maxJobs": 50}
Jobs with few applicants. Apply early:
{"keywords": "nurse","location": "United States","datePosted": "past_24h","under10Applicants": true,"sortBy": "recent","maxJobs": 50}
Senior roles with full details and similar jobs. workType is a request to
LinkedIn. LinkedIn ignores it now, so check workplaceType in the results. See
Filter the jobs:
{"keywords": "software engineer","location": "United States","maxJobs": 10,"fetchDetails": true,"sortBy": "recent","jobType": ["full_time", "contract"],"experienceLevel": ["mid_senior", "director"],"workType": ["remote", "hybrid"],"datePosted": "past_month","includeSimilar": true,"maxSimilarJobs": 2}
The employer's own job data. The Actor reads the job from the hiring system that the application link points to, when the job has such a link:
{"keywords": "software engineer","location": "San Francisco","maxJobs": 20,"fetchDetails": true,"fetchEmployerDetails": true}
Company profiles, location IDs, parsed addresses, and image sizes. The
company profile works without fetchDetails:
{"companyId": "1441","maxJobs": 5,"fetchCompanyDetails": true,"resolveLocations": true,"parseCompanyAddresses": true,"measureImageDimensions": true}
Refresh jobs that you already know. Use the jobId values of an earlier
run. A closed or removed job gives a placeholder, so the result list matches
your list:
{"jobIds": ["4318512219", "4405220132"]}
Use a LinkedIn search URL. Open a job search on LinkedIn, set the filters,
and copy the URL. f_TPR=r3600 limits the results to the last hour:
{"searchUrl": "https://www.linkedin.com/jobs/search?keywords=software%20engineer&location=United%20States&f_TPR=r3600","maxJobs": 25}
Several search URLs. Each URL uses its own filters. The total limit applies across all searches:
{"searchUrls": ["https://www.linkedin.com/jobs/search?keywords=developer&location=Stockholm","https://www.linkedin.com/jobs/search?keywords=data%20engineer&location=Gothenburg"],"maxJobs": 20,"maxJobsPerSearch": 10}
Search by location ID and industry. Start on the second page. LinkedIn controls whether the filters apply:
{"queries": ["engineer"],"geoIds": ["105117694"],"industryIds": ["4"],"startPage": 2,"maxJobs": 20,"maxJobsPerSearch": 10}
Company jobs without job details. This is the fastest and cheapest way to list the jobs of a company:
{"companyId": "64607633","maxJobs": 25,"fetchDetails": false,"sortBy": "recent"}
Choose how to find jobs
| Your goal | Use | Required input |
|---|---|---|
| Find roles by keywords or a sentence, with optional filters | Query search | keywords or queries |
| Reuse a LinkedIn search URL with any filter | URL search | searchUrl or searchUrls |
| Browse the open roles of one or more companies | Company search | companyId or companies |
| Retrieve jobs that you already know | Direct lookup | jobIds |
Nonblank jobIds take precedence over every search input. Otherwise, all
search inputs run in one plan:
- The Actor runs the explicit search URLs first. Then it runs one search for
each combination of query and location. Each
geoIdsentry is one more location. - Company, keyword, and location values work together. A location, a company, or a search filter can start a search without keywords. A filter alone does not add a search when you give a search URL.
- A run has at most 100 searches. The Actor trims search terms, locations, company values, and URLs. It removes blank and repeated entries.
- Searches run in input order. A job that an earlier search found is not saved, enriched, or charged again.
Search with a sentence
Enter a sentence in keywords to use LinkedIn's public AI job search. Use
queries for several sentences. LinkedIn can return jobs that do not meet all
the conditions in your sentence. Use the separate location and date inputs when
those conditions matter. The Actor checks job type and experience against each
job's published criteria. These checks can need more requests.
Public results can differ from results in a member account. A copied member search URL does not supply profile data or personal network data to this Actor. Swedish sentence search has not been tested. See LinkedIn's AI job search help for the member feature.
Search by company
Use companyId for numeric IDs (comma-separated for several), or companies
for numeric IDs, exact company names, and LinkedIn company URLs. Both are one
company filter. An ambiguous or unavailable name stops the run, and so does a
company URL that the Actor cannot read. Use the numeric ID or the company URL
then. Every enriched job has companyId, so you can reuse it in a later run.
Search with a LinkedIn URL
The Actor uses the filters in the URL. LinkedIn controls which filters apply.
maxJobs, fetchDetails, includeSimilar, maxSimilarJobs, and the proxy
settings still apply. startPage replaces the start position of the URL.
datePostedSeconds does not apply, because each URL has its own window. Keywords,
locations, or companies that you give separately create more searches. The
Actor checks f_JT and f_E in a URL like the jobType and experienceLevel
inputs.
Fetch known job IDs
The job ID is the number at the end of a job URL, such as 4318512219 in
https://www.linkedin.com/jobs/view/4318512219.
- Each nonblank entry gives one result, in your order. A repeated ID gives a repeated result.
- Direct lookup always fetches job details, even when
fetchDetailsisfalse. It ignores search filters, search URLs, and search limits.includeSimilar,fetchCompanyDetails, and the other optional settings still apply. - An ID that LinkedIn does not return gives a placeholder with the requested
jobIdand the canonicaljobUrl. All other fields are empty, null, or default. See Unavailable job IDs.
Filter the jobs
Filters are combined. A job must match every filter that you set. Inside one filter, a job can match any of the values.
jobType. Any offull_time,part_time,contract,temporary,volunteer,internship, andother.experienceLevel. Any ofinternship,entry_level,associate,mid_senior,director, andexecutive.workType. Any ofon_site,remote, andhybrid.datePosted.past_24h,past_week, orpast_month.datePostedSeconds. A custom window in seconds, such as3600for the last hour. It overridesdatePosted. The maximum is2592000(30 days). A short window can return no jobs.salary. A minimum salary:40000,60000,80000,100000,120000,140000,160000,180000, or200000.salaryThresholdsadds more values (up to 9) to the same filter. LinkedIn controls how it applies several values.easyApplyOnly. Only jobs with LinkedIn Easy Apply.under10Applicants. Jobs with fewer than 10 applicants.industryIds. Numeric LinkedIn industry IDs (up to 20).geoIds. Numeric LinkedIn location IDs (up to 10). Each ID is one more location.
LinkedIn controls whether it applies the under-10-applicants and industry filters. Salary filters can use estimates that the job does not show, so returned jobs do not always have pay fields.
Filters that LinkedIn no longer applies
Since October 2026, LinkedIn ignores some filters in logged-out searches. The Actor still gives the results that you ask for:
- Recent sort. LinkedIn returns the same order for
recentandrelevant. Forrecent, the Actor collects the newest jobs first. It sorts the saved jobs by date, newest first. All jobs stay inside yourdatePostedordatePostedSecondswindow. With astartPageabove 1, the results use LinkedIn's own order. - Job type and experience level. The Actor checks each job's
"Employment type" and "Seniority level" and keeps only jobs that match. A job
without these values does not match. This makes the run slower, because the
Actor reads one more page for each job that it checks. You pay only for the
jobs that match. The Actor checks at most 20 jobs for each requested job, and
at least 200. If too few jobs match, the run ends with fewer jobs and a
warning in the log. The same rules apply to
f_JTandf_Ein a search URL. - Work type. LinkedIn ignores this filter, and the Actor cannot check the
work arrangement of each job. Results can include other work types. Use
workplaceTypein the output when the job page states it.
Choose the job order
sortBy sets the order. The default is relevant. Each search is sorted on
its own.
| Value | Order |
|---|---|
relevant | LinkedIn's own order. |
recent | Newest first within each search. The Actor searches the last hour, day, week, and month in turn, then sorts the saved jobs by date. |
Recent sorting applies within each search, not across a whole batch of
searches. position is the position on the returned search page. It is not a
global rank and can repeat across pages.
Add details, related jobs, and company data
| Option | What it adds | Notes |
|---|---|---|
fetchDetails | Description, complete criteria, compensation context, benefits, application details, applicants, recruiter, and related searches | One more request for each job |
includeSimilar and maxSimilarJobs | similarJobs for each job. maxSimilarJobs is 25 by default. 0 means all available, up to 1,000 | Charged for each similar job |
fetchCompanyDetails | companyDetails, the public company profile | One request for each company in the run. Works without fetchDetails. Unavailable profiles stay null. |
resolveLocations | enrichment.resolvedLocation | A location ID only when LinkedIn shows the same name. Countries and metro areas usually match. "City, Region, Country" locations and names that several places share stay null. |
parseCompanyAddresses | enrichment.companyLocations[].address | Needs fetchCompanyDetails |
measureImageDimensions | enrichment.images: width, height, and type of LinkedIn images | Reads image headers only |
fetchEmployerDetails | enrichment.employer: the employer's own job data | Needs job details and an external application link to a supported hiring system |
The supported hiring systems are Greenhouse, Lever, Ashby, Workday, ADP Workforce Now, iCIMS, Oracle Recruiting Cloud, UKG Pro, Paylocity, SmartRecruiters, Workable, BambooHR, Rippling, Breezy HR, and Recruitee.
Input reference
No field is required. Give at least one of keywords, queries, searchUrl,
searchUrls, companyId, companies, location, locations, geoIds, or
jobIds.
| Field | Type | Default | Description |
|---|---|---|---|
keywords | string | One keyword query or sentence. Combined with queries, and with company and location filters. | |
queries | string[] | Keyword or sentence queries. Up to 100. One search for each query and location. Combined with keywords. | |
location | string | One location. Combined with locations. Works with company filters. | |
locations | string[] | Locations. Up to 100. Combined with location. | |
geoIds | string[] | Numeric LinkedIn location IDs. Up to 10. Each ID adds a location. | |
companyId | string | A company ID, or comma-separated IDs. Combined with companies, keywords, and locations. | |
companies | string[] | Company IDs, exact names, or LinkedIn company URLs. Up to 20. Combined into one company filter. | |
searchUrl | string | One LinkedIn jobs search URL. It uses its own filters. Combined with searchUrls and any structured searches. | |
searchUrls | string[] | LinkedIn jobs search URLs. Up to 100. Each URL uses its own filters. | |
jobIds | string[] | Fetch known jobs. Takes precedence over every search input. Always fetches details, keeps repeated IDs, and ignores blank entries. | |
maxJobs | integer | 25 | Unique jobs across all searches. 0 means all available, up to 100,000. Each search returns at most 1,000. Direct job IDs ignore this limit. |
maxJobsPerSearch | integer | 1000 | New jobs from one search, from 0 to 1,000. 0 means 1,000. The maxJobs limit also applies. |
startPage | integer | 1 | First search page for every search, from 1 to 40. Also replaces the start position in search URLs. |
sortBy | string | relevant | relevant or recent. |
jobType | string[] | full_time, part_time, contract, temporary, volunteer, internship, or other. | |
experienceLevel | string[] | internship, entry_level, associate, mid_senior, director, or executive. | |
workType | string[] | on_site, remote, or hybrid. LinkedIn ignores this filter. | |
datePosted | string | past_24h, past_week, or past_month. | |
datePostedSeconds | integer | Custom posted-within window in seconds, from 1 to 2,592,000. Overrides datePosted. Ignored for search URLs. | |
salary | string | Minimum salary: 40000, 60000, 80000, 100000, 120000, 140000, 160000, 180000, or 200000. | |
salaryThresholds | string[] | More minimum salary values from the same list. Up to 9. Combined with salary. | |
easyApplyOnly | boolean | false | Only Easy Apply jobs. |
under10Applicants | boolean | false | Jobs with fewer than 10 applicants. LinkedIn controls availability. |
industryIds | string[] | Numeric LinkedIn industry IDs. Up to 20. | |
fetchDetails | boolean | false | Add descriptions, complete criteria, compensation context, benefits, application details, recruiter, and related searches. |
includeSimilar | boolean | false | Add similar jobs to each result. |
maxSimilarJobs | integer | 25 | Similar jobs for each result, from 0 to 1,000. 0 means all available. |
fetchCompanyDetails | boolean | false | Add the public company profile. Works without fetchDetails. |
resolveLocations | boolean | false | Look up the job's location text. Return an ID only when LinkedIn shows the same name. |
parseCompanyAddresses | boolean | false | Parse company address lines. Needs fetchCompanyDetails. |
measureImageDimensions | boolean | false | Measure published LinkedIn images. |
fetchEmployerDetails | boolean | false | Add the employer's own job data. Needs job details and an external application link to a supported hiring system. |
concurrency | integer | 6 | Jobs processed at the same time, from 1 to 10. Searches still run in order. |
adaptiveDelay | boolean | true | Slow down after blocked responses (HTTP 403 or 999), and speed up after successful responses. |
userAgent | string | Advanced. Leave empty. Length 1 to 1,024 characters, no line breaks. | |
proxyConfiguration | object | {"useApifyProxy": true} | Connection settings. Apify Proxy is on by default. Saved empty proxy arrays are ignored. |
Unknown input fields are ignored. Known fields must use their documented types, values, and limits. A value outside them is rejected.
Output
Each item in the default Dataset is one job. The Jobs Overview table shows
the job ID, title, company, location, posted date, salary, detailed
compensation, employment type, experience level, application method, closure
notice, and job link. All 78 root
fields are in every item. A field without data is null. Status objects and
booleans use their documented defaults: a search-only result has
applicationMethod: "unknown" and hasDirectApply: false.
These fields are always null: jobFunction and jobFunctions (LinkedIn no
longer shows the job function publicly), views, closedAt, contentSource,
jobApplicationLimitReached, applicantTrackingSystem, jobGeoId, and
easyApplyUrl. The Actor has no verified source for them. They stay so that
existing integrations keep working.
Fields by topic
- Identity. Job ID, slug, title, company, company ID and slug, and the employer's reference number.
- Links. Job URL, company URL, company logo, and the application link.
- Search result. Location, position, posted date and time since posting, new flag, salary text, hiring badge, and benefits summary.
- Pay. Structured salary with minimum, maximum, currency, and pay period. Compensation context and featured benefits.
- Location. Structured location and all job locations. Workplace type and remote flag.
- Description. Text and HTML, criteria, experience level, employment type, and industries.
- Applicants. The published text, a category, and a count or range.
- Application. Application method, application link and details, and closure notice.
- Requirements. Education, experience, skills, and applicant location requirements.
- Status. Expiry date and job state.
- Recruiter. Name, title, profile link, and photo.
- Company. The public company profile.
- Enrichment. Location IDs, parsed company addresses, image dimensions, and the employer's job data.
- Related. Similar jobs, people also viewed, similar searches, and related searches.
- Run. The UTC time at which the Actor read the job.
Job example
This example is a job that has job details, pay, an employer application link, and the employer's own job data. Square brackets mark values removed from the documentation. Long related lists show one item.
Field groups
| Group | Root fields |
|---|---|
| Identity | jobId, jobSlug, title, company, companyId, companySlug |
| Links and media | jobUrl, companyUrl, companyLogoUrl |
| Search metadata | location, position, postedDate, postedTimeAgo, isNew, salary, badge, hiringSignal, benefitsSummary, benefitsCount |
| Structured data | salaryDetails, locationDetails, locations, workplaceType, workRemoteAllowed, companyDetails |
| Optional enrichment | enrichment |
| Job details | description, descriptionHtml, criteria, experienceLevel, employmentType, industries, applicants, applicantsCategory, applicantsStatus |
| Compensation and benefits | compensationSalary, compensationHeading, compensationProvider, compensationType, compensationDescription, featuredBenefits, featuredBenefitsSource |
| Application | applicationMethod, hasDirectApply, applicationUrl, applicationDetails, easyApplyUrl, applicantsDetails, closedNotice |
| Requirements | educationRequirements, experienceRequirements, skills, applicantLocationRequirements, employmentTypeCode |
| Status and listing data | expireAt, jobState, closedAt, views, employerJobId, benefitsDataSource, jobGeoId, contentSource, jobApplicationLimitReached, applicantTrackingSystem |
| Related data | similarJobs, peopleAlsoViewed, similarSearches, relatedSearches |
| Other details | searchGeoId, geoId, industryIds, titleId, ogTitle, referralMultiplier, recruiter, jobFunction, jobFunctions, scrapedAt |
Field notes
-
jobIdis the LinkedIn job ID. Use it to remove jobs that you already have and as input forjobIds. -
positionis the position on the returned search page. It can repeat across pages. -
postedDateandexpireAtuse the dates that LinkedIn publishes for the job, with LinkedIn's precision. A value can be a date such as2026-09-28or a timestamp such as2026-09-28T17:34:35.000Z. With job details,postedDatecan be more precise.postedTimeAgois the display text, such as "2 days ago". -
jobStateisCLOSEDonly when LinkedIn shows an explicit closure notice. An expiry date does not prove that a job is closed. AnullclosedNoticedoes not prove that applications are open. -
badgeis the complete label that LinkedIn shows with a job in search results.hiringSignalisactively_hiring,early_applicant, ornull.benefitsSummarykeeps the full label for recognised benefit labels. -
salaryis the pay text from the search result. Thecompensation*fields keep the pay text and context from the job details. They are display text, not a normalised salary model.salaryDetailshas parsed amounts. -
salaryDetailshastext,min,max,currency,payPeriod,compensationType,compensationSource, andprovidedByEmployer. Pay periods arehour,day,week,month, oryear. A dollar sign alone does not set the currency to USD. Unknown parts arenull.salaryDetailscan have a value whenfetchDetailsisfalse. -
applicantsis the published text.applicantsCategoryisover_200,first_25, ornull.applicantsDetails.kindisexact,lower_bound,upper_bound,range, orunknown. "Over 200 applicants" givesmin: 201andcount: null. "Be among the first 25 applicants" givesmax: 25andcount: null. -
locationshas all valid job locations.locationDetailsisnullwhen a job has several locations. Country codes use ISO 3166-1 alpha-2. Region codes are checked for the US, Canada, and Australia, such asUS-IL. Other region codes staynull. The Actor does not split display text to invent an address. -
workplaceTypeisremote,hybrid,on_site, ornull. It is set only when LinkedIn states it.workRemoteAllowedistruefor an explicit remote value. An absent value does not mean that remote work is not allowed. -
applicationMethodislinkedin(LinkedIn-hosted apply),external(employer-site apply), orunknown.applicationUrlis the employer application URL that LinkedIn publishes, ornull. An external-apply icon alone does not give a URL. LinkedIn sign-in URLs are not application URLs. -
employerJobIdis the employer's reference number. It is not the LinkedIn ID. -
descriptionHtmlis the HTML markup that LinkedIn publishes. Sanitise it before you show it in a browser or another HTML client. -
criteriahas every published criteria label and value. The convenience fieldsexperienceLevel,employmentType, andindustriescan benullwhen a listing uses other labels. -
employmentTypeCodekeeps LinkedIn's employment type code, such asFULL_TIME.featuredBenefitsis the list of benefits that LinkedIn shows, andfeaturedBenefitsSourceandbenefitsDataSourcekeep the published text that says where the list comes from. -
educationRequirementsandskillsare published strings.applicantLocationRequirementskeeps the published objects or strings. LinkedIn can publish a wrong country label there. Do not treat it as a checked address. -
referralMultiplieris a published callout such as2x. It is display text, not a calculated probability. -
searchGeoIdis search context. It is not the location ID of the job.geoIdis its old alias. -
similarJobshas the related listings that you request withincludeSimilar. The current job and repeated IDs are removed.peopleAlsoViewed,similarSearches, andrelatedSearchesare separate recommendations that come with job details. -
recruiterisnullwhen LinkedIn does not show recruiter information. -
Some fields describe the same value. Use the preferred field in new exports:
Field Preferred field benefitsCountbenefitsSummaryapplicantsStatusapplicantsCategorycompensationProvidercompensationHeadinghasDirectApplyapplicationMethod === "linkedin"geoIdsearchGeoId
Company profile
With fetchCompanyDetails, companyDetails has id, universalName, name,
linkedinUrl, description, website, employeeCount, employeeCountRange,
industry, industries, headquarters, followerCount, logo, logos,
backgroundCovers, companyType, tagline, foundedYear, specialities,
location, and locations.
- The employee count is LinkedIn's published count. It is not verified payroll
headcount.
employeeCountRangehastext,start, andend. An open upper limit staysnull. locationis the primary structured address. Each item inlocationshas the same address fields plustext,addressLines, andheadquarter. A location that LinkedIn marks "Primary" hasheadquarter: true. Other locations havenull. The display address lines stay unchanged.- Each logo or cover has
url,width,height, andexpiresAt. Dimensions and expiry dates staynullunless LinkedIn publishes them. - If a company page is not available, the job stays in the Dataset and
companyDetailsisnull.
Optional enrichment output
Every result has an enrichment object. Without the optional settings it is:
{"enrichment": {"resolvedLocation": null,"companyLocations": null,"images": null,"employer": null}}
enrichment.resolvedLocationis a lookup result for the job location, fromresolveLocations. It hasresolvedGeoId,displayName,query,method,source, andsourceUrl. LinkedIn's job search page picks a location for any text and shows only a short name, such as "Toronto" for "Toronto, Ontario, Canada". So a result needs the shown name to equal the location text. Countries and metro areas usually match. "City, Region, Country" locations givenull. Several places can share a short name: the US state and the country both show "Georgia". So LinkedIn's location typeahead must also rank the same place first. It does not replacejobGeoId,searchGeoId, or the original address.enrichment.companyLocationsis an array ofindex,address, andgeowhenparseCompanyAddressesis on, ornull.indexpoints to the item incompanyDetails.locations.addresshasdetails,input(the original address lines),components(alwaysnull),method, andsource. An address that is not available isnull.geois alwaysnull: company addresses are city level, and LinkedIn confirms only a place's short name. The original data stays incompanyDetails.enrichment.imagesis an array ofurl,width,height,type,method, andsource, ornull. Width and height are measured positive integers. An image that is not supported or not available gets no measurement. The array is empty when measurement is on and no usable image is found. These values stay separate from the sizes in the company profile.enrichment.employeris the matching job from the employer's hiring system, ornull. It hasprovider,sourceUrl,fetchedAt,employerJobId,requisitionId,title,jobUrl,applyUrl,employmentType,workplaceType,isRemote,salaryRanges,salaryText,location,locationDetails,secondaryLocations,secondaryLocationDetails,postedAt,updatedAt, andclosesAt.providerisgreenhouse,lever,ashby,workday,adp_workforce_now,icims,oracle,ukg_pro,paylocity,smartrecruiters,workable,bamboohr,rippling,breezy, orrecruitee. The Actor finds the provider from the employer URL. It does not set the LinkedInapplicantTrackingSystemfield.
Employer data needs an exact job URL or an exact employer ID in the identified
job board. The Actor does not match by job title. Missing employer fields are
null. Employer values stay in this object and do not replace LinkedIn salary,
location, or status fields. Each salary range has min, max, currency,
interval, label, and description, and the ranges stay separate.
Provider differences:
- Greenhouse ranges have no pay period, so
intervalisnull. - Ashby salary ranges exclude bonus and equity.
- A Rippling range
labelis the employer's pay tier, not a place. - ADP Workforce Now shows a fixed pay as one amount, so
minandmaxare equal. - A single Breezy amount, such as "$23+", is a minimum.
- BambooHR pay is free text in
salaryText. - For Workday, BambooHR, and Breezy,
postedAtandclosesAtcan be a date with no time, such as2026-10-02. - For iCIMS, Paylocity, Breezy, and BambooHR, and for most Workable jobs,
locationisnullandlocationDetailshas the address. - Workday employers write their own remote labels. Only
Remote,Hybrid, andOn-sitesetworkplaceType. For Rippling and Breezy,workplaceTypeisnull. For Oracle,workplaceTypestays correct when the employer renames its workplace labels. - A closed job gives
null. So do links to an employer's own domain, shortened links, and Paylocity jobs without a city or state.
Unavailable job IDs
An unavailable job ID in direct lookup gives a placeholder. It keeps your result list aligned with your ID list, also for repeated IDs. Each placeholder is a Dataset item.
{"jobId": "0","jobUrl": "https://www.linkedin.com/jobs/view/0","title": "","company": "","location": "","isNew": false,"applicationMethod": "unknown","hasDirectApply": false,"applicationDetails": {"companyApplyUrl": null,"easyApplyUrl": null,"applyStartersPreferenceVoid": null,"inPageOffsiteApply": null,"type": "unknown"},"applicantsDetails": {"text": null,"count": null,"min": null,"max": null,"kind": "unknown"},"enrichment": {"resolvedLocation": null,"companyLocations": null,"images": null,"employer": null},"scrapedAt": "2026-10-14T11:22:15.428Z"}
All other root fields are null. The example shows the fields that are not
null.
FAQ
How many jobs can I get?
One search returns at most 1,000 jobs, because LinkedIn lists no more. A run
returns at most 100,000 unique jobs, with up to 100 searches. To get more jobs
for a topic, split the search by queries, locations, companies, or filters.
Jobs that two searches both find are saved once. A later startPage reduces the
range of a search.
Why did I get fewer jobs than maxJobs?
maxJobs is an upper limit. The search can have fewer jobs, and the filters can
remove some. The Actor removes repeated job IDs. A jobType or experienceLevel
filter keeps only jobs that match, and the run ends with fewer jobs when too few
match.
How do I get only the new jobs?
Run the Actor on a schedule with datePostedSeconds (for example 86400 for a
daily run, or 3600 for an hourly run) and sortBy: "recent". Use the jobId
field to remove jobs that you already have.
How do I find a company ID, location ID, industry ID, or job ID?
- Company ID. Run a search with
fetchDetails. Each job hascompanyId. You can also give the exact company name or the LinkedIn company URL incompanies. - Location ID. Copy it from the
geoIdparameter of a LinkedIn job search URL. Or useresolveLocationsto getenrichment.resolvedLocation.resolvedGeoIdfor a job. - Industry ID. Copy it from the
f_Iparameter of a LinkedIn job search URL. - Job ID. It is the number at the end of a job URL, and it is the
jobIdfield in the output.
Do I need a LinkedIn account or cookie?
No. The Actor uses public pages. It has no login or cookie input. Public results can differ from results in a member account.
Why are some fields empty?
LinkedIn does not publish every field for every job, and many fields need
fetchDetails. Pay is empty when the job shows no pay. applicationUrl is
empty when LinkedIn hides the employer link, which it does for most jobs.
workplaceType is set only when the job page states it. See
What data does it extract?.
What happens when a job is closed or a job ID is not available?
A job in a search result that closes before the Actor reads its details stays in
the Dataset with the search fields, and the detail fields are null. A closed
job can have a closedNotice. In job ID mode, an unavailable ID gives a
placeholder. If related jobs are not available, similarJobs can have fewer
jobs or be null.
Why does the log show HTTP 429 warnings?
LinkedIn sends a random HTTP 429 for about a third of job page requests. The Actor tries again on a new connection, so the job is usually saved on the second attempt. If a later search page cannot be collected, the Actor saves the jobs from the earlier pages and can finish successfully. If the first page of a search cannot be collected, the run stops, and the jobs that are already saved stay in the Dataset.
Can I get the recruiter's email address?
No. The Actor returns the recruiter name, title, profile link, and photo when LinkedIn shows them. It returns no email addresses. For LinkedIn profiles, companies, and posts, use LinkedIn Profiles, Companies, and Comments.
Does it work outside the United States?
Yes. Give the location as text, such as Stockholm or Canada, or as a
location ID in geoIds.
A feature or field that I need is missing. What can I do?
Tell us in the Issues tab. Describe what you need and give an example search or job ID.
Where can I report a problem?
Open an issue in the Issues tab. Include the run ID and the input, so that we can reproduce it. LinkedIn can change listing status, classifications, criteria, and result order.
Similar Actors
- Indeed Jobs Scraper. Indeed jobs with pre-parsed salary, company profiles, and hiring signals in 54 countries.
- Glassdoor Jobs Scraper. Glassdoor job listings with description, salary, location, and company details.
- Google Jobs Scraper. Public Google Jobs results with application links and the employer's website.
- Upwork Jobs Scraper. Public Upwork job search results and job details.
- Naukri Jobs Scraper. Naukri jobs with filters for company, salary, work mode, and experience.
- LinkedIn Profiles, Companies, and Comments. LinkedIn profiles, companies, services, and posts, with employees, comments, and reactions.