DRAFT tutorial. Not indexed by search engines. Not yet listed on the tutorials hub. Review + iterate in the Claude Code session, then merge the "Publish tutorial" PR to make it public.

How to Scrape LinkedIn Job Listings Without a Login

Pull job titles, companies, locations, salaries, employment types, seniority levels, applicant counts, and full descriptions from LinkedIn Jobs. No LinkedIn account needed. Four input modes cover keyword search, pasted URLs, and still-alive monitoring. Pricing starts at $0.001 per listing.

Apify dataset table showing LinkedIn job listings with columns for job title, company, location, employment type, seniority level, and posted date
One row per job listing. The actor returns title, company, location, salary, seniority, employment type, applicant count, and full description.
Difficulty: Beginner
Time: 10 minutes
Cost: $0.001 per listing (free tier covers ~4,999 listings/month)
Tools: Apify
Try the LinkedIn Jobs Scraper free Browse all NanoScrape actors

In this tutorial

  1. What data you get
  2. Four input modes
  3. Prerequisites
  4. Step 1: Open the actor
  5. Step 2: Configure your search
  6. Step 3: Run the actor
  7. Step 4: Export your results
  8. Automate with n8n
  9. Common use cases
  10. What it costs

What data you get

Each run returns one dataset row per job listing. All data comes from LinkedIn's public job search pages, which are visible to any visitor without an account. The actor uses plain HTTP requests so runs are fast and cost-effective.

{
  "id": "4371481846",
  "title": "Senior Software Engineer, Backend",
  "company": "Acme Analytics",
  "location": "New York, NY",
  "country": "US",
  "job_status": "online",
  "employment_type": "full-time",
  "seniority_level": "Mid-Senior level",
  "remote_option": "hybrid",
  "salary_text": "$140,000 - $180,000/yr",
  "salary_min": 140000,
  "salary_max": 180000,
  "salary_currency": "USD",
  "salary_period": "year",
  "company_industry": "Technology, Information and Internet",
  "company_employee_count": "201-500 employees",
  "company_website": "https://www.acmeanalytics.example",
  "applicants": "<25",
  "description_snippet": "We are looking for a Senior Software Engineer to join our platform team...",
  "description_full": "Full job description text...",
  "posted_at": "2026-08-05T00:00:00.000Z",
  "source_url": "https://www.linkedin.com/jobs/view/4371481846",
  "search_query": "Senior Software Engineer",
  "scraped_at": "2026-08-10T08:30:00.000Z"
}

Core output fields

What the actor does not return: private LinkedIn data (direct messages, connection requests, InMail allowances) and any content behind a login wall. The public job search page is the data source.

Four input modes

Pick the mode that matches your workflow. All four modes produce the same output fields.

Prerequisites

STEP 1

Open the actor

  1. Go to the NanoScrape LinkedIn Jobs Scraper on Apify.
  2. Click Try for free. Sign up with Google or email. It takes about a minute.
  3. Once signed in, the actor opens in Apify Console with the Input tab active.
Apify actor page for the NanoScrape LinkedIn Jobs Scraper showing title, description, pricing events, and a Try for free button
The LinkedIn Jobs Scraper on Apify. Click Try for free to open the input form.
Already have an Apify account? Just follow the actor link and it drops you straight into the input editor.
STEP 2

Configure your search

In the Input tab, click JSON editor at the top right. Paste the input below to start a keyword search with filters:

{
  "searchQueries": ["Software Engineer", "Data Scientist"],
  "location": "United States",
  "datePosted": "past-week",
  "jobType": "full-time",
  "experienceLevel": "mid-senior",
  "remoteFilter": "remote",
  "maxResultsPerQuery": 100,
  "includeJobDetails": true
}

Key input parameters

Bulk mode for large market scans

If you need thousands of listings fast and only need title, company, location, and posted date, skip the per-job detail fetch:

{
  "searchQueries": ["Data Scientist"],
  "location": "Germany",
  "includeJobDetails": false,
  "maxResultsPerQuery": 500
}
Apify Console Input tab showing the JSON editor with searchQueries, location, datePosted, and jobType fields configured for LinkedIn job scraping
Paste your search configuration in JSON editor mode. At minimum, set searchQueries and location.
Paste a LinkedIn search URL instead. Open LinkedIn Jobs, apply your filters manually, then copy the URL from your browser. Paste it into startUrls and set maxResultsPerQuery to cap results. The actor paginates from your exact filter setup.
STEP 3

Run the actor

Click Start at the top right. The run log shows each query as it processes. In default detail mode, the actor fetches each job's detail page in turn, so expect about one to two jobs per second. A search returning 100 jobs typically finishes in under three minutes.

Apify Console run log for the LinkedIn Jobs Scraper showing job titles being processed with a running item count
The live run log. Each job appears as it resolves, with a running item count at the top.

When the status changes to Succeeded, click Results to preview the dataset. Each row is one job listing. Scroll right to see salary, seniority, applicant count, and description fields.

Running large searches. When your keyword returns more than 990 results for a given location, set location to a country name instead of a city. The actor expands to major cities automatically, running parallel queries so you collect several thousand results from a single actor run.
STEP 4

Export your results

From the Results tab, click Export to download the dataset as JSON, CSV, or Excel. For live destinations, use the Integrations panel:

Automate with n8n

To monitor a set of job searches on a regular schedule (for example, pulling all new remote senior engineering roles each weekday morning), connect the actor to n8n using the verified Apify n8n node.

  1. Open n8n and create a new workflow.
  2. Add a Schedule Trigger node. Set the interval to once a day or once a week, depending on how fresh you need the data.
  3. Add an Apify node. Set Operation to Run an Actor and get dataset. Set Actor ID to santamaria-automations/linkedin-scraper.
  4. In the Input JSON field, paste your search configuration (keywords, location, filters, and results cap).
  5. Add a Google Sheets node (or a Slack or email node) to deliver the new listings to your team.
  6. Save and activate the workflow.
{
  "searchQueries": ["Software Engineer", "Backend Engineer"],
  "location": "Germany",
  "datePosted": "past-24h",
  "remoteFilter": "remote",
  "jobType": "full-time",
  "maxResultsPerQuery": 50,
  "includeJobDetails": true
}

This workflow runs daily, pulls remote engineering roles posted in the last 24 hours across Germany, and writes new listings to a Google Sheet. At $0.001 per listing, pulling 100 listings per day costs about $3 per month.

New to n8n? n8n Cloud has a free trial and includes the Apify node pre-installed. On self-hosted or n8n Desktop, install it from Settings › Community Nodes with package name @apify/n8n-nodes-apify.

Common use cases

Recruitment and candidate sourcing

Monitor open roles by keyword and geography so your sourcing team sees new listings before candidates do. Filter by experienceLevel and jobType to focus on roles that match the candidates you have in your pipeline. Combine with the LinkedIn Company Scraper to enrich each employer with headcount, industry, and funding data.

Competitor hiring intelligence

Track which companies are hiring for which roles week over week. Run a search scoped to specific competitors using startUrls from a company jobs page, for example https://www.linkedin.com/company/stripe/jobs/. Chart how their headcount growth maps to their product announcements or funding rounds.

Job board and aggregator feeds

Ingest normalized LinkedIn listings into your own job board, ATS, or vertical search site. All title, location, and description fields are structured JSON, ready to index. The source_url field links back to each original LinkedIn listing for attribution.

Labour market research

Quantify hiring velocity by industry, role, and region. Run searches across several countries and group results by company_industry, seniority_level, and remote_option. Salary data is available for US listings far more often than EU ones, but posting volume by country gives you a hiring heat map even without salary figures.

Still-alive monitoring

If your internal database stores LinkedIn job URLs from past scrapes, use direct-URL mode to check which listings are still active. Set directUrls to your list and read job_status on each returned row. Rows with job_status: "expired" or "offline" can be flagged or removed automatically.

What it costs

100 listings (SERP only)         = $0.101  ($0.001 start + $0.100)
100 listings (with full details) = $0.101  (same -- price per result is the same regardless of mode)
1,000 listings                   = $1.001  ($0.001 + $1.000)
Daily monitor, 100 listings/day  ~ $3.10/month

The Apify free tier includes $5 of usage credit each month, which covers about 4,999 job listings before you pay anything.

Company enrichment cost note: enabling includeCompanyDetails: true adds one extra HTTP request per unique company in the result set. For a 100-job run with 80 distinct employers, that adds roughly 80 seconds to the runtime and a small amount of additional compute cost shown in the Apify Console breakdown.

FAQ

Do I need a LinkedIn account to use this?

No. The actor scrapes LinkedIn's public job search pages, which do not require a login. All data it returns is visible to any anonymous visitor on LinkedIn's public job board.

Which countries are supported?

Every country LinkedIn serves. The actor auto-detects ISO country codes for 30+ countries including the US, UK, Canada, Australia, Germany, France, Switzerland, Austria, Netherlands, Spain, Italy, Poland, Portugal, Sweden, Norway, Denmark, Finland, India, Japan, Singapore, Brazil, and Mexico.

How do I get more than 1,000 results for a keyword?

Set location to a country name (for example "Germany") or the ISO country code ("DE"). The actor automatically expands to major cities and runs a separate query per city, letting you pull several thousand results for a single keyword in one run. This bypasses LinkedIn's ~990-result-per-query ceiling.

Is salary data always available?

Salary is only shown when LinkedIn publicly displays it on the listing, which depends on the employer. It is much more common in US listings than EU ones. The actor returns salary_min, salary_max, salary_currency, and salary_period when the data is present, and leaves them null when it is not.

What is the difference between SERP-only and full detail mode?

Full detail mode (the default, with includeJobDetails: true) fetches each job's detail page to collect the full description, employment type, seniority, applicant count, hiring manager, and more. SERP-only mode (includeJobDetails: false) skips that detail fetch and returns only what appears on the search results page: title, company, location, logo, and posted date. SERP-only runs roughly 3x faster and is ideal for large market scans where you only need the basics.

Can I use this to monitor specific company job pages?

Yes. Paste a company's LinkedIn jobs page URL (for example https://www.linkedin.com/company/stripe/jobs/) into startUrls. The actor paginates through all listings on that page and returns them as structured data. You can also pass individual job listing URLs via directUrls to check whether those specific jobs are still active.

Is scraping LinkedIn legal?

The actor only accesses data publicly visible on LinkedIn's job search without logging in. The hiQ Labs v. LinkedIn ruling in the US established that scraping publicly available data is not a violation of the Computer Fraud and Abuse Act. LinkedIn's Terms of Service restrict automated access, so you are responsible for your own use case. Consult a lawyer for jurisdiction-specific compliance questions.

Related resources

Try the LinkedIn Jobs Scraper free Browse all NanoScrape actors