LinkedIn Jobs Search Scraper avatar

LinkedIn Jobs Search Scraper

Pricing

from $0.40 / 1,000 job listings

Go to Apify Store
LinkedIn Jobs Search Scraper

LinkedIn Jobs Search Scraper

The LinkedIn Jobs Search Scraper extracts job postings by keyword and location, breaking past LinkedIn’s 1,000-result cap and removing duplicates, capturing titles, companies, locations, posted dates, salaries, seniority, applicant counts, and company profiles — ideal for recruitment analysis.

Pricing

from $0.40 / 1,000 job listings

Rating

0.0

(0)

Developer

FalconScrape

FalconScrape

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

18 hours ago

Last modified

Share

🚀 LinkedIn Jobs Search Scraper

Search LinkedIn jobs by keyword and location and export every matching posting to JSON, CSV or Excel — including the ones a normal scraper can't reach.

LinkedIn serves at most 1,000 results per search, no matter how many jobs actually match. A search for "engineer" in the United States matches over 300,000 postings; ask for them and you get 1,000. This scraper detects when a search hits that ceiling, splits it into narrower searches, runs them, and merges everything with duplicates removed — so you get the jobs, not the ceiling.

Every run tells you how many jobs LinkedIn says match versus how many were actually returned. If your results are incomplete, you'll know.

✨ Features

  • Goes past the 1,000-result limit. Automatic search splitting and merging. Measured on "engineer" / United States: 1,500 unique jobs, zero duplicates, in 191 requests — where the plain search tops out at 1,000.
  • Deduplicated, always. LinkedIn repeats results across its own result pages, and overlaps between split searches are unavoidable. Every job appears once, keyed on its LinkedIn job ID.
  • Multiple titles and locations in one run. Every keyword is searched against every location.
  • Three levels of depth, so you pay for what you need:
    • Listing — title, company, location, posted date, logo, links
    • + Job detail — full description, posted salary parsed into min/max/currency/period, seniority, employment type, job function, industries, applicant count, apply type
    • + Company — followers, employee count, industry, website, headquarters, founded, specialties
  • Company data is charged once per company, not once per job. A 500-job run usually spans far fewer companies, and the work is only done once.
  • Worldwide by default. Leave the location empty and you get jobs from everywhere, not just the country the server happens to sit in.
  • Only filters that actually work. Posted-within window, keyword and location all genuinely narrow the search. Workplace type, experience level, job type and salary band are deliberately not offered: LinkedIn accepts them on this endpoint and then ignores them, so exposing them would hand you unfiltered data that looks filtered.
  • Honest truncation reporting. Every run writes a RUN_SUMMARY with returned, estimatedTotal, truncated and the reason.
  • No proxy needed. Runs clean without one; proxy support is there as a fallback for high volume, not a requirement.

🛠️ How It Works

  1. Enter your search keywords and locations, plus any filters.
  2. Choose how much data you want per job — listing, detail, or detail + company.
  3. Run it. Any search that hits LinkedIn's 1,000-result ceiling is automatically split and merged.
  4. Export to JSON, CSV, Excel, or pull it from the API.

A capped search is split into narrower posting-date windows, which is the one dimension LinkedIn's guest search actually honours, and the results are merged on job ID. If you set a posted-within window, splits stay inside it — you never get jobs older than you asked for.

📋 Output Fields

Listing (every run)

FieldDescription
jobIdLinkedIn job posting ID — the deduplication key
jobUrlCanonical LinkedIn job URL
titleJob title
companyNameHiring company name
companyUrlCompany LinkedIn URL, normalised so it works as a join key
companySlugCompany slug
locationJob location
postedDatePosting date (YYYY-MM-DD)
postedTimeAgoRelative posting age, e.g. "2 weeks ago"
companyLogoCompany logo image
sourceQueryWhich search this job came from
scrapedAtISO 8601 scrape timestamp

Job detail

FieldDescription
descriptionFull job description text
salaryTextPosted salary range as displayed
salaryMin / salaryMaxParsed salary bounds
salaryCurrency / salaryPeriodCurrency, and year / hour / month
seniorityLevelEntry level, Mid-Senior level, ...
employmentTypeFull-time, Part-time, Contract, ...
jobFunctionJob function
industriesIndustries
applicantCountApplicant count as a number
numApplicantsCaptionApplicant caption as displayed
applyTypeeasyApply or offsite (external ATS)
jobTitle / jobLocationTitle and location from the posting page
criteriaOriginal name/value criteria list
similarJobsSimilar jobs LinkedIn surfaces alongside this posting
peopleAlsoViewedJobs that viewers of this posting also viewed

Company

FieldDescription
companyIdNumeric LinkedIn company ID
companyFollowersLinkedIn follower count
companySizeEmployee band as published, e.g. "51-200 employees"
companyEmployeeCountUpper bound of that band, as a number
companyIndustryCompany industry
companyWebsiteCompany website
companyHeadquartersHeadquarters location
companyDescriptionCompany About text
companyTaglineCompany tagline
companyFoundedYear founded
companySpecialtiesCompany specialties
companyTypePublic company, Privately Held, ...

Salary is only present where the employer posts it — common in the US, rare elsewhere. Fields with no data are null, never invented.

📊 Sample Output Data

{
"jobId": "4442224163",
"jobUrl": "https://www.linkedin.com/jobs/view/4442224163",
"title": "Critical Facility Engineer II (Day Shift)",
"companyName": "Salute",
"companyUrl": "https://www.linkedin.com/company/inc-salute",
"companySlug": "inc-salute",
"location": "Cheyenne, WY",
"postedDate": "2026-07-20",
"postedTimeAgo": "2 weeks ago",
"companyLogo": "https://media.licdn.com/dms/image/v2/D560BAQFxKcXt6-AAgw/company-logo_100_100/0/1709501595672/salute_dcs_logo",
"sourceQuery": "sortBy=DD&keywords=engineer&location=United States",
"scrapedAt": "2026-08-05T12:51:05.793Z"
}

With detail + company depth, each row also carries the description, parsed salary, seniority, applicant count and the hiring company's profile:

{
"jobId": "4437106135",
"title": "Registered Nurse - Ambulatory",
"companyName": "Incredible Health",
"location": "Quincy, MA",
"postedDate": "2026-06-10",
"salaryText": "$76,003.20 - $163,678.32",
"salaryMin": 76003.2,
"salaryMax": 163678.32,
"salaryCurrency": "$",
"salaryPeriod": "year",
"seniorityLevel": "Entry level",
"employmentType": "Full-time",
"jobFunction": "Health Care Provider",
"industries": "Health and Human Services",
"applicantCount": 25,
"applyType": "offsite",
"companyFollowers": 26902,
"companySize": "51-200 employees",
"companyEmployeeCount": 200,
"companyIndustry": "Software Development",
"companyWebsite": "http://www.incrediblehealth.com",
"companyHeadquarters": "San Francisco, California",
"companyFounded": "2017"
}

💰 Pricing

Pay only for what you extract:

EventPrice (Free plan)Price (Gold plan)
Job listing$0.0008$0.0004
Job with full details$0.003$0.0012
Company profile (per unique company)$0.01$0.004

A 500-job run with full job details costs about $1.50 on the Free plan and $0.60 on Gold.

❓ FAQ

Why don't I get all 319,000 jobs LinkedIn says match? LinkedIn serves 1,000 results per search. Splitting a search multiplies what's reachable but doesn't make it unlimited. Narrow your search — one city instead of a whole country, one keyword instead of a broad one — and run several. The RUN_SUMMARY tells you exactly when and why a run stopped short.

Do I need a proxy? No. Leave it off unless you're running at high volume and start seeing failures.

Do I need a LinkedIn account or cookies? No. Only publicly visible job data is collected.

Can I get jobs for a specific company? Use the LinkedIn Company Jobs Scraper, which resolves the company properly instead of keyword-matching its name.