LinkedIn Jobs Scraper
Pricing
from $0.20 / 1,000 results
LinkedIn Jobs Scraper
Scrape LinkedIn job search results by URL, no login needed. Get title, company, logo, location, post date, applicants, seniority, employment type, job function, industry, salary & currency, full description, and Easy Apply flag, one item per job. Proxy support and automatic retries.
Pricing
from $0.20 / 1,000 results
Rating
0.0
(0)
Developer
Itamar Toledano
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
What is LinkedIn Jobs Scraper and how does it work?
LinkedIn Jobs Scraper is an Apify Actor that extracts structured job listings from a LinkedIn job search, without logging in.
Paste a LinkedIn job search URL, configure a proxy, and run the Actor. It loads LinkedIn's public (guest) search page with a browser-like HTTP client, then opens each job's public posting page for the full details, and stores one dataset item per job. You can download the results from the dataset or pull them through the Apify API.
LinkedIn job search URLs look like this:
https://www.linkedin.com/jobs/search?keywords=Python&location=Germany&position=1&pageNum=0
The host must be www.linkedin.com, the path must be /jobs/search, and the URL needs keywords, location, or both. LinkedIn filters in the query string are kept, so the easiest way to build a URL is to search on LinkedIn while logged out and copy it from the address bar. Useful filters:
| Filter | Example | Meaning |
|---|---|---|
f_TPR | r86400, r604800 | Posted in the last 24 hours / week (seconds) |
f_JT | F, P, C, I | Full-time, part-time, contract, internship |
f_WT | 1, 2, 3 | On-site, remote, hybrid |
f_E | 2, 3, 4 | Entry level, associate, mid-senior |
Why scrape LinkedIn jobs?
- Job market research: who is hiring for a role, where, and at what seniority
- Salary benchmarking: LinkedIn's base pay ranges, parsed into numbers
- Lead generation: companies actively hiring, with LinkedIn company links
- Job alerts & aggregation: combine date filters (
f_TPR) with scheduled runs to get fresh postings - Competition analysis: applicant counts per job
What data can LinkedIn Jobs Scraper extract?
| Data | Fields |
|---|---|
| Search | input, search_keywords, search_location, position |
| Job | job_id, job_title, seniority_level, employment_type, job_function, industries, workplace_type |
| Company | company_name, company_url, company_logo |
| Location & date | location, posted_at, posted_relative, is_new |
| Competition | applicants, insights |
| Salary | salary_text, salary_min, salary_max, salary_type, salary_currency, salary_source |
| Content | description, description_html |
| Apply | job_url, is_easy_apply |
| Meta | has_details, fetched_at |
Card vs. detail fields: the search page gives the title, company, logo, location, dates, and badges. With includeDetails on (the default), each job's posting page adds the description, criteria (seniority, employment type, function, industries), applicants, salary, and apply type, and has_details becomes true.
Notes:
salary_*is only filled when LinkedIn shows a pay range (common in the US, UK, and Canada).salary_currencyis the ISO code behind the symbol ($→ USD,CA$→ CAD,£→ GBP,€→ EUR…), andsalary_sourceisemployerfor a company-provided range orjob_postwhen LinkedIn found the pay in the post.is_easy_applyistruefor LinkedIn Easy Apply jobs andfalsefor jobs that apply on the company's site. LinkedIn only reveals the external apply link to signed-in users, so it isn't returned.workplace_typeis filled when the search URL filters on exactly onef_WTvalue.
How many results can you scrape?
One LinkedIn search page returns up to about 60 jobs. Set maxItems (1–100, default 25) to control how many are saved. For more coverage, run narrower searches (per city, per date range, per job type), for example on a schedule.
How much will it cost?
Each run makes one search request plus one request per job when includeDetails is on (a run with maxItems: 25 makes 26 requests). Turn includeDetails off for a cheaper card-only scrape. Run a few searches first, note the cost per run, and scale from there.
Is it legal to scrape LinkedIn?
This Actor only reads public job postings that LinkedIn shows to logged-out visitors; it never logs in. Job postings can still contain personal data (e.g. recruiter names), so review LinkedIn's terms and your own compliance requirements (e.g. GDPR). See Apify's post on the legality of web scraping.
How do I scrape jobs on LinkedIn?
- Open linkedin.com/jobs/search in a private window, search, and copy the URL
- Open LinkedIn Jobs Scraper in Apify Console and paste it into
url - Pick
maxItemsand whether to include job details - Keep the default proxy (Apify residential) or pick your own
- Click Start and open the Dataset tab when the run finishes
Tips
- LinkedIn rate-limits guest traffic per IP. Residential proxies work best for larger or frequent runs.
- Sign-in walls and rate-limit responses (HTTP 429/999) are detected and retried automatically (default up to 4 attempts).
- If a single posting page keeps failing, that job is still saved with its search-card fields and
has_details: false, so one bad page doesn't fail the run.
Input
| Field | Required | Description |
|---|---|---|
url | Yes | HTTPS LinkedIn job search URL (www.linkedin.com/jobs/search?keywords=…&location=…) |
maxItems | No | Maximum jobs to save (1–100, default 25) |
includeDetails | No | Fetch each job's posting page (default true) |
proxyConfiguration | Recommended | Apify Proxy or custom proxy URLs |
{"url": "https://www.linkedin.com/jobs/search?keywords=Python&location=Germany&position=1&pageNum=0","maxItems": 25,"includeDetails": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Sample output
One item per job:
{"source": "linkedin","input": "https://www.linkedin.com/jobs/search?keywords=Python&location=Germany&position=1&pageNum=0","search_keywords": "Python","search_location": "Germany","position": 1,"job_id": "4467502615","job_title": "(Senior) Software Developer Backend / Python","company_name": "Athereon GRC GmbH","company_url": "https://www.linkedin.com/company/athereon-grc","company_logo": "https://media.licdn.com/dms/image/v2/…/athereon_grc_logo?…","location": "Saarbrücken, Saarland, Germany","workplace_type": null,"posted_at": "2026-09-17","posted_relative": "1 week ago","is_new": false,"insights": [],"applicants": "56 applicants","seniority_level": "Associate","employment_type": "Full-time","job_function": "Information Technology","industries": "Software Development","salary_text": null,"salary_min": null,"salary_max": null,"salary_type": null,"salary_currency": null,"salary_source": null,"description": "Ihre Aufgaben\nDu entwickelst Features und Verbesserungen für das Backend unserer SaaS-Applikation…","description_html": "<strong>Ihre Aufgaben</strong><ul><li>Du entwickelst Features…</li></ul>","job_url": "https://www.linkedin.com/jobs/view/4467502615","is_easy_apply": false,"has_details": true,"fetched_at": "2026-09-29T17:46:40.010873Z"}
A US job with a pay range returns, for example, "salary_text": "$176,400.00/yr - $226,800.00/yr", "salary_min": 176400, "salary_max": 226800, "salary_type": "yearly", "salary_currency": "USD", "salary_source": "employer".
Integrations
Connect LinkedIn Jobs Scraper to Make, Zapier, Slack, Google Sheets, Airbyte, GitHub, and more through Apify integrations, or trigger actions with webhooks when a run finishes.
Using the Apify API
Run the Actor and fetch results programmatically with the Apify API, using apify-client for Node.js or apify-client for Python. See the API tab for code examples.
FAQ
Do I need a LinkedIn account or cookies?
No. The Actor only uses LinkedIn's public guest pages.
Does it scrape profiles, companies, or posts?
No. Only job search URLs (www.linkedin.com/jobs/search) are accepted.
Why do some jobs have has_details: false?
Either includeDetails is off, or LinkedIn blocked that job's posting page on every retry. The search-card fields are still returned.
What happens when LinkedIn shows a sign-in wall?
The Actor treats sign-in redirects, missing results, and HTTP 429/999 responses as blocks, retries, and fails the run if every attempt for the search page is blocked. Switching to residential proxies usually fixes it.
Your feedback
Found a bug or have a feature request? Open an issue on the Actor's Issues tab in Apify Console.