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.
The actor referenced in this article. Pay only for results delivered.
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 IDjob_url: full LinkedIn job URLtitle: job titlecompany: company namecompany_url: LinkedIn company page URLlocation: job locationposted_at: relative posting date (e.g. “2 days ago”)job_type: Full-time, Part-time, Contract, or Remoteseniority_level: Entry, Associate, Mid-Senior, Director, Executivedescription: first 500 characters of the job descriptionapplicant_count: number of applicants shownscraped_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.
Explore the scraper referenced in this article: inputs, outputs, and pricing, then run it on Apify.
GitHub Repo Intelligence: Vet Any Dependency Before You Add It
Pull stars, forks, contributors, commit recency, latest release and full README for any public GitHub repo in one call. No token required, MCP-ready for agents doing dependency checks.
Bilibili Scraper: Video, Creator and Search Data in Python
Pull Bilibili videos by keyword, URL or creator ID: titles, view and like counts, duration, author stats. Plain HTTP, no cookies, no login required.
SEEK Jobs Scraper: Australian Job Listings in Python
How to pull SEEK.com.au job listings by keyword, location, work type and salary band in Python: title, company, salary range, apply link, no login or API key.