LinkedIn Jobs Scraper & Job Market Data | $0.50 / 1K avatar

LinkedIn Jobs Scraper & Job Market Data | $0.50 / 1K

Pricing

from $3.00 / 1,000 actor starteds

Go to Apify Store
LinkedIn Jobs Scraper & Job Market Data | $0.50 / 1K

LinkedIn Jobs Scraper & Job Market Data | $0.50 / 1K

LinkedIn job postings data without an official API: search by keyword, location or company, no login or cookies. Full description, seniority, employment type, industries. Incremental mode reports only new or closed postings. From $0.50 per 1,000 rows.

Pricing

from $3.00 / 1,000 actor starteds

Rating

5.0

(1)

Developer

Hriday Rungta

Hriday Rungta

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

3

Monthly active users

2 days ago

Last modified

Share

LinkedIn Jobs Scraper: job market data and new/closed job alerts (no login)

Get LinkedIn job postings data without an official LinkedIn jobs API, a login or a cookie. Search by keyword and location, or pull every open posting of a company, and get one structured row per job: title, company, location, seniority, employment type, industries and the full description. Switch on incremental mode and every scheduled run returns only postings that are new or have closed.

From $0.50 per 1,000 job rows (mode "all") or $2.00 per 1,000 change rows (mode "changes"), plus a $0.003 start fee per run.

What can you use LinkedIn job data for?

  • Job market data: count and compare postings by role, city, company or industry, week over week.
  • Hiring signals and competitor tracking: watch which roles a company opens and closes (sales intelligence, recruiting, investor research).
  • Job postings data for dashboards: feed Google Sheets, Looker Studio, Power BI or a database on a schedule.
  • Job alerts: get only new postings for a search, instead of re-reading the same list.
  • Skills and salary research: full description text for NLP, skill counts and (when a posting states one) pay figures.

Output example

One row per posting (description shortened):

{
"jobId": "4478595713",
"title": "Sr. Data Analyst",
"companyName": "Accenture Federal Services",
"companyUrl": "https://www.linkedin.com/company/accenturefederalservices",
"location": "Washington, DC",
"employmentType": "Full-time",
"seniorityLevel": "Mid-Senior level",
"industries": "IT Services and IT Consulting",
"descriptionText": "At Accenture Federal Services, nothing matters more than ...",
"postedIso": "2026-10-20",
"postedText": "8 hours ago",
"applicantsText": "118 applicants",
"activelyHiring": true,
"permalink": "https://www.linkedin.com/jobs/view/sr-data-analyst-at-accenture-federal-services-4478595713",
"sourceType": "search",
"sourceValue": "data analyst @ United States"
}

Other fields: jobFunction, scrapedAt. In mode "changes" each row also has changeType (new or closed), firstSeen, lastSeen and daysLive. Some fields can be empty when LinkedIn does not show them for a posting.

Input

InputDefaultNotes
searchesone example search{ "keywords": "...", "location": "..." } pairs; either can be blank
companyUrls[]Company page URL or bare slug (stripe). Every open posting of that company
modeallall or changes
datePostedanyany, past24Hours, pastWeek, pastMonth
titleInclude / titleExclude[]Keyword filters on the title; exclude wins
salaryMin0Best-effort, see below
experienceLevel, jobType, remoteanyApplied by this Actor after it reads each job page, see "Known limits"
maxResults100Cost cap, you pay per row saved
firstRunSince30 daysMode "changes" only; all reports every open posting as new on run one
stateStoreName, stateNamespaceautoMode "changes" only

Example input for a weekly data analyst job market snapshot:

{
"searches": [{ "keywords": "data analyst", "location": "United States" }],
"datePosted": "pastWeek",
"maxResults": 200
}

Pricing (pay per event)

EventPriceWhen
actor-started$0.003once per run
job-row$0.0005one posting row, mode "all"
change-row$0.002one NEW or CLOSED posting row, mode "changes"

Worked examples:

  • 20 postings, mode "all": $0.003 + 20 x $0.0005 = $0.013
  • 1,000 postings, mode "all": $0.003 + $0.50 = $0.503
  • A daily "changes" run that finds 15 new or closed postings: $0.003 + 15 x $0.002 = $0.033. Unchanged postings cost nothing.

Set maxResults as your cost cap. When the limit is reached the run stops cleanly and keeps what it saved.

Incremental mode: new and closed job alerts

A posting can close, and LinkedIn does not announce that. So in mode "changes" the Actor stores the full set of posting ids it has seen per search or company in a key-value store on your account and compares each fresh fetch with it: ids no longer present are reported closed, new ids are reported new, unchanged ones produce no row and no charge.

  • First run: a source's first run takes postings from the last firstRunSince (default 30 days) as its baseline "new", so it does not bill a search's whole listing.
  • Safe by design: if a run is cut short before a source is fully read, closed-posting detection is skipped for that source, so you never get a false "closed". Your own title/salary filters never affect what counts as known.
  • Private to you: state keys are namespaced by your Apify user id.

Schedule it and connect it

Run on an Apify Schedule (daily or weekly), then send the dataset onward:

  • Google Sheets, Make, n8n, Zapier: use the Apify integrations, or trigger on "run succeeded".
  • Webhooks: call your own endpoint when a run finishes.
  • API / JSON, CSV, Excel: download any dataset from the Console or the API.

Known limits (please read)

  • Public job postings only. No personal profiles (/in/...), no candidate data, no login. Profiles are gated by LinkedIn and are out of scope.
  • experienceLevel, jobType and remote are applied by this Actor, not by LinkedIn. LinkedIn's logged-out search stopped applying these three filters (tested 2026-10-21: identical results with and without them; only datePosted still works). The Actor therefore reads each job's own page and keeps the postings whose stated seniority level and employment type match. Postings that do not state the field are dropped. Workplace type (remote, hybrid, on-site) has no field on the page, so it is a text match on the title, location and the start of the description: treat it as best-effort and expect fewer rows than requested. Filtered runs read several times more job pages than a plain run, so they take 1-2 minutes instead of about 30-90 seconds; dropped postings are never billed.
  • salaryMin is conservative. LinkedIn has no structured salary field on most postings, so a posting is dropped only when a figure was found in its description and it is below your minimum. Postings with no salary are kept.
  • Results come from LinkedIn's public search, which returns a limited number of postings per search. Split broad searches by location or keyword.
  • Fields such as jobFunction or applicantsText are empty when LinkedIn does not show them.

FAQ

Is there an official LinkedIn jobs API? Not for general job search: LinkedIn's official job APIs are for partners posting or syncing their own jobs. This Actor reads the public job pages any visitor can see.

Do I need a LinkedIn account or cookie? No.

What is a good alternative to a LinkedIn jobs API for job market data? Run this Actor on a schedule and export to your sheet or database. Prices are flat and shown above.

How do I get only new jobs? Set mode to changes and schedule it.

Can it scrape LinkedIn profiles or Sales Navigator? No.

Can I use it with ChatGPT or Claude? Yes, Apify Actors can be called from AI agents through the Apify MCP server and the API.

Is it legal? It collects publicly visible job postings. You are responsible for using the data in line with LinkedIn's terms and the laws that apply to you (for example GDPR).