The Mine Works
LinkedIn Jobs Scraper: Job Listings by Keyword and Location Without Login
← All posts
tutorial June 23, 2026 · 2 min read

LinkedIn Jobs Scraper: Job Listings by Keyword and Location Without Login

Scrape LinkedIn job listings by keyword and location: job title, company, seniority, applicant count, and job description. No LinkedIn login required.

Try the scraper

The actor referenced in this article. Pay only for results delivered.

View the scraper →

LinkedIn’s public job search is accessible without a login. Our LinkedIn Jobs Scraper targets the unauthenticated job listings page, paginates across results, and returns structured data per listing.

What you get per job

  • job_id — LinkedIn’s internal job ID
  • job_url — full LinkedIn job URL
  • title — job title
  • company — company name
  • company_url — LinkedIn company page URL
  • location — job location
  • posted_at — relative posting date (e.g. “2 days ago”)
  • job_type — Full-time, Part-time, Contract, or Remote
  • seniority_level — Entry, Associate, Mid-Senior, Director, Executive
  • description — first 500 characters of the job description
  • applicant_count — number of applicants shown
  • scraped_at — ISO timestamp

Python example

import requests, time

run = requests.post(
    "https://api.apify.com/v2/acts/themineworks~linkedin-jobs-scraper/runs",
    headers={"Authorization": f"Bearer {APIFY_TOKEN}"},
    json={
        "keywords": "machine learning engineer",
        "location": "San Francisco Bay Area",
        "maxResults": 100
    }
)

run_id = run.json()["data"]["id"]

while True:
    r = requests.get(
        f"https://api.apify.com/v2/actor-runs/{run_id}",
        headers={"Authorization": f"Bearer {APIFY_TOKEN}"}
    ).json()
    if r["data"]["status"] in ("SUCCEEDED", "FAILED"):
        break
    time.sleep(5)

jobs = requests.get(
    f"https://api.apify.com/v2/actor-runs/{run_id}/dataset/items",
    headers={"Authorization": f"Bearer {APIFY_TOKEN}"}
).json()

for job in jobs:
    print(job["title"], "@", job["company"])
    print(f"  {job['location']} | {job['seniority_level']} | {job['applicant_count']} applicants")

Hiring signal analysis

import pandas as pd

df = pd.DataFrame(jobs)

# Which companies are hiring the most for this role?
print(df.groupby("company").size().sort_values(ascending=False).head(20))

# Seniority distribution
print(df["seniority_level"].value_counts())

# Average applicant count by seniority
print(df.groupby("seniority_level")["applicant_count"].mean())

Scheduled monitoring

To track new job postings over time, schedule this actor daily and deduplicate by job_id:

seen_ids = set(existing_df["job_id"].tolist())
new_jobs = [j for j in jobs if j["job_id"] not in seen_ids]
print(f"{len(new_jobs)} new postings since last run")

Use cases

Talent intelligence. Track which companies are hiring for a specific role and at what seniority to gauge growth direction.

Sales prospecting. Companies posting senior sales or growth roles are often expanding and receptive to new vendors.

Competitive hiring analysis. Monitor competitor job postings to infer product roadmap and team-building priorities.

Market research. Measure demand for a skill by counting job postings across cities, industries, and company sizes.

Job aggregation. Build a niche job board by combining this actor with Indeed and Glassdoor scrapers.

Pricing

$0.003 per job listing. Empty searches are not charged.

Available on Apify.

Related Actor

Explore the scraper referenced in this article — see inputs, outputs, and pricing, then run it on Apify.