Linkedin Search Jobs Scraper [Without Cookies]
Pricing
$15.00/month + usage
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
Maintained by CommunityActor stats
15
Bookmarked
412
Total users
27
Monthly active users
20 hours
Issues response
2 days ago
Last modified
Categories
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:
- Search URLs —
https://www.linkedin.com/jobs/search?keywords=…→ paginated listings with details for every job - Single-job URLs —
https://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 - 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
| Capability | This actor | Typical cookie-based alternative |
|---|---|---|
| ★ rating | 5.0 / 5 | Varies |
| Works without a LinkedIn account | Yes — no cookies, no login, no token | Requires logged-in session |
| Compliant with most TOS interpretations | Yes — only reads LinkedIn's public Jobs surface | Often disputed (logged-in scraping) |
| Three input modes (search URL + single-job URL + filter) | All three supported | Often URL-only or filter-only |
| Single-job detail URL → recruiter contacts (best-effort) + company LinkedIn | Yes (new in v0.3) | Often missing |
geoId + placeIds (f_PP) location precision | Yes — city-level + sub-locale filters | Often missing |
| Workplace type filter (on-site / remote / hybrid) | Yes — codes 1/2/3 | Sometimes |
| Experience-level filter | Yes — codes 1–6 (intern → director) | Partial |
| Contract type filter (Full/Part/Contract/Temp/Intern/Volunteer/Other) | All 7 codes | Partial |
| Time-range filter (24h / week / month) | Yes | Yes |
Strict maxItems control (no overshoot) | Yes — predictable stop | Often overshoots |
| Company-name filter (whitelist employers) | Yes | Sometimes |
| Residential-proxy reliability | Yes | Yes |
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:
| Field | What it contains | Anonymous-viewer note |
|---|---|---|
title, company, location | Standard job topcard | Always available |
companyLinkedinUrl, companyLinkedinSlug | Direct link to the hiring company's LinkedIn page (cleaned of tracking params) | Always available |
description | Full plain-text job description | Always available |
workplaceType | On-site / Remote / Hybrid | Usually available |
applyUrl | External careers-site URL where users apply | Usually available |
salary | Salary range or compensation when company published it | Sometimes available |
criteria | Seniority, employment type, function, industries | Always available |
hiringTeam | Array of {name, linkedinUrl, title} for recruiters / hiring managers attached to the job | Best-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 plan | Per 1,000 jobs | Per 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.
Related LinkedIn Scrapers
Explore our complete suite of LinkedIn scraping tools:
- LinkedIn Company About Scraper - Extract company details from About pages
- LinkedIn Search Jobs Scraper (Without Cookies) - Scrape job listings without authentication
- LinkedIn Search Groups Scraper - Find and extract LinkedIn groups
- LinkedIn Company Employees/People Scraper - Scrape employee profiles from companies
- LinkedIn People/Users Profile Scraper - Extract detailed user profile information
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 flatjobPosterName/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) andcompanyLinkedinSlug, 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
locationandgeoId, plus city or sub-location filtering withplaceIds(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
maxItemslimit. - 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 attachcompanyDetails— 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
postedAtISO timestamp, structuredsalaryobject, flattenedseniorityLevel/employmentType/jobFunction/industries,easyApplyflag, canonicaljobUrl, and rawdescriptionHtml. The legacylinkfield and nestedjobobject 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 flatcompanyWebsite,companyLogo,companyDescription,companyIndustry,companyEmployeesCount(exact integer),companySize(band like"5,001-10,000"),companyHeadquarters, andcompanyFollowerCount— no flag to flip. Turn it off to cut run time and cost. - Numeric
applicantsCount: the rawnumberOfApplicantsstring plus a parsed integer you can sort and filter on. - Flat recruiter fields:
jobPosterName/jobPosterTitle/jobPosterProfileUrl/jobPosterPhoto(the first hiring-team member) alongside the fullhiringTeam[]array, which now also carries each member'sphoto. benefits[]: job benefits when LinkedIn lists them (best-effort).- Smarter
companyNamesfilter: 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.
How to scrape more than 1000 LinkedIn jobs per search
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:
- Turn on
Bypass 1000-result cap (split by city)(splitByLocation: true) and pick yoursplitCountry. (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. RaisemaxItemsto capture them all. - 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). - 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. - 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:
- 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. - Set
timeRangetoLast 24 hours(r86400) to keep each run fast and focused on fresh listings. - 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.
- 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
- Set Up: Ensure you have an Apify account and access to the Apify platform.
- 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 intostartUrlsto scrape paginated listings. - Single-job URLs (new in v0.3) — paste
https://www.linkedin.com/jobs/view/{id}/URLs intostartUrlsto scrape just those jobs with recruiter + company enrichment. - Filter fields — leave
startUrlsempty and configurekeywords,location,geoId, etc. below.
- Search URLs — paste
- Adjust Scraper Settings: Customize settings like
minDelay,maxDelay, andmaxConcurrencyas per your requirements. - Run the Scraper: Execute the scraper on the Apify platform.
- 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):
- Search URL mode —
startUrlscontaining/jobs/search?…URLs - Single-job URL mode —
startUrlscontaining/jobs/view/{id}/URLs - Filter mode —
keywords,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/orhttps://www.linkedin.com/jobs/view/mobile-engineer-at-jll-4410745146— the actor returns one enriched row per URL withhiringTeam[](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.
- Search URLs like
- Keywords (
keywords): Search terms or job titles to look for. WhenstartUrlsis 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. Useany time,r86400(last 24 hours),r604800(last week), orr2592000(last month). - Workplace Type (
remote/jobTypes): Select LinkedIn workplace codes –1(On-site),2(Remote),3(Hybrid). If both fields are provided,remotetakes precedence; otherwisejobTypesis used. - Experience Levels (
experienceLevels/experienceLevel): Choose experience codes –1Internship,2Entry level,3Associate,4Mid-Senior,5Executive,6Director. Both fields are aliases and can be combined. - Contract Type (
contractType): Filter jobs by job type –FFull-time,PPart-time,CContract,TTemporary,IInternship,VVolunteer,OOther. - 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 soMicrosoftalso catchesMicrosoft 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) (defaulttrue, 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 ofsplitCountryto beat LinkedIn's ~1000-per-search cap. Ignored whenstartUrlsis provided. Takes precedence overautoSplitwhen 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
locationand optionallygeoId. - 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
startUrlsor provide the matchinggeoIdandplaceIds.
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, everycompany*field (with enrichment on — the default),location,seniorityLevel,employmentType,jobFunction,industries,criteria,postedAt,numberOfApplicants/applicantsCount,description/descriptionHtml, and the URL fields are always present.companyHeadquartersandcompanyFollowerCountpopulate for most companies.workplaceType,salary,benefits,applyUrl,easyApply, and thehiringTeam/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);nullotherwise. 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.nullwhen 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 exactcompanyEmployeesCount. - 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
criteriablock 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).nullwhen 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.nullotherwise. - easyApply (new in v0.4):
truewhen the application stays on LinkedIn,falsewhen it links out to an external careers site,nullwhen 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.
nullwhen LinkedIn hides the apply target behind its own modal. - hiringTeam (new in v0.3,
photoadded 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
hiringTeammember flattened to top-level fields.nullwhen 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
linkfield and nestedjobsub-object were removed in favour of the clean flat schema above. UsecompanyLinkedinUrlinstead oflink, and the top-level fields instead ofjob.
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
- For issues or feature requests, please use the Issues section of this actor.
- For further assistance, contact the author:
- Author's website: https://muhamed-didovic.github.io/
- Email: muhamed.didovic@gmail.com
Additional Services
- Request customization or a full dataset: muhamed.didovic@gmail.com
- Need other platforms scraped? Contact muhamed.didovic@gmail.com
- For API services of this scraper, reach out to muhamed.didovic@gmail.com
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 (
companyNamesfilter) 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