LinkedIn Jobs Scraper avatar

LinkedIn Jobs Scraper

Pricing

from $0.88 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper

LinkedIn Jobs Scraper

Scrape public LinkedIn job listings for one keyword and location per run: title, company, location, posted date and job URL, plus optional full description, seniority, employment type, job function, industries and applicant count. Up to about 1,000 jobs per search. No login.

Pricing

from $0.88 / 1,000 results

Rating

0.0

(0)

Developer

Kyle Adkins

Kyle Adkins

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Share

What does LinkedIn Jobs Scraper do?

LinkedIn Jobs Scraper searches public LinkedIn job listings by keyword and location and returns one clean record per job as JSON, CSV or Excel. Turn on Include full job details and each job also comes back with its complete description text, seniority level, employment type, job function, industries and applicant count, all read from the job's public page.

It is used by recruiters and sourcers tracking hiring demand, job-board and aggregator builders, market and salary researchers, and sales teams watching which companies are hiring for a role. It needs no LinkedIn account, cookies or API key, because it reads the same public pages a logged-out visitor sees. Jobs are deduplicated by LinkedIn job ID within a run, and requests are retried with backoff and rotated proxy sessions when LinkedIn rate-limits.

What data can you get?

Every job has the search-card fields. The fields marked (details) are null unless Include full job details is on. salary is null when LinkedIn shows none, and because LinkedIn's search cards carry no pay data it is only filled from the job page, so turn on details to get it.

FieldDescriptionExample
idStable record ID, same as jobId4470016722
sourceUrlPage the record was read from (the job URL)https://www.linkedin.com/jobs/view/...-4470016722
jobIdLinkedIn job posting ID, unique per job4470016722
titleJob titleSoftware Engineer II, Backend (Identity Decisioning)
companyHiring company nameAffirm
companyUrlLinkedIn company page URLhttps://www.linkedin.com/company/affirm
locationJob location as shown on LinkedInSalt Lake City, UT
urlPublic job URL without tracking parametershttps://www.linkedin.com/jobs/view/...-4470016722
postedDatePosting date, YYYY-MM-DD2026-09-24
salarySalary or compensation range if LinkedIn shows one, otherwise null. Filled from the job page, so it needs Include full job details$117,000.00/yr - $234,000.00/yr
description (details)Full job description text, up to 20,000 charactersWe are looking for a Software Engineer to join...
seniorityLevel (details)Seniority levelMid-Senior level
employmentType (details)Employment typeFull-time
jobFunction (details)Job function categoryEngineering and Information Technology
industries (details)Industries of the hiring companyFinancial Services
applicants (details)Number parsed from applicantsText; Over 200 gives 200 and Be among the first 25 gives 25, see applicantsIsApproximate27
applicantsIsApproximate (details)True when the caption is a bound (Over N, Be among the first N) rather than an exact countfalse
applicantsText (details)Applicant caption as shown on LinkedIn27 applicants
keywordsThe keywords input that found the jobsoftware engineer
searchLocationThe location input that found the jobUnited States
scrapedAtUTC timestamp of the run2026-09-29T18:48:05.608024+00:00

The dataset has three views in the Console: Jobs (the basic table), Full details (description, seniority, function, industries, applicants) and Companies (company, company page, industries and location).

How to use LinkedIn Jobs Scraper

  1. Open the Actor in Apify Console and go to the Input tab.
  2. Enter Keywords, for example data analyst, and a Location such as Austin, Texas or United Kingdom. Leave the location empty to search all locations.
  3. Switch on Include full job details if you need descriptions, seniority, job function, industries and applicant counts.
  4. Optionally narrow the search with date posted, job type, experience level and workplace type, and set Max results.
  5. Click Start and wait for the run to finish. Runs with full details take longer because the Actor opens one extra page per job.
  6. Open the Output tab and export the dataset as JSON, CSV, Excel, XML or HTML, or fetch it through the API.

Input

All fields are optional in the input form, but keywords must contain a value when the run starts. If it is empty the run fails immediately with a clear message.

FieldTypeDefault / prefillDescription
keywordsstringprefill software engineerJob title or keywords to search for, for example python developer. Required at run time.
locationstringprefill United States, no defaultCity, state or country. Leave empty to search all locations.
includeDetailsbooleandefault false, prefill falseOpen each job's public page to also return the full description, seniority level, employment type, job function, industries and applicant count. One extra request per job.
datePostedstringanyOne of any, 24h, week, month. Only jobs posted within the period are returned.
jobTypearrayempty (all)Any of fullTime, partTime, contract, temporary, internship, volunteer, other.
experienceLevelarrayempty (all)Any of internship, entry, associate, midSenior, director, executive.
workTypearrayempty (all)Any of onSite, remote, hybrid.
maxResultsinteger10 (1 to 1000)Maximum number of unique jobs to return. LinkedIn's public search stops at roughly 1,000 results per query.
proxyConfigurationobjectApify ProxyProxy settings. Apify Proxy is recommended because LinkedIn rate-limits datacenter IPs; residential proxies are the most reliable for large runs.

Example input:

{
"keywords": "nurse",
"location": "Ohio",
"includeDetails": true,
"datePosted": "week",
"workType": ["onSite"],
"maxResults": 50,
"proxyConfiguration": { "useApifyProxy": true }
}

Output

Below are two items from a real run with includeDetails on (keywords software engineer, location United States). The description is shortened here for readability; the dataset holds the full text.

[
{
"id": "4470016722",
"sourceUrl": "https://www.linkedin.com/jobs/view/software-engineer-ii-backend-identity-decisioning-at-affirm-4470016722",
"jobId": "4470016722",
"title": "Software Engineer II, Backend (Identity Decisioning)",
"company": "Affirm",
"companyUrl": "https://www.linkedin.com/company/affirm",
"location": "Salt Lake City, UT",
"url": "https://www.linkedin.com/jobs/view/software-engineer-ii-backend-identity-decisioning-at-affirm-4470016722",
"postedDate": "2026-09-24",
"salary": null,
"description": "At Affirm, we exist for the moments that matter, giving people a clear, predictable way to pay over time... We are looking for a Software Engineer to join the Identity Decisioning team ...",
"seniorityLevel": "Mid-Senior level",
"employmentType": "Full-time",
"jobFunction": "Engineering and Information Technology",
"industries": "Financial Services",
"applicants": 27,
"applicantsText": "27 applicants",
"applicantsIsApproximate": false,
"keywords": "software engineer",
"searchLocation": "United States",
"scrapedAt": "2026-09-29T18:48:05.608024+00:00"
},
{
"id": "4462335889",
"sourceUrl": "https://www.linkedin.com/jobs/view/software-engineer-ii-backend-post-transaction-at-affirm-4462335889",
"jobId": "4462335889",
"title": "Software Engineer II, Backend (Post-Transaction)",
"company": "Affirm",
"companyUrl": "https://www.linkedin.com/company/affirm",
"location": "Salt Lake City, UT",
"url": "https://www.linkedin.com/jobs/view/software-engineer-ii-backend-post-transaction-at-affirm-4462335889",
"postedDate": "2026-09-26",
"salary": null,
"description": "At Affirm, we exist for the moments that matter... Affirm is reinventing credit to make it more honest and friendly ...",
"seniorityLevel": "Mid-Senior level",
"employmentType": "Full-time",
"jobFunction": "Engineering and Information Technology",
"industries": "Financial Services",
"applicants": 63,
"applicantsText": "63 applicants",
"applicantsIsApproximate": false,
"keywords": "software engineer",
"searchLocation": "United States",
"scrapedAt": "2026-09-29T18:48:05.608024+00:00"
}
]

With includeDetails off, the items contain the search-card fields (id, sourceUrl, jobId, title, company, companyUrl, location, url, postedDate, plus keywords, searchLocation and scrapedAt), and the salary and detail fields are null.

How much does it cost?

The Actor uses pay-per-event pricing: you are charged for each job saved to the dataset. Turning on full job details does not add a separate charge per job, it only makes the run slower because each job needs one more request. Apify's free plan credit covers small runs, so you can try a few dozen jobs before paying anything. For the exact price per result on each plan, open the Pricing tab on the Actor page.

You can also set a maximum cost per run in the run options. The Actor stops cleanly when that limit is reached and keeps everything collected so far.

Integrations and API

Start runs, poll them and read datasets over the Apify API, or use the official clients. Set the APIFY_TOKEN environment variable to your API token from Apify Console.

Python:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("axiomworks/linkedin-jobs-scraper").call(run_input={
"keywords": "python developer",
"location": "United Kingdom",
"includeDetails": True,
"maxResults": 25,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["title"], job["company"], job.get("applicants"))

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('axiomworks/linkedin-jobs-scraper').call({
keywords: 'python developer',
location: 'United Kingdom',
includeDetails: true,
maxResults: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => // one job per item
process.stdout.write(`${item.title}\n`));

cURL:

curl -X POST "https://api.apify.com/v2/acts/axiomworks~linkedin-jobs-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords": "python developer", "location": "United Kingdom", "includeDetails": true, "maxResults": 25}'

Because it runs on Apify, the Actor plugs into Zapier, Make, n8n, Google Sheets and any system that accepts webhooks through Apify integrations. A common setup is a scheduled run with a datePosted of 24h that sends new jobs to a spreadsheet or a Slack channel.

Use with AI agents (MCP)

LinkedIn Jobs Scraper can be called by AI agents through Apify's MCP server at https://mcp.apify.com. Agents discover it with the search-actors tool and run it with call-actor. To expose only this Actor to your client, add it to the MCP configuration of Claude, ChatGPT, Cursor or any MCP-compatible tool:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=axiomworks/linkedin-jobs-scraper"
}
}
}

Example prompts you can type once it is connected:

  • "Find 30 remote product designer jobs on LinkedIn posted this week and include the full descriptions."
  • "Search LinkedIn for entry level data analyst jobs in Berlin and list the companies with the most applicants."
  • "Pull recent LinkedIn postings for site reliability engineer in Canada and summarize the seniority levels and industries."

The input and output schemas are typed, so the agent sees exactly which fields exist (keywords, location, includeDetails, filters) and what comes back, and can fill them without guessing.

FAQ

How many LinkedIn jobs can I get per search? LinkedIn's public search stops at roughly 1,000 results for one keyword and location combination, and maxResults is capped at 1,000. To collect more, split the search by location, date posted, job type or experience level.

Why did I get fewer jobs than Max results? LinkedIn had fewer matching public listings, or duplicates were removed. The Actor also stops early if it sees no new jobs on two consecutive result pages.

How fast is it, and why is full details slower? The search pages return 10 jobs each and the Actor pauses briefly between pages. With full details on, it opens one extra job page per job, five at a time with Apify Proxy and two at a time without a proxy, so a run with details takes noticeably longer than one without. The default run timeout is one hour.

Do I need a proxy? For small runs it often works without one, but LinkedIn rate-limits datacenter IPs with HTTP 429 and 999 responses. The Actor retries up to five times with growing delays and gets a fresh proxy session on every attempt. For large runs or full details, use Apify Proxy, ideally the residential group.

Why do I get zero results or a blocked error? If LinkedIn refuses the first search request after all retries, the run fails with a message asking you to enable a proxy or try later. If a search simply has no public matches, the run finishes with an empty dataset and logs a warning. Try broader keywords, an empty location or fewer filters.

Is salary always included? No. LinkedIn shows salary on only some listings, and only on the job page, so salary needs Include full job details and is null for listings without a pay range.

Can I schedule it, and how fresh is the data? Yes, use Apify schedules. Data is read live from LinkedIn on every run, and scrapedAt records when. There is no cross-run deduplication, so for a daily job feed set datePosted to 24h and store results by jobId.

The Actor only reads publicly visible job listings that a logged-out visitor can open. It does not log in, use cookies or collect private profile data. Job postings can still include personal or company information, so make sure your use complies with privacy laws such as GDPR and CCPA and with the terms of the platform. You are responsible for how you use the data you collect.

Feedback

Found a bug, a missing field or a change in LinkedIn's pages that breaks a run? Open an issue in the Issues tab of this Actor with your input and the run link. Feature requests are welcome there too.