LinkedIn Jobs Scraper avatar

LinkedIn Jobs Scraper

Pricing

$30.00 / 1,000 job analyzeds

Go to Apify Store
LinkedIn Jobs Scraper

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

Andrey Afanasenko

Maintained by Community

Actor stats

0

Bookmarked

6

Total users

1

Monthly active users

5 hours ago

Last modified

Share

Apify Actor

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.

ModeInputWhat it returns
1: Search Jobs (searchJobs)Keywords + LinkedIn geo code + optional date / type / level / workplace filters10-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 keywordSlim 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

  1. Choose Operation Mode at the top of the input panel.
  2. The matching 🎯 Mode N section appears below — fill its primary field (keywords / job URLs / company URLs).
  3. Optionally tune the 🔬 Advanced filtering section.
  4. Set the per-mode cap (maxItemsModeN) if you want a hard ceiling. Leave at 0 for unlimited (paid plan only).
  5. 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.

EventPriceWhen it fires
JOB_ANALYZED$0.030 per jobOnce 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.

FilterEffect
filterTitleContainsDrop rows whose job title doesn't contain this substring.
filterTitleNotContainsDrop rows whose job title contains this substring (great for excluding "senior" or "intern").
filterCompanyNamesAllow-list — drop rows whose company name doesn't match one of the entries.
filterLocationContainsSubstring match against location.
filterSalaryMinDrop rows whose listed salary is below this. Note: LinkedIn rarely surfaces salary on search rows, so any non-zero floor drops most of them.
filterPostedWithinDaysDrop rows posted more than N days ago.
filterRemoteOnlyDrop 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:

🔑 Use cases

  • Recruiting — daily delta of postings matching your sourcing criteria.
  • Lead generation — hiring-team contacts for ABM / outbound (Mode 2 with include_hiring_team on).
  • Market intel — track who is hiring at competitors (Mode 3 with their company URLs).
  • Salary benchmarking — enrich a list of postings and aggregate salary_display by 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.

ActorUse case
linkedin-profile-api-scraperEnrich 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.