LinkedIn Jobs Scraper - Keyword & Location Search (No Login) avatar

LinkedIn Jobs Scraper - Keyword & Location Search (No Login)

Pricing

from $0.70 / 1,000 job results

Go to Apify Store
LinkedIn Jobs Scraper - Keyword & Location Search (No Login)

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

Kamer Ozkan

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 hours ago

Last modified

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

FieldDescription
id, urlLinkedIn job ID and the canonical job URL
title, companyName, companyUrl, companyLogoJob title and the hiring company's public LinkedIn page and logo
location, postedAt, postedTextLocation as posted, posting date (YYYY-MM-DD), and LinkedIn's relative text such as "3 weeks ago"
seniorityLevel, employmentType, jobFunction, industriesThe four structured criteria LinkedIn publishes on the job page
applicantsCount, applicantsTextApplicant count when LinkedIn shows a number, plus the original text
salaryText, benefitsSalary range and highlights such as "Actively Hiring" whenever LinkedIn shows them publicly
descriptionText, descriptionHtmlThe full job description as readable text and as HTML
detailStatuscomplete, not_requested, or unavailable (the detail page could not be read after retries; such rows are not charged)
searchKeywords, searchLocation, searchUrlWhich search produced the row
isNew, firstSeenAtNew-jobs-only bookkeeping for scheduled runs
officialApplyUrl, jobStatus, ghostJobRisk, verificationStatus and related fieldsFilled 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

FieldDescriptionDefault
keywordsUp to 20 job titles or keywords, one search each; LinkedIn boolean syntax such as data (analyst OR scientist) worksEmpty
locationsUp to 20 cities, regions, or countries as you would type them on LinkedIn; empty means worldwideEmpty
searchUrlsUp to 20 LinkedIn jobs search URLs copied from a private browser windowEmpty
datePostedanyTime, past24Hours, pastWeek, pastMonthanyTime
sortByrelevance or daterelevance
companyIdsNumeric LinkedIn company IDs (the f_C value in a search URL) that restrict every searchEmpty
geoIdNumeric LinkedIn geoId for exact location targeting; overrides locationsEmpty
easyApplyOnlyOnly jobs with LinkedIn Easy Applyfalse
under10ApplicantsOnly jobs with fewer than 10 applicantsfalse
workplaceType, jobType, experienceLevelRemote/hybrid/on-site, job type, and seniority selections, added to the search text (see below)Empty
maxJobsPerSearchCost and time cap per keyword and location combination, 10 to 1,000100
includeJobDetailsFetch every job's public detail pagetrue
newJobsOnlyReturn only jobs not seen in earlier runs of the same watchlistfalse
stateNamespaceWatchlist history scope for new-jobs-only mode; auto isolates each saved Taskauto
verifyApplyLinksOptional official apply-link and ghost-job verification through a separate Actorfalse
maxConcurrencyParallel detail requests, 1 to 105
proxyConfigurationApify Proxy, included in the priceApify 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.

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 returnedJob 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

  1. Save your input as an Apify Task.
  2. Add a Schedule, for example daily at 07:00.
  3. Turn on newJobsOnly and set datePosted to past24Hours.
  4. 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 short datePosted window, and ideally a geoId; 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.