LinkedIn Jobs Scraper — No Login, by Keyword & Location avatar

LinkedIn Jobs Scraper — No Login, by Keyword & Location

Pricing

from $40.00 / 1,000 job listings

Go to Apify Store
LinkedIn Jobs Scraper — No Login, by Keyword & Location

LinkedIn Jobs Scraper — No Login, by Keyword & Location

Scrape public LinkedIn job listings without login or cookies. Search by keyword, location, and job type; get title, company, salary, seniority, posting date, applicant count, and apply links. Read hiring-intent signals for sales or source roles for recruiting. No API key. Pay per record.

Pricing

from $40.00 / 1,000 job listings

Rating

0.0

(0)

Developer

NexGenData

NexGenData

Maintained by Community

Actor stats

1

Bookmarked

155

Total users

6

Monthly active users

2 days ago

Last modified

Share

Watch mode: save a job search once and get only the newly posted roles on every later run — $0.05 per check, and you pay for records only when there are new ones.

Sample run: the default returns 50 jobs so you can verify schema and quality before scaling up. Raise maxResults (up to 1000) for full runs — each job is billed at the price shown.

Pull public LinkedIn job listings without logging in, without cookies, and without an account — just a keyword and a location. Each run returns title, company, location, salary range (when posted), seniority, posting date, applicant count, and a direct apply link. Recruiters source roles, sales teams read hiring signals, and analysts benchmark compensation — all from a clean CSV/JSON feed.

It reads only LinkedIn's public, guest-visible job data, so there is no session, no 2FA, and nothing to authenticate. You supply a search; it returns the matching postings.

Optional delivery: Send results straight to your own Notion database or Supabase table in the same run, via Apify's native MCP connectors — the Actor never sees your credentials. Leave blank to get the dataset as usual.

Pricing: $1 ≈ 25 job listings (Pay-Per-Event, $0.04 per listing).

🤖 For AI agents & automation

An agent can read hiring-intent from public LinkedIn listings — track which companies are hiring for which roles, by location and recency, for sales, recruiting, or market research.

Sample agent prompt:

Find 'data engineer' jobs in Austin posted in the last week and return company, title, employment type and salary.

Output fields (one item per result):

  • job_title — role title
  • company_name — hiring company
  • location — job location
  • posted_date — date posted
  • job_url — listing URL
  • job_id — LinkedIn job id
  • salary — salary if shown
  • job_type — the job-type filter you asked for (every delivered row matches it), or "Not specified"
  • employment_type — the employment type LinkedIn shows on the job page (Full-time, Contract, Internship…)
  • seniority_level, job_function, industries, applicants — from the job page
  • description — full job description

Agentic payment (x402): this Actor uses Pay-Per-Event pricing, so AI agents can run it via Apify's experimental x402 agentic-payment support — pay per call in USDC on Base, no Apify account or API key required ($1 minimum).

Related (on Apify): sales-intelligence-mcp — MCP server for agent workflows over the same data domain.

What you get per job

  • job_title, company_name, location, posted_date, job_url, job_id
  • salary (where LinkedIn shows it on the listing)
  • employment_type, seniority_level, job_function, industries, applicants (read from each job's page)
  • Full job description (when fetchDescriptions is on)

Use cases

  • Recruiters — daily lists of companies hiring for a target role.
  • Sales / RevOps — hiring-intent signals (a company hiring data engineers is buying a data stack).
  • Comp benchmarking — aggregate salary ranges by role × geo.
  • Market intel — track competitor hiring velocity over time.
  • Niche job boards — power a board with fresh public LinkedIn postings.

Sample input

{
"keywords": "data engineer",
"location": "San Francisco",
"jobType": "full-time",
"maxItems": 200,
"fetchDescriptions": true
}

Several searches in one run (one run instead of one run per search): put each keyword/location pair in searches. maxResults applies per search, a posting matched by two searches is delivered (and charged) once, and the run's status message gives the per-search count.

{
"searches": [
{ "keywords": "data engineer", "location": "San Francisco" },
{ "keywords": "data engineer", "location": "New York" },
{ "keywords": "analytics engineer", "location": "Remote" }
],
"maxResults": 25,
"fetchDescriptions": true
}

Sample output

{
"title": "Senior Data Engineer",
"company": "Globex",
"location": "San Francisco, CA",
"remote": false,
"salary": "$170k-$210k",
"seniority": "Senior",
"employment_type": "full-time",
"posted_date": "2026-06-22",
"applicant_count": 47,
"apply_url": "https://www.linkedin.com/jobs/view/3912...",
"easy_apply": true
}

How to use

  1. Click Try for free to open the Actor in the Apify Console.
  2. Enter your Search Keywords and Location.
  3. (Optional) Pick a Job Type and Posted within, set Maximum results, and toggle Fetch full job descriptions.
  4. Click Start, then download results as JSON, CSV, or Excel, or pull them via the REST API.

Note: maxResults, maxItems and maxJobs are interchangeable; if more than one is provided, maxResults takes precedence, then maxItems.

FAQ

Do I need a LinkedIn login or cookies? No — it reads public guest job data only. No account, no session cookie, no 2FA.

Can I filter by keyword, location, job type and posting date? Yes. postedWithin (past_24_hours, past_week, past_month) limits results to fresh postings — use past_24_hours on a daily schedule. jobType (full-time, part-time, contract, temporary, internship, volunteer, other) is checked against the Employment type on each job's own page, because LinkedIn's logged-out search ignores job-type filters; only matching jobs are delivered and charged. For part-time, contract, temporary, internship and volunteer the type word is also added to the search so matches turn up quickly. Keyword is required; the rest are optional.

Is salary included? Where LinkedIn shows it on the posting, yes — typically a subset of jobs, depending on role and jurisdiction.

Will I get the full job description? Yes — enable fetchDescriptions to pull the full description text for each listing (slightly slower).

How do I use this for hiring-intent / sales? Search the role your product maps to (e.g. "data engineer"); the companies posting it are actively investing in that area, which is a buying signal you can route to your CRM.

Is scraping public LinkedIn jobs allowed? It targets only publicly visible postings. Follow LinkedIn's terms and applicable law in your jurisdiction.

🔌 Optional company web enrichment (paid add-on)

Set enrich_companies: true to resolve each hiring company's website and append its domain, homepage title and description (enriched_* fields). Opt-in, default off; base listing output unchanged. Billed separately — $0.03 per listing, only when a homepage is resolved.

Watch mode — get only what's new

Set watchMode: true to turn a one-off search into a saved monitor. Instead of returning every job posting that matches your job search, a watch run returns only the job postings that are new since your last run.

  • First run seeds a baseline: it records what currently matches and returns 0 records — nothing to alert on yet.
  • Every later run returns only the newly-appearing job postings (each tagged change_type: "new_filing"), plus any whose status changed.
  • Point a Schedule at it (daily/hourly) and you have a standing "New job posting match" feed.

What a watch run charges: one Watch check — a flat $0.05 per run, whether or not anything new is found. You are not charged the per-job posting price on a run that finds nothing. When new job postings do appear, each is billed at the normal per-record rate on top of the $0.05 check.

Inputs

fieldmeaning
watchModetrue to enable watch mode (default false = a normal one-off search)
watchLabeloptional name; two watches with the same query but different labels keep separate memory

Worked example — watch senior data engineer roles in the US:

{
"watchMode": true,
"watchLabel": "senior data engineer roles in the US"
}

Run 1 returns 0 records and reports "baseline established: monitoring N job posting(s)". Schedule it daily; from run 2 on, you receive only the new job postings — a $0.05 check on quiet days, $0.05 + records on the days something lands.