LinkedIn Jobs Scraper: Full Descriptions, Monitor avatar

LinkedIn Jobs Scraper: Full Descriptions, Monitor

Pricing

from $2.00 / 1,000 complete jobs

Go to Apify Store
LinkedIn Jobs Scraper: Full Descriptions, Monitor

LinkedIn Jobs Scraper: Full Descriptions, Monitor

LinkedIn jobs scraper for public job postings with full descriptions, company, location and posted date. Filter titles and schedule a monitor that skips jobs you already have. No login. $2 per 1,000 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

4 days ago

Last modified

Share

LinkedIn Jobs Scraper: full descriptions and a new jobs monitor

Run on Apify

This LinkedIn jobs scraper collects public LinkedIn job postings with the full job description from the detail page, not the shortened search card, plus company, location and posted date. You get one row per job at $0.002 each, which is $2 per 1,000 jobs, and you can filter titles and schedule a monitor that returns only postings you have not seen. No LinkedIn login and no cookies.

Limits before you pay for anything: up to 10,000 delivered jobs in one run, up to 20 search URLs, and each search reads at most 1,000 source candidates or 100 pages. A job is delivered and charged only when the row has a confirmed job ID, title, company, canonical URL and a description of at least 100 characters. It does not guess emails, hiring managers, applicant counts or salaries the posting does not publish; jobPosterName is filled only when LinkedIn shows the poster. LinkedIn can return fewer results or limit access, and the run summary records when a search stopped early.

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. These are measured results from that benchmark, not a promise of full coverage.

What you get

One row per 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 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
jobFunction, industriesAs published
jobPosterName, jobPosterUrlJob poster name and profile URL when shown
scrapedAtCollection timestamp

Missing optional values are null. The actor never guesses 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.

Try it in 30 seconds

  1. Open the actor page in the Apify Store and click Try for free.
  2. Keep the prefilled software engineer and United States search, or type your own.
  3. Set maxJobs to 25, click Start, then open the dataset and download it as JSON, CSV or Excel.

Apify's free plan includes monthly platform credit, so a first run of 25 jobs sits inside it.

Example output

One record from the September 27, 2026 benchmark run. descriptionText is shortened here.

{
"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 here are placeholders, a real posting fills them in when 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

That is $2 per 1,000 complete jobs. 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.

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.

Input

FieldTypeDefaultWhat it does
searchUrlsarray of stringsnoneUp to 20 HTTPS LinkedIn /jobs/search URLs. A URL carries its own search, so keywords and location are ignored when URLs are given; companyIds and postedWithinDays cannot be combined with URLs. Unsupported filters are rejected
keywordsstringprefill software engineerSearch phrase. Use with location
locationstringprefill United StatesSent to LinkedIn. LinkedIn controls geographic matching
companyIdsarray of stringsnoneNumeric LinkedIn company IDs used as the source's company filter
postedWithinDaysintegerany agePosting age filter in whole days, 1 to 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
{
"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, so split broad searches into narrower ones for more volume.

Schedule the new jobs monitor

  1. Save this input as a task in Apify Console:
{
"keywords": "software engineer",
"location": "United States",
"postedWithinDays": 1,
"titleIncludes": ["engineer"],
"titleExcludes": ["intern"],
"maxJobs": 100,
"onlyNew": true
}
  1. Open Schedules, create one, for example daily at 07:00, and add the task.
  2. Optionally add a webhook, or a Make, n8n or Zapier trigger on run succeeded, to send the new rows where 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 the named key-value store linkedin-jobs-monitor-v1, and deleting it resets the baseline. Run one schedule per configuration.

Use cases

  • Recruiting pipelines: pull every new "data engineer" posting in your target cities each morning and push it into your ATS.
  • 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. Filter by companyIds and route the 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 the same 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}'

The same call works from Python and Node.js with the Apify client, and from Make, n8n or Zapier with the Apify app or node. AI assistants and MCP clients can call the Actor as a tool through the Apify MCP server:

https://mcp.apify.com/?tools=agnes.developer.queen/linkedin-jobs-scraper

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. Runs for one configuration must not overlap, and different searches keep separate histories.

Does it work outside the US?

Yes. The benchmark covered the United States, United Kingdom, Canada, Germany and Australia. 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.

Can I use my own LinkedIn search URL?

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

The actor only collects postings that LinkedIn shows publicly without a login, and no emails or private profile data. You are responsible for how you use the data, including your compliance with LinkedIn's terms and any privacy law that applies to you.

Support

Open an issue on the Issues tab of the Store page with the run ID and your input. Docs: github.com/agnesthedeveloper/linkedin-jobs-scraper.