LinkedIn Jobs Scraper
Pricing
$30.00 / 1,000 job analyzeds
LinkedIn Jobs Scraper
Search LinkedIn job postings by keyword, location, company, or filters and enrich any LinkedIn job URL with full description, skills, salary and hiring-team contacts. Pay only for jobs that land in your dataset.
Pricing
$30.00 / 1,000 job analyzeds
Rating
0.0
(0)
Developer
Andrey Afanasenko
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
Search LinkedIn jobs by keyword, location, company, or filters — and enrich any LinkedIn job posting URL with the full description, skills, salary, and hiring-team contacts. Pay only for jobs that land in your dataset.
🎯 What it does
You feed the Actor LinkedIn job criteria — keywords + location, a list of company URLs, or specific job-posting URLs — it returns clean, structured rows ready for a CRM, sheet, or downstream agent.
| Mode | Input | What it returns |
|---|---|---|
1: Search Jobs (searchJobs) | Keywords + LinkedIn geo code + optional date / type / level / workplace filters | 10-field slim job rows (25 per upstream call, paginated). Cost cap: maxItemsMode1. |
2: Fetch Job Details (fetchJobDetails) | LinkedIn job posting URLs (one per line) | 1 row per URL, 36+ fields incl. full description, skills, salary, hiring team. Cost cap: maxItemsMode2. |
3: Search Company Jobs (searchCompanyJobs) | LinkedIn company URLs + optional keyword | Slim job rows for every open posting at the listed companies. Cost cap: maxItemsMode3. |
⚠️ Pick your mode first. All three modes have their own dedicated input section. Filling the wrong mode's fields is the #1 reason runs return zero rows. Always set "Operation Mode" before touching anything else.
- 10 slim fields per search row —
company,company_linkedin_url,company_logo,job_title,job_url,job_urn,location,posted_time,remote,salary. - 36 detail fields per enriched row — full
job_description,skills[],hiring_team[],salary_details,experience_level,industries[],employee_count,job_functions[],hq_*company fields, and 20+ more. - 7 advanced filters — title contains / NOT contains, company name allow-list, location contains, minimum salary, posted-within-N-days, remote-only — applied across all modes.
📦 What you get — output sample
One row per LinkedIn job. Slim columns (top of the row) always populated; detail columns only filled by Mode 2 (Fetch Job Details) and emit null in slim rows.
{"input": "https://www.linkedin.com/jobs/view/4344628911","company": "Qualcomm","company_linkedin_url": "https://www.linkedin.com/company/qualcomm","company_logo": "https://media.licdn.com/dms/image/.../qualcomm_logo","job_title": "New Graduate - AI SW SDK Engineer","job_url": "https://www.linkedin.com/jobs/view/4344628911","job_urn": "4344628911","location": "Santa Clara, CA","posted_time": "2026-05-18 11:33:11","remote": "On-site","salary": "","applies": 0,"benefits": [],"closed": false,"company_description": "Qualcomm is a world leader in 3G, 4G and next-generation wireless technologies …","company_id": "1337","company_name": "Qualcomm","company_public_id": "qualcomm","employee_count": 38000,"employee_range": "10001+","experience_level": "Entry level","expired": false,"follower_count": 4600000,"hiring_team": [{ "name": "Jane Recruiter", "title": "University Talent Acquisition", "profile_url": "https://www.linkedin.com/in/jane-r" }],"hq_address_line1": "5775 Morehouse Drive","hq_city": "San Diego","hq_country": "US","hq_full_address": "5775 Morehouse Drive, San Diego, CA, US","hq_postalcode": "92121","hq_region": "California","industries": ["Wireless Services", "Semiconductor Manufacturing"],"job_description": "We are looking for a New Graduate AI SW SDK Engineer to join …","job_functions": ["Engineering", "Information Technology"],"job_id": "4344628911","job_location": "Santa Clara, CA, United States","job_type": "Full-time","posted": "2026-05-18 11:33:11","remote_allow": "On-site","salary_details": null,"salary_display": "$110,000 - $140,000","skills": ["Python", "C++", "CUDA", "ONNX", "PyTorch"],"specialities": ["wireless", "semiconductor", "5G"],"views": 1240}
Detail columns (applies through views) are null in rows produced by Mode 1 (Search Jobs) and Mode 3 (Search Company Jobs); they only populate in Mode 2 (Fetch Job Details).
⚡ How to use
- Choose Operation Mode at the top of the input panel.
- The matching
🎯 Mode Nsection appears below — fill its primary field (keywords / job URLs / company URLs). - Optionally tune the
🔬 Advanced filteringsection. - Set the per-mode cap (
maxItemsModeN) if you want a hard ceiling. Leave at 0 for unlimited (paid plan only). - Click Save & Start.
If you start a run with no input filled in, the Actor uses a built-in demo seed and caps the output at 10 rows — see the USER_MESSAGE record in the run's Storage tab.
🛠 Operation modes
🎯 Mode 1: Search Jobs
Search LinkedIn jobs by keyword + location with optional filters (date posted, job type, experience level, workplace type, Easy Apply, low-applicant). 25 jobs per upstream call; the Actor paginates until your cap is reached.
Required: searchJobsKeywords (free text). Geo defaults to United States.
Geo targeting — four fields, most specific non-empty wins (top to bottom on the input panel):
- Country (
searchJobsGeoCode) — 198 countries, required default (US). - State / province / region (
searchJobsState, optional) — ~1500 entries covering top 70 markets. Overrides Country. - Major city (
searchJobsCity, optional) — top 1000 cities globally by population. Overrides State + Country. - Custom Location (
searchJobsLocationCustom, optional) — type ANY LinkedIn-indexed place ("Cluj-Napoca", "Tartu", "Pune", "Brooklyn") or paste a numeric LinkedIn geoId. Resolved live at run start. Overrides everything above.
⚠️ Make sure Operation Mode is "Mode 1: Search Jobs". Mode-2 / Mode-3 fields are ignored here.
🎯 Mode 2: Fetch Job Details
Enrich an array of LinkedIn job-posting URLs with the full 36-field detail (description, skills, salary, hiring team, …). Use this after Mode 1 to drill into the postings you care about.
Required: fetchJobDetailsUrls (array of LinkedIn job URLs). Optional toggles: include skills / include hiring team (both default on).
⚠️ Make sure Operation Mode is "Mode 2: Fetch Job Details". Mode-1 / Mode-3 fields are ignored here.
🎯 Mode 3: Search Company Jobs
Find every open job at one or more LinkedIn companies. The Actor resolves each company URL to its LinkedIn numeric id, then runs a single search across all of them. Optional keyword narrows further.
Required: searchCompanyJobsCompanyUrls (array of company LinkedIn URLs). Optional: searchCompanyJobsKeywords.
⚠️ Make sure Operation Mode is "Mode 3: Search Company Jobs". Mode-1 / Mode-2 fields are ignored here.
💸 Pricing
PAY_PER_EVENT — one event, one price, across all modes.
| Event | Price | When it fires |
|---|---|---|
JOB_ANALYZED | $0.030 per job | Once per row pushed to the dataset (any mode). |
Apify platform compute (memory + storage + bandwidth) is on top of that and small for this workload — a 50-job Mode 1 run typically costs well under $0.05 in platform overhead.
🔬 Advanced filtering
Filters apply after the upstream fetch, before the row lands in the dataset. The paid event still fires on the raw fetch — filters narrow your output, not your bill.
| Filter | Effect |
|---|---|
filterTitleContains | Drop rows whose job title doesn't contain this substring. |
filterTitleNotContains | Drop rows whose job title contains this substring (great for excluding "senior" or "intern"). |
filterCompanyNames | Allow-list — drop rows whose company name doesn't match one of the entries. |
filterLocationContains | Substring match against location. |
filterSalaryMin | Drop rows whose listed salary is below this. Note: LinkedIn rarely surfaces salary on search rows, so any non-zero floor drops most of them. |
filterPostedWithinDays | Drop rows posted more than N days ago. |
filterRemoteOnly | Drop rows not flagged remote. |
🎁 Free plan
The free plan caps each run at 50 jobs across all modes. Upgrade your Apify plan to lift the cap.
📊 Output destinations
The Actor writes to the standard Apify dataset, which is reachable as JSON / CSV / Excel / RSS / HTML / XML via the Dataset API. Ready-to-pipe into:
- Google Sheets — via the Apify ↔ Sheets integration.
- Airtable — via Apify ↔ Airtable.
- Webhooks — every successful run can POST to your endpoint.
🔑 Use cases
- Recruiting — daily delta of postings matching your sourcing criteria.
- Lead generation — hiring-team contacts for ABM / outbound (Mode 2 with
include_hiring_teamon). - Market intel — track who is hiring at competitors (Mode 3 with their company URLs).
- Salary benchmarking — enrich a list of postings and aggregate
salary_displayby role / location.
❓ FAQ
Q: My run returned zero rows.
99% of the time this is "wrong mode selected." Open the input panel, check Operation Mode at the top, then make sure the matching 🎯 Mode N section is the one you filled in.
Q: Salary is empty on most rows.
LinkedIn rarely shows salary on search-result rows. Enrich the postings you care about via Mode 2 — salary_display is more often populated there.
Q: My target city / town isn't in the City dropdown. Use the Custom Location field — type any LinkedIn-indexed place (e.g. "Cluj-Napoca", "Tartu", "Brooklyn"). The Actor resolves it live against LinkedIn's typeahead at run start and logs the resolved name + ID so you can verify the pick.
Q: I already have a LinkedIn geoId from the URL — can I paste it directly?
Yes. Paste the numeric ID (e.g. 102095887 for California) into Custom Location. The Actor detects 6–10 digit numeric inputs and skips the typeahead resolve.
Q: Are filters charged?
The JOB_ANALYZED event fires on the raw upstream fetch. Filters in the 🔬 Advanced filtering section run after the fetch, so they narrow your output but not your bill. If "all rows filtered" is a problem, loosen the filters and post-filter downstream.
Q: Can I search several job titles at once?
Yes — separate them with commas in the keyword field (e.g. Risk Analyst, Data Analyst, Financial Analyst). The Actor searches for jobs matching any of them. Custom Location works the same way: a comma list resolves to the first place LinkedIn recognises.
Q: Can I sort by posting date?
Yes — set searchJobsSortBy to "Most recent" in Mode 1.
⏱ Timing & runtime
- Mode 1: ~2-4 seconds per 25-job page → ~10 seconds for 50 jobs.
- Mode 2: ~2-3 seconds per job URL (sequential — the detail endpoint is single-job).
- Mode 3: 1 extra company-id resolve call per company URL, then same as Mode 1.
Default Apify timeout is fine for runs ≤ a few hundred rows; bump the timeout in Run Options for larger sweeps.
🤝 Related Actors
| Actor | Use case |
|---|---|
| linkedin-profile-api-scraper | Enrich LinkedIn profile / company URLs with 44 / 26-field detail. |
🆘 Support
Found a bug, a missing field, or a posting that didn't enrich? Use the Issues tab on this Actor's Apify Store page — it's the fastest path to a fix.
📋 Changelog
See ./CHANGELOG.md for the version history.