LinkedIn Jobs Scraper & Employer Company Details avatar

LinkedIn Jobs Scraper & Employer Company Details

Pricing

from $2.99 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper & Employer Company Details

LinkedIn Jobs Scraper & Employer Company Details

LinkedIn Jobs Scraper collects job postings from LinkedIn, capturing titles, companies, locations, descriptions, and posting dates. Configure keywords, regions, and filters to gather clean, structured job-market data for research, analytics, recruiting, or automation workflows efficiently insights

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

16

Total users

2

Monthly active users

2 days ago

Last modified

Share

LinkedIn Jobs Scraper — Employer and Company Details

LinkedIn Jobs Scraper & Employer Company Details turns a LinkedIn job search into structured JSON rows that carry both the job listing and the employer behind it — followers, employees on LinkedIn, industry, size band, headquarters, founded year, and website — for one cached request per unique company, no matter how many of its jobs you scrape. It's built for recruiters and sales teams who need to screen jobs by the hiring company's real size and industry, market researchers tracking which employers are hiring in a sector, and lead-generation teams who want a company firmographic profile attached to every job lead rather than a bare title and location. No login and no cookie are required — every source is LinkedIn's own public guest surface. Every section below documents an input, an output field, or the exact measured coverage behind it.

What is LinkedIn Jobs Scraper & Employer Company Details?

This Actor is a superset of a plain LinkedIn jobs scraper: every job search still works exactly as a base scraper would, with employer firmographics, an employee-count size filter, and similar-jobs expansion layered on top — all fetched from LinkedIn's public, cookie-less job and company pages.

Key capabilities, read from the source and its own measured-coverage documentation:

  • Employer firmographics on every job rowresolve_employer() fetches each employer's public company page once per unique slug (cached and lock-serialized, so 40 jobs across 12 companies costs 12 company requests, not 40) and attaches companyFollowers, companyEmployeesOnLinkedIn, companyIndustry, companySizeBand, companyHeadquarters, companyFoundedYear, companyWebsite, companySpecialties, and companyOrgUrn.
  • Measured field coverage, not a guess. The module docstring in src/main.py reports coverage measured on 24 successfully-fetched companies: org ID/followers/employees/industry/size band at 100%, headquarters and website at 96%, founded year at 75%, specialties at 71% — and the company page itself fetched successfully on 24/26 (92%) of attempts.
  • A dedicated cookie-less session for company pages. fetch_employer_profile() uses its own DummyCookieJar session with no warm-up, because the module's own measurement found that fetching a company page on the same cookie-carrying session used for job search caused 6/20 pages to return HTTP 999 with zero recovery after backoff — while the identical slugs returned 200 immediately on a fresh, cookie-less session.
  • Context-anchored salary parsing. LinkedIn's guest surfaces publish no structured pay data at all (measured 0/60 on both cards and criteria), so extract_salary() only accepts a currency token when it carries a period unit ("$52/hour") or sits within a bounded distance of genuine compensation wording, and explicitly rejects nearby funding/revenue/reimbursement language — salary is null on most listings, which is the honest, expected result.
  • Honest applicant-count typing. parse_applicants() distinguishes LinkedIn's three different applicant phrasings — an exact count, an "Over N" floor (at_least), and a "first N" ceiling (fewer_than) — via applicantsCountType, rather than treating every phrasing as a precise number.
  • Similar-jobs expansion past the ~1,000-result ceiling. followSimilarJobs opens each seed job's public page and queues the related jobs LinkedIn recommends beside it — the only way to reach listings beyond LinkedIn's own per-search results cap — with discoveredVia/seedJobId marking exactly which jobs came from expansion versus the original search.
  • Uncharged accounting rows, never billed as results. A job that fails to fetch or fails to parse is pushed as an error_row() with a stated errorReason, via a plain Actor.push_data() call with no charged_event_name — it is never counted as a billed row_result.

What data can I extract with LinkedIn Jobs Scraper & Employer Company Details?

Every field below is read directly from extract_from_html(), parse_employer_profile(), and error_row() in src/main.py — the dataset's default view surfaces 42 of these as table columns.

Job fields

FieldExample ValueUse Case
titleSenior Data AnalystJob title
companyName / companyUrl / companyIdAcme Corp / company page URL / numeric IDEmployer identity
locationNew York, NYJob location, from the topcard bullet (measured 100% coverage) or the search card as fallback
publishedAt2026-07-01Exact ISO date from the search card (measured 150/150 = 100%), preferred over the relative-text reconstruction
postedTime1 week agoLinkedIn's own relative-time string
salary"$52/hour" or nullContext-anchored, prose-parsed — null on most listings since LinkedIn publishes no structured pay
applicationsCount / applicantsCountType119 / "exact"Applicant count, honestly typed as exact, at_least, or fewer_than
contractType / experienceLevel / workType / sectorFull-time / Mid-Senior level / Engineering / Software DevelopmentLinkedIn's own listed criteria
benefits"health insurance, 401(k), remote"Keyword signal detected in the description prose — not a structured LinkedIn field
posterFullName / posterProfileUrlname / profile URLJob poster identity; genuinely present on roughly 10% of listings, null otherwise
description / descriptionHtmlfull text / cleaned HTMLFull job description
discoveredVia / seedJobId"search" or "similar_jobs" / seed job IDWhether this job came from your search or from similar-jobs expansion
jobUrlcanonical job linkDirect URL
errorReason"throttled_999", "unparseable_page", etc.Present only on uncharged accounting rows
scrapedAt2026-07-26T09:00:00ZUTC capture time

Employer firmographic fields

FieldExample ValueMeasured Coverage
companyOrgUrn1441100% (n=24)
companyFollowers450000100%
companyEmployeesOnLinkedIn10500100%
companyIndustrySoftware Development100%
companySizeBand / companySizeMin / companySizeMax"1,001-5,000 employees" / 1001 / 5000100%
companyHeadquartersSan Francisco, CA96%
companyWebsitehttps://acme.com96%
companyFoundedYear201075% — genuinely optional on LinkedIn
companySpecialties["SaaS", "Fintech"]71% — genuinely optional on LinkedIn
employerProfileStatus"ok", "throttled_999", "not_requested"Discloses exactly why a field is null when it is

A field that's genuinely absent on LinkedIn's own company page is left null — never estimated or back-filled — and employerProfileStatus states the reason.

Why not build this yourself?

LinkedIn's public guest job and company pages look simple to scrape but hide several measured traps this Actor's own source documents fixing: the search endpoint serves exactly 10 cards per page rather than the 25 a naive implementation assumes (silently dropping 59% of results at scale), sortBy is accepted but completely ignored by the guest endpoint, and fetching a company's public page on the same session used for job search causes an unrecoverable HTTP 999 on roughly a third of companies — while a fresh, cookie-less session for that exact same page returns 200 immediately. None of this is documented by LinkedIn; it was found by direct measurement and is exactly the kind of undocumented platform behavior that's expensive to discover yourself and easy to get subtly wrong.

How to use data extracted from LinkedIn Jobs Scraper & Employer Company Details?

Recruiters and talent sourcing teams

Screen job leads by companyEmployeesOnLinkedIn using employerSizeMin/employerSizeMax to focus on companies in your target headcount band, and use companyIndustry alongside title to build a shortlist without opening each employer's page individually.

Sales development and account-based marketing

Use companyFollowers, companySizeBand, and companyIndustry on job postings to identify which companies in your target segment are actively hiring — a strong buying-intent signal for sales and marketing outreach.

Market and labor research

Track salary (when present), experienceLevel, and workType across a role and location over time to observe hiring trends, remote-work adoption, or compensation patterns within a sector.

AI agents and enrichment pipelines

Because every row carries both job and employer data with an honest employerProfileStatus, an agent can filter on that status before trusting firmographic fields, and use discoveredVia/seedJobId to distinguish direct search hits from expanded discovery.

🔼 Input sample

ParameterRequiredTypeDescriptionExample Value
addEmployerProfileNobooleanFetch and attach employer firmographics to every job row. Default true.true
employerSizeMin / employerSizeMaxNointegerKeep only jobs whose employer has at least/at most this many LinkedIn employees. A job whose size is unknown is kept, never dropped. Requires employer details on.500
followSimilarJobsNobooleanAlso queue each seed job's "similar jobs" block. Default false.true
similarJobsPerSeedNointeger (0–40)Related jobs to take per seed listing. Default 10.10
companyInputNoarrayTarget companies — name, LinkedIn URL, or numeric ID. Leave empty to search all employers by keyword.["Google"]
keywordsNostringJob title or skill to search for. Default "Software Engineer"."Data Analyst"
locationNostringAny location LinkedIn understands. Default "United States"."London"
maxJobsNointeger (1–1000)Jobs to collect, including similar-jobs expansion. Default 20.100
publishedAtNostring enum""/r86400/r604800/r2592000 (Any/24h/week/month). Default ""."r604800"
workTypeNostring enum""/1/2/3 (Any/On-site/Remote/Hybrid). Default ""."2"
contractTypeNostring enum""/F/P/C/T/I/V. Default ""."F"
experienceLevelNostring enum"" through 6 (Any → Executive). Default ""."4"
geoIdNostringLinkedIn's numeric region ID, for consistent country-level results."103644278"
sortOrderNostring enumAccepted for backward compatibility only — LinkedIn's guest endpoint ignores sorting entirely.""
proxyConfigurationNoobjectOff by default; escalates through datacenter then residential automatically on a block.{"useApifyProxy": false}
{
"keywords": "Data Analyst",
"location": "United States",
"maxJobs": 50,
"addEmployerProfile": true,
"employerSizeMin": 500
}

Common pitfall: sortOrder is accepted but has zero effect — the Actor's own measurement found LinkedIn's guest job endpoint returns byte-identical result sets regardless of sort parameter, and logs this explicitly rather than pretending the sort was applied. Don't rely on this field to change result ordering.

🔽 Output sample

Output is one JSON row per job (plus uncharged accounting rows for jobs that failed to parse), pushed to the run's default dataset — charged as one row_result event per successfully scraped job.

{
"id": "3900000001",
"type": "job",
"isChild": false,
"title": "Senior Data Analyst",
"companyName": "Acme Corp",
"companyUrl": "https://www.linkedin.com/company/acme-corp/",
"companyEmployeesOnLinkedIn": 10500,
"companySizeBand": "5,001-10,000 employees",
"companySizeMin": 5001,
"companySizeMax": 10000,
"companyIndustry": "Software Development",
"companyFollowers": 450000,
"companyHeadquarters": "San Francisco, CA",
"companyFoundedYear": 2010,
"companyWebsite": "https://acme.com",
"location": "New York, NY",
"publishedAt": "2026-07-01",
"salary": null,
"applicationsCount": "119",
"applicantsCountType": "exact",
"contractType": "Full-time",
"experienceLevel": "Mid-Senior level",
"discoveredVia": "search",
"seedJobId": null,
"jobUrl": "https://www.linkedin.com/jobs/view/3900000001",
"errorReason": null,
"scrapedAt": "2026-07-26T09:00:00Z"
}

How do you filter and target specific jobs and employers?

Employer size is the primary firmographic lens. employerSizeMin/employerSizeMax screen on companyEmployeesOnLinkedIn directly — an exact measured count, not a size-band guess — so employerSizeMin: 500 reliably drops startups without accidentally keeping a mid-market company whose size band happens to straddle your threshold.

Search scope vs. expansion. companyInput targets specific employers by name/URL/ID; leaving it empty searches all of LinkedIn by keywords and location instead. followSimilarJobs adds a second discovery mode entirely — it reaches listings your keywords never matched, useful once you've exhausted a keyword search's direct results but still want more within the same employer or role space.

LinkedIn-side filters run before any of your own. publishedAt, workType, contractType, experienceLevel, and geoId are all applied by LinkedIn itself before results are returned, making a narrow run both faster and cheaper than filtering broad results after the fact.

Three real examples:

{ "keywords": "Software Engineer", "location": "United States", "employerSizeMin": 1000, "maxJobs": 100 }

Enterprise-only engineering roles, screened by real employee count.

{ "companyInput": ["Stripe", "Notion"], "addEmployerProfile": true, "maxJobs": 50 }

All current openings at two named companies, with full firmographics.

{ "keywords": "Product Manager", "followSimilarJobs": true, "similarJobsPerSeed": 20, "maxJobs": 300 }

Breadth-first search expanded well past a single keyword search's natural result set.

▶️ Want to try other LinkedIn scrapers?

ScraperWhat it extracts
LinkedIn Company URL Mass Profile FinderBulk company URL discovery with executive contacts
LinkedIn Comments and Reactions ScraperPost comments, replies and reaction breakdown
LinkedIn Profile Contact ExtractorContact details parsed from a profile
LinkedIn Post Comments ScraperComments scoped by profile or company URL

How to extract LinkedIn jobs and employer data programmatically

This Actor runs as a standard Apify Actor call — one API call in, structured JSON dataset out, using your Apify API token.

Python example

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("<YOUR_USERNAME>/linkedin-jobs-scraper-employer-company-details").call(run_input={
"keywords": "Data Analyst",
"location": "United States",
"employerSizeMin": 500,
"maxJobs": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["companyName"], item["companyEmployeesOnLinkedIn"])

Export to spreadsheets or CRM

Every dataset supports one-click CSV/Excel export from the Apify Console. Map companyName, companyIndustry, and companyEmployeesOnLinkedIn directly into a CRM's Account object alongside the job lead itself.

Scraping publicly visible LinkedIn job postings and company pages is generally lawful, since this data is published for anyone to view without logging in — the underlying legal question was tested directly in hiQ Labs v. LinkedIn (9th Cir.), which held that scraping public, non-password-protected data does not violate the U.S. Computer Fraud and Abuse Act. posterFullName/posterProfileUrl are personal data under GDPR/CCPA when present, so treat that subset accordingly if you store or reuse it at scale, and consult legal counsel for commercial applications.

❓ FAQ

Why is salary null on most jobs?

LinkedIn's guest job surfaces publish no structured pay data at all (measured 0/60 on both the search cards and the listed criteria). salary is only ever populated from context-anchored parsing of the description's own prose, and null is the honest, expected result on most listings rather than a scraping failure.

Does adding employer details slow the run down a lot?

Each unique employer costs exactly one cached request regardless of how many of its jobs you scrape — 40 jobs across 12 companies costs 12 company requests, not 40. Turn addEmployerProfile off entirely for a pure job-listing scrape with no extra requests.

What happens to a job whose employer size can't be read?

It's kept, never silently dropped, even when employerSizeMin/employerSizeMax is set — the size filter only applies when the employee count is actually known; employerProfileStatus states why a field is missing when it is.

Can I go past LinkedIn's ~1,000-result search ceiling?

Not within a single search — LinkedIn's public endpoint hard-stops around 1,000 results per query. followSimilarJobs reaches additional listings through each seed job's own "similar jobs" block instead, which is a separate discovery path from the search itself.

Does sortOrder actually change result order?

No — it's accepted for backward compatibility only. The Actor's own measurement found LinkedIn's guest job endpoint returns byte-identical result sets regardless of the sort parameter sent, and this is logged explicitly during a run rather than silently ignored.

How is the applicant count reported when LinkedIn shows a range?

applicantsCountType discloses which of LinkedIn's three phrasings applied: exact for a stated count, at_least for an "Over N" floor, and fewer_than for a "first N" ceiling — never presenting a bucketed figure as an exact number.

How does this compare to other LinkedIn jobs Actors?

As observed on the Apify Store on 2026-07-26, getdataforme/linkedin-jobs-and-company-details and its "-pro" variant advertise combined jobs-and-company output but publish minimal documentation on field coverage or extraction method; harvestapi/linkedin-company focuses on company profiles specifically rather than jobs-plus-employer in one row. This Actor's measured-coverage percentages and its documented HTTP-999 cookie-state fix are not something either listing publishes.

Does this work with AI agent frameworks?

Yes — call it as a standard HTTP endpoint via the Apify API from any agent framework capable of making an API call; there's no MCP-specific integration for this Actor.

Conclusion

LinkedIn Jobs Scraper & Employer Company Details turns a job search into job listings with real, measured-coverage employer firmographics attached — at one request per unique company, not per job. It fits recruiting, sales intelligence, and labor-market research that need company context alongside every job lead. Start a run from the Apify Console or the Apify API with your target role and location to get your first jobs-plus-employer export.