LinkedIn Jobs Scraper avatar

LinkedIn Jobs Scraper

Pricing

from $2.10 / 1,000 jobs

Go to Apify Store
LinkedIn Jobs Scraper

LinkedIn Jobs Scraper

Scrape LinkedIn job listings worldwide without login: title, company, location, seniority, job function, industries, applicants, salary when posted, full description, apply link and recruiter emails from the posting.

Pricing

from $2.10 / 1,000 jobs

Rating

5.0

(1)

Developer

Matvey

Matvey

Maintained by Community

Actor stats

0

Bookmarked

18

Total users

10

Monthly active users

a day ago

Last modified

Share

LinkedIn Jobs Scraper turns any LinkedIn job search into a clean table — without login, cookies or a LinkedIn account. Every row has the title, company, location, remote / hybrid / on-site, seniority, industries, number of applicants, Easy Apply or external apply, salary when the employer posts it, the full description, the job poster when LinkedIn shows them, recruiter emails and phones found in the posting — and company details at no extra cost: website and domain, industry, size, employees on LinkedIn, followers, headquarters, founded year, specialties and description. Worldwide, by any location LinkedIn understands.

Type job titles and a location and click Start. Export as JSON, CSV or Excel, run it on a schedule for fresh postings, or call it from the API and AI agents.

Tested head-to-head — 5 October 2026

Tested against the 5 most-used LinkedIn jobs scrapers: company website, size and HQ on every row, plus e-mails and phones from the posting

The same search — "python developer" jobs in New York, 10 asked — went to this Actor and to the five most-used LinkedIn jobs scrapers on the Apify Store, from an ordinary free account. Where both returned the same job, applicants, seniority and salary matched exactly; what differed was how much of the company came with each row.

This ActorThe others
Company website, size & HQ on every rowYes3 of 5
E-mails & phones from the posting textYes (optional)none (1 has an AI field, empty in this test)
Jobs returned (10 asked)105 – 133

What is LinkedIn Jobs Scraper?

It is a LinkedIn jobs scraper and LinkedIn jobs API for recruiters, job boards, lead generation, labour-market research and AI agents. LinkedIn has no public job-search API; this Actor reads LinkedIn's public guest job pages — the ones anyone can open without signing in — so no account is ever at risk.

  • No login, no cookies: nothing to connect, nothing to get banned.
  • Full descriptions and LinkedIn's own fields: seniority, industries, applicants, applyType (Easy Apply or an external site), and the job poster (posterName, posterTitle, posterProfileUrl) when LinkedIn shows the hiring team.
  • Company details, free: each hiring company's LinkedIn page is read once per run — companyWebsite, companyDomain, companyIndustry, companySize, companyEmployeesOnLinkedIn, companyFollowers, companyHeadquarters, companyFounded and more on every row. Turn off with Add company details.
  • Filters at the source: posted within, remote / hybrid / on-site filter, job type, experience level, radius, sort by date. Jobs found with the workplace filter carry it in workplaceType and isRemote.
  • Contacts: emails and phones from the posting text; optional look-up of general contacts on the company website.

What data does it return?

FieldExample
id, url4466180813 · https://de.linkedin.com/jobs/view/senior-data-engineer-at-trust-in-soda-4466180813
title, company, companyUrl, companyLogoSenior Data Engineer · Trust In SODA · https://uk.linkedin.com/company/trust-in-soda · …
location, queryLocationBerlin, Germany · Berlin, Germany
seniority, industries, applyTypeMid-Senior level · Software Development · external
applicants, applicantsText189 · "189 applicants"
workplaceType, isRemoteremote · true (from the workplace filter; otherwise from the title and location, else null)
employmentType, jobTypesfulltime · ["fulltime"]
salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryText85000 · 110000 · EUR · year (when the employer posts pay)
postedAt, postedText, description, descriptionHtml2026-09-15T00:00:00.000Z · "1 week ago" · full text · HTML
posterName, posterTitle, posterProfileUrlAsif Shaikh · Delivery Manager at NTT DATA North America · linkedin.com/in/shaikh-asif (about 1 job in 5)
companyWebsite, companyDomainhttps://www.bankofamerica.com · bankofamerica.com
companyIndustry, companyType, companyFoundedBanking · Public Company · null (the year when the page shows it, e.g. 2008)
companySize, companySizeMin, companySizeMax10,001+ employees · 10001 · null
companyEmployeesOnLinkedIn, companyFollowers227047 · 3488660
companyHeadquarters, companyCity, companyCountryCharlotte, NC · Charlotte · US
companySpecialties, companyDescription, companyTagline["Financial Services"] · about text · tagline
emails, phonesfrom the posting text, when present

LinkedIn no longer shows "Job function" to guests on most postings, so jobFunction is usually null. The external apply link is shown by LinkedIn to signed-in members only, so applyUrl is null unless LinkedIn shows it to guests: applyType tells whether the job's button is LinkedIn Easy Apply (easyApply) or an external site (external), and url opens the job. Company fields are null when LinkedIn did not open the company page this time — the job row is still delivered.

How much does it cost?

Pay per job row; error rows are free.

RowPrice
Job$0.003 — 1,000 LinkedIn jobs for $3
Job that came with an email address+$0.002
Company details on the rowfree

No fee per run, per page or for proxies. Larger monthly plans get 10–30 % off.

How to scrape LinkedIn jobs

  1. Enter Job titles or keywords (one per line) and a Location (city, region, country or "Worldwide").
  2. Pick filters: posted within, workplace, job types, experience level, radius, sort.
  3. Keep Full descriptions on if you need the job text (one extra request per job). When LinkedIn refuses a job page on the first route, it is fetched again through a residential address and then a web unblocker — included in the price. A job whose page still does not open is delivered without the description fields. With your own proxy URLs in the proxy field, only your proxies are used.
  4. Click Start; export the dataset or read it through the API.

⬇️ Input

{
"keywords": ["data engineer", "product manager"],
"location": "Berlin, Germany",
"maxJobsPerQuery": 200,
"datePosted": "week",
"experience": ["mid"],
"includeDescription": true
}

Remote jobs worldwide, newest first:

{ "keywords": ["react developer"], "location": "Worldwide", "remote": "remote", "sortBy": "date", "datePosted": "day" }

⬆️ Output

{
"type": "job",
"source": "linkedin",
"id": "4454812137",
"url": "https://www.linkedin.com/jobs/view/python-developer-iii-at-bank-of-america-4454812137",
"title": "Python Developer III",
"company": "Bank of America",
"location": "Jersey City, NJ",
"postedAt": "2026-09-27T00:00:00.000Z",
"postedText": "1 week ago",
"seniority": "Not Applicable",
"employmentType": "fulltime",
"industries": "Banking",
"applicants": 148,
"applicantsText": "148 applicants",
"applyType": "external",
"applyUrl": null,
"salaryText": "$102,900.00/yr - $179,900.00/yr",
"salaryMin": 102900,
"salaryMax": 179900,
"salaryCurrency": "USD",
"salaryPeriod": "year",
"workplaceType": null,
"isRemote": false,
"description": "Job Description:\nAt Bank of America, we are guided by a common purpose to help make financ …",
"posterName": null,
"posterTitle": null,
"posterProfileUrl": null,
"companyUrl": "https://www.linkedin.com/company/bank-of-america",
"companyWebsite": "https://www.bankofamerica.com",
"companyDomain": "bankofamerica.com",
"companyIndustry": "Banking",
"companySize": "10,001+ employees",
"companySizeMin": 10001,
"companySizeMax": null,
"companyEmployeesOnLinkedIn": 227047,
"companyFollowers": 3488666,
"companyHeadquarters": "Charlotte, NC",
"companyCity": "Charlotte",
"companyCountry": "US",
"companyFounded": null,
"companyType": "Public Company",
"companySpecialties": [
"Financial Services"
],
"companyTagline": null,
"companyDescription": "Bank of America is one of the world's largest financial institutions, serving individuals, …",
"emails": [],
"phones": [],
"query": "python developer",
"queryLocation": "New York, NY"
}

A search that cannot be read arrives as a type: "error" row with the reason, never as a silently empty run.

Use cases

  • Recruiting and sourcing: who is hiring for a role, where, how many applicants already.
  • Job boards and alerts: fresh LinkedIn postings on a schedule; dedupe on id.
  • Lead generation: companies hiring for a function are buying tools for it — export company and contacts.
  • Market research: seniority and industries across thousands of postings.
  • AI agents: typed rows an agent can filter.

Integrations

Run it from the Apify API, a schedule or a webhook, and push results to Google Sheets, Airtable, Slack or a CRM through n8n, Make or Zapier. The Apify MCP server exposes it to Claude, ChatGPT and other agents.

❓ FAQ

Do I need a LinkedIn account or cookies?

No. Only LinkedIn's public guest job pages are read.

How many jobs can I get?

Up to 1,000 per search — the same ceiling LinkedIn shows to any visitor. LinkedIn lists 10 jobs per page; the Actor reads page after page until your Jobs per keyword number, the last page or that ceiling. Split big searches by location or keyword.

I also need Indeed and company career sites.

Use Jobs API — Indeed, LinkedIn and Greenhouse / Lever / Ashby / Workable boards in one schema — or Indeed Jobs Scraper.

It reads public job postings without logging in and returns factual listing data and public business contacts. Respect LinkedIn's terms and local law for outreach; this is not legal advice.

You might also like

Use via API

Run this Actor from your own code or pipeline. Get your token in Apify Console → Settings → API & Integrations. Every input field below has the same name as in the JSON tab of the input form.

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("lergassy/linkedin-jobs-scraper").call(run_input={
"keywords": [
"python developer"
],
"location": "New York, NY",
"maxJobsPerQuery": 25,
"includeDescription": True,
"includeContacts": False
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('lergassy/linkedin-jobs-scraper').call({
"keywords": [
"python developer"
],
"location": "New York, NY",
"maxJobsPerQuery": 25,
"includeDescription": true,
"includeContacts": false
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

cURL (runs the Actor and returns the results in one call)

curl -X POST "https://api.apify.com/v2/acts/lergassy~linkedin-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"keywords": ["python developer"], "location": "New York, NY", "maxJobsPerQuery": 25, "includeDescription": true, "includeContacts": false}'