LinkedIn Jobs Scraper — Salary, Applicants & Company Data
Pricing
from $4.00 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
12
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
LinkedIn Jobs Scraper 💼
foXLabs LinkedIn series: Company profiles · Company 360 · Hiring signals · Ad tracker · Ad discovery
🎉 Turn public LinkedIn jobs into clean, structured data — no login, no API key, one row per posting, with the title, company, location, posted date, seniority and description. Built for recruiters, sales (hiring-intent) and labour-market research.
🔍 What is the LinkedIn Jobs Scraper — and when should you use it?
Give this actor keywords, titles or company names and it returns matching jobs from public LinkedIn job postings — as clean, deduplicated rows you can filter, export or feed to an AI agent. Every run reads the source live.
Use it when you need: open jobs by keyword, title or place from LinkedIn — for hiring-intent lists, recruiter sourcing or labour-market research.
Use something else when: you need a company’s full ATS board — use the matching Fox Labs ATS actor for that.
🤖 Use with AI agents
Already on the Apify MCP server? Ask for this Actor by name: foxlabs/linkedin-jobs-scraper.
Your agent can pay for its own runs. This Actor is pay-per-event with agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — no Apify account or API token of its own. Billing is the same either way: per delivered record, never for errors.
Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want to pull LinkedIn job company records using the Apify Actor `foxlabs/linkedin-jobs-scraper`.Input: `keywords`, `location`, `datePosted`, `experienceLevel`, `jobType` and more — see the Input table below. `maxResults` caps how many results are returned.Start with: {"location":"United States","maxResults":10}Ask me what to look up, run the Actor, then summarise the rows as a table.
The machine-readable API, MCP config and OpenAPI definition live at apify.com/foxlabs/linkedin-jobs-scraper.md.
📋 Overview
Everything you need to turn public LinkedIn job postings into clean, structured data — in one actor, with no login, cookies or API key.
Why teams pick this actor:
- ✅ One call — keywords and a place in, matching jobs out (worldwide when no place is given).
- 🧹 No empty-promise columns — only fields LinkedIn’s public job pages actually fill; degenerate columns are removed.
- 🔗 Stable identifiers — every row carries the source's own IDs, ready to join across runs and to other Fox Labs actors.
- 💰 Per-row pricing — a minimal price per delivered row, no subscription.
- 🤖 Agent-ready — MCP + x402 agentic payments.
✨ Features
- 🔍 Keyword and place search — LinkedIn’s own relevance ranking, worldwide by default, with posted-date, seniority and employment-type filters.
- 📄 Full job page — description, seniority, employment type, job function, industries, applicant count and parsed salary (with details on).
- 🧹 Clean schema — deduplicated camelCase rows, ready for CSV/Excel/JSON.
🎬 Quick Start
curl -X POST "https://api.apify.com/v2/acts/foxlabs~linkedin-jobs-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"location":"United States","maxResults":10}'
🚀 Getting Started (3 steps)
- Choose your targets — keywords, titles or company names.
- Set the cap —
maxResultslimits how many results are returned. - Run and export — get a clean dataset as JSON, CSV or Excel.
📥 Input
{"location":"United States","maxResults":10}
| Field | Type | Description |
|---|---|---|
keywords | string | Job title, skill or keyword to search — e.g. "software engineer", "account executive", "react". |
location | string | City, region or country — e.g. "New York", "London", "Germany", "European Union". Leave blank to search worldwide. |
datePosted | string | Only jobs posted within this window. Use "Past 24 hours" or "Past week" for fresh hiring signals. |
experienceLevel | string | Keep only jobs whose page states this seniority. LinkedIn's own seniority filter has no effect on its public pages, so the Actor reads each listed job's page (full details are switched on) and reads at most 10 listed jobs per requested job. Many employers state "Not Applicable" and are then left out. |
jobType | string | Keep only jobs whose page states this employment type. Like seniority, this is applied by the Actor on each job's page (full details are switched on), reading at most 10 listed jobs per requested job. |
maxResults | integer | How many jobs to return (1–1000). LinkedIn's public search caps at ~1000 per query — narrow with keywords, location or date for large searches. |
scrapeDetails | boolean | Open each job for its full description, seniority, employment type, job function, industries, applicant count and parsed salary. Turn off for a faster, lighter… |
enrichCompany | boolean | Add employer firmographics (employee count, industry, HQ, website domain, followers) from the company's public LinkedIn page. One extra request per unique… |
includeOwnership | boolean | Resolve each employer to its ULTIMATE beneficial owner — a real person or a cross-border parent company — by walking UK holding-company ownership chains… |
proxyConfiguration | object | Proxy configuration. Residential proxy (the default) is strongly recommended — LinkedIn rate-limits and blocks un-proxied and datacenter traffic. |
📤 Output
One row per result, saved to the dataset. Every row carries scrapedAt. Lookups that cannot be completed are reported in the run log rather than silently dropped.
| Field | Description |
|---|---|
jobId | Job Id |
jobUrl | Job Url |
title | Title |
companyName | Company / entity name |
companyLinkedInUrl | Company Linked In Url |
companySlug | Company Slug |
companyLogo | Company Logo |
location | Location |
postedDate | Posted Date |
postedTimeAgo | Posted Time Ago |
listingBadge | Listing Badge |
descriptionText | Description Text |
descriptionHtml | Description Html |
seniorityLevel | Seniority Level |
employmentType | Employment Type |
jobFunction | Job Function |
industries | Industries |
applicantCount | Applicant Count |
applicantCountText | Applicant Count Text |
applicantCountIsUpperBound | Applicant Count Is Upper Bound |
companyEmployeeCount | Company Employee Count |
companyFollowers | Company Followers |
companyIndustry | Company Industry |
source | Source |
companyWebsite | Company Website |
companyDomain | Company Domain |
companyHQ | Company H Q |
salaryRaw | Salary Raw |
salaryMin | Salary Min |
salaryMax | Salary Max |
salaryCurrency | Salary Currency |
salaryPeriod | Salary Period |
salaryFormatted | Salary Formatted |
💼 Use cases
1. Hiring-intent signals — spot companies hiring for a function. Input: keywords + location. Output: jobs by company. Use: rank accounts by intent.
2. Recruiter sourcing — find open roles across companies. Input: titles or keywords. Output: postings with their LinkedIn job URLs. Use: a sourcing list.
3. Labour-market research — track demand for a role over time. Input: keywords, scheduled. Output: postings over time. Use: a demand trend.
🔗 Integration
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('foxlabs/linkedin-jobs-scraper').call({"location":"United States","maxResults":10});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('foxlabs/linkedin-jobs-scraper').call(run_input={"location":"United States","maxResults":10})for item in client.dataset(run.default_dataset_id).iterate_items():print(item)
Written for apify-client 3 for Python, where call() returns a run object; with version 1 or 2 it returns a dict — write run['defaultDatasetId'] there.
Automation (n8n / Zapier / Make): schedule or webhook → HTTP request to the actor API with your input → handle the JSON dataset → push to a sheet, CRM or dashboard.
📊 Pricing
Pay-per-event: per delivered record. Empty or failed lookups are never billed. View current pricing.
❓ FAQ
Do I need an account, login or API key? No. This reads public LinkedIn job postings.
What do I search by? Keywords, titles or company names.
How current is the data? Every run queries the source live, so results are as fresh as LinkedIn’s public job pages.
What job fields are returned? Title, company, location, posted date, seniority, employment type and description from the public LinkedIn posting.
Can I export to CSV / Excel / JSON? Yes — directly from the Apify dataset.
🐛 Troubleshooting
- Fewer rows than expected — raise
maxResults, or refine the input. - No rows with a seniority or employment-type filter — many employers state "Not Applicable" as seniority; the run log says how many job pages were read. Put the level in the keywords (for example "director software engineer") or leave the filter out.
- US jobs only — versions before 0.1.19 searched the United States when
locationwas empty; this is fixed, leavelocationempty for worldwide.
⚖️ Is it legal to scrape this data?
This actor reads publicly available LinkedIn job postings. Results can still contain personal data (e.g. a person’s name); personal data is protected by the GDPR and similar laws, so only process it with a legitimate basis. See Apify’s blog post on the legality of web scraping.
🤝 Support & contact
- 🌐 Website: data.foxlabs.com.tr
- 📧 Email: info@foxlabs.com.tr
- 🐛 Issues: open a ticket in the Actor’s Issues tab
- 🧰 More clean B2B data actors: Fox Labs on Apify
Changelog
0.1.22 — 2026-10-08 — README: the Python example works with the current Apify client
- The README's Python example read the results with
run['defaultDatasetId']. With the current Apify client for Python (version 3)call()returns a run object, not a dict, and that line raisedTypeError: 'Run' object is not subscriptable— after the run itself had finished. The example now readsrun.default_dataset_id; with client version 1 or 2, keeprun['defaultDatasetId']. Checked with apify-client 3.2.1, 2.5.1 and 1.12.2. - No code, output field or pricing change.
0.1.21 — 2026-10-07 — a run that Apify starts again does not write a job twice
- A run that the platform starts again no longer repeats what it has written. Apify can move a run to another server while it is going; the Actor then starts again from the top with the same dataset. Until now it read and wrote the jobs again and counted from zero: in a test with
maxResults25 that was started again after 9 rows, the dataset ended with 35 rows — 10 jobs written and charged twice. The Actor now first reads which jobs its own dataset already holds; they count towardsmaxResultsand are not read, written or charged again. - No output field changed, no pricing change.
0.1.19 — 2026-09-24 — empty location is worldwide; seniority and job-type filters that work
- Empty location now searches worldwide, as this README always said. Without a location LinkedIn searches the United States only: from German and British IP addresses, a blank location returned 10 of 10 US jobs (2026-09-24). Earlier versions therefore returned US jobs where the input promised worldwide. The Actor now asks LinkedIn for "Worldwide" when
locationis empty; put "United States" inlocationfor US jobs. - Seniority (
experienceLevel) and employment type (jobType) now filter. LinkedIn's public job search ignores its own seniority, job-type and workplace filters: the first 20 results were identical with and without each of them. Earlier versions passed them to LinkedIn and so returned unfiltered jobs. The Actor now reads each listed job's page and keeps only jobs whose page states the chosen seniority or employment type. Full details are switched on for this; it reads at most 10 listed jobs per requested job, and the run log says how many pages it read and why it stopped. Jobs left out are not charged. Many employers state "Not Applicable" as seniority and are left out by a seniority filter; for rare levels such as Director, put the word in the keywords. workplaceType(remote / hybrid / on-site) is no longer applied. LinkedIn ignores that filter, and its public pages do not state a job's workplace type reliably. The field is hidden in the input form and accepts any value, so saved inputs still run; a run that sets it logs a warning. Put "remote" or "hybrid" in the keywords instead.- README: removed template text that did not describe this Actor — registry-ID lookups, formation / status monitoring, legal form, formation date and address fields, registry troubleshooting, and "apply links" (the Actor returns LinkedIn job URLs; external apply links need a login). The 0.1.17 note said these were removed; in this README they were not.
- No pricing change: you still pay per delivered job. (Build 0.1.18 failed on an input-schema check and was never published.)
0.1.17 — 2026-09-20 — README examples corrected against the real input schema
- The README's code examples did not match this Actor. They used
queriesandmaxResultsPerQuery— keys that do not exist in this Actor's input schema — with a placeholder value, and the input table listed those same phantom fields. Anyone who copied the AI-agent, cURL, JavaScript or Python example got a failing run. Every example now uses the real schema and matches the Console prefill:{"location":"United States","maxResults":10} - The input table is regenerated from
input_schema.json, so it lists the fields the Actor actually accepts. - Removed claims carried over from the same generator template where present: "formation / status monitoring", "a canonical registry record for KYB and due diligence", "every row carries
query", andindustrydescribed as a NACE code. - No code, output field or pricing change.
0.1 — 2026-09-07
- Enabled AI-agent payments (x402) + rebuilt the README to the full standard (What-is / when, AI-agents + x402 agentic payments + MCP, Overview, Features, Use cases, Integration, FAQ, Troubleshooting, Support & contact).
0.0
- Initial release: data from public LinkedIn job postings by name or registry ID.