LinkedIn Jobs Scraper avatar

LinkedIn Jobs Scraper

Pricing

from $0.95 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper

LinkedIn Jobs Scraper

[πŸ’° $0.95 / 1K] Extract LinkedIn job postings at scale β€” title, company, location, salary, description, seniority, employment type, applicant count, and recruiter details. Search by keyword and location with date, job-type, experience-level, and remote filters, or paste LinkedIn search URLs.

Pricing

from $0.95 / 1,000 results

Rating

0.0

(0)

Developer

SolidCode

SolidCode

Maintained by Community

Actor stats

0

Bookmarked

56

Total users

15

Monthly active users

1.1 days

Issues response

21 hours ago

Last modified

Share

Pull public LinkedIn job postings at scale β€” title, hiring company, location, full description, seniority, employment type, job function and industry on every single row, plus applicant counts, listed pay and the recruiter behind the role on the postings that publish them, and optional company profiles. Search with plain keyword + location fields (no hand-built URLs) and get one clean row per job. Built for recruiters, sourcers, talent-market analysts, and job-board builders who need fresh LinkedIn job data without manual copy-paste or maintaining a LinkedIn login.

Why This Scraper?

  • No LinkedIn login or cookies required β€” runs entirely against LinkedIn's public guest job listings, so there's no account to connect, no session to babysit, and a much lower compliance footprint.
  • Plain keyword + location search, not URL hacking β€” type "data engineer" and "United States" instead of hand-crafting a LinkedIn URL; power users can still paste raw LinkedIn job-search URLs, and the run tells you by name if a pasted URL uses a filter LinkedIn's public search doesn't apply.
  • Company-level targeting from a plain LinkedIn page address β€” paste linkedin.com/company/microsoft and get only that employer's postings; stack several companies to watch a whole competitor set in one run.
  • Four recency windows down to "Past 24 hours" β€” combine with Most-recent sort to build a daily feed of brand-new postings, ordered by real posting date rather than LinkedIn's own shuffle.
  • Seniority, employment type, job function and industry on every row β€” read straight off each posting, so you can slice the export by any of them after the fact in your spreadsheet or database.
  • Recruiter contact block pulled out whenever LinkedIn names a job poster β€” name, title, photo, and LinkedIn profile URL, so warm outreach reaches a person instead of a careers inbox. Roughly 1 posting in 10 names one, and senior and executive roles name one far more often (about 1 in 4).
  • Listed pay split into a structured min/max pair you can sort on β€” about 1 posting in 5 publishes pay, rising to roughly 1 in 2 in pay-transparency markets such as New York; you also get the live applicant count (present on about two thirds of postings) and the employer's Featured Benefits list on the minority of roles that publish one.
  • Optional one-toggle company enrichment β€” flip on scrapeCompanyDetails to append each company's description, website, employee count, and industry to the job row.
  • Full job description in both plain text and HTML β€” descriptionText for analysis and descriptionHtml to preserve formatting, plus job function and industry classification.
  • Up to ~1,000 jobs per search with smooth pagination β€” pages straight through LinkedIn's guest ceiling, and de-duplicates jobs that appear across overlapping searches.

Use Cases

Recruiting & Sourcing

  • Build daily feeds of newly posted roles in your niche and territory
  • Capture the recruiter or job poster behind a role whenever LinkedIn names one
  • Track which companies are actively hiring for a given title
  • Prioritize roles by applicant count so your outreach lands before the shortlist closes

Market & Salary Research

  • Benchmark listed pay ranges by title, seniority, and location across the postings that publish them
  • Measure hiring demand by employment type and workplace arrangement
  • Analyze applicant counts to gauge how competitive roles are
  • Map remote vs. hybrid vs. on-site distribution across a market

Lead Generation

  • Identify companies scaling specific functions (sales, engineering, ops)
  • Build outbound lists of firms hiring for roles your product serves
  • Enrich target accounts with company description, size, and industry
  • Spot fast-growing startups by tracking sustained job-posting volume

Job-Board & Aggregator Content

  • Backfill a niche job board with structured, deduplicated postings
  • Refresh listings on a schedule with the Past-24-hours window
  • Power "jobs near you" or "remote jobs" feeds with workplace filters
  • Normalize titles, functions, and industries across thousands of roles

Competitive Hiring Intelligence

  • Monitor a competitor's open roles to infer roadmap and team growth
  • Track which locations a rival is expanding into
  • Compare seniority mix and employment types across peer companies
  • Watch for leadership hires by filtering Director and Executive levels

Getting Started

The fastest way to start β€” a keyword and a location:

{
"keywords": "data engineer",
"location": "United States",
"maxResults": 100
}

Daily Monitor

Brand-new roles posted in the past 24 hours, newest first:

{
"keywords": "product manager",
"location": "Remote",
"datePosted": "day",
"sortBy": "recent",
"maxResults": 200
}

Competitor Watch

Every role a named set of employers posted this week:

{
"keywords": "machine learning engineer",
"location": "London, United Kingdom",
"datePosted": "week",
"companyUrls": [
"https://www.linkedin.com/company/deepmind",
"https://www.linkedin.com/company/stripe"
],
"maxResults": 300
}

Advanced β€” Full Enrichment

Roles posted in the past week, with company profiles attached to every row:

{
"keywords": "machine learning engineer",
"location": "London, United Kingdom",
"datePosted": "week",
"sortBy": "relevant",
"scrapeCompanyDetails": true,
"maxResults": 500
}

You can also paste raw LinkedIn job-search URLs and mix them with a keyword search:

{
"startUrls": [
"https://www.linkedin.com/jobs/search/?keywords=nurse&location=Berlin"
],
"maxResults": 100
}

Input Reference

ParameterTypeDefaultDescription
keywordsstring"data engineer"Job title, skill, or keyword to search for. Leave empty if you are only using URLs.
locationstring"United States"City, region, or country β€” matches what you'd type in LinkedIn's location box.
startUrlsstring[][]Full LinkedIn job-search URLs, copied from your browser. Keyword, location, date-posted and company filters in the URL are applied; see the note below the table for the ones LinkedIn's public search doesn't apply. Mixable with the keyword search above.

Filters

ParameterTypeDefaultDescription
datePostedselectAny timeRecency window: Any time, Past month, Past week, or Past 24 hours.
companyUrlsstring[][]Only return jobs from these employers. Paste each company's LinkedIn page address, e.g. https://www.linkedin.com/company/microsoft. Empty = every company.
sortByselectMost relevantOrder results by Most relevant, or Most recent to get the freshest postings first, ordered by posting date. Most recent checks a wider pool of listings before picking the newest, so those runs take a little longer.

Output Options & Limits

ParameterTypeDefaultDescription
scrapeCompanyDetailsbooleantrueAlso fetch each job's company profile (description, website, employee count, industry). Turn off for faster runs.
maxResultsinteger100Total jobs to return across all searches and URLs. Several searches share this total and run in order, so a later one returns nothing once it is used up. Use 0 for unlimited instead: every search then runs on its own until LinkedIn runs out of jobs (roughly 1,000 each), so 3 searches can return around 3,000 billed results.

Which filters LinkedIn applies to public job data. Date posted and company work on every search, including inside a pasted URL. Experience level, job type, workplace type, industry and salary do not β€” LinkedIn only applies those for visitors who are signed in to a LinkedIn account, so a URL using them returns a wider set of jobs here than the same link shows in your own browser. This actor reads public data without a login, so it can't apply them. Paste such a URL and the run names the ignored filters in its log rather than quietly returning more than you asked for. Every posting still carries its own seniorityLevel, employmentType, jobFunction and industries, so you can filter the export on those columns afterwards.

Output

Each job posting is one flat row. Here's a representative result with company details enabled:

{
"id": "3801234567",
"link": "https://www.linkedin.com/jobs/view/3801234567",
"title": "Senior Data Engineer",
"companyName": "Acme Analytics",
"companyLinkedinUrl": "https://www.linkedin.com/company/acme-analytics",
"companyLogo": "https://media.licdn.com/dms/image/acme-logo.png",
"location": "New York, NY",
"salary": "$140,000 - $180,000",
"salaryInfo": ["$140,000", "$180,000"],
"benefits": ["Medical insurance", "Dental insurance", "401(k)"],
"postedAt": "2026-05-28",
"applicantsCount": 47,
"descriptionText": "We are looking for a Senior Data Engineer to build and scale our data platform...",
"descriptionHtml": "<p>We are looking for a <strong>Senior Data Engineer</strong>...</p>",
"seniorityLevel": "Mid-Senior level",
"employmentType": "Full-time",
"jobFunction": "Engineering and Information Technology",
"industries": ["Software Development", "Data Infrastructure"],
"jobPosterName": "Jane Doe",
"jobPosterTitle": "Technical Recruiter at Acme Analytics",
"jobPosterPhoto": "https://media.licdn.com/dms/image/jane-doe.jpg",
"jobPosterProfileUrl": "https://www.linkedin.com/in/jane-doe",
"companyDescription": "Acme Analytics builds data infrastructure for enterprise teams...",
"companyWebsite": "https://www.acme-analytics.com",
"companyEmployeesCount": 850,
"companyIndustry": "Software Development"
}

Core Job Fields

FieldTypeDescription
idstringLinkedIn job posting ID
linkstringCanonical job posting URL
titlestringJob title
locationstringJob location text
postedAtstringPosting date as YYYY-MM-DD β€” sorts and filters correctly in Sheets, Excel, and CSV
applicantsCountintegerNumber of applicants so far, on the roughly two thirds of postings where LinkedIn publishes a count

Company

FieldTypeDescription
companyNamestringHiring company name
companyLinkedinUrlstringCompany LinkedIn page URL
companyLogostringCompany logo image URL
companyDescriptionstringCompany about text (when scrapeCompanyDetails is on)
companyWebsitestringCompany website (when scrapeCompanyDetails is on)
companyEmployeesCountintegerCompany employee count (when scrapeCompanyDetails is on)
companyIndustrystringCompany industry (when scrapeCompanyDetails is on)

Compensation

FieldTypeDescription
salarystringListed pay text, on the roughly 1 posting in 5 where the employer publishes it β€” higher in pay-transparency markets such as New York, lower for executive roles
salaryInfostring[]Structured pay parts (min and max), populated on exactly the rows that carry a salary
benefitsstring[]The employer's Featured Benefits list (medical, dental, 401(k), parental leave, and similar). Only a minority of postings publish one, so expect this to be empty on most rows

Description & Classification

FieldTypeDescription
descriptionTextstringPlain-text job description
descriptionHtmlstringHTML job description (preserves formatting)
seniorityLevelstringSeniority as the employer labelled it on the posting (Entry level, Mid-Senior level, etc.)
employmentTypestringEmployment type as the employer labelled it (Full-time, Part-time, Contract, etc.)
jobFunctionstringLinkedIn job function
industriesstring[]Associated industries

Job Poster

FieldTypeDescription
jobPosterNamestringRecruiter / job poster name. Present on roughly 1 posting in 10 β€” closer to 1 in 4 for director and executive roles β€” and blank when LinkedIn does not name a poster
jobPosterTitlestringRecruiter title (same rows as jobPosterName)
jobPosterPhotostringRecruiter photo URL (same rows as jobPosterName)
jobPosterProfileUrlstringRecruiter LinkedIn profile URL (same rows as jobPosterName)

Tips for Best Results

  • Beat the per-search cap by splitting searches β€” each LinkedIn search returns at most ~1,000 jobs. To go deeper, run several narrower searches by location, seniority, or date and the actor will deduplicate overlapping results for you.
  • Set maxResults to 0 when you run several searches at once β€” a number is a single total that the searches share in order, so the last ones can come back empty. 0 gives every search its own run to LinkedIn's ~1,000 ceiling, which is usually what you want for multi-city or multi-role collections. Budget for it: three searches can return around 3,000 results.
  • Build a daily monitor β€” pair sortBy: Most recent with datePosted: Past 24 hours to capture only brand-new postings on a scheduled run.
  • Turn off company details for speed β€” set scrapeCompanyDetails to false when you only need the job posting itself; company enrichment adds an extra request per unique company.
  • Start small to validate β€” set maxResults to 25–50 on your first run to confirm the data matches your needs, then scale up.
  • Combine structured filters with URLs β€” use the clean keyword/location/filter fields for everyday searches and reserve pasted URLs for filter combinations the fields don't cover.
  • Watch applicantsCount for competitiveness β€” low applicant counts on recent postings are your best window for candidate outreach or fast applications.
  • Know which columns are guaranteed and which depend on the employer β€” title, companyName, location, link, postedAt, descriptionText, seniorityLevel, employmentType, jobFunction and industries land on essentially every row. salary, benefits, applicantsCount and the jobPoster* fields only exist when the employer or LinkedIn publishes them, so build reports that tolerate blanks there and never read a missing applicant count as zero.
  • Build a remote feed from the posting text, not a filter β€” search remote as a keyword or set location to Remote, then narrow the export on title and descriptionText. LinkedIn's workplace filter is a signed-in-only feature, so it can't be applied to public job data.
  • Filter seniority and employment type in your spreadsheet, after the run β€” every row carries the employer's own seniorityLevel, employmentType, jobFunction and industries, so one broad run can be sliced many ways. Expect real-world messiness in those labels: most employers leave seniority as "Not Applicable" and tag almost everything "Full-time", so treat them as a hint and lean on title and descriptionText when the cut has to be accurate.

Pricing

From $0.95 per 1,000 results β€” pay-per-result only, with lower rates as you climb Apify's loyalty tiers.

ResultsNo discountBronzeSilverGold
100$0.11$0.11$0.10$0.095
1,000$1.13$1.07$1.01$0.95
10,000$11.30$10.70$10.10$9.50
100,000$113.00$107.00$101.00$95.00

The tiered rates above take effect on 11 September 2026. Until then every run is billed at the Gold rate of $0.95 per 1,000 results, and Gold stays $0.95 after the change.

A "result" is any job posting row in the output dataset. No compute charges β€” you only pay per result returned.

Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

  • Zapier / Make / n8n β€” Workflow automation
  • Google Sheets β€” Direct spreadsheet export
  • Slack / Email β€” Notifications on new postings
  • Webhooks β€” Trigger custom APIs on run completion
  • Apify API β€” Full programmatic access

This actor collects only public, logged-out LinkedIn job listing data for legitimate recruiting, market research, and analytics. Users are responsible for complying with applicable laws and LinkedIn's Terms of Service. Do not use extracted data for spam, harassment, or any unlawful purpose, and handle any personal data (such as recruiter contact details) in accordance with applicable privacy regulations.