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.
LinkedIn Post Search: Find Posts by Keyword Without Login
How to search LinkedIn posts without an account: find a post from one person, trace the author of a quote, and pull matching posts in Python.
LinkedIn Profile Scraper: Experience, Education, and Skills Without Login
Extract full LinkedIn profile data: work history, education, skills, connections, from a list of profile URLs. No LinkedIn cookies or login required.
Build a List of Funded Startups That Are Hiring on Wellfound
Turn Wellfound job listings into one row per startup with website, stage, total raised and latest round, using the Wellfound Jobs Scraper.
Compare Salary Bands in Lakhs by City and Experience on Foundit
Build a salary table for one role across Indian cities and experience bands from Foundit.in listings that publish pay, and drop the placeholder figures.