Home › Guides › LinkedIn company jobs scraper
LinkedIn company jobs scraper: open roles, salaries and company data for a list of companies
Give the LinkedIn Company Jobs Scraper a list of companies and it returns their open LinkedIn jobs as clean rows — title, location, posted date, seniority, employment type, job function, applicant count, the full description and salary, with the company's own data on every row. It reads only LinkedIn's public job pages: no LinkedIn account, no cookies.
Who it's for
- Sales and agencies — open roles are buying signals: a company hiring five data engineers is building a data team, and salary and seniority say how big the budget is.
- Recruiters — every open role at your target clients, with pay ranges and applicant counts to prioritise.
- Investors and analysts — hiring volume (
linkedinJobCount) and the mix by function, seniority and country, company by company, week by week. - Job boards and salary research — structured jobs with parsed, sourced pay.
What is different, measured on the platform
- Salary sits in the description. LinkedIn's own pay box was filled for only 53 of 897 jobs in our test runs; most employers write the range into the description instead (“The annual US base salary range for this role is …”). The scraper reads both, under strict rules, and tells you where each figure came from (
salarySource,salaryRaw). Salary was found for 99% of US-located jobs (493 of 498 — mostly California, New York and Washington, which require pay ranges), 30% of jobs elsewhere and 68% overall. - No location means US only. Without a location, LinkedIn quietly searches the United States only — Stripe showed 625 US jobs against 942 worldwide. The scraper asks for worldwide unless you name a place.
- LinkedIn's own job count is worth keeping.
linkedinJobCountis on every row: a hiring-volume signal, and a check that you got everything. - Public pages ignore seniority and job-type filters. The results do not change when you set them. The scraper applies these filters to what each job page states. About half of the employers tested state no seniority at all, and the run tells you when that is the case.
What you get
| Fields | What they are |
|---|---|
| Title, location, posted date, job URL and ID | From the job listing |
| Seniority, employment type, job function, industries | As LinkedIn states them on the job page |
salaryMin, salaryMax, currency, period | Parsed pay — yearly, monthly or hourly, cents kept |
salarySource, salaryRaw | linkedin (LinkedIn's pay box) or description (the employer's own sentence, quoted) |
| Applicant count and its bounds | “Over 200 applicants” is a floor, “Be among the first 25” a ceiling |
| Description | The full text, line breaks and bullets kept, plus the HTML |
| Company identity | Name, ID, LinkedIn URL, website as LinkedIn lists it, and the registrable domain (news.microsoft.com becomes microsoft.com) |
| Company firmographics | Industry, employee count, followers, HQ and founding year from the company's LinkedIn page, on every row |
linkedinJobCount | LinkedIn's own count of open jobs for the company and your search |
| Provenance | Whether the job page was read, how the company was identified, which input it came from, and whether a monitor saw it before |
A real row from a platform run, trimmed:
{
"companyName": "Vercel",
"companyDomain": "vercel.com",
"companyIndustry": "Software Development",
"companyEmployeeCount": 1027,
"companyHQ": "San Francisco, California, US",
"linkedinJobCount": 32,
"title": "Software Engineer, Financial Data Platform",
"location": "New York, United States",
"postedDate": "2026-09-19",
"employmentType": "Full-time",
"salaryMin": 190000,
"salaryMax": 258000,
"salaryCurrency": "USD",
"salaryPeriod": "yearly",
"salarySource": "description",
"applicantCountText": "Be among the first 25 applicants",
"detailStatus": "ok"
}
The same row shows a limit worth knowing: this New York job quotes only the San Francisco pay range. salaryRaw always carries the employer's sentence, so you can see which location a range belongs to.
How salary is read
- LinkedIn's pay box first. Otherwise the description — but only in a sentence that names pay (“salary”, “pay range”, “hourly rate” …) or states a period (“/hr”, “per year”), and only with a currency.
- Bonus, stipend, funding and revenue amounts are not pay. Implausible values are rejected, and so are ranges wider than 8×.
- One stated amount is the exact pay (min = max); “up to” fills only the maximum and “starting at” only the minimum.
- A range in another country's currency than the job's — a London job quoting its Amsterdam range in euros — is left out.
Input example
Engineering jobs posted this week at three companies:
{
"companies": [
"stripe",
"vercel",
"https://www.linkedin.com/company/notionhq/"
],
"keywords": "engineer",
"datePosted": "past-week",
"maxJobsPerCompany": 100
}
Companies can be a LinkedIn company URL, a slug, a numeric company ID or a name. Slugs can belong to a namesake: notion is a 39-person company called “Notion”, while Notion Labs is notionhq — when in doubt, paste the URL. Keywords, location and posting date are applied by LinkedIn; seniority and job type are applied by the scraper. For a weekly watch on target accounts, add onlyNewJobs and a monitorName and schedule the run.
Measured data quality and speed
Platform runs on builds 0.1.1–0.1.4, 2026-09-24:
| Fields | Share of jobs |
|---|---|
| Title, location, posted date, job URL | 100% |
| Company name, ID, domain, industry, employees, HQ | 100% |
| Seniority, employment type, job function, industries, applicant count, description (details on) | 100% of jobs whose page was read; 512 of 512 pages read |
| Salary (details on) | 68% of 897 unique jobs: 99% of US-located jobs, 30% elsewhere |
| Founding year | 61–100% — some company pages state none, and none is invented |
| Unique jobs per input | 100% |
Salary coverage depends on the employer: from 0% in the Shopify and Goldman Sachs samples to 94% at Figma; Microsoft's jobs in Germany had it on 12 of 12. On 512 MB with residential proxy, Stripe, Vercel and Microsoft at 200 jobs each with full details came back as 512 jobs in 342 s — about 90 jobs a minute. The scraper only makes HTTP requests and parses HTML, with no browser.
Honest limits
- About 1,000 jobs per company and search. LinkedIn's public search stops there. Split big employers by
location,keywordsordatePosted. - No remote or hybrid filter. LinkedIn's public pages ignore the workplace filter and do not state the workplace type reliably, so there is neither a filter nor a column.
- A pay range can belong to another location, as in the sample row above — check
salaryRaw. - Seniority filters cost page reads. To test a job against the filter, the scraper reads its page, and each page read is a job detail, matched or not. It reads at most 20 listed jobs per requested job (at least 50) and says so when it stops.
- Refused requests. LinkedIn sometimes answers HTTP 999 or 429; the scraper retries on a new residential IP, up to four attempts. A job whose page still cannot be read is delivered with
detailStatusunavailableorjob-closedand is not charged as a detail. - No person-level data. LinkedIn shows the hiring team only to signed-in members, and the scraper does not sign in. Job descriptions can still name people; if you store them, handle them lawfully, for example under the GDPR. The scraper is not affiliated with LinkedIn Corporation.
Pricing
Pay per event: one event per job delivered, and one per job page read — every delivered job with details on, plus, when you use the seniority or job-type filter, the pages of jobs the filter left out. Companies that are not found or have no jobs cost nothing and leave an explanatory row. Current prices are on the actor's Pricing tab.
Related
More company-data scrapers on foXLabs. For what a public LinkedIn company page exposes beyond jobs, read LinkedIn company data without a login; for the same roles straight from Greenhouse, Lever, Ashby and other applicant tracking systems, read hiring signals from ATS job boards.
Frequently asked questions
Do I need a LinkedIn account or cookies?
No. Only LinkedIn's public job pages are read, without logging in.
Why did I get fewer jobs than linkedinJobCount?
LinkedIn's public search stops at about 1,000 jobs per company and search. Split big employers by location, keywords or datePosted. linkedinJobCountIsLowerBound marks counts LinkedIn shows as 2,000+.
Why is there no remote or hybrid filter?
LinkedIn's public pages ignore the workplace filter (the results do not change) and do not state the workplace type reliably, so the scraper offers neither the filter nor a column rather than guess. Use keywords, for example remote, if the word matters to you.
How do I catch every new job with a monitor?
Each monitoring run returns at most “Max jobs per company” jobs the monitor has not seen, and remembers them. Set it above the company's volume for your search (linkedinJobCount on the rows shows it) and use “Posted: past week” for a weekly schedule. Measured: a second run over ten companies returned 157 jobs, none of them returned before.
Why does the seniority filter find nothing at some companies?
Many employers state no seniority on LinkedIn. In a sample of twelve tech companies, six (Vercel, Microsoft, HubSpot, Snowflake, OpenAI, Notion) had “Not Applicable” on every job, while Stripe, Figma, Shopify, Airbnb and Goldman Sachs state it. Run without the seniority filter, or add “Not Applicable”.
Try it: paste your target accounts into the input above and run it on Apify, then export the jobs or schedule a weekly monitor.
Open the LinkedIn Company Jobs Scraper →Or browse all foXLabs datasets on Apify.