LinkedIn Jobs Scraper (No Login Required)
Pricing
from $0.40 / 1,000 results
LinkedIn Jobs Scraper (No Login Required)
Extract LinkedIn job listings without logging in - title, company, salary, absolute post date, logo and full description. Filter by keyword, location, radius, company, date posted, Easy Apply and applicant count, paste a LinkedIn search URL, and pull past LinkedIn's 1000-result cap.
Pricing
from $0.40 / 1,000 results
Rating
5.0
(27)
Developer
Zebu Data
Maintained by CommunityActor stats
36
Bookmarked
151
Total users
3
Monthly active users
3 hours ago
Last modified
Categories
Share
What does LinkedIn Jobs Scraper do?
This Actor extracts job postings from LinkedIn โ no login, no cookies, no LinkedIn account required. Give it a keyword and a location, or paste a LinkedIn job-search URL, and it returns clean, structured JSON with the title, company, location, salary, description and 16 more fields per job. It is a practical API alternative for anyone who needs LinkedIn hiring data on a schedule.
Why use LinkedIn Jobs Scraper?
- ๐ No login, ever. No account, no cookies, no session tokens to keep alive. Nothing to get banned.
- ๐งฑ Breaks LinkedIn's 1000-result wall. LinkedIn stops serving results after ~1000 jobs for any single query. Ask for more and this Actor automatically splits your search into several narrower queries and de-duplicates the results, so you can pull well past that ceiling in one run.
- ๐
Real dates, not "2 weeks ago". Every job carries
published_at_iso, an absolute ISO date you can actually sort and filter on โ alongside the relative string LinkedIn shows. - โก Fast mode for bulk pulls. Turn off Scrape full job details and the Actor works straight from the search results, using about a tenth of the requests. Ideal when you want thousands of job leads and will enrich the interesting ones later.
- ๐ Search by keyword, by URL, or both. Build a search from keywords and filters, or paste searches you already set up on LinkedIn โ each URL is scraped with exactly the filters it contains, SEO landing pages like
/jobs/python-developer-jobs-new-york-nyincluded. - ๐ The location you asked for. LinkedIn quietly answers place names it does not recognise, such as Deutschland, with jobs from the whole United States. This Actor checks every location and switches to LinkedIn's own suggestion (Germany), so you get the country you meant.
- ๐ฏ Honest filters. Every filter LinkedIn still supports for logged-out visitors is here โ date posted, company, search radius, Easy Apply, under 10 applicants โ and the input schema says plainly which extra filters run locally instead of on LinkedIn.
- ๐ผ๏ธ Company logos and IDs included, ready for dashboards and CRM imports.
How it compares
| This Actor | Typical LinkedIn jobs scraper | |
|---|---|---|
| LinkedIn account / cookies | Not needed | Often required |
| Past the 1000-result cap | Yes, automatic | Usually capped |
| Absolute post date | published_at_iso | Relative text only |
| Low-cost bulk mode | Yes, one toggle | Rare |
| Filters that LinkedIn dropped | Documented as unavailable | Often still advertised |
What data can you extract?
| Field | Type | Description |
|---|---|---|
job_title | string | Job title |
company_name | string | Hiring company as shown on the posting |
location | string | Job location |
published_at_iso | date | Absolute posting date, e.g. 2026-08-26 |
published_at | string | Relative posting age, e.g. 3 weeks ago |
salary_range | string | Compensation range, when the posting discloses one |
job_url | string | Canonical LinkedIn job URL |
apply_type | string | easy_apply (apply on LinkedIn) or external (apply on the employer's site) |
apply_url | string | Apply link โ populated for easy_apply only, see Tips |
company_url | string | LinkedIn company page |
company_logo | string | Company logo image URL |
company_id | string | LinkedIn company ID |
job_id | string | LinkedIn job posting ID |
applications_count | string | Applicant count text, e.g. 71 applicants |
seniority_level | string | e.g. Mid-Senior level, Entry level |
employment_type | string | e.g. Full-time, Contract |
job_function | string | e.g. Information Technology and Engineering |
industries | string | e.g. Hospitals and Health Care |
benefits | string | Benefits listed on the posting |
search_term | string | The keyword this job was found with |
description_text | string | Full job description as plain text |
description_html | string | Full job description as HTML |
With Scrape full job details turned off, the first eleven fields plus job_id and search_term are returned and the rest are left empty.
How to scrape LinkedIn jobs
- Open the Actor and go to the Input tab.
- Option 1 โ Search by keyword: type one or more keywords into Keyword(s), set a Location (or Locations for several at once), and add any filters you need: Search Radius, Posted Within, Company Name or Company ID, Easy Apply only, Under 10 applicants only.
- Option 2 โ Search by URL: paste LinkedIn job-search URLs into LinkedIn Search URL(s). Each URL keeps its own filters. Use it instead of Option 1, or together with it.
- Under Filtering & output options, set Max Results per Search (
0means everything available) and, if you want, title and company filters or Scrape full job details. - Click Start and download the results as JSON, CSV, Excel or XML from the Output tab, or pull them from the Apify API.
How much does it cost?
This Actor is priced per result: you pay for the job postings you actually receive, plus a negligible start fee. There are no charges for pages that return nothing.
Because it reads LinkedIn's public endpoints directly instead of driving a browser, it burns very little compute, which is what keeps the per-result price low. Two ways to spend less:
- Turn off Scrape full job details for bulk lead generation โ roughly a tenth of the requests per job.
- Set Max Results per Search to what you actually need instead of
0.
New Apify accounts include free monthly usage credits, so you can try a run before paying anything.
Input
Configure everything on the Input tab. There are two ways to search โ use either one, or both in the same run. All fields are optional except a keyword or a search URL.
Option 1 โ Search by keyword
These filters shape keyword searches only.
| Input | Type | Description |
|---|---|---|
| Keyword(s) | array | Job titles or search terms. One search per keyword, per location. |
| Location | string | A single city, region or country. A name LinkedIn does not recognise is switched to its own suggestion. |
| Locations (multiple) | array | Several places at once; overrides Location. |
| Geo ID | string | LinkedIn's internal location ID, more precise than a location name; overrides Location. |
| Search Radius | select | Exact location, or 5 / 10 / 25 / 50 / 100 miles. |
| Posted Within | select | Any time, Past month, Past week, Past 24 hours. |
| Easy Apply only | boolean | Only jobs you can apply to on LinkedIn. |
| Under 10 applicants only | boolean | Only jobs with fewer than 10 applicants. |
| Company Name | array | Filter by company; resolved via LinkedIn's own fuzzy company lookup. |
| Company ID | array | Filter by LinkedIn company ID โ exact, and preferred over name. |
Option 2 โ Search by URL
| Input | Type | Description |
|---|---|---|
| LinkedIn Search URL(s) | array | Searches you already set up on LinkedIn. Each URL is scraped with exactly the filters it contains. |
Filled in both options? Both are scraped, with duplicates removed. The one exception: if Keyword(s) and Location still hold the example values (Python Developer, New York), only the URLs are scraped.
Filtering & output options
These apply to both options.
| Input | Type | Description |
|---|---|---|
| Job title must contain / Skip job titles containing | array | Local title filters applied after scraping. |
| Skip these companies | array | Local company filter applied after scraping. |
| Scrape full job details | boolean | On by default. Off is much cheaper and faster. |
| Max Results per Search | integer | Per keyword and location, or per search URL. 0 means everything available. |
Output
Each job is one dataset item:
{"job_title": "Senior Python Engineer (Backend)","company_name": "Alaffia Health","location": "New York, NY","published_at_iso": "2026-08-26","published_at": "3 weeks ago","salary_range": "$180,000.00/yr - $220,000.00/yr","job_url": "https://www.linkedin.com/jobs/view/senior-python-engineer-backend-at-alaffia-health-4459355664","apply_type": "external","apply_url": "","company_url": "https://www.linkedin.com/company/alaffia-health","company_logo": "https://media.licdn.com/dms/image/v2/D4D0BAQFXRSx-aDACtg/company-logo_100_100/alaffia_health_logo","company_id": "68124272","job_id": "4459355664","applications_count": "71 applicants","seniority_level": "Mid-Senior level","employment_type": "Full-time","job_function": "Information Technology and Engineering","industries": "Hospitals and Health Care","benefits": "Medical insurance Vision insurance Dental insurance 401(k)","search_term": "Python Developer","description_text": "About Alaffia & Our Mission. Every year, U.S. health plans lose billions to improper payments and administrative waste...","description_html": "<div class=\"description__text description__text--rich\">...</div>"}
Fields that are often empty, because LinkedIn only shows them on some postings: salary_range, benefits, applications_count.
Tips
apply_urlis only filled in for Easy Apply jobs. Whenapply_typeisexternal, LinkedIn hides the employer's destination link behind a sign-in wall for logged-out visitors, so the field is left empty rather than filled with a misleading value. Usejob_urlto reach the posting.- Work mode, employment type and experience level cannot be filtered at search time. LinkedIn removed those filters from its logged-out job search, so no no-login scraper can apply them server-side.
employment_typeandseniority_levelare returned on every job, so filter them downstream. - Prefer Company ID over Company Name. LinkedIn's company lookup matches loosely. The run log always prints which company each name matched so you can catch a wrong match; if none of your names resolve, the run stops with an error instead of quietly returning every job.
- Going past 1000 results costs more requests. Splitting a search into narrower queries is how the cap is bypassed, and overlapping results are discarded after being fetched. Narrow your search where you can.
- Schedule it. Use Apify Schedules for a daily pull, and integrations to push results into Google Sheets, Slack, Zapier, Make or your own webhook.
FAQ and support
Is scraping LinkedIn jobs legal? This Actor collects only publicly available job postings โ the same pages any visitor can see without logging in. Job listings are business information published by employers, not personal data. Web scraping of public data is broadly lawful, but how you use the data is your responsibility. If you extract anything that could identify a person, you must have a lawful basis under GDPR and comparable laws. Consult a lawyer if you are unsure.
Do I need a LinkedIn account? No. That is the point of this Actor.
Why did my run return fewer jobs than Max Results? LinkedIn simply may not have that many matching postings, or your local filters removed some. Widen the keyword, the location or the radius.
Why am I getting jobs from the United States instead of my location? LinkedIn answers a place name it does not recognise with jobs from the whole United States. This Actor checks every location: when that happens, it switches to LinkedIn's own location suggestion โ Deutschland becomes Germany โ and says so in the run log. If LinkedIn has no suggestion either, the log warns you; enter the place the way LinkedIn's location box suggests it, or use Geo ID. Also make sure Geo ID is empty unless you mean it: when it is filled in, it overrides Location.
Why are some fields empty? LinkedIn does not publish salary, benefits or applicant counts on every posting. Empty means the source did not have it.
Something looks wrong. Open an issue on the Actor's Issues tab with the run ID and your input, and it will be looked at.