LinkedIn Jobs Scraper avatar

LinkedIn Jobs Scraper

Pricing

from $15.00 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper

LinkedIn Jobs Scraper

Scrape LinkedIn job listings without login. Search by keyword and location, filter by job type, seniority, work arrangement and date. Get titles, companies, salaries, descriptions, applicant counts and more. No account required.

Pricing

from $15.00 / 1,000 results

Rating

0.0

(0)

Developer

Yuliia Kulakova

Yuliia Kulakova

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

1

Monthly active users

11 days ago

Last modified

Share

LinkedIn Jobs Scraper

Scrape LinkedIn job listings without login — titles, companies, locations and posting dates, plus salaries, seniority, applicant counts and full descriptions when you turn on Include Full Details.

No LinkedIn account required. Uses LinkedIn's public guest API — fast, no browser needed.

What it does

Search LinkedIn job listings by keyword and location. Run multiple searches at once, apply filters, and optionally fetch full job details including salary ranges, seniority level, applicant count and job description.

  • ✅ No LinkedIn account or login required
  • ✅ Search multiple job titles in one run
  • ✅ Filter by date posted and work arrangement; job type and seniority are matched from each job's own page (see the note under Input)
  • ✅ Optional full details: salary, description, applicant count, industry
  • ✅ Built-in deduplication across pages and queries
  • ✅ Export to JSON, CSV or Excel

Input

FieldTypeDescription
searchQuerystringJob title or keywords (e.g. "software engineer")
searchQueriesarrayMultiple job titles in one run — overrides searchQuery
locationstringCity, country or region (e.g. "New York", "London", "Remote")
maxResultsintegerMax jobs for the whole run, shared across all queries (default: 50, max: 1000). With Include Full Details on, a large run may return somewhat fewer — every job costs an extra request, and the run stops at its own time budget rather than at the run timeout
datePostedstringany · past24h · pastWeek · pastMonth
jobTypearrayfulltime · parttime · contract · temporary · internship · volunteer. Needs includeDescription: true — see the note below
seniorityLevelarrayinternship · entry · associate · mid_senior · director · executive. Needs includeDescription: true — see the note below
workTypearrayonsite · remote · hybrid. Passed through to LinkedIn; its public data does not expose a workplace type, so we cannot confirm how strictly it is applied
includeDescriptionbooleanFetch full details per job (salary, description, applicants). One extra request and a short pause per job. The run stops and returns what it has once it reaches a time budget scaled to maxResults — about 3 minutes for a small request, 40 minutes at most — rather than hitting the run timeout. Default: false
deduplicationbooleanSkip duplicate job postings. Default: true

About jobType and seniorityLevel. LinkedIn's public search endpoint accepts the matching URL parameters but does not apply them. Measured on 2026-08-26 with matched searches, sending them was never better and twice clearly worse: "freelance contract" returned 5 contract jobs in 6 without the filter and 2 in 6 with it; "senior director" returned 3 director-level jobs in 6 without it and 1 in 6 with it. So this Actor no longer sends them. It reads each job's own Employment type and Seniority level instead and keeps only the ones that match — which means these two filters work only when Include Full Details is on. With it off, they are skipped and the run log says so, rather than quietly returning an unfiltered list.

A keyword beats the filter by two orders of magnitude. Measured twice: "freelance contract" as a keyword returned 5 contract roles in 6, and "contract software engineer" returned 5 in 8 — while filtering plain software engineer by jobType: ["contract"] found 1 contract role in 200 job pages read. Contract roles are a fraction of a percent of an unfiltered result set, and the filter has to open and read every job to find them. If you want a specific kind of role, put the word in searchQuery. Use the filter to be certain about what came back, not to go looking for it.

Output fields

FieldDescription
titleJob title
companyCompany name
companyUrlLinkedIn company page URL
companyLogoCompany logo image URL
locationJob location
postedDateDate posted (ISO format)
jobUrlDirect link to the LinkedIn job posting
salaryTextSalary as published on the job page, read out of the free-text description — best effort: the Actor looks for a pay range, so a posting quoting a single figure ("$45/hour") is left empty, as is a range written in an unusual way. It leaves the field empty rather than guessing. LinkedIn does not put pay in search results at all, so this needs Include Full Details — how often it is there depends entirely on where the job is: a New York sample on 2026-08-29 stated pay in 7 of 8 postings, a mixed-location sample on 2026-08-26 in 1 of 5. States with pay-transparency laws publish it, others often do not
salaryMin / salaryMaxParsed salary range
salaryCurrencyCurrency (USD, EUR, GBP…)
salaryPeriodyearly / hourly / monthly
seniorityLevelEntry level, Mid-Senior, Director, etc. Many postings publish Not Applicable — 4 of 8 in a live run on 2026-08-29 — and those cannot satisfy a seniorityLevel filter
employmentTypeFull-time, Part-time, Contract, etc.
jobFunctionJob category (Engineering, Sales, etc.)
industriesIndustry sector
applicantCountNumber of applicants (when shown)
descriptionFull job description text

salaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriod, seniorityLevel, employmentType, jobFunction, industries, applicantCount and description all require Include Full Details (includeDescription: true). Without it you get the search-card fields only: title, company, location, posted date, logo and links.

Example input

{
"searchQuery": "remote data analyst",
"location": "New York",
"maxResults": 100,
"datePosted": "pastWeek",
"includeDescription": true
}

The kind of role is in the query, not in a filter — that is the faster and more accurate way round, for the reason explained above. Add jobType or seniorityLevel on top only when you need every returned row to be certified as that type; expect the run to read a lot of job pages to do it.

Multiple searches in one run:

{
"searchQueries": ["data analyst", "data scientist", "business analyst"],
"location": "United States",
"maxResults": 50,
"workType": ["remote"]
}

Pricing

$15.00 per 1,000 results — approximately $0.015 per job listing.

RunResultsCost
maxResults: 50up to 50~$0.75
maxResults: 300, any number of queriesup to 300~$4.50
maxResults: 1000, any number of queriesup to 1,000~$15.00

maxResults is the budget for the whole run — three queries with maxResults: 300 return 300 jobs in total, not 900. A per-run start charge of $0.01 per GB of memory applies as well ($0.04 at the default 4 GB).

One thing to expect from LinkedIn itself: its public search does not return a stable result set. Repeating an identical request can bring back a completely different page of jobs — measured on 2026-08-29, one of three repeats shared no listings at all with the first. Deduplication is on by default and covers a single run; across runs, treat the results as a sample rather than a fixed list.

Pay only for what you scrape — no subscriptions, no monthly plans.


Something looks wrong? Please tell us

If a run returns fewer jobs than you expected, or a field looks off, open an Issue on this Actor's page. It comes straight to us, and a run ID plus the input you used is usually enough for us to see the cause. LinkedIn changes its pages without warning — an Issue is how we find out quickly, and we would much rather hear it from you than not.

If a run broke on our side, write to us and we will sort it out.


If it did the job

If this Actor saved you time, please leave a rating on its Store page. Ratings are how small Actors get found here — without them, a scraper sits near the bottom of the search results no matter how well it works. It takes a moment, and it genuinely helps.