LinkedIn Jobs Scraper - Keyword & Location Search (No Login)
Pricing
from $0.70 / 1,000 job results
LinkedIn Jobs Scraper - Keyword & Location Search (No Login)
Scrape LinkedIn jobs by keyword, location, date, company or search URL without a login. Full job details: description, seniority, employment type, function, industries, applicants. $1 per 1,000 jobs, new-jobs-only mode for daily runs, optional official apply-link and ghost-job checks.
Pricing
from $0.70 / 1,000 job results
Rating
0.0
(0)
Developer
Kamer Ozkan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 hours ago
Last modified
Categories
Share
Scrape LinkedIn job postings by keyword and location, with full public job details, without a LinkedIn login.
This Actor reads LinkedIn's public job search, the same pages anyone can open in a private browser window, and returns one clean row per job: title, company, location, posting date, seniority level, employment type, job function, industries, applicant count, salary when LinkedIn shows it, and the complete description as text and HTML. It never asks for your LinkedIn account, session cookies, or password.
Built for job boards and aggregators, recruiters and staffing agencies, lead generation from hiring signals, market and salary research, and daily job alert automations in Make, Zapier, n8n, or your own code.
What you get for every job
| Field | Description |
|---|---|
id, url | LinkedIn job ID and the canonical job URL |
title, companyName, companyUrl, companyLogo | Job title and the hiring company's public LinkedIn page and logo |
location, postedAt, postedText | Location as posted, posting date (YYYY-MM-DD), and LinkedIn's relative text such as "3 weeks ago" |
seniorityLevel, employmentType, jobFunction, industries | The four structured criteria LinkedIn publishes on the job page |
applicantsCount, applicantsText | Applicant count when LinkedIn shows a number, plus the original text |
salaryText, benefits | Salary range and highlights such as "Actively Hiring" whenever LinkedIn shows them publicly |
descriptionText, descriptionHtml | The full job description as readable text and as HTML |
detailStatus | complete, not_requested, or unavailable (the detail page could not be read after retries; such rows are not charged) |
searchKeywords, searchLocation, searchUrl | Which search produced the row |
isNew, firstSeenAt | New-jobs-only bookkeeping for scheduled runs |
officialApplyUrl, jobStatus, ghostJobRisk, verificationStatus and related fields | Filled only when optional apply-link verification is enabled |
The output contains no job poster names, profile photos, recruiter profile links, applicant identities, emails, or phone numbers. It is a job-postings dataset, not a people dataset.
Quick start
{"keywords": ["software engineer"],"locations": ["Berlin, Germany"],"datePosted": "pastWeek","maxJobsPerSearch": 100}
Every keyword is searched in every location. Add more keywords and locations to cover a market, or paste LinkedIn search URLs when you prefer to build the filters on linkedin.com first.
Input fields
| Field | Description | Default |
|---|---|---|
keywords | Up to 20 job titles or keywords, one search each; LinkedIn boolean syntax such as data (analyst OR scientist) works | Empty |
locations | Up to 20 cities, regions, or countries as you would type them on LinkedIn; empty means worldwide | Empty |
searchUrls | Up to 20 LinkedIn jobs search URLs copied from a private browser window | Empty |
datePosted | anyTime, past24Hours, pastWeek, pastMonth | anyTime |
sortBy | relevance or date | relevance |
companyIds | Numeric LinkedIn company IDs (the f_C value in a search URL) that restrict every search | Empty |
geoId | Numeric LinkedIn geoId for exact location targeting; overrides locations | Empty |
easyApplyOnly | Only jobs with LinkedIn Easy Apply | false |
under10Applicants | Only jobs with fewer than 10 applicants | false |
workplaceType, jobType, experienceLevel | Remote/hybrid/on-site, job type, and seniority selections, added to the search text (see below) | Empty |
maxJobsPerSearch | Cost and time cap per keyword and location combination, 10 to 1,000 | 100 |
includeJobDetails | Fetch every job's public detail page | true |
newJobsOnly | Return only jobs not seen in earlier runs of the same watchlist | false |
stateNamespace | Watchlist history scope for new-jobs-only mode; auto isolates each saved Task | auto |
verifyApplyLinks | Optional official apply-link and ghost-job verification through a separate Actor | false |
maxConcurrency | Parallel detail requests, 1 to 10 | 5 |
proxyConfiguration | Apify Proxy, included in the price | Apify Proxy |
At least one keyword, one search URL, or one company ID is required. The input expands to at most 50 searches per run.
How the filters really work
LinkedIn changed its public job search in August 2026. The date posted, company, Easy Apply, under-10-applicants, location, geoId, and sort filters still work as real server-side filters, and this Actor applies them exactly. The workplace type, job type, and experience level filters are no longer applied by LinkedIn on public search pages. Instead of silently ignoring your selection, the Actor adds it to the search text in a fixed order, for example Remote (Full-time OR Contract) Entry level software engineer, which is what LinkedIn itself recommends. Treat those three selections as strong hints, not guarantees, and check seniorityLevel and employmentType on the returned rows when you need exact values.
Search URLs are parsed the same way: keywords, location, geoId, distance, f_TPR, f_C, f_AL, f_EA, and sortBy are applied as filters; f_WT, f_JT, and f_E are converted into search text. The run summary lists every converted filter under convertedFilters so nothing happens silently.
New jobs only: pay for new postings, not for re-downloads
Most job pipelines run the same search every day and then have to deduplicate on their side. Turn on newJobsOnly and the Actor remembers every job ID it has returned for your watchlist and emits only jobs it has not seen before. Combined with datePosted: "past24Hours", a daily schedule delivers exactly the new postings, and you pay only for those rows.
{"keywords": ["account executive", "sales development representative"],"locations": ["United States"],"datePosted": "past24Hours","sortBy": "date","newJobsOnly": true,"stateNamespace": "auto"}
Save the input as an Apify Task, add a Schedule, and keep stateNamespace on auto so each Task keeps its own history. API callers should set one stable namespace per watchlist. The first run returns everything it finds and creates the baseline. Job IDs are remembered for 120 days.
Search URL mode
Open https://www.linkedin.com/jobs/search/ in a private browser window, enter your search, apply filters, and copy the address bar into searchUrls:
{"searchUrls": ["https://www.linkedin.com/jobs/search/?keywords=data%20analyst&location=London%2C%20United%20Kingdom&f_TPR=r86400&sortBy=DD"],"maxJobsPerSearch": 300}
Keyword searches and search URLs can be combined in one run. Identical searches are merged, and a job found by several searches is returned once.
Official apply links and ghost-job risk (optional)
LinkedIn's public job page does not expose the employer's application URL. When you enable verifyApplyLinks, the scraped jobs are sent to the LinkedIn Job Apply Link Verifier, which returns the official application URL, the applicant tracking system behind it, the live job status, a confidence score, evidence, and a ghost-job risk label into the same rows. Use maxJobsToVerify and verificationMaxTotalChargeUsd as hard cost guards; the verifier is billed separately at the price shown on its Store page. A failed verification never removes scraped rows; the rows simply carry verificationStatus: "failed".
Example output
The row below is unedited output from a local production run on 2026-09-02 for the search software engineer in Berlin, Germany (past week, remote hint, job details on, verification off). The description, HTML, and logo URL are shortened here for readability only.
{"id": "4413440825","url": "https://www.linkedin.com/jobs/view/4413440825","title": "Product Engineer","companyName": "Attio","companyUrl": "https://uk.linkedin.com/company/attio","companyLogo": "https://media.licdn.com/dms/image/v2/C4D0BAQF16UXOMcHaCA/company-logo_100_100/company-logo...","location": "Germany","postedAt": "2026-08-27","postedText": "6 days ago","applicantsCount": 200,"applicantsText": "Over 200 applicants","salaryText": "€80,000.00/yr - €100,000.00/yr","benefits": null,"seniorityLevel": "Not Applicable","employmentType": "Full-time","jobFunction": "Engineering and Information Technology","industries": "Software Development","descriptionText": "Attio is the CRM for agentic revenue. Designed for the most ambitious go-to-market teams, it gives companies the power to understand every customer, automate at ...","descriptionHtml": "<strong>Attio is the CRM for agentic revenue.</strong> Designed for the most ambitious go-to-market teams, it gives comp ...","detailStatus": "complete","searchKeywords": "software engineer","searchLocation": "Berlin, Germany","searchUrl": "https://www.linkedin.com/jobs/search?keywords=Remote+software+engineer&location=Berlin%2C+Germany&f_TPR=r604800&sortBy=R","isNew": null,"firstSeenAt": "2026-09-02T16:57:29.774Z","verificationStatus": "not_requested","officialApplyUrl": null,"applyMethod": null,"jobStatus": null,"ghostJobRisk": "unknown","verificationConfidence": null,"verifiedAt": null,"verificationEvidence": [],"safeToPublish": null,"reviewRequired": null,"sourceProvider": null,"companyWebsite": null,"scrapedAt": "2026-09-02T16:57:29.774Z"}
The OUTPUT record in the key-value store reports, for every search, how many jobs were found, the total LinkedIn reported, whether the search finished or stopped at a cap, how many pages and retries were needed, plus billing counters, new-jobs-only state sizes, and warnings.
Pricing
- Job results: $1.00 per 1,000 jobs returned with details included
- Actor start: $0.005 per GB of run memory (one event per run at the default 512 MB)
- Platform usage and Apify Proxy: included
Rows whose public detail page could not be read after retries are returned with detailStatus: "unavailable" and are not charged. Turning includeJobDetails off does not change the price; it only makes runs faster.
| Jobs returned | Job result cost |
|---|---|
| 100 | $0.10 |
| 1,000 | $1.00 |
| 10,000 | $10.00 |
A daily new-jobs-only schedule over five keyword searches that finds 40 new postings per day costs about $1.20 per month in job results plus the Actor start for each run. Bronze, Silver, Gold, Platinum, and Diamond plans receive the reduced tiered price shown on the Store page. Optional apply-link verification is billed by the verifier Actor.
Scheduling and integrations
- Save your input as an Apify Task.
- Add a Schedule, for example daily at 07:00.
- Turn on
newJobsOnlyand setdatePostedtopast24Hours. - Add a webhook for
ACTOR.RUN.SUCCEEDED, or read the dataset from Make, Zapier, n8n, the Apify API, the JavaScript or Python client, or Apify's MCP server for AI agents.
Export the dataset as JSON, CSV, Excel, or XML from the run page or through the API.
Limits and honesty notes
- LinkedIn's public search returns at most 1,000 jobs per search. Split a large market by city, keyword, or date window to go beyond it; the run summary shows when a search hit the cap.
- Public search results are ranked and geo-resolved by LinkedIn per session, so the same broad search can return a noticeably different slice between runs, and LinkedIn's reported total can change too. For reproducible schedules use
sortBy: "date", a shortdatePostedwindow, and ideally ageoId; new-jobs-only mode then turns the remaining variation into a clean stream of new postings. - Salary appears only when LinkedIn publishes it on the job. Employer application URLs require the optional verification step.
- LinkedIn can throttle public traffic. Every search and every job detail request uses its own proxy session and is retried with a fresh session; searches that still fail are listed in the summary, and no job is charged twice.
- The Actor reads public job pages only. It does not log in, does not collect applicant or recruiter profiles, and does not bypass LinkedIn's authentication.
- Users remain responsible for using the output lawfully and in line with applicable terms.
FAQ
Do I need a LinkedIn account or cookies?
No. The Actor reads only the public job search and job pages that are available without login.
How many jobs can I scrape per run?
Up to 1,000 jobs per search and up to 50 searches per run, so up to 50,000 jobs in one run when the searches are broad enough. Use maxJobsPerSearch to control cost.
Can I search by company instead of keyword?
Yes. Put numeric LinkedIn company IDs in companyIds with or without keywords. For a change feed of a company's whole job inventory with new, changed, and closed roles, use the companion LinkedIn Company Jobs Monitor.
Why does the remote or experience filter return other jobs too?
LinkedIn no longer applies those filters on public search; the Actor adds them to the search text, which improves ranking but is not an exact filter. Check employmentType and seniorityLevel on the rows or filter in your own workflow.
Is this affiliated with LinkedIn?
No. This Actor is not affiliated with or endorsed by LinkedIn or Microsoft.
Related Actors
- LinkedIn Company Jobs Monitor & Change Feed: stateful new, changed, reopened, and confirmed closed roles per company.
- LinkedIn Job Apply Link Verifier: official apply URLs, live status, and ghost-job risk for any LinkedIn job URL.
- ATS Job Change Feed API: the same change-feed contract read directly from Greenhouse, Lever, Workday, and other public job boards.