Linkedin Search Jobs Scraper [Without Cookies] avatar

Linkedin Search Jobs Scraper [Without Cookies]

Pricing

$15.00/month + usage

Go to Apify Store
Linkedin Search Jobs Scraper [Without Cookies]

Linkedin Search Jobs Scraper [Without Cookies]

Streamline your job search and recruitment process with the LinkedIn Scraper. Easily extract detailed listings, application insights, and company profiles. This tool is perfect for recruiters, job seekers, or analysts who want to harness LinkedIn's vast job marketplace data with precision and speed.

Pricing

$15.00/month + usage

Rating

5.0

(3)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

15

Bookmarked

412

Total users

27

Monthly active users

20 hours

Issues response

2 days ago

Last modified

Share

LinkedIn Jobs Scraper — No Login, No Cookies

Disclaimer: This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by LinkedIn Corporation or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

Scrape LinkedIn job postings without a LinkedIn account, without cookies, and without any auth flow. Three input modes — all mixable in the same run:

  1. Search URLshttps://www.linkedin.com/jobs/search?keywords=… → paginated listings with details for every job
  2. Single-job URLshttps://www.linkedin.com/jobs/view/4410745146/ → one enriched row per URL with recruiter contacts (best-effort), company LinkedIn, apply URL, salary, workplace type, criteria, and full description
  3. Filter fields — keywords + location + geoId + placeIds + time range + workplace type + experience level + contract type + company name

Strict maxItems budgeting + residential proxy support.

Why use this scraper

CapabilityThis actorTypical cookie-based alternative
★ rating5.0 / 5Varies
Works without a LinkedIn accountYes — no cookies, no login, no tokenRequires logged-in session
Compliant with most TOS interpretationsYes — only reads LinkedIn's public Jobs surfaceOften disputed (logged-in scraping)
Three input modes (search URL + single-job URL + filter)All three supportedOften URL-only or filter-only
Single-job detail URL → recruiter contacts (best-effort) + company LinkedInYes (new in v0.3)Often missing
geoId + placeIds (f_PP) location precisionYes — city-level + sub-locale filtersOften missing
Workplace type filter (on-site / remote / hybrid)Yes — codes 1/2/3Sometimes
Experience-level filterYes — codes 16 (intern → director)Partial
Contract type filter (Full/Part/Contract/Temp/Intern/Volunteer/Other)All 7 codesPartial
Time-range filter (24h / week / month)YesYes
Strict maxItems control (no overshoot)Yes — predictable stopOften overshoots
Company-name filter (whitelist employers)YesSometimes
Residential-proxy reliabilityYesYes

Why this matters: cookie-based LinkedIn scrapers require you to either (a) maintain a logged-in LinkedIn session and hand its cookies to the scraper — which gets your account flagged/banned — or (b) buy session cookies from third-party sellers (against LinkedIn's TOS). This scraper reads only the publicly-indexed Jobs surface that anyone with a browser can see, so no account is required and no account is at risk.

Single-job URL mode (new in v0.3)

Paste a LinkedIn job URL like https://www.linkedin.com/jobs/view/4410745146/ directly into the Start URLs field. The actor skips the search/pagination step and returns one enriched row with all the details, including:

FieldWhat it containsAnonymous-viewer note
title, company, locationStandard job topcardAlways available
companyLinkedinUrl, companyLinkedinSlugDirect link to the hiring company's LinkedIn page (cleaned of tracking params)Always available
descriptionFull plain-text job descriptionAlways available
workplaceTypeOn-site / Remote / HybridUsually available
applyUrlExternal careers-site URL where users applyUsually available
salarySalary range or compensation when company published itSometimes available
criteriaSeniority, employment type, function, industriesAlways available
hiringTeamArray of {name, linkedinUrl, title} for recruiters / hiring managers attached to the jobBest-effort — LinkedIn cookie-gates this on many jobs. Empty array means LinkedIn hid the data from anonymous viewers, not a parser failure.

Use cases that fit this mode

  • Recruitment outreach — given a candidate's saved LinkedIn job URL, pull the hiring manager's contact and reach out cold.
  • B2B lead-gen for ATS / HR-tech vendors — given a list of currently-open job URLs, harvest the hiring companies and contact the hiring managers.
  • Job intelligence for sales — given a competitor's job posting URL, learn what stack/skills they're hiring for and pitch your product to the decision-maker.
  • Manual enrichment — given a single shortlisted job URL, get every field LinkedIn shows on the public page in one row of JSON/CSV.

Honest limitations

This actor works without LinkedIn login, which is its main moat over cookie-based scrapers. The trade-off: for some jobs, LinkedIn shows recruiter contacts only to logged-in viewers. We extract what LinkedIn exposes publicly — for those jobs, hiringTeam: []. The other 6-7 fields above are always populated.

If you need guaranteed recruiter extraction on every job, you'd need a cookie-based scraper (with the account-flagging risk that comes with it). For most recruitment outreach use cases, the best-effort hit rate is enough to be useful.

Pricing — pay-per-result, tiered

Beats every popular cheap-jobs-scraper alternative at the paid tiers, with the same generous Free tier:

Your Apify planPer 1,000 jobsPer result
Free$0.70$0.0007
Bronze (Starter $49/mo)$0.55$0.00055
Silver (Scale $499/mo)$0.45$0.00045
Gold$0.35$0.00035
Platinum$0.25$0.00025

Examples:

  • 1,000 jobs on Free: $0.70 (covered by Apify's $5 monthly credit)
  • 10,000 jobs on Bronze: $5.50 (50% covered by Bronze plan's monthly credit)
  • 100,000 jobs on Gold: $35
  • 500,000 jobs on Platinum: $125

No actor-start fee. No subscription. No "rent." You pay only for the rows we actually emit to your dataset.

Migrated from $15/mo rent — older versions of this actor required a flat $15/month rental fee regardless of volume. We migrated to tiered pay-per-result so light users pay less and heavy users get a volume discount. If you were a rent customer, you'll find the new model cheaper at any volume under 21,000 jobs/month (Free tier) — and Bronze+ users save even more.

Explore our complete suite of LinkedIn scraping tools:

Overview

The LinkedIn Jobs Scraper is a powerful tool designed to help you gather detailed job listing information from LinkedIn. Whether you're a recruiter, job seeker, or data analyst, this scraper simplifies the process of extracting job postings, company details, and application insights from LinkedIn.

LinkedIn is a leading professional networking platform that hosts millions of job listings globally. Our scraper enables efficient data extraction to streamline your recruitment or research needs.

Features

  • Extract Job Listings: Gather detailed information on job titles, companies, locations, salaries, and more.
  • Three Input Modes (updated in v0.3): Paste search URLs (/jobs/search?…), paste single-job detail URLs (/jobs/view/{id}/), or use manual search filters. All three are mixable in the same run.
  • Recruiter Contact Extraction (new in v0.3): Return a hiringTeam[] array (plus flat jobPosterName / jobPosterTitle / jobPosterProfileUrl / jobPosterPhoto) for the recruiters / hiring managers on a job — best-effort, since LinkedIn cookie-gates this for anonymous viewers on many postings.
  • Company LinkedIn URL + Slug (new in v0.3): Every row includes the canonical companyLinkedinUrl (cleaned of tracking params) and companyLinkedinSlug, ready to chain into a company-detail scraper.
  • Apply URL + Workplace Type + Salary (new in v0.3): External careers-site URL where users apply, on-site/remote/hybrid classification, and salary range when the company published it.
  • LinkedIn Location Filters: Supports broad search locations with location and geoId, plus city or sub-location filtering with placeIds (f_PP).
  • Retrieve Additional Criteria: Scrape job seniority levels, employment types, and industries.
  • Capture Application Insights: Get information on the number of applicants and application links.
  • Strict Max Items Control: Stops much more predictably at the requested maxItems limit.
  • Configurable Settings: Adjust scraping parameters like concurrency, retries, delays, and proxy usage to suit your needs.
  • Proxy Support: Ensure reliable and anonymous scraping with built-in proxy configurations.

New in v0.4

  • Company details enrichment (scrapeCompanyDetails): optionally fetch each job's company page and attach companyDetails — website, industry, company size, headquarters, logo, description, and follower count.
  • Bypass the 1000-result cap (autoSplit): LinkedIn's guest search caps each query at ~1000 results. Turn this on and the actor fans the search out across all six experience levels, then deduplicates — returning well beyond 1000 jobs per search.
  • Daily monitoring / only new jobs (onlyNewJobs): remembers job IDs across runs in the actor's key-value store and skips anything already returned, so a scheduled run only emits jobs posted since last time.
  • Multiple locations in one run (locations): search several countries/regions at once; each is combined with every keyword.
  • Cleaner, flatter output schema: absolute postedAt ISO timestamp, structured salary object, flattened seniorityLevel / employmentType / jobFunction / industries, easyApply flag, canonical jobUrl, and raw descriptionHtml. The legacy link field and nested job object were removed.

New in v0.5

  • City-level geo-split (splitByLocation + splitCountry): the strongest way past the 1000-result cap. Pick a country and the actor fans the search out across its major metros (e.g. 30 US cities, 19 UK cities), then de-duplicates — typically many times more unique jobs than a single country search. 39 countries covered.
  • Company enrichment on by default (scrapeCompanyDetails): every row now ships flat companyWebsite, companyLogo, companyDescription, companyIndustry, companyEmployeesCount (exact integer), companySize (band like "5,001-10,000"), companyHeadquarters, and companyFollowerCount — no flag to flip. Turn it off to cut run time and cost.
  • Numeric applicantsCount: the raw numberOfApplicants string plus a parsed integer you can sort and filter on.
  • Flat recruiter fields: jobPosterName / jobPosterTitle / jobPosterProfileUrl / jobPosterPhoto (the first hiring-team member) alongside the full hiringTeam[] array, which now also carries each member's photo.
  • benefits[]: job benefits when LinkedIn lists them (best-effort).
  • Smarter companyNames filter: the employer is now injected into the search query (so its jobs actually appear) and matched loosely — previously a company-only filter could return nothing.

LinkedIn's public Jobs surface only ever paginates through about 1000 results per search, no matter how many jobs actually match. This is a hard limit on LinkedIn's side — every scraper hits it. Here is how to get past it with this actor:

  1. Turn on Bypass 1000-result cap (split by city) (splitByLocation: true) and pick your splitCountry. (new in v0.5) The actor runs your search once per major city in that country (30 US metros, 19 UK cities, …), then merges and de-duplicates. This is the highest-yield option — each city has its own ~1000 ceiling, so one keyword can pull far past 1000 jobs. Raise maxItems to capture them all.
  2. Or split by experience (autoSplit: true) — runs the search once per experience level (Internship → Director) and merges. City-split and experience-split are alternative strategies; if both are on, city-split takes precedence (it returns more unique jobs per request, without the city × 6 request blow-up).
  3. Split by time using timeRange. Run separate scheduled passes for Last 24 hours / Last week and accumulate results over time instead of trying to pull the whole backlog at once.
  4. Narrow the keywords. Several specific searches ("backend engineer", "frontend engineer", "data engineer") return more total unique jobs than one broad search ("engineer") that gets truncated at 1000.

Combine city-split × time windows × specific keywords and the actor's built-in de-duplication stitches everything into one clean dataset.

How to scrape new jobs every day automatically

Use this actor as a daily job monitor that only ever returns jobs you haven't seen before:

  1. Turn on Only new jobs (skip previously seen) (onlyNewJobs: true). The actor remembers every job ID it has returned (stored in its key-value store) and skips them on the next run — so each run emits only genuinely new postings.
  2. Set timeRange to Last 24 hours (r86400) to keep each run fast and focused on fresh listings.
  3. Schedule it. In the Apify Console open the actor → Schedules → create a schedule (e.g. every day at 08:00). Each scheduled run reuses the same input and only outputs jobs posted since the previous run.
  4. Pipe the new jobs anywhere. Connect an integration (Webhook, Slack, Google Sheets, Make/Zapier, or the Apify API) to the run's dataset so fresh jobs land in your inbox, CRM, or spreadsheet automatically.

Tip: keep one schedule per saved search (role + location). Each writes to its own dataset and shares the de-dup memory across its runs.

How to Use

  1. Set Up: Ensure you have an Apify account and access to the Apify platform.
  2. Choose an input mode (any one, or mix them in the same run):
    • Search URLs — paste https://www.linkedin.com/jobs/search?… URLs from your browser into startUrls to scrape paginated listings.
    • Single-job URLs (new in v0.3) — paste https://www.linkedin.com/jobs/view/{id}/ URLs into startUrls to scrape just those jobs with recruiter + company enrichment.
    • Filter fields — leave startUrls empty and configure keywords, location, geoId, etc. below.
  3. Adjust Scraper Settings: Customize settings like minDelay, maxDelay, and maxConcurrency as per your requirements.
  4. Run the Scraper: Execute the scraper on the Apify platform.
  5. Download Results: Export the scraped data in your preferred format (JSON, CSV, Excel).

Input Configuration

The actor supports three input modes (updated in v0.3):

  1. Search URL modestartUrls containing /jobs/search?… URLs
  2. Single-job URL modestartUrls containing /jobs/view/{id}/ URLs
  3. Filter modekeywords, location, geoId, placeIds, and the other filter fields

When startUrls is provided, the actor prioritizes those URLs and ignores the manual search filter section. Search URLs and single-job URLs can be mixed in the same startUrls list — the actor auto-detects each URL type.

Example: Search URL Mode

Paste one or more LinkedIn Jobs result URLs copied from your browser. This is the best option when you want to preserve LinkedIn-specific filters such as geoId and f_PP.

{
"startUrls": [
{
"url": "https://www.linkedin.com/jobs/search?keywords=Software%20Engineer&location=United%20States&geoId=103644278&f_PP=104555257&position=1&pageNum=0"
}
],
"maxItems": 100,
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
}
}

Example: Single-Job URL Mode (new in v0.3)

Paste one or more LinkedIn job detail URLs (the URL you see when you open a job posting in a browser tab). The actor returns one enriched row per URL — with hiringTeam[] (best-effort), companyLinkedinUrl, applyUrl, salary, workplaceType, full description, and criteria. No search/pagination step is performed.

Both canonical and slug-with-ID URL formats are accepted:

  • https://www.linkedin.com/jobs/view/4410745146/
  • https://www.linkedin.com/jobs/view/mobile-engineer-at-jll-4410745146
{
"startUrls": [
{ "url": "https://www.linkedin.com/jobs/view/4410745146/" },
{ "url": "https://www.linkedin.com/jobs/view/software-engineer-at-discord-4307349185" }
],
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

You can also mix search URLs and single-job URLs in the same startUrls list — the actor auto-detects each URL's type and routes accordingly.

Example: Filter Mode

Use the filter fields when you want the actor to construct the LinkedIn Jobs search for you.

{
"keywords": ["Software Engineer"],
"location": "United States",
"geoId": "103644278",
"placeIds": ["104555257"],
"timeRange": "any time",
"jobTypes": ["1", "3"],
"experienceLevels": ["4", "5", "6"],
"contractType": ["F"],
"companyNames": ["Microsoft"],
"maxItems": 250,
"minDelay": 5,
"maxDelay": 10,
"maxConcurrency": 2,
"minConcurrency": 1,
"maxRequestRetries": 8,
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
}
}

Input Fields Explanation

  • Start URLs (startUrls): Accepts two URL types — mix them freely in the same list. (updated in v0.3)
    • Search URLs like https://www.linkedin.com/jobs/search?keywords=… — the actor extracts filters (keywords, location, geoId, f_PP, workplace type, experience level, contract type) from the URL and paginates through search results.
    • Single-job URLs like https://www.linkedin.com/jobs/view/4410745146/ or https://www.linkedin.com/jobs/view/mobile-engineer-at-jll-4410745146 — the actor returns one enriched row per URL with hiringTeam[] (best-effort), companyLinkedinUrl, applyUrl, salary, workplaceType, full description, and criteria. No search step.
    • When provided, these URLs take precedence over the manual filter fields below.
  • Keywords (keywords): Search terms or job titles to look for. When startUrls is used, this field is ignored.
  • Location (location): Broad search location, such as a country or region.
  • Geo ID (geoId): Optional LinkedIn internal ID for the broad location. This is useful when LinkedIn expects a specific region identifier instead of relying only on the location text.
  • Place Filter IDs (placeIds): Optional LinkedIn place filter IDs (f_PP) used for city-level or sub-location filtering. This is especially helpful for cases where a city filter works on LinkedIn UI but a plain city name alone does not.
  • Time Range (timeRange): Controls the posting age filter. Use any time, r86400 (last 24 hours), r604800 (last week), or r2592000 (last month).
  • Workplace Type (remote / jobTypes): Select LinkedIn workplace codes – 1 (On-site), 2 (Remote), 3 (Hybrid). If both fields are provided, remote takes precedence; otherwise jobTypes is used.
  • Experience Levels (experienceLevels / experienceLevel): Choose experience codes – 1 Internship, 2 Entry level, 3 Associate, 4 Mid-Senior, 5 Executive, 6 Director. Both fields are aliases and can be combined.
  • Contract Type (contractType): Filter jobs by job type – F Full-time, P Part-time, C Contract, T Temporary, I Internship, V Volunteer, O Other.
  • Company Names (companyNames) (improved in v0.5): Restrict results to specific employers. The company is injected into the LinkedIn search query so its jobs actually surface (not just post-filtered), and matched loosely so Microsoft also catches Microsoft Corporation. Works alongside keywords (e.g. Software Engineer at Microsoft) or on its own (all jobs at Stripe, no keyword needed). Lists of several companies run one search each.
  • Scrape company details (scrapeCompanyDetails) (default true, new in v0.5): Enrich each row with the company's website, industry, exact employee count, size band, headquarters, logo, description, and follower count (one extra request per unique company, cached within a run). Turn it off to cut run time and cost.
  • Split by city (splitByLocation) (new in v0.5): Fan the search out across the major cities of splitCountry to beat LinkedIn's ~1000-per-search cap. Ignored when startUrls is provided. Takes precedence over autoSplit when both are on.
  • Split country (splitCountry) (new in v0.5): The country whose metros are used by Split by city. 39 countries supported (US, GB, CA, AU, IE, IN, DE, FR, … — accepts the 2-letter code or full name). No effect unless Split by city is on.
  • Split by experience (autoSplit): Alternative cap-buster — runs the search once per experience level and merges. See "How to scrape more than 1000…" above.
  • Only new jobs (onlyNewJobs): Remember job IDs across runs and emit only jobs not seen before — ideal for scheduled daily monitoring.
  • Max Items (maxItems): Maximum number of jobs to collect in a single run. The actor now limits queued and pushed items more strictly so it does not overshoot the requested count as easily. Raise this when using Split by city — each city is a separate search.
  • Min Delay (minDelay): Minimum delay (in seconds) between requests.
  • Max Delay (maxDelay): Maximum delay (in seconds) between requests.
  • Max/Min Concurrency (maxConcurrency, minConcurrency): Bounds for simultaneous requests handled by the crawler.
  • Max Request Retries (maxRequestRetries): Number of retries for failed requests before stopping.
  • Proxy Configuration (proxy): Proxy settings for anonymity and reliability during scraping.

Notes About LinkedIn Locations

  • LinkedIn often uses a combination of a broad location plus internal IDs for more precise filtering.
  • A country or region is typically represented by location and optionally geoId.
  • A city or sub-location is often represented by placeIds (f_PP) in the LinkedIn Jobs URL.
  • If a search works in the LinkedIn UI but not with plain text location alone, copy the full LinkedIn Jobs URL into startUrls or provide the matching geoId and placeIds.

Output Structure

The scraper produces a structured list of job postings with detailed information. Below is an example output row (same shape for both search-results and single-job inputs):

{
"id": "4410745146",
"title": "Mobile Engineer",
"company": "JLL",
"companyLinkedinUrl": "https://www.linkedin.com/company/jll/",
"companyLinkedinSlug": "jll",
"companyLogo": "https://media.licdn.com/.../jll-logo.png",
"companyWebsite": "https://www.jll.com",
"companyDescription": "JLL is a leading professional services firm that specializes in real estate...",
"companyIndustry": "Real Estate",
"companyEmployeesCount": 109930,
"companySize": "10,001+",
"companyHeadquarters": "Chicago, Illinois",
"companyFollowerCount": 1543210,
"companyDetails": {
"website": "https://www.jll.com",
"industry": "Real Estate",
"companySize": "10,001+",
"employeeCount": 109930,
"headquarters": "Chicago, Illinois",
"logo": "https://media.licdn.com/.../company-logo.png",
"description": "JLL is a leading professional services firm...",
"followerCount": 1543210
},
"location": "Memphis, Tennessee, United States",
"workplaceType": "On-site",
"seniorityLevel": "Mid-Senior level",
"employmentType": "Full-time",
"jobFunction": "Engineering",
"industries": ["Real Estate"],
"benefits": ["401(k)", "Medical insurance"],
"criteria": [
{ "title": "Seniority level", "value": "Mid-Senior level" },
{ "title": "Employment type", "value": "Full-time" },
{ "title": "Job function", "value": "Engineering" },
{ "title": "Industries", "value": "Real Estate" }
],
"postedAt": "2026-06-11T09:14:00.000Z",
"postedTimeAgo": "2 days ago",
"numberOfApplicants": "Be among the first 25 applicants",
"applicantsCount": 25,
"salary": {
"raw": "$120,000.00/yr - $150,000.00/yr",
"minAmount": 120000,
"maxAmount": 150000,
"currency": "$",
"period": "yearly"
},
"easyApply": false,
"description": "We are seeking a Mobile Engineer to join JLL's Technology team...",
"descriptionHtml": "<p>We are seeking a Mobile Engineer...</p>",
"applyUrl": "https://careers.jll.com/...",
"hiringTeam": [
{
"name": "Todd Greer",
"linkedinUrl": "https://www.linkedin.com/in/todd-greer-recruiter",
"title": "Senior Talent Acquisition Partner",
"photo": "https://media.licdn.com/dms/image/.../todd-greer.jpg"
}
],
"jobPosterName": "Todd Greer",
"jobPosterTitle": "Senior Talent Acquisition Partner",
"jobPosterProfileUrl": "https://www.linkedin.com/in/todd-greer-recruiter",
"jobPosterPhoto": "https://media.licdn.com/dms/image/.../todd-greer.jpg",
"jobUrl": "https://www.linkedin.com/jobs/view/4410745146/",
"sourceUrl": "https://www.linkedin.com/jobs/view/4410745146/",
"scrapedFrom": "job-view-url"
}

Field availability (verified on a live run): id, title, company, every company* field (with enrichment on — the default), location, seniorityLevel, employmentType, jobFunction, industries, criteria, postedAt, numberOfApplicants/applicantsCount, description/descriptionHtml, and the URL fields are always present. companyHeadquarters and companyFollowerCount populate for most companies. workplaceType, salary, benefits, applyUrl, easyApply, and the hiringTeam / jobPoster* recruiter fields are best-effort — LinkedIn hides them from anonymous (no-login) viewers on many postings, so expect them blank / null / [] on a sizeable share of rows.

Output Fields Explanation

  • id: LinkedIn's numeric job ID.
  • title: Job title.
  • company: Hiring company display name.
  • companyLinkedinUrl (new in v0.3): Canonical company LinkedIn URL (/company/{slug}/), stripped of tracking params. Ready to feed into a company-detail scraper.
  • companyLinkedinSlug (new in v0.3): Just the company slug (e.g., "jll") for downstream lookups.
  • companyDetails (new in v0.4): Company enrichment object — {website, industry, companySize, employeeCount, headquarters, logo, description, followerCount}. Populated when Scrape company details is enabled (on by default); null otherwise. Best-effort from the public company page.
  • companyLogo / companyWebsite / companyDescription / companyIndustry / companyHeadquarters / companyFollowerCount (new in v0.5): The same enrichment data lifted to flat top-level fields for easy spreadsheet/CSV use.
  • companyEmployeesCount (new in v0.5): Exact employee count as an integer (e.g., 7972), parsed from the company page. null when LinkedIn doesn't publish it.
  • companySize (new in v0.5): Human-readable size band (e.g., "5,001-10,000", "10,001+") — distinct from the exact companyEmployeesCount.
  • location: Job location as shown on LinkedIn.
  • workplaceType (new in v0.3): On-site / Remote / Hybrid when LinkedIn surfaces it.
  • seniorityLevel / employmentType / jobFunction (new in v0.4): Flattened top-level fields lifted out of the criteria block for easy access.
  • industries (new in v0.4): Array of industry strings parsed from the criteria block.
  • criteria: Raw criteria array (kept for backward compatibility): seniority, employment type, job function, industries.
  • postedAt (new in v0.4): Absolute ISO-8601 posting timestamp. Derived from LinkedIn's <time datetime> when present, otherwise approximated from the relative text. Use this for date filtering and "new since" logic.
  • postedTimeAgo: Human-readable posted-date (e.g., "4 days ago").
  • numberOfApplicants: Approximate applicant count as the raw LinkedIn string (e.g., "Over 200 applicants").
  • applicantsCount (new in v0.5): The same count parsed to an integer for sorting/filtering (e.g., 200). null when not shown.
  • benefits (new in v0.5): Array of benefit strings when LinkedIn lists them on the posting (best-effort; often empty on public pages).
  • salary (updated in v0.4): Structured object {raw, minAmount, maxAmount, currency, period} when the company published compensation. null otherwise.
  • easyApply (new in v0.4): true when the application stays on LinkedIn, false when it links out to an external careers site, null when no apply target is exposed.
  • description: Full plain-text job description (HTML stripped, lists preserved as * bullets).
  • descriptionHtml (new in v0.4): Raw description markup for consumers that want to keep formatting.
  • applyUrl (new in v0.3): External careers-site URL where users click to apply. null when LinkedIn hides the apply target behind its own modal.
  • hiringTeam (new in v0.3, photo added v0.5): Array of {name, linkedinUrl, title, photo} for recruiters / hiring managers attached to the job. Best-effort — LinkedIn hides this from anonymous viewers on many jobs.
  • jobPosterName / jobPosterTitle / jobPosterProfileUrl / jobPosterPhoto (new in v0.5): The first hiringTeam member flattened to top-level fields. null when no hiring team is exposed.
  • jobUrl (new in v0.4): Canonical, tracking-free /jobs/view/{id}/ URL for the posting.
  • sourceUrl (new in v0.3): The customer's original input URL (or the reconstructed /jobs/view/{id}/ URL when input was a search). Useful for joining back to your input list.
  • scrapedFrom (new in v0.3): "job-view-url" if this row came from a single-job URL input, "search-results" if it came from a search/filter pipeline.

Schema change in v0.4: the legacy link field and nested job sub-object were removed in favour of the clean flat schema above. Use companyLinkedinUrl instead of link, and the top-level fields instead of job.

Explore More Scrapers

If you found the LinkedIn Jobs Scraper useful, check out other powerful scrapers and actors at memo23's Apify profile. We offer a wide range of tools to enhance your web scraping and automation needs.

Support

Additional Services

Use Cases

Search mode (/jobs/search?… URLs or filter fields):

  • Recruiters / staffing agencies — bulk-pull LinkedIn jobs matching a candidate's profile, then send personalized outreach
  • Job boards / aggregators — refresh a country/region/role slice daily without maintaining browser sessions
  • Market intelligence — track who's hiring for what role, where, and at what experience level over time
  • Salary benchmarking — combine extracted role + company + location to estimate market compensation
  • Competitor monitoring — watch competitor hiring patterns (companyNames filter) to infer expansion plans
  • Academic / labor-economics research — pull longitudinal LinkedIn Jobs data with reproducible filter inputs

Single-job URL mode (/jobs/view/{id}/ URLs) (new in v0.3):

  • Cold-outreach recruitment — given a candidate's saved job URL, extract the hiring manager's LinkedIn + title + company domain, then craft a personalized message
  • B2B lead-gen for HR-tech / ATS / recruiting-tool vendors — given a list of currently-open job URLs (signals a company is hiring + has a budget), identify the hiring manager and pitch
  • Sales intelligence on competitors — paste a competitor's job posting URL to learn their tech stack, role criteria, and decision-maker
  • Manual lead enrichment — given a single shortlisted job URL, output one row of JSON with every public field LinkedIn shows
  • Pipeline tools (Zapier / Make / n8n integrations) — accept LinkedIn job URLs from upstream sources (e.g., a candidate's LinkedIn job-saved feed) and emit enriched job rows for downstream automation

SEO Keywords

linkedin scraper, linkedin jobs scraper, linkedin job listings, linkedin jobs api, linkedin without cookies, linkedin without login, linkedin no auth, linkedin public scraper, scrape linkedin jobs, linkedin job extractor, linkedin recruiter tool, linkedin jobs export, linkedin jobs csv, linkedin jobs json, recruitment data, hiring intelligence, talent acquisition, linkedin geoid, linkedin placeids, linkedin experience level filter, linkedin contract type filter, linkedin workplace type, linkedin company name filter, linkedin sourcing, recruitment automation, ats integration linkedin, job board scraper, job market data, hiring trends, salary benchmarking, competitor hiring intelligence, labor market research, recruitment platform, talent intelligence, linkedin job feed, linkedin jobs scraping apify, linkedin job url scraper, linkedin job detail scraper, linkedin single job url, linkedin hiring manager extractor, linkedin recruiter contact, hiring team linkedin, linkedin jobs view url, linkedin company linkedin url, linkedin apply url scraper, linkedin job salary scraper, linkedin job posting api, linkedin no cookies scraper, recruiter outreach automation, b2b lead-gen linkedin jobs