# LinkedIn Jobs Scraper - Company Data On Every Job (`clearpath/linkedin-jobs-scraper`) Actor

Scrape LinkedIn jobs with the employer's full company profile on every row, at no extra charge. Exact posting dates, applicant counts as numbers, and salary with its stated source. No login needed, and it splits the search to pass LinkedIn's 1,000-job limit.

- **URL**: https://apify.com/clearpath/linkedin-jobs-scraper.md
- **Developed by:** [ClearPath](https://apify.com/clearpath) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 1,000 job scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## LinkedIn Jobs Scraper | Company Data On Every Job, No Login (2026)

[![Every LinkedIn job, with the employer's company profile. 1,200 unique jobs, past LinkedIn's 1,000 limit.](https://api.apify.com/v2/key-value-stores/rfpznBPgVbyLYqNaQ/records/linkedin-jobs-scraper-readme-hero-v1.png)](https://console.apify.com/actors/Z1aLN1Uv3ycPUkfTd/input)

From <strong>Clearpath</strong>, creators of <a href="https://apify.com/clearpath/wellfound-api-ppe">Wellfound Jobs</a>, <a href="https://apify.com/clearpath/welcome-to-the-jungle-jobs-api">Welcome to the Jungle Jobs</a> and <a href="https://apify.com/clearpath/stepstone-de-job-scraper">StepStone Job Scraper</a>. Job-market data with the pay, role and employer context needed for recruitment and research.

### Why choose this actor?

<strong>The employer's company profile on every row, at no extra charge.</strong> Industry, size band, employee and follower counts, headquarters split into street, city, region, postcode and country, founding year, website, specialities and the company's own About text. Other LinkedIn job scrapers either charge separately for company data or leave it out.

<strong>It does not stop at 1,000 jobs.</strong> LinkedIn serves at most 1,000 results for any one search, on every surface it has. Ask for more and this actor splits the search by location and then by posting date until it has what you asked for, deduplicating as it goes. A measured run returned 1,200 unique postings with zero duplicates.

<strong>No LinkedIn account, no cookies, no session to keep alive.</strong> Only what a logged-out visitor can see, so there is nothing to log in with, nothing to expire and nothing for you to maintain. 100 fully detailed jobs took 27 seconds in a measured run.

<a href="https://console.apify.com/actors/Z1aLN1Uv3ycPUkfTd/input"><img src="https://api.apify.com/v2/key-value-stores/rfpznBPgVbyLYqNaQ/records/linkedin-jobs-scraper-readme-cta-v1.svg" width="228" height="48" alt="Scrape LinkedIn jobs"/></a>

### Quick start

Try one hundred data-engineering roles in Germany. Change the keyword and location to match your market.

```json
{
  "keywords": "data engineer",
  "location": "Germany",
  "maxItems": 100
}
```

<a href="https://console.apify.com/actors/Z1aLN1Uv3ycPUkfTd/input">Open actor input</a> to set filters, paste LinkedIn search addresses or pick an output language. Export JSON, CSV or Excel; JSON keeps the benefits list intact.

<table><tr><td colspan="6" style="background:#0A66C2;color:#FFFFFF;padding:10px 14px;font-size:13px;font-weight:700;border:none;border-radius:4px 4px 0 0">Clearpath &middot; Job Market Data</td></tr><tr><td style="padding:8px 10px;border:1px solid #C4D3EF;border-radius:0 0 0 4px;background:#D8E4FF;border-right:none;border-top:none;vertical-align:top;width:16%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-Z1aLN1Uv3ycPUkfTd-DwRlvqITvt-linkedin-jobs-scraper-icon.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://console.apify.com/actors/Z1aLN1Uv3ycPUkfTd/input" style="color:#0A66C2;text-decoration:none;font-weight:700;font-size:13px">LinkedIn</a></span><br><span style="color:#0A66C2;font-size:12px">&#10148; You are here</span></td><td style="padding:8px 10px;border:1px solid #C4D3EF;background:#EAF0FF;border-right:none;border-top:none;vertical-align:top;width:16%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-sqkHGNG0toRTR3ORV-zgctRChWeu-wellfound-jobs-scraper-logo.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/clearpath/wellfound-api-ppe" style="color:#0A66C2;text-decoration:none;font-weight:700;font-size:13px">Wellfound</a></span><br><span style="color:#31456C;font-size:12px">Startup hiring</span></td><td style="padding:8px 10px;border:1px solid #C4D3EF;background:#EAF0FF;border-right:none;border-top:none;vertical-align:top;width:16%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-MdJIadsWKRaguareT-XPALnVdNgE-welcome-to-the-jungle-jobs-scraper-logo.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/clearpath/welcome-to-the-jungle-jobs-api" style="color:#0A66C2;text-decoration:none;font-weight:700;font-size:13px">WTTJ</a></span><br><span style="color:#31456C;font-size:12px">European jobs</span></td><td style="padding:8px 10px;border:1px solid #C4D3EF;background:#EAF0FF;border-right:none;border-top:none;vertical-align:top;width:16%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-cB8bzys6LuwcwX70q-fJBZqO5VQe-stepstone-deutschland-scraper-logo.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/clearpath/stepstone-de-job-scraper" style="color:#0A66C2;text-decoration:none;font-weight:700;font-size:13px">StepStone</a></span><br><span style="color:#31456C;font-size:12px">Germany salaries</span></td><td style="padding:8px 10px;border:1px solid #C4D3EF;background:#EAF0FF;border-right:none;border-top:none;vertical-align:top;width:16%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-bc0M5EvO4rEZNuHqM-2cGUywMaMX-stepstone-deutschland-scraper-logo.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/clearpath/totaljobs-uk-job-scraper" style="color:#0A66C2;text-decoration:none;font-weight:700;font-size:13px">Totaljobs</a></span><br><span style="color:#31456C;font-size:12px">UK jobs</span></td><td style="padding:8px 10px;border:1px solid #C4D3EF;border-radius:0 0 4px 0;background:#EAF0FF;border-top:none;vertical-align:top;width:16%"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-9QmCVplwYguH9FndJ-4C6nohUa6D-ycombinator-scraper-api-logo.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/clearpath/ycombinator-api-scraper" style="color:#0A66C2;text-decoration:none;font-weight:700;font-size:13px">Y Combinator</a></span><br><span style="color:#31456C;font-size:12px">Startup jobs</span></td></tr></table>

#### Copy to your AI assistant

```
clearpath/linkedin-jobs-scraper on Apify. Collects public LinkedIn job postings without any login or cookies and returns 64 fields per job, including the employer's full company profile (industry, size band, employee and follower counts, split headquarters address, founded year, website, specialities, About text) on every row at no extra charge: there is no enrichment switch that costs more, companyDetails just defaults to true. Search with keywords + location, or geoId for an exact place (geoId OVERRIDES location, and LinkedIn does not reject an ID that does not exist, it silently stops filtering by place, so only pass one you copied from a real search address). An unresolvable location stops the run before anything is charged. Narrowing options are all off by default: datePosted (anyTime|pastMonth|pastWeek|past24Hours|pastHour), postedWithinMinutes (overrides datePosted), postedAfter, companies, easyApplyOnly, under10ApplicantsOnly, titleInclude, titleExclude, skipJobIds. searchUrls REPLACES the keyword, location, date and company settings with what the pasted addresses carry, while titleInclude/titleExclude, postedAfter and skipJobIds still apply; several addresses share the budget in turn and maxItemsPerSearch caps each one. maxItems is the run-wide total, default 100, and 0 means no limit. LinkedIn serves at most 1,000 results for any one search on every surface it has; expandSearch (default true) passes that ceiling by splitting the search by place and then by posting-date window, deduplicating by job id. Constraints to respect before promising fields: there is NO remote/hybrid/on-site filter without a login, so use titleInclude for "remote" instead; salary appears only where the employer published it, which is local practice rather than coverage (about 7 in 25 in a New York sample, nearer 1 in 30 in a German one) and is null otherwise; a named hiring contact appears on roughly 1 job in 8; seniorityLevel is a LinkedIn placeholder on most public listings, so read seniorityLevelInferred together with seniorityLevelSource (listed|inferred|unknown) and expect empty rather than a guess; and applyUrl, applyMethod, expireAt, workplaceTypes, workRemoteAllowed, salaryInsights and insights are ALWAYS null, kept only so pipelines written against other LinkedIn job scrapers keep working. outputLanguage (8 languages) also changes the wording of the seniorityLevel, employmentType, jobFunction and industries values, so pin it if you parse them. Pricing: pay per event, $0.99 per 1,000 jobs plus $0.002 per run start; free-plan accounts pay a higher per-job rate and are capped at 5 runs and 25 jobs total. Full spec (input schema, dataset fields, README): GET https://api.apify.com/v2/actors/clearpath~linkedin-jobs-scraper/builds/default with Authorization: Bearer <APIFY_TOKEN>. Token: https://console.apify.com/account/integrations
```

### What you get that other LinkedIn job scrapers skip

- **The hiring company, in depth.** Nineteen company fields on every job row, including the headquarters broken into separate street, city, region, postcode and country fields, employee and follower counts as numbers, and the year the company was founded. Bundled, not billed separately.
- **Applicant count as a number.** LinkedIn writes "Over 200 applicants" or "Be among the first 25 applicants". You get that wording in `applicantsCount` and a sortable integer in `applicantsCountNumber`.
- **Salary with its source.** When an employer publishes pay, you get the raw string, minimum, maximum, currency, period, and `salarySource` naming who stated it, so an employer range is never confused with an estimate.
- **An exact posting date.** `postedAt` is a real date such as `2026-08-20`, not "3 weeks ago". The relative wording is kept separately in `postedTimeAgo`.
- **Seniority, honestly.** LinkedIn shows a placeholder instead of a seniority level on most public listings. Where it does, this actor infers the level from the job title and tells you it did so in `seniorityLevelSource`. Where the title gives no clear signal, the field stays empty rather than being guessed.
- **Eight output languages.** English, German, French, Spanish, Italian, Dutch, Portuguese and Polish. The setting also changes the wording of the seniority, employment type, job function and industry values.

### How to scrape LinkedIn jobs

Search by keyword and place, or paste LinkedIn search addresses you already use. Everything that narrows the result set is off unless you turn it on.

| Parameter | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | string | empty | What you would type into LinkedIn's job search. |
| `location` | string | empty | City, region or country. Checked against LinkedIn's own place list. |
| `geoId` | string | empty | An exact LinkedIn place ID, copied from a search address. Overrides `location`. |
| `datePosted` | enum | `anyTime` | `pastHour`, `past24Hours`, `pastWeek`, `pastMonth` or `anyTime`. |
| `maxItems` | integer | 100 | Total jobs to return. `0` means no limit. |
| `expandSearch` | boolean | `true` | Split the search by place and date to pass 1,000 results. |
| `companies` | array | empty | Company names or LinkedIn company IDs. |
| `postedWithinMinutes` | integer | empty | Finer than `datePosted`. Overrides it. |
| `postedAfter` | string | empty | Drop anything posted before this date, as `2026-09-01`. |
| `easyApplyOnly` | boolean | `false` | Only jobs you can apply to without leaving LinkedIn. |
| `under10ApplicantsOnly` | boolean | `false` | Only jobs with fewer than ten applicants so far. |
| `titleInclude` | array | empty | Keep only titles containing one of these words. |
| `titleExclude` | array | empty | Drop titles containing any of these words. |
| `skipJobIds` | array | empty | Job IDs you already hold. |
| `searchUrls` | array | empty | LinkedIn search addresses. Replaces the keyword search. |
| `maxItemsPerSearch` | integer | empty | Caps what each pasted address contributes. |
| `companyDetails` | boolean | `true` | The employer's company profile on every row. |
| `outputLanguage` | enum | `en-US` | One of eight languages. |

Paste several addresses and they share the run in turn, so a busy first address cannot use up the whole budget:

```json
{
  "searchUrls": [
    "https://www.linkedin.com/jobs/search?keywords=designer&location=Austria",
    "https://www.linkedin.com/jobs/search?keywords=nurse&location=Belgium"
  ],
  "maxItemsPerSearch": 50,
  "maxItems": 100
}
```

Only what is new since your last run, for a scheduled job:

```json
{
  "keywords": "product manager",
  "location": "Netherlands",
  "postedWithinMinutes": 1440,
  "maxItems": 500
}
```

### What data can you extract from LinkedIn?

Sixty-four fields per job, in five groups: the posting itself, the pay, LinkedIn's own classification, the named hiring contact where there is one, and the employer's company profile.

One complete row, exactly as returned, with the job description shown in full:

```json
{
  "id": "4456013005",
  "link": "https://www.linkedin.com/jobs/view/4456013005",
  "refId": "5kWyHjzeoG2cKVUqOsPdaQ==",
  "trackingId": "XmgrD0efYCqsZfmcGXvsnw==",
  "title": "Software Developer",
  "companyName": "Lensrentals",
  "companyLinkedinUrl": "https://www.linkedin.com/company/lensrentals.com",
  "companySlug": "lensrentals.com",
  "companyLogo": "https://media.licdn.com/dms/image/v2/C4E0BAQEXfgrA_FwdDA/company-logo_100_100/company-logo_100_100/0/1630591808625/lensrentalscom_logo?e=2147483647&v=beta&t=Ak6G98g_NXpeddqkuxnY0-GnMk4KQpaccx2d2h7QVF4",
  "location": "New York, NY",
  "benefits": [],
  "postedAt": "2026-08-20",
  "postedAtTimestamp": 1787184000,
  "postedTimeAgo": "1 month ago",
  "descriptionHtml": "<div class=\"show-more-less-html__markup show-more-less-html__markup--clamp-after-5\n            relative overflow-hidden\">\n          <p>Job Description:</p><br><p>The Software Developer is a hands-on individual contributor within the engineering team, with primary focus on Lensrentals' e-commerce platform. This role builds, tests, and maintains features across the front-end, back-end, and database layers, working from technical direction set by senior and lead engineers. The Software Developer collaborates with teammates and, as needed, with Digital &amp; Marketing partners to deliver work that helps reach and engage audiences, build customer knowledge and trust, and improve the overall digital experience.</p><br>Essential Duties and Responsibilities:<br><ul><br> <li><br>  <p>Develops, tests, and maintains software features across front-end, back-end, and database layers, contributing to core e-commerce systems</p><br> </li><br> <li><br>  <p>Implements well-scoped features and enhancements from tickets, specifications, and technical direction provided by senior and lead engineers</p><br> </li><br> <li><br>  <p>Builds and improves customer-facing digital experience features such as navigation, search, filters, and recommendations</p><br> </li><br> <li><br>  <p>Follows established architectural patterns and technical direction, raising questions and surfacing implementation concerns to senior engineers when trade-offs arise</p><br> </li><br> <li><br>  <p>Participates in planning sessions, stand-ups, and retrospectives, providing estimates and status updates for assigned work</p><br> </li><br> <li><br>  <p>Collaborates with Digital &amp; Marketing stakeholders as needed to clarify requirements and validate that delivered work meets intent</p><br> </li><br> <li><br>  <p>Participates in code reviews, both submitting work for review and reviewing peers' changes against team coding standards</p><br> </li><br> <li><br>  <p>Investigates and resolves software defects and performance issues within assigned systems, escalating complex or cross-system problems as appropriate</p><br> </li><br> <li><br>  <p>Communicates progress, blockers, and dependencies clearly and promptly to the team</p><br> </li><br> <li><br>  <p>Pairs with and supports junior engineers on onboarding, tooling, and day-to-day technical questions</p><br> </li><br> <li><br>  <p>Contributes ideas for improving team processes, tools, and delivery practices</p><br> </li><br> <li><br>  <p>Maintains technical documentation in accordance with departmental standards</p><br> </li><br></ul><br>Education and/or Skill Requirements:<br><ul><br> <li><br>  <p>Bachelor's degree in Computer Science, Software Engineering, or related field. Equivalent experience accepted in lieu of degree</p><br> </li><br> <li><br>  <p>Minimum 4 years of professional software engineering experience building and maintaining production applications</p><br> </li><br> <li><br>  <p>Demonstrated ability to independently deliver well-scoped features with limited day-to-day supervision</p><br> </li><br> <li><br>  <p>Experience collaborating with teammates and non-technical partners (e.g., marketing, digital, product) to clarify and deliver requirements</p><br> </li><br> <li><br>  <p>Exposure to e-commerce platforms or customer-facing digital experience work (search, recommendations, personalization, A/B testing) preferred</p><br> </li><br> <li><br>  <p>Solid working knowledge of full stack development including front-end frameworks, back-end services, and relational databases</p><br> </li><br> <li><br>  <p>Ability to write, review, and debug production-quality code in one or more of the team's core languages and frameworks, e.g. Go, Ruby on Rails, React, with willingness to learn the others</p><br> </li><br> <li><br>  <p>Working understanding of software design principles such as SOLID</p><br> </li><br> <li><br>  <p>Familiarity with version control, testing practices, and CI/CD workflows</p><br> </li><br> <li><br>  <p>Exposure to distributed systems concepts and NoSQL datastores is a plus, but not required</p><br> </li><br> <li><br>  <p>Ability to manage personal workload and meet committed deadlines for assigned tasks</p><br> </li><br> <li><br>  <p>Strong analytical and problem-solving skills</p><br> </li><br> <li><br>  <p>Strong written and verbal communication skills</p><br> </li><br></ul><br><p>Physical Requirements:</p><br><p><br> <br><br></p><br><ul><br> <li><br>  <p>Sedentary work; primarily performed at a desk in an office environment.</p><br> </li><br> <li><br>  <p>Ability to operate standard office equipment including computer, keyboard, and mouse for extended periods.</p><br> </li><br></ul><br><p><br> <br><br></p><br>Location:&nbsp;Remote - USStatus:&nbsp;Full Time\n        </div>",
  "descriptionText": "\nJob Description:\nThe Software Developer is a hands-on individual contributor within the engineering team, with primary focus on Lensrentals' e-commerce platform. This role builds, tests, and maintains features across the front-end, back-end, and database layers, working from technical direction set by senior and lead engineers. The Software Developer collaborates with teammates and, as needed, with Digital & Marketing partners to deliver work that helps reach and engage audiences, build customer knowledge and trust, and improve the overall digital experience.\nEssential Duties and Responsibilities:\n\n\nDevelops, tests, and maintains software features across front-end, back-end, and database layers, contributing to core e-commerce systems\n\n\n\nImplements well-scoped features and enhancements from tickets, specifications, and technical direction provided by senior and lead engineers\n\n\n\nBuilds and improves customer-facing digital experience features such as navigation, search, filters, and recommendations\n\n\n\nFollows established architectural patterns and technical direction, raising questions and surfacing implementation concerns to senior engineers when trade-offs arise\n\n\n\nParticipates in planning sessions, stand-ups, and retrospectives, providing estimates and status updates for assigned work\n\n\n\nCollaborates with Digital & Marketing stakeholders as needed to clarify requirements and validate that delivered work meets intent\n\n\n\nParticipates in code reviews, both submitting work for review and reviewing peers' changes against team coding standards\n\n\n\nInvestigates and resolves software defects and performance issues within assigned systems, escalating complex or cross-system problems as appropriate\n\n\n\nCommunicates progress, blockers, and dependencies clearly and promptly to the team\n\n\n\nPairs with and supports junior engineers on onboarding, tooling, and day-to-day technical questions\n\n\n\nContributes ideas for improving team processes, tools, and delivery practices\n\n\n\nMaintains technical documentation in accordance with departmental standards\n\nEducation and/or Skill Requirements:\n\n\nBachelor's degree in Computer Science, Software Engineering, or related field. Equivalent experience accepted in lieu of degree\n\n\n\nMinimum 4 years of professional software engineering experience building and maintaining production applications\n\n\n\nDemonstrated ability to independently deliver well-scoped features with limited day-to-day supervision\n\n\n\nExperience collaborating with teammates and non-technical partners (e.g., marketing, digital, product) to clarify and deliver requirements\n\n\n\nExposure to e-commerce platforms or customer-facing digital experience work (search, recommendations, personalization, A/B testing) preferred\n\n\n\nSolid working knowledge of full stack development including front-end frameworks, back-end services, and relational databases\n\n\n\nAbility to write, review, and debug production-quality code in one or more of the team's core languages and frameworks, e.g. Go, Ruby on Rails, React, with willingness to learn the others\n\n\n\nWorking understanding of software design principles such as SOLID\n\n\n\nFamiliarity with version control, testing practices, and CI/CD workflows\n\n\n\nExposure to distributed systems concepts and NoSQL datastores is a plus, but not required\n\n\n\nAbility to manage personal workload and meet committed deadlines for assigned tasks\n\n\n\nStrong analytical and problem-solving skills\n\n\n\nStrong written and verbal communication skills\n\nPhysical Requirements:\n\n\n\nSedentary work; primarily performed at a desk in an office environment.\n\n\n\nAbility to operate standard office equipment including computer, keyboard, and mouse for extended periods.\n\n\nLocation: Remote - USStatus: Full Time",
  "applicantsCount": "Over 200 applicants",
  "applicantsCountNumber": 200,
  "salaryRaw": "$110,000.00/yr - $130,000.00/yr",
  "salaryMin": 110000.0,
  "salaryMax": 130000.0,
  "salaryCurrency": "$",
  "salaryPeriod": "yearly",
  "salarySource": "Lensrentals provided pay range",
  "salaryNote": null,
  "seniorityLevel": "Not Applicable",
  "employmentType": "Full-time",
  "jobFunction": "Engineering and Information Technology",
  "industries": "Non-profit Organizations",
  "seniorityLevelInferred": null,
  "seniorityLevelSource": "unknown",
  "jobPosterName": null,
  "jobPosterTitle": null,
  "jobPosterProfileUrl": null,
  "jobPosterPhoto": null,
  "searchInput": "software engineer",
  "discoveredVia": "search",
  "scrapedAt": "2026-09-24T09:48:18+00:00",
  "applyUrl": null,
  "expireAt": null,
  "workplaceTypes": null,
  "workRemoteAllowed": null,
  "salaryInsights": null,
  "applyMethod": null,
  "insights": null,
  "salary": "$110,000.00/yr - $130,000.00/yr",
  "inputUrl": "software engineer",
  "companyIndustry": "Photography",
  "companySize": "51-200 employees",
  "companyHeadquarters": "Memphis, TN",
  "companyType": "Privately Held",
  "companyFounded": null,
  "companySpecialties": null,
  "companyDescription": "Lensrentals.com is the leading online photography and videography equipment rental house. Founded in a spare bedroom in 2006 in Memphis, TN, Lensrentals.com has grown to over 150 employees. With the country's largest inventory of camera equipment, we are the best resource for photographers and videographers of every budget and experience level.",
  "companyTagline": null,
  "companyWebsite": "http://www.lensrentals.com",
  "companyFollowerCount": 1125,
  "companyEmployeesCount": 103,
  "companyHqStreet": "7730 Trinity Rd",
  "companyHqCity": "Memphis",
  "companyHqRegion": "TN",
  "companyHqPostalCode": "38018",
  "companyHqCountry": "US",
  "companyDataFetchedAt": "2026-09-24T09:48:20+00:00"
}
```

On roughly one job in eight the employer attaches a named hiring contact, which adds four more populated fields. This is a real row with the person's surname, profile handle and photo path masked for this README; a run returns them in full:

```json
{
  "jobPosterName": "Diana M. A.",
  "jobPosterTitle": "Business Development Manager- Technology-Big Data-Cybersecurity-Cloud",
  "jobPosterProfileUrl": "https://es.linkedin.com/in/d********n",
  "jobPosterPhoto": "https://media.licdn.com/dms/image/v2/C4E03AQEPCqHw6r_jHw/profile-displayphoto-shrink_400_400/..."
}
```

Seven fields are always empty: `applyUrl`, `applyMethod`, `expireAt`, `workplaceTypes`, `workRemoteAllowed`, `salaryInsights` and `insights`. LinkedIn publishes those only to signed-in visitors. They are kept in every row so a pipeline written against another LinkedIn job scraper keeps working without a change.

### Reaching past LinkedIn's 1,000-job limit

LinkedIn will not serve more than 1,000 results for a single search. That ceiling is the same whether you are logged out, logged in or using the mobile app, so no scraper can simply page past it.

When you ask for more than one search can hold, this actor splits the search: first by place, using LinkedIn's own list of regions and cities inside the place you asked for, then by posting-date window. Every job is deduplicated by its LinkedIn ID, so overlapping slices never bill you twice for the same posting. LinkedIn's own top matches are always collected first, so a smaller run still returns the most relevant jobs.

Leave `expandSearch` on and set `maxItems` to what you actually need. A measured run asking for 1,200 returned 1,200 unique jobs in 229 seconds with no duplicates.

### Pricing

| Event | When charged | Price |
|---|---|---|
| Actor start | Once per run | $0.002 |
| Job scraped | Per job delivered to your dataset | $0.99 per 1,000 |

The company profile, the full description, the applicant count, the salary fields and the hiring contact are all included in that per-job price. There is no detail upgrade and no enrichment surcharge.

A 100-job run costs $0.002 + $0.099, about **$0.10**. A 1,000-job run costs $0.002 + $0.99, about **$0.99**. Prices shown are the Bronze tier; higher plans pay less per job.

Jobs that are filtered out by your own title filters or skip list are never charged. Free-plan accounts pay a higher per-job rate and are limited to 5 runs and 25 jobs in total.

### Frequently asked questions

**Do I need a LinkedIn account, login or cookies?**
No. This actor reads only what LinkedIn shows a logged-out visitor, so there is nothing to sign in with and no session that can expire mid-run.

**Can I really get more than 1,000 jobs from one search?**
Yes, by splitting the search. See the section above. Leave `expandSearch` on and raise `maxItems`.

**Is the company profile an extra charge?**
No. It is included in the per-job price. Turn it off with `companyDetails` only if you want the run to finish slightly sooner.

**Why does salary appear on only some jobs?**
Because only some employers publish it. Coverage follows local pay-transparency practice rather than anything about the scraper: in a measured New York run 7 jobs in 25 carried a pay range, while a German run returned closer to 1 in 30. Where pay is absent the salary fields are null, never estimated.

**Can I filter to remote, hybrid or on-site?**
No, and no LinkedIn job scraper that works without a login can. LinkedIn applies that filter only for signed-in visitors, and it is the one filter with no logged-out equivalent. Many employers put "Remote" or "Hybrid" in the job title, so `titleInclude` is the practical substitute.

**Can I filter by seniority, employment type, job function or industry?**
Those arrive as fields on every row, so filter after the run. Inside the run, the title filters are the equivalent.

**How current is the data?**
It is read live when the run starts. `postedAt` is an exact date and `postedAtTimestamp` is the same date ready to sort.

**Can I run this on a schedule and get only what is new?**
Yes. Use `postedWithinMinutes` to match your schedule interval, or `postedAfter` for a fixed date floor, or pass the IDs you already hold in `skipJobIds`.

**What happens if I misspell the location?**
The run stops immediately and tells you, before anything is collected or charged. LinkedIn silently ignores a place it cannot resolve and returns jobs from everywhere instead, which would otherwise bill you for a worldwide search you did not ask for.

**What does the output language setting change?**
The wording LinkedIn returns: posting dates, applicant counts, and the seniority, employment type, job function and industry values. Job descriptions stay in whatever language the employer wrote them in.

**Is a job ID stable?**
Yes. `id` is LinkedIn's own job posting ID, so it is the right key for deduplicating across runs.

**Is this public data?**
Yes. Everything collected is visible to anyone who opens LinkedIn without logging in. You remain responsible for how you use personal data, including the named hiring contact where one is present.

### Limits worth knowing before you start

- No remote, hybrid or on-site filter. There is no logged-out equivalent.
- Salary is present only where the employer published it.
- A named hiring contact appears on roughly one job in eight.
- Seven fields are always empty by design, listed above.
- External apply links are not available without a login; `link` always points at the LinkedIn job page.

### Support

Found a problem or need a field that is missing? Open an issue on the Issues tab, or email max@mapa.slmail.me.

# Actor input Schema

## `keywords` (type: `string`):

What you are looking for, the way you would type it into LinkedIn. For example "data engineer" or "remote python contract".

## `location` (type: `string`):

A city, region or country, in plain English. Matched against LinkedIn's own place list, so "Berlin", "Bavaria" and "Germany" all work and give different result sets.

## `geoId` (type: `string`):

Optional. Pins the search to one exact LinkedIn place and overrides the location above. Copy it from a LinkedIn jobs search address in your browser: it is the <code>geoId=</code> number. Use <code>92000000</code> for worldwide or <code>91000000</code> for the European Union.<br><b>Check it before you run:</b> LinkedIn does not reject an ID that does not exist, it just stops filtering by place, so a mistyped ID quietly returns jobs from anywhere. If you are not copying an ID, leave this empty and use the location field, which is checked against LinkedIn's place list for you.

## `datePosted` (type: `string`):

Only return jobs posted inside this window.

## `maxItems` (type: `integer`):

How many jobs to return. LinkedIn serves at most 1,000 for any one search; ask for more and the search is split by location and posting date to reach past that.<br><b>0 means no limit</b>, so the run keeps going until the search is exhausted or your run budget stops it. Set a number here if you want a predictable cost.

## `expandSearch` (type: `boolean`):

LinkedIn returns at most 1,000 jobs for one search. When you ask for more, the search is split by location and then by posting date until it has enough. Results always start with LinkedIn's own top matches, so turning this off simply stops at 1,000.

## `companies` (type: `array`):

Company names or LinkedIn company IDs. Names are matched against LinkedIn's own company list, so "Google" is enough. Leave empty for every employer.

## `postedWithinMinutes` (type: `integer`):

Optional, and finer than the choices above. Set 15 to catch jobs in the quarter hour since your last run. Overrides the window above.

## `postedAfter` (type: `string`):

Drop anything posted before this date, written as 2026-09-01. Useful for a scheduled run that should only ever return what is new.

## `easyApplyOnly` (type: `boolean`):

Only jobs you can apply to without leaving LinkedIn. Reduces the number of results.

## `under10ApplicantsOnly` (type: `boolean`):

Only jobs with fewer than ten applicants so far. Reduces the number of results, often sharply.

## `titleInclude` (type: `array`):

Keep only jobs whose title contains at least one of these words. Leave empty to keep every title.

## `titleExclude` (type: `array`):

Drop jobs whose title contains any of these words, for example "intern" or "senior".

## `skipJobIds` (type: `array`):

Job IDs you already have. Useful for a scheduled run that should only return what is new.

## `searchUrls` (type: `array`):

Paste one or more LinkedIn job search addresses instead of filling the fields above. When you use this, the keyword, location, posting-date window and company settings are taken from the address itself, so those fields are ignored. The title filters, "Posted on or after", the skip list and the output settings still apply.

## `maxItemsPerSearch` (type: `integer`):

When you paste several addresses, caps how many each one contributes so a single busy search cannot use up the whole run. Leave empty to let them compete.

## `companyDetails` (type: `boolean`):

Adds the employer's industry, size, headquarters, founding year, website, follower count and description to every row. Included at no extra charge. Turn it off only if you want the run to finish slightly sooner.

## `outputLanguage` (type: `string`):

The language LinkedIn returns job text in. Affects wording such as posting dates, hiring labels and the seniority, employment type, job function and industry values. Job descriptions stay in whatever language the employer wrote them in.

## Actor input object example

```json
{
  "keywords": "data engineer",
  "location": "Germany",
  "datePosted": "anyTime",
  "maxItems": 100,
  "expandSearch": true,
  "companies": [],
  "easyApplyOnly": false,
  "under10ApplicantsOnly": false,
  "titleInclude": [],
  "titleExclude": [],
  "skipJobIds": [],
  "searchUrls": [],
  "companyDetails": true,
  "outputLanguage": "en-US"
}
```

# Actor output Schema

## `results` (type: `string`):

Every job collected by this run, one row each.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": "data engineer",
    "location": "Germany",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearpath/linkedin-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": "data engineer",
    "location": "Germany",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("clearpath/linkedin-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": "data engineer",
  "location": "Germany",
  "maxItems": 100
}' |
apify call clearpath/linkedin-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,clearpath/linkedin-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Z1aLN1Uv3ycPUkfTd/builds/WgMUkI0z01gS0eTOg/openapi.json
