LinkedIn Jobs Scraper — Salary, Applicants & Company Data avatar

LinkedIn Jobs Scraper — Salary, Applicants & Company Data

Pricing

from $4.00 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper — Salary, Applicants & Company Data

LinkedIn Jobs Scraper — Salary, Applicants & Company Data

Scrape public LinkedIn jobs by keyword & location — no login. Title, company, location, full description, seniority, employment type, applicant count, PARSED salary, and optional company firmographic enrichment (employees, industry, HQ, domain). For recruiting, market research & sales intent.

Pricing

from $4.00 / 1,000 results

Rating

0.0

(0)

Developer

Berkan Kaplan

Berkan Kaplan

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

5 days ago

Last modified

Share

LinkedIn Jobs Scraper — Salary, Applicants & Company Data

LinkedIn Jobs Scraper — Salary, Applicants & Company Data

Need structured LinkedIn job-posting data — not a brittle HTML dump or a scraper that asks for your account cookies? This Actor searches LinkedIn's public guest job listings by keyword and location and returns clean, ready-to-use records: title, company (+ LinkedIn page), location, full description, seniority, employment type, applicant count, and a parsed salary object — plus optional employer firmographics (employee count, industry, HQ, domain, followers) pulled inline from the company page.

No login, no cookies, no account risk — it reads only what a logged-out visitor can see, so you never put a LinkedIn account on the line. Built for recruiting, talent-market research, and sales-intent signals (who is hiring, for what, how competitively).

  • 💼 Full job records — title, company, location, full description, seniority, type, applicant count
  • 💰 Parsed salary — a real { min, max, currency, period } object, not a raw string
  • 🏢 Optional employer firmographics — employee count, industry, HQ, domain, followers, founded — inline per job
  • 🔓 No login, no cookies — public guest data only, so an account is never at risk

Quick start (API)

Get 100 software-engineer jobs posted in New York this past week, in one call:

curl -X POST "https://api.apify.com/v2/acts/foxlabs~linkedin-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "keywords": "software engineer", "location": "New York", "datePosted": "week", "maxResults": 100 }'

Prefer no code? Open the Input tab, type your keywords and location, set your filters, and click Start — then download the results.

What you get

One clean, flat record per job. A default run (details on) returns:

FieldTypeDescription
jobIdstringLinkedIn's numeric job-posting ID
jobUrlstringCanonical public job URL (/jobs/view/{jobId})
titlestringJob title
companyNamestringEmployer name
companyLinkedInUrlstringEmployer's LinkedIn company-page URL
companySlugstringCompany slug parsed from that URL (lower-cased)
companyLogostringCompany logo image URL
locationstringJob location as shown on the listing
workplaceTypestringRemote / Hybrid / On-site — when LinkedIn tags it in the card text
postedDatestringISO date the job was posted
postedTimeAgostringHuman relative time, e.g. "1 week ago"
benefitsstringBenefits snippet, when the listing shows one
descriptionTextstringFull job description, plain text
descriptionHtmlstringFull job description, original HTML
seniorityLevelstringe.g. Mid-Senior level, Entry level
employmentTypestringe.g. Full-time, Contract
jobFunctionstringe.g. Engineering and Information Technology
industriesstringIndustry label(s) for the role
applicantCountnumberApplicant count, parsed to a number
applicantCountTextstringRaw applicant text, e.g. "87 applicants"
jobPosterobjectBest-effort hiring contact { name, title, profileUrl } — usually absent when logged-out
salaryMinnumberParsed minimum pay
salaryMaxnumberParsed maximum pay (omitted when pay is a single figure)
salaryCurrencystringCurrency code — USD, GBP or EUR
salaryPeriodstringyearly / hourly / monthly
salaryFormattedstringCompact display, e.g. $150K–$220K/yr
salaryRawstringThe raw compensation text salary was parsed from
sourcestringAlways "LinkedIn (public)"
scrapedAtstringISO timestamp of the scrape

Turn on Enrich with company firmographics and each record also carries employer data pulled inline from the company's public LinkedIn page:

FieldTypeDescription
companyEmployeeCountnumberEmployee count from the company page
companyFollowersnumberLinkedIn follower count
companyIndustrystringCompany industry
companyWebsitestringCompany website URL
companyDomainstringBare domain of that website
companyHQstringHQ location (city, region, country)
companyFoundednumberFounding year

Fields with no value are omitted from the record (not returned as null), so every record is compact. Salary fields appear only where LinkedIn actually displays compensation.

Sample output

Illustrative record (details + company enrichment on; fields shown fully populated — a real record omits any field LinkedIn doesn't show):

{
"jobId": "3901234567",
"jobUrl": "https://www.linkedin.com/jobs/view/3901234567",
"title": "Senior Software Engineer",
"companyName": "Datadog",
"companyLinkedInUrl": "https://www.linkedin.com/company/datadog",
"companySlug": "datadog",
"companyLogo": "https://media.licdn.com/dms/image/v2/D4E0BAQ.../company-logo_100_100/0/logo.png",
"location": "New York, NY",
"workplaceType": "Hybrid",
"postedDate": "2026-06-28",
"postedTimeAgo": "1 week ago",
"benefits": "Medical insurance, 401(k), Vision insurance",
"descriptionText": "About the role: We're hiring a Senior Software Engineer to build and scale our observability platform. You'll own services end to end, from design through production...",
"descriptionHtml": "<p><strong>About the role:</strong> We're hiring a Senior Software Engineer...</p>",
"seniorityLevel": "Mid-Senior level",
"employmentType": "Full-time",
"jobFunction": "Engineering and Information Technology",
"industries": "Software Development",
"applicantCount": 87,
"applicantCountText": "87 applicants",
"salaryMin": 150000,
"salaryMax": 220000,
"salaryCurrency": "USD",
"salaryPeriod": "yearly",
"salaryFormatted": "$150K–$220K/yr",
"salaryRaw": "$150,000.00/yr - $220,000.00/yr",
"companyEmployeeCount": 7000,
"companyFollowers": 850000,
"companyIndustry": "Software Development",
"companyWebsite": "https://www.datadoghq.com",
"companyDomain": "datadoghq.com",
"companyHQ": "New York, NY, US",
"companyFounded": 2010,
"source": "LinkedIn (public)",
"scrapedAt": "2026-07-05T09:12:44.001Z"
}

Input & filters

  • Keywords — job title, skill or free-text query (e.g. software engineer, account executive, react).
  • Location — city, region or country (e.g. New York, London, Germany). Leave blank to search worldwide.
  • Workplace type — LinkedIn's own filter: remote / hybrid / on-site.
  • Date posted24h / week / month. Use a short window for fresh hiring signals.
  • Experience levelinternship, entry, associate, mid-senior, director, executive.
  • Employment typefull-time, part-time, contract, temporary, internship.
  • Scrape full details — on by default: opens each job for the full description, seniority, type, applicant count and parsed salary. Turn off for a faster, list-only run.
  • Enrich with company firmographics — opt-in: appends employer size/industry/HQ/domain/followers to every job.
  • Max results — 1–1,000 per search (LinkedIn's public cap).

At least one of keywords or location is required.

Example inputs (copy & paste)

// 1) Fresh remote signals: product-manager roles posted this week, remote
{ "keywords": "product manager", "workplaceType": "remote", "datePosted": "week", "maxResults": 200 }
// 2) Enriched hiring feed: London data-engineer jobs + employer firmographics
{ "keywords": "data engineer", "location": "London", "enrichCompany": true, "maxResults": 150 }
// 3) Fast list-only scan (no per-job detail): a wide sales sweep, US
{ "keywords": "sales", "location": "United States", "scrapeDetails": false, "maxResults": 500 }
// 4) Fresh 24h buying signal: RevOps leadership openings, director level
{ "keywords": "Head of RevOps", "datePosted": "24h", "experienceLevel": "director", "maxResults": 100 }
// 5) Contract talent market: freelance React roles, remote
{ "keywords": "react", "jobType": "contract", "workplaceType": "remote", "maxResults": 200 }
// 6) Early-career pipeline: marketing internships, hybrid, Germany
{ "keywords": "marketing", "location": "Germany", "workplaceType": "hybrid", "experienceLevel": "internship", "jobType": "internship", "maxResults": 150 }
// 7) Full-detail + enriched deep pull: executive product roles worldwide
{ "keywords": "VP Product", "experienceLevel": "executive", "scrapeDetails": true, "enrichCompany": true, "maxResults": 300 }

Use cases

  • Recruiting & sourcing. Pull every open role for a title + location with the full description, seniority and applicant count, so you can see how contested each posting is and where to focus outreach — no manual copy-paste from the LinkedIn UI.
  • Talent-market & salary research. Where LinkedIn shows pay, you get a structured salaryMin/salaryMax/salaryCurrency/salaryPeriod — aggregate it to benchmark compensation by role, seniority and geography instead of eyeballing job ads.
  • Sales-intent & hiring signals. A company hiring 12 SDRs or a "Head of RevOps" is a buying signal. Filter by keyword + datePosted: "24h" to catch fresh openings, and turn on enrichment to qualify each employer by size and industry.
  • Competitor & market monitoring. Track who a competitor is hiring for, how many roles, and how fast they fill — run the same search on a schedule and diff the results over time.
  • CRM & company enrichment. Turn on Enrich with company firmographics to append employee count, industry, HQ, website and domain to each job — a company-qualified feed, not just a title list.
  • Job boards & aggregators. Feed a niche board or a Slack/email digest with fresh, structured postings in JSON, CSV or Excel.

Performance & throughput

The Actor paginates LinkedIn's public guest search 10 cards at a time, de-duplicates by jobId into a single clean set, then fetches per-job details and (optionally) company firmographics with bounded concurrency (8 parallel requests). Company enrichment is cached per company, so scraping 100 jobs from 30 employers does only 30 enrichment fetches — not 100. LinkedIn rate-limits aggressively (HTTP 429 / 999), so each request retries with backoff over a residential proxy. Throughput is network- and proxy-bound; a single search is capped at LinkedIn's ~1,000 public results — narrow with filters (date, workplace, seniority, location) to page deeper into large markets.

Integrations

JavaScript (apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('foxlabs/linkedin-jobs-scraper').call({
keywords: 'software engineer', location: 'New York', datePosted: 'week', maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python (apify-client):

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("foxlabs/linkedin-jobs-scraper").call(run_input={
"keywords": "software engineer", "location": "New York", "datePosted": "week", "maxResults": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item.get("companyName"), item.get("salaryFormatted"))

Also works with Make / n8n / Zapier (Apify app → run this Actor, map the input), scheduled runs, webhooks, and the Apify MCP server so AI agents can call it as a tool.

Data quality

  • Nothing is fabricated. Every field is read from LinkedIn's public pages; when LinkedIn doesn't show a value, the field is simply omitted — never guessed or padded.
  • De-duplicated. Results are unique by jobId; repeated cards across pagination are merged, not double-counted.
  • Salary is scoped, not scraped from prose. It is parsed only from LinkedIn's compensation element (requiring a currency symbol), so numbers elsewhere in a description can't masquerade as pay. Salary therefore appears only where LinkedIn actually discloses it — mostly US pay-transparency roles (an estimated 40–50% of US postings), rarely in the EU where employers don't publish ranges.
  • Enrichment is best-effort. Company firmographics come from the employer's public page; a field is included only when present there.

Pricing

Pay per result — you're billed for the job records returned, so a tightly-filtered search that matches fewer jobs costs less. Company enrichment reuses a per-company cache, so many jobs at one employer add only one lookup. There's an Apify free tier to evaluate the full feature set before you scale, and no third-party API keys to buy.

FAQ

Do I need a LinkedIn login or cookies? No. The Actor reads only LinkedIn's public logged-out job pages — no account, no session cookie, no account risk.

Can I get the salary for every job? No — only where LinkedIn itself displays a pay range. That's mostly US pay-transparency roles; elsewhere it's usually absent, and the field is omitted rather than guessed.

How many jobs can one search return? Up to ~1,000 — LinkedIn's public search cap. Set maxResults up to 1000.

How do I get more than 1,000 results? Split the search: run it per date window, workplace type, seniority, employment type or location and combine the datasets. Each narrower slice pages fresh under the cap.

What are the company firmographics and how do I get them? Employee count, followers, industry, website, domain, HQ and founding year — turn on Enrich with company firmographics. It adds one request per unique employer (cached).

Does a field being missing mean the scrape failed? No. Records are compact by design: any value LinkedIn doesn't show for that job is omitted. Missing salary, benefits or jobPoster is normal.

What export formats are available? JSON, CSV, Excel, or via the Apify API and integrations.

Can I filter by remote/date/seniority/type? Yes — workplace type, date posted, experience level and employment type all map to LinkedIn's own facets.

Is the external apply URL or the full hiring team included? No — those are login-gated fields LinkedIn hides from logged-out visitors, so a cookieless scraper can't see them. A single best-effort jobPoster is attempted but is usually absent when logged-out.

Which proxy should I use? Residential (the default). LinkedIn rate-limits and blocks un-proxied and datacenter traffic.

Troubleshooting

  • "Provide at least keywords or location" → the run needs at least one of the two. Add a keyword or a location and re-run.
  • Fewer results than maxResults → either the search genuinely has fewer matching jobs, or you hit LinkedIn's ~1,000 public cap. Widen the query for more matches, or narrow with filters to page deeper.
  • No salary / no firmographics → salary appears only where LinkedIn shows it; firmographics require Enrich with company firmographics to be turned on.
  • Slow, blocked, or "999" responses → LinkedIn is rate-limiting. Keep the default Residential proxy on; the Actor already retries 429/999 with backoff. Smaller, filtered runs are more reliable than one huge sweep.
  • No official public API. LinkedIn offers no open jobs API for this; the Actor reads LinkedIn's public, logged-out guest job pages. It uses no login and no cookies.
  • Public data only. Fields LinkedIn hides from logged-out visitors — the external/offsite apply URL and the full recruiter/hiring-team list — are not returned. In exchange, you never risk an account.
  • ~1,000-result public cap per search is LinkedIn's, not the Actor's. Use filters to cover larger markets.
  • Personal data. A best-effort jobPoster may include an individual's name and public profile URL. If you process it you are responsible for your own lawful basis (e.g. GDPR); use the data only for legitimate recruiting, research and B2B purposes.
  • Your responsibility. Respect LinkedIn's Terms of Service and applicable data-protection law in your jurisdiction. You are responsible for how you use the output.
  • Not affiliated with, endorsed by, or sponsored by LinkedIn Corporation. "LinkedIn" is a trademark of its owner.

Support

Questions, a field you'd like added, or a custom build? Open the Issues tab on this Actor, or email info@foxlabs.com.tr. We reply fast.

If this Actor saves you time, a ⭐ review really helps.

Changelog

0.2 — 2026-07-05

  • Reworked docs: API quick-start, complete field table, realistic sample output, JS/Python/Make/MCP integration snippets, expanded FAQ & troubleshooting, honest legal/limits notes.
  • Corrected the input schema (removed an apply-URL mention that the Actor does not emit; clarified the enrichment field).

0.1

  • Initial release. Keyword/location search with workplace, date, experience and employment-type filters; full description, seniority, job function, industries, applicant count; parsed salary object; opt-in company firmographic enrichment; de-duplicated pagination; cookieless (no login).

Part of the foXLabs data platform — public-data company, contact, jobs, procurement & AI-search intelligence scrapers. Browse the full suite at data.foxlabs.com.tr.