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

157

Total users

8

Monthly active users

a day 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.

🔌 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. Not billed separately today — enriched listings cost the same $0.04 as any listing.

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.

Run it on a schedule

Daily is the right cadence for LinkedIn jobs. New roles are posted every day and older ones close, so a daily run with postedWithin set to past_24_hours keeps a role or hiring-signal list current. Each run mostly brings new postings rather than changes to old ones. Turn on watchMode for a scheduled feed: the first run records a baseline and returns 0 records, and every later run returns only the postings that are new since the last run (tagged change_type: "new_filing"), plus any whose status changed. Send each run's results onward with a webhook, Google Sheets, Zapier, Make or the Apify API.

Video guides from Apify: Schedule your Actor · Integrations

FAQ

LinkedIn's job search is free in a browser, but it shows one page at a time and has no export. This actor returns postings as clean CSV or JSON with title, company, location, salary where shown, seniority, job function, industries, applicant count and apply link. It runs several keyword and location searches in one run, removes duplicates, and checks your job type against each job's own page, because LinkedIn's logged-out search ignores job-type filters. It needs no login, no cookies and no API key, and you pay per listing.

What does a typical run cost?

You pay per result, not for run time: $0.04 for each row in the results, plus $0.005 per run start (charged per GB of run memory, minimum one). A run that returns 50 job listings costs about $2.00. Optional extras are charged only when you turn them on: a watch-mode change check $0.05. Live prices are always shown in the Pricing tab.

Can I scrape LinkedIn jobs without logging in?

Yes. The actor reads only LinkedIn's public, guest-visible job data, so there is no account, session cookie or 2FA. You supply a keyword (required) and optionally a location, job type and posting window.

Does LinkedIn job data include salaries?

Only where LinkedIn shows a salary on the posting, which is typically a subset of jobs depending on role and location. When no salary is posted, the field is empty.

How do I find companies that are hiring for a specific role?

Search the role your product or service maps to, for example data engineer, and set postedWithin to keep only fresh postings. The companies posting that role are investing in that area, which you can use as a hiring-intent signal. Turn on enrich_companies to add each company's domain, homepage title and description.

How many jobs can one run return?

Up to 1,000 per search, set with maxResults (default 50). With several searches in searches, the limit applies per search, and a posting matched by two searches is delivered once. Full descriptions are included only when fetchDescriptions is on.