LinkedIn Jobs Scraper: Salary, Recruiter Contact avatar

LinkedIn Jobs Scraper: Salary, Recruiter Contact

Pricing

from $0.50 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper: Salary, Recruiter Contact

LinkedIn Jobs Scraper: Salary, Recruiter Contact

Scrape public LinkedIn jobs: salary as text and as numbers, full description, applicant count, seniority, employment type, industries, benefits, the recruiter who posted the role, and the hiring company profile. Filters that actually filter. Paste a LinkedIn search URL. From $0.42 per 1,000 results.

Pricing

from $0.50 / 1,000 results

Rating

3.0

(1)

Developer

Sourabh Kumar

Sourabh Kumar

Maintained by Community

Actor stats

2

Bookmarked

176

Total users

11

Monthly active users

15 days ago

Last modified

Share

LinkedIn jobs scraper: search, job details, salary, recruiter & company data

Search LinkedIn jobs by keyword and location, or pull full details for job URLs you already have. Every record can carry the published salary, the recruiter who posted the job, and the hiring company's profile.

From $0.42 per 1,000 results, plus a $0.005 start fee per run. No login, no cookies, no browser.

Search in any language LinkedIn supports. Japanese, Korean, Portuguese and Hindi keywords all return native-script titles, tested against Tokyo, Seoul, Sao Paulo and Bengaluru.

Why this scraper?

  • 🎯 The filters actually filter. LinkedIn stopped applying job type, experience level and workplace type on logged-out searches. Most scrapers pass them through anyway and quietly return unfiltered jobs. This one applies them itself and only charges you for rows that survive.
  • πŸ’° Salary comes back as numbers, not just a string: minimum, maximum, currency and period, ready to sort and chart.
  • 🧲 The recruiter who posted the job, with their name, headline and LinkedIn profile. It is the field most job-data buyers want, and hardly anyone else returns it.
  • 🏒 Full company profile on every row if you want it: description, website, industry, size, employee count, followers, headquarters, specialties, founding year.
  • πŸ”— Paste a LinkedIn search URL. Build the search on linkedin.com, copy the address bar, done. Keywords, location, radius and date filters all come across.
  • 🌍 Several searches in one run. Every keyword against every location, deduplicated. It's also the way past LinkedIn's 1,000-results-per-search ceiling.
  • ⚑ No browser. Plain HTTP requests, so a 1,000-job run finishes in minutes on 512 MB and costs pennies in compute.
  • 🧾 Duplicates are never billed twice. The same job from two overlapping searches is one row and one charge.
  • πŸ“… Expiry dates and exact posting timestamps from LinkedIn's own structured data, so you can tell a fresh job from a stale one.

What data can you extract?

πŸ’Ό Job title🏒 Company + logoπŸ“ LocationπŸ”— Job URL
πŸ’΅ Salary rangeπŸ”’ Salary min / maxπŸ’± Currency + periodπŸ“Š Applicant count
πŸ“ Full description🎚️ Seniority levelπŸ“„ Employment type🏭 Industries
πŸ§‘β€πŸ’Ό Recruiter nameπŸ”— Recruiter profile🏠 Remote / hybrid⚑ Easy Apply
πŸ“… Posted date⏳ Expires on🎁 BenefitsπŸ”’ Closed flag
🌐 Company websiteπŸ‘₯ Employee countπŸ“ˆ FollowersπŸ—ΊοΈ Headquarters

Modes and ready-to-paste recipes

πŸ” Search mode

Find jobs by keyword and location, with filters. This is the default.

{
"mode": "search",
"keywords": "software engineer",
"location": "United States",
"maxResults": 50,
"enrichDetails": true
}

πŸ“„ Job details mode

You already have job URLs or IDs and want everything about them. Duplicates in the list are removed before anything is fetched, so you are never charged twice for the same job.

{
"mode": "detail",
"urls": [
"https://www.linkedin.com/jobs/view/4447220072",
"4318517031"
]
}

Paste a LinkedIn search URL

{
"startUrls": [
"https://www.linkedin.com/jobs/search/?keywords=data%20engineer&location=Seattle%2C%20Washington%2C%20United%20States&f_TPR=r604800&f_AL=true"
],
"maxResults": 100
}

Several keywords across several cities

Each keyword is searched in each location and the results are deduplicated. This is also how you get past LinkedIn's 1,000-per-search cap.

{
"searchTerms": ["react developer", "vue developer"],
"locations": ["Berlin, Germany", "Amsterdam, Netherlands"],
"maxResults": 400
}

Remote jobs only, newest first

{
"keywords": "product designer",
"location": "United States",
"workplaceType": "remote",
"sortBy": "recent",
"maxResults": 100
}

Every open role at specific companies

Leave the keywords empty and give one or more company IDs.

{
"keywords": "",
"companyId": "1586,3848",
"location": "United States",
"maxResults": 500
}

Fresh jobs nobody has applied to yet

{
"keywords": "account executive",
"location": "London, United Kingdom",
"datePosted": "past24h",
"underTenApplicants": true,
"maxResults": 100
}

Recruiter contacts for outreach

{
"keywords": "sales manager",
"geoId": "102380872",
"distance": "25",
"enrichDetails": true,
"maxResults": 200
}

Salary benchmarking with company context

{
"keywords": "data scientist",
"location": "New York",
"minSalary": "120k",
"enrichCompany": true,
"fetchStructuredData": true,
"maxResults": 200
}

Input

{
"mode": "search",
"keywords": "software engineer",
"location": "United States",
"geoId": "",
"distance": "any",
"maxResults": 100,
"enrichDetails": true,
"datePosted": "pastWeek",
"jobType": "full-time",
"experienceLevel": "mid-senior",
"workplaceType": "remote",
"minSalary": "120k",
"easyApplyOnly": false,
"underTenApplicants": false,
"companyId": "",
"sortBy": "recent",
"fetchStructuredData": false,
"enrichCompany": false
}
FieldTypeDefaultNotes
modestringsearchsearch or detail.
keywordsstringsoftware engineerSupports AND, OR, NOT and "quoted phrases".
locationstringUnited StatesFree text. A plain city name can be ambiguous.
geoIdstringnoneLinkedIn's numeric location ID. Overrides location and removes all ambiguity.
distancestringany0 (exact), 5, 10 or 25 miles.
startUrlsarraynonePaste LinkedIn job search URLs. Filters in the URL are honoured.
searchTermsarraynoneExtra keyword sets. Paired with every entry in locations.
locationsarraynoneExtra locations.
urlsarraynoneJob URLs or numeric job IDs, for detail mode.
maxResultsinteger500 means as many as LinkedIn will give, up to 1,000 per search.
enrichDetailsbooleanfalseOpens each posting for description, salary, seniority and the recruiter.
datePostedstringanypast24h, pastWeek, pastMonth.
jobTypestringanyFull-time, part-time, contract, temporary, volunteer, internship.
experienceLevelstringanyInternship through executive.
workplaceTypestringanyOn-site, remote or hybrid.
minSalarystringany40k to 120k. Keeps only jobs with a published salary at or above it.
easyApplyOnlybooleanfalseOnly jobs you apply to without leaving LinkedIn.
underTenApplicantsbooleanfalseOnly jobs with fewer than ten applicants so far.
companyIdstringnoneOne or more numeric company IDs, comma separated.
sortBystringrelevantrelevant or recent.
fetchStructuredDatabooleanfalseAdds expiry date, exact posting time, split city/region/country and experience required.
enrichCompanybooleanfalseAdds the hiring company's profile. Fetched once per company.
includeFailedRowsbooleanfalseAdds an unbilled diagnostic row for any job that could not be read.
detailConcurrencyinteger8Job pages opened at once.
searchConcurrencyinteger5Search pages requested at once.

Output

Real rows from live runs. The recruiter's name and profile link are redacted here; a real run returns them in full.

Search mode, without enrichment. One row per job card, fast and cheap.

{
"jobId": "4453687841",
"title": "Software Engineer II (Java)",
"company": "JPMorganChase",
"companyUrl": "https://www.linkedin.com/company/jpmorganchase",
"companyLogo": "https://media.licdn.com/dms/image/v2/D4E0BAQGxpntCyRgsuA/company-logo_100_100/company-logo_100_100/0/1718711710850/jpmorganchase_logo...",
"location": "New York, NY",
"postedDate": "2026-08-13",
"jobUrl": "https://www.linkedin.com/jobs/view/4453687841",
"isActivelyHiring": null,
"isEarlyApplicant": null,
"easyApply": null,
"applyUrl": null,
"scrapedAt": "2026-08-29T09:58:13.191Z"
}

Search or detail mode, fully enriched. Everything above plus the description, salary, recruiter and company profile.

{
"jobId": "4452744530",
"title": "Recruiter",
"company": "Winston Staffing",
"companyUrl": "https://www.linkedin.com/company/winston-staffing",
"companyId": "50826",
"location": "New York, United States",
"postedDate": "2026-08-12",
"postedTimeAgo": "2 weeks ago",
"jobUrl": "https://www.linkedin.com/jobs/view/4452744530",
"isActivelyHiring": true,
"isEarlyApplicant": null,
"easyApply": true,
"applyType": "easyApply",
"applyUrl": null,
"workplaceType": "on-site",
"salary": "$50,000.00/yr - $90,000.00/yr",
"salaryMin": 50000,
"salaryMax": 90000,
"salaryCurrency": "USD",
"salaryPeriod": "yearly",
"salaryProvidedBy": "This range is provided by Winston Staffing. Your actual pay will be based on your skills and experience.",
"applicantCount": "35 applicants",
"applicantCountValue": 35,
"description": "Recruiter. Winston Support Service since 1967. We are seeking experienced 360 recruiters...",
"descriptionHtml": "<p>...</p>",
"seniorityLevel": "Mid-Senior level",
"employmentType": "Full-time",
"jobFunction": "Sales",
"industries": "Staffing and Recruiting",
"benefits": "Medical insurance, Vision insurance, Dental insurance, 401(k)",
"isClosed": null,
"posterName": "[recruiter name]",
"posterHeadline": null,
"posterProfileUrl": "https://www.linkedin.com/in/[their-profile]",
"posterPhoto": null,
"scrapedAt": "2026-08-29T09:59:00.232Z"
}

With fetchStructuredData. Adds these keys to the same row.

{
"postedAt": "2026-08-12T19:43:43.000Z",
"validThrough": "2026-09-11T19:43:43.000Z",
"city": "New York",
"region": "NY",
"country": "US",
"externalJobId": "8530700002",
"monthsOfExperience": 60,
"educationLevel": "bachelor degree"
}

With enrichCompany. Adds these keys to the same row.

{
"companyDescription": "Winston Resources is the Single Source Solution for all of your staffing needs...",
"companyWebsite": "http://www.winstonresources.com",
"companyIndustry": "Staffing and Recruiting",
"companySize": "51-200 employees",
"companyEmployeeCount": 362,
"companyFollowerCount": 43479,
"companyHeadquarters": "New York, NY",
"companySpecialties": "Healthcare, Legal, Banking/Finance, Information Technology...",
"companyFoundedDate": "1967",
"companyType": "Privately Held"
}

How to scrape LinkedIn jobs: step by step

  1. Create a free Apify account. Takes 30 seconds, no card needed.
  2. Open LinkedIn Jobs Scraper in the Apify Console.
  3. Type a keyword and a location, or paste a LinkedIn search URL.
  4. Click Start. A 200-job run takes well under a minute; 1,000 fully enriched jobs takes about eight.
  5. Export as JSON, CSV or Excel, or fetch it through the API.

How much does LinkedIn Jobs Scraper cost?

You pay per result, and the rate depends on your Apify plan. There is a $0.005 fee each time a run starts.

Your Apify planPrice per 1,000 results
Free$1.00
Starter$0.50
Scale$0.42
Business and above$0.42

Nothing extra for the description, the salary, the recruiter or the company profile. Every field is included at the same rate.

The Apify Free plan gives you $5 of usage credit a month, which is about 4,900 jobs. The $29/month Starter plan covers roughly 58,000 jobs a month. Compute is on top and is small here: a 1,000-job enriched run used about 3 cents of platform time in testing.

No subscription lock-in. Pause whenever you like.

Use cases

  • 🧲 Recruitment outreach: Get the name and LinkedIn profile of the person who posted the job, not just the company.
  • πŸ’° Salary benchmarking: Real published ranges as sortable numbers, with company size and industry attached.
  • πŸ“Š Hiring intelligence: Track which companies are hiring, for what, and how fast their postings age.
  • 🎯 Job boards and aggregators: Fill a niche board and use the expiry date to retire stale listings.
  • πŸ” Competitor monitoring: Watch a named list of companies and see every role they open.
  • πŸ§‘β€πŸŽ“ Job hunting at scale: Filter to jobs with under ten applicants posted in the last 24 hours.
  • πŸ“ˆ Labour market research: Track demand for a skill across cities and over time.
  • πŸ€– Feeding an AI agent: Clean, flat JSON that a model can reason over without post-processing.

Limitations

  • 1,000 results per search. That is LinkedIn's own ceiling, not ours. Split the search across several locations or date windows to go further.
  • Salary is published on roughly one job in five. When the employer does not publish a range, the salary fields are empty. minSalary drops those jobs, so expect far fewer results when you use it.
  • The recruiter is not on every job. LinkedIn shows it only when the person who posted the role turned that on. In testing it appeared on about a third of postings for recruiting and healthcare roles, and far less often on large-company engineering roles.
  • No apply link. LinkedIn hides the external application URL behind a sign-in. You get applyType instead, telling you whether it is an Easy Apply or an off-site application.
  • No skills list and no view count. Neither is published to logged-out visitors.
  • Workplace type is not perfect. LinkedIn does not label every posting, so remote and hybrid are read from its structured data where present.
  • Job titles come back in the language they were posted in. Nothing is translated.

FAQ

How much does LinkedIn Jobs Scraper cost?

LinkedIn Jobs Scraper uses pay-per-result pricing, and the rate follows your Apify plan: $1.00 per 1,000 results on the Free plan, $0.50 on Starter, and $0.42 on Scale and above, plus a $0.005 fee when a run starts. The Free plan's $5 of monthly credit covers around 4,900 results; the $29/month Starter plan covers roughly 58,000.

No subscription lock-in. Pause whenever.

Do I need a LinkedIn account or cookies?

No. This actor only reads pages that any logged-out visitor can see, so there is nothing to log in to and no session to get banned.

Why did my job type or experience level filter return fewer jobs than I expected?

Because it is a real filter. LinkedIn stopped applying those filters for logged-out searches, so this actor checks every job against its own posting and drops the ones that do not match. You are only charged for the jobs that survive. If a run comes back short, the status message tells you how many were filtered out and why.

How do I find a company ID or a location ID?

Open the search on linkedin.com and apply the company or location filter there, then look at the address bar: the company ID is the f_C value and the location ID is the geoId value. Or just paste the whole URL into startUrls and skip the step.

Scraping public data is generally allowed in the US and most of the EU, as long as you don't collect personal data covered by GDPR or CCPA without a lawful basis. This actor only touches publicly accessible pages, but how you use the output is on you.

Apify's full breakdown: Is web scraping legal?.

Can I integrate LinkedIn Jobs Scraper with other tools?

Push results into Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive, and more. Apify treats every actor as a webhook source, so anything that consumes webhooks or pulls from an API works.

Full list: Apify integrations.

Can I use LinkedIn Jobs Scraper with the Apify API?

Yes. Every run is available via the Apify REST API:

curl -X POST "https://api.apify.com/v2/acts/sourabhbgp~linkedin-jobs-scraper/runs?token=APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":"software engineer","location":"United States","maxResults":100,"enrichDetails":true}'

Docs: Apify API reference.

Can I use LinkedIn Jobs Scraper through an MCP Server?

Yes. Apify ships an MCP server that exposes every actor as a tool, so Claude Desktop, Cursor, and any other MCP-capable client can call LinkedIn Jobs Scraper directly. Setup: Apify MCP docs.

Your feedback

Bug, missing field, or odd behavior? Drop a note in the Issues tab. Reports go to a human and fixes usually ship the same week.