LinkedIn Jobs Scraper - Search, Filter & Detail Extraction avatar

LinkedIn Jobs Scraper - Search, Filter & Detail Extraction

Pricing

from $0.05 / 1,000 jobs

Go to Apify Store
LinkedIn Jobs Scraper - Search, Filter & Detail Extraction

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

Kai

Maintained by Community

Actor stats

2

Bookmarked

1K

Total users

167

Monthly active users

9.5 hours

Issues response

14 hours ago

Last modified

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 jobId to 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?

DataWhen you get it
Job ID, slug, title, link, company name, company ID, company link, and company logoEvery job
Location, search position, posted date, time since posting, new flag, and hiring badgeEvery 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 industriesWith fetchDetails, or in job ID mode
Applicants as text, a category, and a count or rangeWith fetchDetails, or in job ID mode
Compensation context, featured benefits, application method, application link, and closure noticeWith fetchDetails, or in job ID mode
Recruiter name, title, profile link, and photoWhen LinkedIn shows a recruiter
Workplace type, structured location, education, experience, and skillsWhen the job page publishes them
Jobs that people also viewed, similar searches, and related searchesWith fetchDetails
Similar jobsWith includeSimilar
Company profile: description, website, employee count, industry, headquarters, followers, specialities, founding year, locations, and logosWith fetchCompanyDetails
Location IDs for jobs, parsed company addresses, and image dimensionsWith resolveLocations, parseCompanyAddresses, and measureImageDimensions
The employer's own job data: title, apply link, pay ranges, locations, and datesWith 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

  1. Enter a job title or a sentence in Search query, and a place in Location.
  2. Set Max jobs. Use 0 to get all the jobs that LinkedIn lists for the search, up to 100,000 jobs. Each search returns at most 1,000 jobs.
  3. 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 goalUseRequired input
Find roles by keywords or a sentence, with optional filtersQuery searchkeywords or queries
Reuse a LinkedIn search URL with any filterURL searchsearchUrl or searchUrls
Browse the open roles of one or more companiesCompany searchcompanyId or companies
Retrieve jobs that you already knowDirect lookupjobIds

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 geoIds entry 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 fetchDetails is false. 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 jobId and the canonical jobUrl. 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 of full_time, part_time, contract, temporary, volunteer, internship, and other.
  • experienceLevel. Any of internship, entry_level, associate, mid_senior, director, and executive.
  • workType. Any of on_site, remote, and hybrid.
  • datePosted. past_24h, past_week, or past_month.
  • datePostedSeconds. A custom window in seconds, such as 3600 for the last hour. It overrides datePosted. The maximum is 2592000 (30 days). A short window can return no jobs.
  • salary. A minimum salary: 40000, 60000, 80000, 100000, 120000, 140000, 160000, 180000, or 200000. salaryThresholds adds 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 recent and relevant. For recent, the Actor collects the newest jobs first. It sorts the saved jobs by date, newest first. All jobs stay inside your datePosted or datePostedSeconds window. With a startPage above 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_JT and f_E in 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 workplaceType in 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.

ValueOrder
relevantLinkedIn's own order.
recentNewest 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.

OptionWhat it addsNotes
fetchDetailsDescription, complete criteria, compensation context, benefits, application details, applicants, recruiter, and related searchesOne more request for each job
includeSimilar and maxSimilarJobssimilarJobs for each job. maxSimilarJobs is 25 by default. 0 means all available, up to 1,000Charged for each similar job
fetchCompanyDetailscompanyDetails, the public company profileOne request for each company in the run. Works without fetchDetails. Unavailable profiles stay null.
resolveLocationsenrichment.resolvedLocationA 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.
parseCompanyAddressesenrichment.companyLocations[].addressNeeds fetchCompanyDetails
measureImageDimensionsenrichment.images: width, height, and type of LinkedIn imagesReads image headers only
fetchEmployerDetailsenrichment.employer: the employer's own job dataNeeds 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.

FieldTypeDefaultDescription
keywordsstringOne keyword query or sentence. Combined with queries, and with company and location filters.
queriesstring[]Keyword or sentence queries. Up to 100. One search for each query and location. Combined with keywords.
locationstringOne location. Combined with locations. Works with company filters.
locationsstring[]Locations. Up to 100. Combined with location.
geoIdsstring[]Numeric LinkedIn location IDs. Up to 10. Each ID adds a location.
companyIdstringA company ID, or comma-separated IDs. Combined with companies, keywords, and locations.
companiesstring[]Company IDs, exact names, or LinkedIn company URLs. Up to 20. Combined into one company filter.
searchUrlstringOne LinkedIn jobs search URL. It uses its own filters. Combined with searchUrls and any structured searches.
searchUrlsstring[]LinkedIn jobs search URLs. Up to 100. Each URL uses its own filters.
jobIdsstring[]Fetch known jobs. Takes precedence over every search input. Always fetches details, keeps repeated IDs, and ignores blank entries.
maxJobsinteger25Unique 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.
maxJobsPerSearchinteger1000New jobs from one search, from 0 to 1,000. 0 means 1,000. The maxJobs limit also applies.
startPageinteger1First search page for every search, from 1 to 40. Also replaces the start position in search URLs.
sortBystringrelevantrelevant or recent.
jobTypestring[]full_time, part_time, contract, temporary, volunteer, internship, or other.
experienceLevelstring[]internship, entry_level, associate, mid_senior, director, or executive.
workTypestring[]on_site, remote, or hybrid. LinkedIn ignores this filter.
datePostedstringpast_24h, past_week, or past_month.
datePostedSecondsintegerCustom posted-within window in seconds, from 1 to 2,592,000. Overrides datePosted. Ignored for search URLs.
salarystringMinimum salary: 40000, 60000, 80000, 100000, 120000, 140000, 160000, 180000, or 200000.
salaryThresholdsstring[]More minimum salary values from the same list. Up to 9. Combined with salary.
easyApplyOnlybooleanfalseOnly Easy Apply jobs.
under10ApplicantsbooleanfalseJobs with fewer than 10 applicants. LinkedIn controls availability.
industryIdsstring[]Numeric LinkedIn industry IDs. Up to 20.
fetchDetailsbooleanfalseAdd descriptions, complete criteria, compensation context, benefits, application details, recruiter, and related searches.
includeSimilarbooleanfalseAdd similar jobs to each result.
maxSimilarJobsinteger25Similar jobs for each result, from 0 to 1,000. 0 means all available.
fetchCompanyDetailsbooleanfalseAdd the public company profile. Works without fetchDetails.
resolveLocationsbooleanfalseLook up the job's location text. Return an ID only when LinkedIn shows the same name.
parseCompanyAddressesbooleanfalseParse company address lines. Needs fetchCompanyDetails.
measureImageDimensionsbooleanfalseMeasure published LinkedIn images.
fetchEmployerDetailsbooleanfalseAdd the employer's own job data. Needs job details and an external application link to a supported hiring system.
concurrencyinteger6Jobs processed at the same time, from 1 to 10. Searches still run in order.
adaptiveDelaybooleantrueSlow down after blocked responses (HTTP 403 or 999), and speed up after successful responses.
userAgentstringAdvanced. Leave empty. Length 1 to 1,024 characters, no line breaks.
proxyConfigurationobject{"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

GroupRoot fields
IdentityjobId, jobSlug, title, company, companyId, companySlug
Links and mediajobUrl, companyUrl, companyLogoUrl
Search metadatalocation, position, postedDate, postedTimeAgo, isNew, salary, badge, hiringSignal, benefitsSummary, benefitsCount
Structured datasalaryDetails, locationDetails, locations, workplaceType, workRemoteAllowed, companyDetails
Optional enrichmentenrichment
Job detailsdescription, descriptionHtml, criteria, experienceLevel, employmentType, industries, applicants, applicantsCategory, applicantsStatus
Compensation and benefitscompensationSalary, compensationHeading, compensationProvider, compensationType, compensationDescription, featuredBenefits, featuredBenefitsSource
ApplicationapplicationMethod, hasDirectApply, applicationUrl, applicationDetails, easyApplyUrl, applicantsDetails, closedNotice
RequirementseducationRequirements, experienceRequirements, skills, applicantLocationRequirements, employmentTypeCode
Status and listing dataexpireAt, jobState, closedAt, views, employerJobId, benefitsDataSource, jobGeoId, contentSource, jobApplicationLimitReached, applicantTrackingSystem
Related datasimilarJobs, peopleAlsoViewed, similarSearches, relatedSearches
Other detailssearchGeoId, geoId, industryIds, titleId, ogTitle, referralMultiplier, recruiter, jobFunction, jobFunctions, scrapedAt

Field notes

  • jobId is the LinkedIn job ID. Use it to remove jobs that you already have and as input for jobIds.

  • position is the position on the returned search page. It can repeat across pages.

  • postedDate and expireAt use the dates that LinkedIn publishes for the job, with LinkedIn's precision. A value can be a date such as 2026-09-28 or a timestamp such as 2026-09-28T17:34:35.000Z. With job details, postedDate can be more precise. postedTimeAgo is the display text, such as "2 days ago".

  • jobState is CLOSED only when LinkedIn shows an explicit closure notice. An expiry date does not prove that a job is closed. A null closedNotice does not prove that applications are open.

  • badge is the complete label that LinkedIn shows with a job in search results. hiringSignal is actively_hiring, early_applicant, or null. benefitsSummary keeps the full label for recognised benefit labels.

  • salary is the pay text from the search result. The compensation* fields keep the pay text and context from the job details. They are display text, not a normalised salary model. salaryDetails has parsed amounts.

  • salaryDetails has text, min, max, currency, payPeriod, compensationType, compensationSource, and providedByEmployer. Pay periods are hour, day, week, month, or year. A dollar sign alone does not set the currency to USD. Unknown parts are null. salaryDetails can have a value when fetchDetails is false.

  • applicants is the published text. applicantsCategory is over_200, first_25, or null. applicantsDetails.kind is exact, lower_bound, upper_bound, range, or unknown. "Over 200 applicants" gives min: 201 and count: null. "Be among the first 25 applicants" gives max: 25 and count: null.

  • locations has all valid job locations. locationDetails is null when a job has several locations. Country codes use ISO 3166-1 alpha-2. Region codes are checked for the US, Canada, and Australia, such as US-IL. Other region codes stay null. The Actor does not split display text to invent an address.

  • workplaceType is remote, hybrid, on_site, or null. It is set only when LinkedIn states it. workRemoteAllowed is true for an explicit remote value. An absent value does not mean that remote work is not allowed.

  • applicationMethod is linkedin (LinkedIn-hosted apply), external (employer-site apply), or unknown. applicationUrl is the employer application URL that LinkedIn publishes, or null. An external-apply icon alone does not give a URL. LinkedIn sign-in URLs are not application URLs.

  • employerJobId is the employer's reference number. It is not the LinkedIn ID.

  • descriptionHtml is the HTML markup that LinkedIn publishes. Sanitise it before you show it in a browser or another HTML client.

  • criteria has every published criteria label and value. The convenience fields experienceLevel, employmentType, and industries can be null when a listing uses other labels.

  • employmentTypeCode keeps LinkedIn's employment type code, such as FULL_TIME. featuredBenefits is the list of benefits that LinkedIn shows, and featuredBenefitsSource and benefitsDataSource keep the published text that says where the list comes from.

  • educationRequirements and skills are published strings. applicantLocationRequirements keeps the published objects or strings. LinkedIn can publish a wrong country label there. Do not treat it as a checked address.

  • referralMultiplier is a published callout such as 2x. It is display text, not a calculated probability.

  • searchGeoId is search context. It is not the location ID of the job. geoId is its old alias.

  • similarJobs has the related listings that you request with includeSimilar. The current job and repeated IDs are removed. peopleAlsoViewed, similarSearches, and relatedSearches are separate recommendations that come with job details.

  • recruiter is null when LinkedIn does not show recruiter information.

  • Some fields describe the same value. Use the preferred field in new exports:

    FieldPreferred field
    benefitsCountbenefitsSummary
    applicantsStatusapplicantsCategory
    compensationProvidercompensationHeading
    hasDirectApplyapplicationMethod === "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. employeeCountRange has text, start, and end. An open upper limit stays null.
  • location is the primary structured address. Each item in locations has the same address fields plus text, addressLines, and headquarter. A location that LinkedIn marks "Primary" has headquarter: true. Other locations have null. The display address lines stay unchanged.
  • Each logo or cover has url, width, height, and expiresAt. Dimensions and expiry dates stay null unless LinkedIn publishes them.
  • If a company page is not available, the job stays in the Dataset and companyDetails is null.

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.resolvedLocation is a lookup result for the job location, from resolveLocations. It has resolvedGeoId, displayName, query, method, source, and sourceUrl. 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 give null. 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 replace jobGeoId, searchGeoId, or the original address.
  • enrichment.companyLocations is an array of index, address, and geo when parseCompanyAddresses is on, or null. index points to the item in companyDetails.locations. address has details, input (the original address lines), components (always null), method, and source. An address that is not available is null. geo is always null: company addresses are city level, and LinkedIn confirms only a place's short name. The original data stays in companyDetails.
  • enrichment.images is an array of url, width, height, type, method, and source, or null. 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.employer is the matching job from the employer's hiring system, or null. It has provider, sourceUrl, fetchedAt, employerJobId, requisitionId, title, jobUrl, applyUrl, employmentType, workplaceType, isRemote, salaryRanges, salaryText, location, locationDetails, secondaryLocations, secondaryLocationDetails, postedAt, updatedAt, and closesAt. provider is greenhouse, lever, ashby, workday, adp_workforce_now, icims, oracle, ukg_pro, paylocity, smartrecruiters, workable, bamboohr, rippling, breezy, or recruitee. The Actor finds the provider from the employer URL. It does not set the LinkedIn applicantTrackingSystem field.

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 interval is null.
  • Ashby salary ranges exclude bonus and equity.
  • A Rippling range label is the employer's pay tier, not a place.
  • ADP Workforce Now shows a fixed pay as one amount, so min and max are equal.
  • A single Breezy amount, such as "$23+", is a minimum.
  • BambooHR pay is free text in salaryText.
  • For Workday, BambooHR, and Breezy, postedAt and closesAt can be a date with no time, such as 2026-10-02.
  • For iCIMS, Paylocity, Breezy, and BambooHR, and for most Workable jobs, location is null and locationDetails has the address.
  • Workday employers write their own remote labels. Only Remote, Hybrid, and On-site set workplaceType. For Rippling and Breezy, workplaceType is null. For Oracle, workplaceType stays 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 has companyId. You can also give the exact company name or the LinkedIn company URL in companies.
  • Location ID. Copy it from the geoId parameter of a LinkedIn job search URL. Or use resolveLocations to get enrichment.resolvedLocation.resolvedGeoId for a job.
  • Industry ID. Copy it from the f_I parameter of a LinkedIn job search URL.
  • Job ID. It is the number at the end of a job URL, and it is the jobId field in the output.

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