LinkedIn shows job postings to anyone, even without an account. In this tutorial we'll collect job postings — with full descriptions, salary when shown, applicant count, seniority and Easy Apply flag — for several keywords and locations, filter out what we don't want, and monitor new jobs every day.
No LinkedIn account, no cookies, no risk to your profile.
Disclosure: I built the Apify Actor used below (LinkedIn Jobs Scraper). It costs $0.30 per 1,000 jobs with full details and runs on Apify's free plan.
What you get for every job
title, company, location, exact posted date, applicants, salary (when LinkedIn shows it), seniority level, employment type, industries, apply type (Easy Apply or company site), job poster (when shown), full description (text and HTML), job URL.
1. Try it without code
Open LinkedIn Jobs Scraper, click Try for free and run:
{ "keywords": ["data analyst"], "locations": ["United States"], "datePosted": "week", "maxJobsPerSearch": 100 } Or set your filters on linkedin.com/jobs, copy the URL and paste it into searchUrls.
2. Many keywords × many locations, cleaned
{ "keywords": ["python developer", "data engineer"], "locations": ["London", "Berlin", "Remote"], "workplaceTypes": ["remote", "hybrid"], "experienceLevels": ["mid-senior"], "titleMustExclude": ["intern", "principal"], "companyExclude": ["Staffing", "Recruitment"], "maxJobsPerSearch": 200 } Each keyword × location is a separate search; duplicates across searches are removed automatically.
3. From Python: daily "new jobs" report
pip install "apify-client>=3" from apify_client import ApifyClient import csv client = ApifyClient("YOUR_APIFY_TOKEN") # Apify Console → Settings → API & Integrations run = client.actor("rt-solutions/linkedin-jobs-scraper").call(run_input={ "keywords": ["machine learning engineer"], "locations": ["United States"], "postedWithinHours": 24, # only jobs posted in the last 24 hours "sortBy": "date", "maxJobsPerSearch": 300, }) jobs = list(client.dataset(run.default_dataset_id).iterate_items()) jobs = [j for j in jobs if j.get("jobId")] # skip warning rows # "Be among the first 25 applicants" is returned as 25 few_applicants = [j for j in jobs if (j.get("applicants") or 999) <= 25] with open("new_ml_jobs.csv", "w", newline="") as fh: w = csv.writer(fh) w.writerow(["title", "company", "location", "salary", "applicants", "applyType", "url"]) for j in few_applicants: w.writerow([j["title"], j["companyName"], j["location"], j.get("salary"), j.get("applicants"), j.get("applyType"), j["jobUrl"]]) print(f"{len(jobs)} new jobs, {len(few_applicants)} with 25 applicants or fewer") A job item (shortened):
{ "jobId": "4460087902", "title": "Senior Software Engineer, Payments", "companyName": "Whatnot", "location": "San Francisco, CA", "postedDate": "2026-10-28", "applicants": 200, "salary": "$155,000.00/yr - $160,000.00/yr", "seniorityLevel": "Mid-Senior level", "employmentType": "Full-time", "applyType": "external", "jobUrl": "https://www.linkedin.com/jobs/view/…" } 4. Put it on autopilot
In Apify Console: Schedules → run daily with postedWithinHours: 24, and connect the Google Sheets integration so new jobs land in a sheet every morning.
Limits worth knowing
- LinkedIn shows up to about 1,000 jobs per search. For more, use more keywords or more precise locations (cities instead of countries).
-
minSalaryis a LinkedIn filter that only works for US searches.
Cost
$0.30 per 1,000 jobs with full details (cheaper on paid plans). A daily run of ~300 jobs costs about $0.09.
Need company data for the employers you find (website, size, headcount, HQ)? See LinkedIn Company Scraper.