LinkedIn Jobs Scraper — Hiring Intelligence for Half the Price avatar

LinkedIn Jobs Scraper — Hiring Intelligence for Half the Price

Pricing

from $0.80 / 1,000 results

Go to Apify Store
LinkedIn Jobs Scraper — Hiring Intelligence for Half the Price

LinkedIn Jobs Scraper — Hiring Intelligence for Half the Price

Scrape LinkedIn job listings with company enrichment. 30 data fields, no login required.

Pricing

from $0.80 / 1,000 results

Rating

0.0

(0)

Developer

bootforge

bootforge

Maintained by Community

Actor stats

0

Bookmarked

20

Total users

4

Monthly active users

5 days ago

Last modified

Share

LinkedIn Jobs Scraper

The LinkedIn Jobs Scraper is an Apify actor that extracts job listings from LinkedIn by keyword search, location, or a pre-built search URLno login and no LinkedIn account required. It returns 33 flat fields per job, including title, location, salary, applicant count, full job description, recruiter info, and complete company enrichment (website, employee count, industry, type, HQ).

Use it to build recruiting pipelines, track competitor hiring, feed a job board, or benchmark salaries by role and location — exported to JSON, CSV, or Excel, or pulled from the Apify API.

Table of contents

What the LinkedIn jobs scraper does

  • 🔎 Keyword + location search — search by job title and filter by location, job type, experience level, workplace type, date posted, and minimum salary.
  • 🔓 No login required — uses LinkedIn's public guest API; no account, cookies, or li_at token needed.
  • 🏢 Company enrichment — for every job, adds website, employee count, industry, type, HQ, founded year, and logo from the company page (cached once per company per run).
  • 💰 Salary parsing — extracts min/max, currency, and period from both the search card and the detail-page compensation section.
  • ♾️ Unlimited results — auto-splits searches across date, job type, experience level, and workplace to bypass LinkedIn's 1,000-result cap.
  • 🛡️ Anti-blocking built in — TLS-fingerprinted HTTP (curl_cffi), retry with exponential backoff, proxy rotation, and rate limiting with jitter.
  • 🔗 Search-URL support — paste saved LinkedIn search URLs for precise filter control.

How to scrape LinkedIn jobs

  1. Click Try for free and open the actor.
  2. Enter one or more search_queries (e.g. python developer) or paste search_urls.
  3. Set location (e.g. United States, Remote, London, UK) and any filters you need.
  4. Choose sort_bydate for the freshest postings, relevance for best-match.
  5. Keep enrich_company on for the full company dataset; add a residential proxy.
  6. Click Start, then export results as JSON, CSV, or Excel, or pull them from the Apify API.
{
"search_queries": ["python developer"],
"location": "United States",
"sort_by": "date",
"max_results": 100,
"enrich_company": true,
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

LinkedIn jobs scraper input

FieldDescription
search_queriesJob-title keywords (e.g. python developer). Each query runs separately; results merge and dedupe by job_id.
search_urlsPre-built LinkedIn job-search URLs — use saved searches or precise URL-parameter filters.
locationLocation text, e.g. New York, Remote, United States. Empty = global.
geo_idAdvanced: LinkedIn's internal geo ID for exact targeting (overrides location).
job_typefull-time, part-time, contract, temporary, volunteer, internship.
experience_levelinternship, entry, associate, mid-senior, director, executive.
workplace_typeon-site, remote, hybrid.
date_posted24h, week, month — filter by posting recency.
salary_rangeMinimum salary band: 40k+, 60k+, 80k+, 100k+, 120k+ (USD/year).
sort_byrelevance (default) or date (most recent first).
enrich_companyAdd company website, size, industry, type, HQ (default true).
enrich_posterAdd job-poster name, title, profile URL when available (default true).
auto_splitBypass the 1,000-result cap by splitting the search across dimensions (default true).
split_byDimension to split by when auto-split is on: date_posted, job_type, workplace_type. Leave empty to let the scraper decide.
max_resultsCap total results across all queries (default 500, max 10,000).
max_concurrencyParallel requests (default 10, max 30).
max_requests_per_minuteRate limit (default 60; lower = safer).
cache_providerCache enrichment data (company/poster info) to speed up repeat runs: memory (default, within-run only), file (persists to disk, CLI/local), apify (persists across runs via Key-Value Store).
transportHTTP engine used to fetch pages. auto (default, recommended) uses curl_cffi, the verified-best transport for LinkedIn. Pin a specific transport only if you know why.
strategy_modeRetry ordering: cost_first (default) favors the cheapest working path.
request_delayFixed delay (seconds) inserted between requests. 0 (default) = no added delay beyond max_requests_per_minute.
proxyProxy config — residential recommended for all runs.

LinkedIn jobs data output

Each job is one flat, CSV-friendly dataset row with 33 fields (4 core, 9 company, 6 job metadata, 4 salary, 2 description, 3 poster, 4 engagement, scraped_at). Real output from job ID 4381014743:

{
"job_id": "4381014743",
"url": "https://www.linkedin.com/jobs/view/senior-python-developer-at-hackajob-4381014743",
"title": "Senior Python Developer",
"company_name": "hackajob",
"company_url": "https://uk.linkedin.com/company/hackajob",
"company_website": "https://www.hackajob.com",
"company_size": "51-200 employees",
"company_industry": "Software Development",
"company_type": "Privately Held",
"company_headquarters": "London",
"company_founded": null,
"company_description": null,
"company_logo_url": "https://media.licdn.com/dms/image/v2/D4D0BAQG3u9MOOWLo4w/company-logo_100_100/...",
"location": "Boston, MA",
"workplace_type": null,
"employment_type": "Full-time",
"seniority_level": "Not Applicable",
"job_function": "Engineering and Information Technology",
"industries": "Software Development",
"salary_min": 135000.0,
"salary_max": 155000.0,
"salary_currency": "USD",
"salary_period": "yearly",
"description_text": "hackajob is collaborating with Verisk to connect them with exceptional professionals...",
"description_html": "<div class=\"show-more-less-html__markup\">...</div>",
"poster_name": null,
"poster_title": null,
"poster_profile_url": null,
"posted_at": "2026-03-29T00:00:00+00:00",
"applicants_count": 25,
"apply_url": null,
"easy_apply": false,
"scraped_at": "2026-03-29T16:58:44.919665Z"
}
Field groupFields
Corejob_id, url, title, company_name
Company (enrich_company)company_url, company_website, company_size, company_industry, company_type, company_headquarters, company_founded, company_description, company_logo_url
Job metadatalocation, workplace_type, employment_type, seniority_level, job_function, industries
Salarysalary_min, salary_max, salary_currency, salary_period
Descriptiondescription_text, description_html
Poster (enrich_poster)poster_name, poster_title, poster_profile_url
Engagementposted_at, applicants_count, apply_url, easy_apply
Metadatascraped_at

Null fields are expected, not errors: workplace_type is null when the employer doesn't specify remote/hybrid/on-site; apply_url is null on LinkedIn's sign-in-to-apply flow; salary_* is null when the employer didn't list pay; poster_* depends on what the public guest API exposes for that listing. Company enrichment is included at no extra charge.

How much it costs

This actor uses pay-per-result pricing (Apify pay-per-event, one charge per dataset item) — you pay for the jobs you collect, not for compute time. Company enrichment, salary parsing, and poster info are included at no extra charge.

EventUSD
Actor start (per GB memory, default 2 GB → $0.02/run)$0.01
Per LinkedIn job result (33-field enriched record)$0.001
Typical runCost
100 jobs~$0.12
1,000 jobs~$1.02
10,000 jobs~$10.02

The per-result price is all-in — there is no separate platform-usage line item on top. (Apify Proxy traffic, if you use the platform's residential proxy, is billed separately by Apify.)

LinkedIn blocks datacenter IPs, so a residential proxy is recommended for every run. This actor supports Apify Proxy natively — the simplest option is Apify's managed residential pool, which the input prefills:

{ "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }

If you run your own scrapers (inside or outside Apify) and want reliable residential IPs for LinkedIn or other sites, DataImpulse offers pay-as-you-go residential proxies with per-country targeting and no monthly minimum:

👉 Get DataImpulse residential proxies (referral link)

You can also plug in your own provider via the proxy config — Bright Data, Oxylabs, SmartProxy, or any raw proxy URL.

Why this LinkedIn jobs scraper

  • No login, no cookies — runs entirely on LinkedIn's public guest API, so there's no account to get flagged and no li_at token to manage.
  • Full company dataset, free — website, size, industry, type, HQ, and logo come with every job, cached once per company per run.
  • Bypasses the 1,000-result cap — multi-dimensional auto-split (date → job type → experience → workplace) collects everything a single search would truncate.
  • Salary from two sources — parses the search card and the detail-page compensation section, in annual, monthly, or hourly form.
  • Resilient by design — individual failures never crash the run; you always get partial results with retry, backoff, and proxy rotation.
  • Open source — the underlying linkedin-scraper Python package ships a Typer CLI and a FastAPI server; the Apify wrapper is a thin layer.

FAQ

Do I need a LinkedIn account or login? No. The actor uses LinkedIn's public guest job endpoints — no account, no cookies, no li_at token. It reads only publicly visible listing and company data, so there's nothing to authenticate and no session to get flagged.

Do I need a proxy? Yes, for reliable results. LinkedIn blocks datacenter IPs like Apify's servers. Use the prefilled Apify residential proxy ({"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}) or your own residential provider. Without one you'll likely see "LinkedIn BLOCKED the request".

How many jobs can I scrape? Effectively unlimited. LinkedIn caps a single search at ~1,000 results, but with auto_split: true (default) the actor re-runs each query split across date, job type, experience level, and workplace to collect everything, deduplicated by job_id.

Why are some salary or company fields empty? LinkedIn only shows salary when the employer includes it (roughly 40-60% of US postings, lower elsewhere). Company fields fall back to JSON-LD when the full page is unavailable. Nulls reflect missing source data, not a scraper failure.

Is scraping LinkedIn jobs legal? This actor collects only publicly available job and company data. You are responsible for complying with LinkedIn's terms and applicable laws. Do not collect personal data without a lawful basis, and avoid using output in ways that violate privacy or anti-discrimination rules.

Which proxies work best? Residential proxies with per-country targeting. Apify's managed residential pool works out of the box; for your own runs, DataImpulse (referral link) provides pay-as-you-go residential IPs with no monthly minimum.

Rate this actor ⭐

If the LinkedIn Jobs Scraper saved you time, please leave a review on its Apify Store page — ratings help other people find it and tell us what to build next. Hit a bug or missing field? Open an issue through the actor's Issues tab and we'll fix it fast — recency and reliability are what keep this actor ranking.

Building a full data pipeline? Pair this actor with our other scrapers — same proxy config format, same Pydantic-validated output, all open source.

  • LinkedIn Profile Scraper — scrape LinkedIn profiles via your li_at cookie: structured fields, full experience history, optional email/phone/contact enrichment.
  • Indeed Job Scraper — Indeed job listings with structured salary across 10 country storefronts, Cloudflare-safe.
  • Google Maps Business & Contact Scraper — scrape Google Maps businesses with emails, phone numbers, reviews, images, and social links.