LinkedIn Jobs Scraper — Full Descriptions & New Jobs Monitor avatar

LinkedIn Jobs Scraper — Full Descriptions & New Jobs Monitor

Pricing

from $2.00 / 1,000 complete jobs

Go to Apify Store
LinkedIn Jobs Scraper — Full Descriptions & New Jobs Monitor

LinkedIn Jobs Scraper — Full Descriptions & New Jobs Monitor

LinkedIn jobs scraper for public job postings with full descriptions, company, location and posted date. Filter by title and schedule a new-jobs monitor that skips jobs you already have. No login or cookies. $2 per 1,000 complete jobs.

Pricing

from $2.00 / 1,000 complete jobs

Rating

0.0

(0)

Developer

Agnes Maina

Agnes Maina

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

LinkedIn Jobs Scraper: full job descriptions and a new-jobs monitor

Run on Apify

This LinkedIn jobs scraper collects public LinkedIn job postings with the full job description (not the truncated search card), plus company, location and posted date, with no login or cookies. You can filter by job title, schedule a new-jobs monitor that only returns postings you have not seen, and you pay $2 per 1,000 complete jobs.

In the September 27, 2026 cloud benchmark, 20 searches across the US, UK, Canada, Germany and Australia delivered 500 jobs from 506 attempted detail pages (98.81%). All 50 independently re-checked job identities matched. These are measured results from that benchmark, not a promise of exhaustive LinkedIn coverage.

What you get

Every delivered row is one LinkedIn job with these fields:

FieldWhat it holds
jobIdLinkedIn job ID
urlCanonical job URL
titleJob title from the detail page
companyNameHiring company
companyUrlCompany LinkedIn page
locationLocation as shown on the posting
descriptionTextFull job description text (at least 100 characters, or the job is not delivered)
postedAtRawDate text as displayed, for example "2 weeks ago"
postedAtSource date YYYY-MM-DD, or an approximate timestamp from relative text
postedAtPrecisionday, approximate or null
postedAtEstimatedtrue when the date is an estimate
salaryTextSalary text when the posting publishes it
employmentTypeFull-time, part-time, contract and so on
seniorityLevelSeniority level as published
jobFunctionJob function as published
industriesIndustries as published
jobPosterNameName of the job poster when shown
jobPosterUrlJob poster profile URL when shown
scrapedAtCollection timestamp

Missing optional values are null. The actor does not guess emails, hiring managers, salaries or applicant counts. Each run also writes RUN_SUMMARY (per-search counts and stop reasons) and DIAGNOSTICS (errors) to the key-value store, outside the job dataset.

Try it in 30 seconds

  1. Open the actor on Apify and click Try for free.
  2. Keep the prefilled software engineer / United States search or type your own keywords and location.
  3. Set maxJobs to 25 and click Start.
  4. Download the dataset as JSON, CSV or Excel when the run finishes.

Apify's free plan includes $5 of monthly credit. At $0.002 per job that covers about 2,500 jobs a month before you pay anything.

Example output

A real record from the September 27, 2026 benchmark. descriptionText is shortened here; the delivered row holds the full text.

{
"jobId": "4419969671",
"url": "https://www.linkedin.com/jobs/view/4419969671/",
"title": "Senior Software Engineer \u2013 Go (Golang)",
"companyName": "General Motors",
"companyUrl": "https://www.linkedin.com/company/general-motors/",
"location": "Warren, MI",
"descriptionText": "(full job description text)",
"postedAtRaw": "2 weeks ago",
"postedAt": "2026-09-12",
"postedAtPrecision": "day",
"postedAtEstimated": false,
"salaryText": null,
"employmentType": "Full-time",
"seniorityLevel": "Not Applicable",
"jobFunction": null,
"industries": null,
"jobPosterName": null,
"jobPosterUrl": null,
"scrapedAt": "2026-09-27T15:31:19.157Z"
}

Fields shown as null in this example are placeholders; on a real posting they are filled whenever LinkedIn publishes them.

Pricing

Pay per event, no subscription:

EventPrice
job (one complete job delivered)$0.002
apify-actor-start (per run, per GB of memory, minimum one)$0.00005

Worked example: 1,000 jobs cost 1,000 x $0.002 = $2.00, plus $0.00005 for the run start at the default 256 MB memory. Proxy costs are included. There is no extra platform-usage charge.

A job is charged only when the delivered row has a confirmed job ID, title, company identity, canonical URL and a description of at least 100 characters. Incomplete records, duplicates and jobs rejected by your title filters are skipped and never charged. Set a maximum cost per run in Apify and the actor stops cleanly at that limit.

How this compares

Live Apify Store data, checked September 30, 2026. Prices are per job result for each actor's free tier and its lowest paid tier. "Not stated" means the Store listing did not say either way.

ActorPrice per jobStart feeFull description?New-jobs monitor / schedule?Login required?
This actor (agnes.developer.queen/linkedin-jobs-scraper)$0.002 on every tier$0.00005Yes, required for a job to be chargedBuilt-in onlyNew with 90-day history, plus Apify SchedulesNo
curious_coder/linkedin-jobs-scraper$0.002 free tier, $0.001 paid tiers$0.00005Yes (descriptionText, descriptionHtml)Schedule a "Last 24 hours" search URL; cross-run history not statedNot stated
cheap_scraper/linkedin-job-scraper$0.0007 free tier, down to $0.00035 on Gold+$0.005Not statedApify scheduler; removes duplicate jobs, cross-run history not statedNot stated
bebity/linkedin-jobs-scraper$0.0015 free tier, down to $0.001 on Gold+$0.00005YesApify schedulerNo

If lowest price per row is all you need, the other actors are cheaper on paid tiers. This one is built for recurring feeds: you get only unseen jobs, and you are never charged for a row without a full description.

Input

FieldTypeDefaultWhat it does
searchUrlsarray of stringsnoneUp to 20 HTTPS LinkedIn /jobs/search URLs. Use these or the keyword fields, not both. Unsupported URL filters are rejected.
keywordsstringprefill software engineerSearch phrase. Use with location.
locationstringprefill United StatesLocation sent to LinkedIn. LinkedIn controls geographic matching.
companyIdsarray of stringsnoneNumeric LinkedIn company IDs used as the source's company filter.
postedWithinDaysintegerany agePosting-age filter. Accepts 1, 7 or 30.
titleIncludesarray of stringsnoneCase-insensitive phrases. A delivered title must contain at least one.
titleExcludesarray of stringsnoneReject titles containing any of these phrases.
maxJobsinteger100Total cap across all searches, 1 to 10,000. Incomplete and duplicate jobs do not count.
onlyNewbooleanfalseSkip job IDs delivered by the same search and filter configuration in the previous 90 days.
proxyConfigurationobjectApify datacenter proxyDirect, datacenter or residential access. Direct requests can be rate-limited.

Example input:

{
"keywords": "software engineer",
"location": "United States",
"titleIncludes": ["engineer"],
"titleExcludes": ["intern"],
"maxJobs": 100
}

Results come newest first. Each search scans at most 1,000 source candidates or 100 pages. LinkedIn can return fewer results, repeat pages or limit access, and the run summary says when a search stopped early.

Use cases

  • Recruiting pipelines: pull every new "data engineer" posting in your target cities each morning and push it into your ATS or a spreadsheet.
  • Job boards and aggregators: feed a niche board with full descriptions instead of one-line snippets.
  • Hiring-intent signals for sales: a company posting five DevOps roles this week is a warm lead for infrastructure tooling. Filter by companyIds or title and route rows to your CRM.
  • Labour-market research: track posting volume by title, location and seniority over time.
  • Salary and skills analysis: parse salaryText and descriptionText for pay ranges, required tools and years of experience.

Integrations

Run it from the Apify API and get the jobs back in one call:

curl -X POST "https://api.apify.com/v2/acts/agnes.developer.queen~linkedin-jobs-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":"data analyst","location":"London","maxJobs":50}'

Python:

from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("agnes.developer.queen/linkedin-jobs-scraper").call(
run_input={"keywords": "data analyst", "location": "London", "maxJobs": 50}
)
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["title"], job["companyName"], job["url"])

Node.js:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('agnes.developer.queen/linkedin-jobs-scraper').call({
keywords: 'data analyst',
location: 'London',
maxJobs: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'jobs');

No-code tools: use the Apify app in Make, n8n or Zapier, pick "Run actor", enter agnes.developer.queen/linkedin-jobs-scraper and map the dataset items to Google Sheets, Airtable, Slack or your CRM.

AI agents: the Apify MCP server exposes this actor as a tool. Point your MCP client at https://mcp.apify.com?actors=agnes.developer.queen/linkedin-jobs-scraper.

Schedule the new-jobs monitor

  1. In Apify Console, open the actor and save this input as a task:
{
"keywords": "software engineer",
"location": "United States",
"postedWithinDays": 1,
"titleIncludes": ["engineer"],
"titleExcludes": ["intern"],
"maxJobs": 100,
"onlyNew": true
}
  1. Go to Schedules, create a schedule (for example daily at 07:00), and add the task.
  2. Optionally add a webhook or a Make/n8n/Zapier trigger on "run succeeded" to send the new rows wherever you need them.

The first run delivers matching jobs up to the cap. Later runs skip job IDs already delivered under the same search and title filters within 90 days. Capped or failed jobs are not marked as seen, so they can arrive on the next run. History lives in your named key-value store linkedin-jobs-monitor-v1; deleting it resets the baseline. Run one schedule per configuration and do not let runs overlap.

FAQ

Can you scrape LinkedIn jobs without login?

Yes. The actor reads public LinkedIn job pages. It needs no LinkedIn account, cookies or session, and no third-party data API.

Does it include the full job description?

Yes. descriptionText holds the full description from the job detail page. A job without a description of at least 100 characters is not delivered and not charged.

How do I get only new jobs?

Set onlyNew to true, save the input as a task and schedule it. Each run skips job IDs delivered under the same configuration in the last 90 days. Adding postedWithinDays: 1 keeps each daily run focused on fresh postings.

How often can I run it?

As often as you like, as long as runs for the same monitor configuration do not overlap. Daily or a few times a day works well for most searches. Different searches can run in parallel because they keep separate histories.

Does it work outside the US?

Yes. The benchmark covered the United States, United Kingdom, Canada, Germany and Australia. Put any location LinkedIn accepts in location. LinkedIn decides geographic matching.

Why was a job not charged?

Only complete jobs are charged. Rows with missing identity data, descriptions under 100 characters, duplicates, and titles rejected by titleIncludes or titleExcludes are skipped for free. In the benchmark, 6 of 506 detail pages came back incomplete and were not charged.

How many jobs can I get per run?

Up to 10,000 with maxJobs. Each individual search scans at most 1,000 source candidates or 100 pages, so split broad searches into several narrower ones or several searchUrls for more volume.

Can I use my own LinkedIn search URL?

Yes. Build a search on LinkedIn, copy the /jobs/search URL into searchUrls (up to 20). Unsupported filters in the URL are rejected with a clear error before scraping starts.

The actor only collects job postings that LinkedIn shows publicly without a login, and it does not collect emails or private profile data. You are responsible for how you use the data, including compliance with LinkedIn's terms, GDPR, CCPA and any other laws that apply to you. If in doubt, ask a lawyer.

Support

Open an issue on the actor's Issues tab. Include the run ID, your input and what you expected to see. Bug reports with a run ID usually get fixed fastest.

Docs and examples: https://github.com/agnesthedeveloper/linkedin-jobs-scraper