LinkedIn Jobs Scraper, Bulk & Company Data — No Login, $1.5/1k avatar

LinkedIn Jobs Scraper, Bulk & Company Data — No Login, $1.5/1k

Pricing

from $1.50 / 1,000 jobs

Go to Apify Store
LinkedIn Jobs Scraper, Bulk & Company Data — No Login, $1.5/1k

LinkedIn Jobs Scraper, Bulk & Company Data — No Login, $1.5/1k

LinkedIn Jobs Scraper: search LinkedIn jobs by keywords × locations in bulk, paste search URLs or company names, get full descriptions, salary numbers, applicants and optional company profiles. No login or cookies. MCP-ready for AI agents. $1.5 per 1,000 records.

Pricing

from $1.50 / 1,000 jobs

Rating

0.0

(0)

Developer

Peter Skotte

Peter Skotte

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

24 days ago

Last modified

Features

Limited permissions

Share

LinkedIn Jobs Scraper — no login, bulk search, salary as numbers, company data

LinkedIn Jobs Scraper collects public LinkedIn job listings by keyword and location, by pasted search URL, by company, or from a list of keywords you keep in a Google Sheet. Every job comes back with the full description, seniority, employment type, industries, applicant count, salary parsed to numbers, Easy Apply vs external apply, a live check that flags closed postings, and (when LinkedIn shows one) the job poster. Turn on the company add-on and each job also carries the hiring company's website, employee count, headquarters, industry, founding year and specialties.

It uses LinkedIn's public guest endpoints. No LinkedIn account, no cookies, no login. Because the no-login path is what is used, the one thing LinkedIn does not hand out is the external "apply on company website" URL on most jobs (see Limits).

What you get

GroupFields (example values)
JobjobId "4480995445", title, jobUrl, postedAt "2026-10-19", postedText "2 days ago", location
CompanycompanyName, companyUrl, companyLogo
Detailsdescription (plain text), descriptionHtml, seniorityLevel "Mid-Senior level", employmentType "Full-time", industries
SalarysalaryText, salaryMin 143500, salaryMax 212850, salaryCurrency "USD", salaryPeriod "year" (from LinkedIn's salary field or, when written only in the text, parsed from the description)
DemandapplicantsText "Over 200 applicants", applicants 200
ApplyapplyType "EASY_APPLY" or "EXTERNAL", easyApply true/false, applyUrl (only when LinkedIn exposes it)
Benefitsbenefits — list items found under a Benefits / Perks / "What we offer" heading of the description
Job posterjobPosterName, jobPosterTitle, jobPosterProfileUrl, jobPosterPhoto — only when LinkedIn shows "Direct message the job poster"
FreshnessisLive false when the posting is closed, detailsFetched
Company add-oncompanyId, companyDescription, companySlogan, companyWebsite, companyEmployeesCount 368, companyEmployeesRange "201-500", companyIndustry, companyHeadquarters, companyAddress {street, city, region, postalCode, country}, companyType, companyFounded 2017, companySpecialties[], companyFollowers, companyEnriched
ContextsearchKeywords, searchLocation, searchUrl, scrapedAt

jobFunction is kept in the schema for old users but is always null: LinkedIn's guest pages no longer serve it.

Use cases

  1. Recruiting and sourcing. Pull every new "data engineer" posting in 20 cities each morning, with salary numbers and the poster to contact.
  2. Salary benchmarking. salaryMin / salaryMax / salaryPeriod are numbers, so you can chart pay by title and metro without text parsing.
  3. Lead generation for staffing, HR-tech and B2B sales. Companies that are hiring for a role are buying signals. The company add-on gives website, headcount and industry for each.
  4. Competitor hiring intelligence. Pass company names or URLs and get all of their open roles, with no keywords needed.
  5. Labour-market research. Count postings by skill, seniority and workplace type over time; schedule it and keep the dataset.
  6. Job boards and aggregators. Feed fresh, de-duplicated listings (with the live check) into your own board.
  7. Monitoring. "Only new jobs" mode returns just the postings not seen in earlier runs.

Input

Choose one way to say what to search; all of them can be combined.

InputWhat it does
searchUrlsLinkedIn search URLs (every filter in the URL is kept) and/or single job URLs (linkedin.com/jobs/view/...). Aliases urls, startUrls.
keywords + locationOne search. Empty {} input runs "python developer" in "Austin, Texas" so the default run returns a sample.
keywordsList × locationsBulk: every keyword is searched in every location. Alias titles.
listUrlPublic Google Sheet, CSV or text URL. First column may hold keywords, search URLs, job URLs or company URLs.
companyNames / companyIdsOnly jobs at these companies (names or company URLs are resolved to all of the company's LinkedIn ids). With no keywords, returns every job at those companies.
geoId, distanceExact LinkedIn location id and radius in miles.
postedWithinany / day / week / month (alias datePosted).
workplace, jobType, experienceOn-site / remote / hybrid; full-time ... volunteer; internship ... executive.
easyApplyEasy Apply jobs only.
titleInclude, titleExcludeKeep or drop jobs by title words (all words of any phrase must match).
splitByLocation, splitCountryBeat LinkedIn's 1,000-per-search cap by running one search per state / metro.
enrichCompanyAdd the company profile fields (paid add-on, see Pricing). Alias scrapeCompany.
fetchDetailsOn by default: opens each job for description, salary, apply type, poster. Off = search card only, faster.
maxItemsTotal jobs, default 10. limitPerSearch caps each search.
onlyNew, monitorId, skipJobIdsIncremental monitoring and de-duplication against ids you already hold.
proxyConfigurationResidential proxy (default US) is used on the platform.
{
"keywordsList": ["data analyst", "data engineer"],
"locations": ["Munich, Germany", "Berlin, Germany", "London"],
"postedWithin": "week",
"workplace": ["hybrid", "remote"],
"titleExclude": ["intern", "staff"],
"limitPerSearch": 100,
"maxItems": 500
}

Example: all jobs at certain companies, with company data

{
"companyNames": ["Stripe", "https://www.linkedin.com/company/openai"],
"enrichCompany": true,
"maxItems": 200
}

Example: paste a search URL you built on linkedin.com

{
"searchUrls": ["https://www.linkedin.com/jobs/search/?keywords=data%20analyst&geoId=103644278&f_AL=true&f_TPR=r604800"],
"maxItems": 100
}

Example: every nurse job in the US past the 1,000 cap

{ "keywords": "nurse", "location": "United States", "splitByLocation": true, "maxItems": 20000 }

Supported for splitting: US (51 states and DC), CA, GB, IE, DE, FR, NL, BE, CH, AT, ES, IT, PT, SE, NO, DK, FI, PL, IN, AU, NZ, SG, AE, BR, MX, ZA. Other countries work as a normal search.

Example: daily monitor

{ "keywordsList": ["machine learning engineer"], "location": "United States", "postedWithin": "day", "onlyNew": true, "monitorId": "ml-us" }

Schedule it daily; each run returns only postings not returned by earlier runs with the same monitorId.

Output

One dataset item per job. The Overview view shows title, company, location, salary, applicants and link; the Company profiles view shows the add-on fields. Two complete rows from real runs follow (long text trimmed for this README only).

A job with the company add-on:

{
"jobId": "4480995445",
"title": "Senior Data Analyst",
"jobUrl": "https://www.linkedin.com/jobs/view/4480995445",
"companyName": "Usercentrics",
"companyUrl": "https://de.linkedin.com/company/usercentrics",
"companyLogo": "https://media.licdn.com/dms/image/v2/D4D0BAQHwYL8YHDzAyw/company-logo_100_100/company-logo…",
"location": "Munich, Bavaria, Germany",
"postedAt": "2026-10-19",
"postedText": "2 days ago",
"salaryText": null,
"salaryMin": null,
"salaryMax": null,
"salaryCurrency": null,
"salaryPeriod": null,
"seniorityLevel": "Not Applicable",
"employmentType": "Full-time",
"jobFunction": null,
"industries": "IT Services and IT Consulting",
"applicantsText": "184 applicants",
"applicants": 184,
"description": "SHAPE THE FUTURE OF PRIVACY WITH USERCENTRICS Usercentrics is a global leader in the field of consent management platforms (CMP). We follow our company vision to build a world where user privacy enables a thriving digital ecosystem. Our mission is to provide privacy solutions that empower organizations to embrace data privacy while building trust with their users through freedom of choice. With ou … [trimmed for this README]",
"descriptionHtml": "<p>SHAPE THE FUTURE OF PRIVACY WITH USERCENTRICS&nbsp;<br></p><p>Usercentrics is a global leader in the field of consent management platforms (CMP). We follow our company vision to build a world where user privacy enables a thriving digital ecosystem. Our mission is to provide privacy solutions that … [trimmed for this README]",
"applyUrl": null,
"applyType": "EASY_APPLY",
"easyApply": true,
"benefits": null,
"jobPosterName": null,
"jobPosterTitle": null,
"jobPosterProfileUrl": null,
"jobPosterPhoto": null,
"isLive": true,
"detailsFetched": true,
"companyId": "18532079",
"companyDescription": "At Usercentrics, we believe that user privacy, consent, and preferences should be at the heart of every digital strategy. By leading the way with Privacy-Led Marketing, we empower businesses with the tools they need to build and maintain trust and transparency while respecting user choices. \n\nWe off … [trimmed]",
"companySlogan": "The Google-certified CMP empowering businesses to build trust through user privacy.",
"companyWebsite": "https://usercentrics.com/",
"companyEmployeesCount": 368,
"companyEmployeesRange": "201-500",
"companyIndustry": "Software Development",
"companyHeadquarters": "Munich, Bavaria",
"companyAddress": {
"street": "Sendlinger Straße 7",
"city": "Munich",
"region": "Bavaria",
"postalCode": "80331",
"country": "DE"
},
"companyType": "Privately Held",
"companyFounded": 2017,
"companySpecialties": [
"GDPR",
"ePrivacy",
"LegalTech",
"Adtech",
"Usercentrics",
"SaaS",
"… (27 in total)"
],
"companyFollowers": 31875,
"companyEnriched": true,
"searchKeywords": "data analyst",
"searchLocation": "Munich, Germany",
"searchUrl": "https://www.linkedin.com/jobs/search?keywords=data+analyst&location=Munich%2C+Germany",
"scrapedAt": "2026-10-21T17:32:02.901Z"
}

A job with a job poster (pasted job URL, no company add-on, so the company fields are null):

{
"jobId": "4480493778",
"title": "Data Analyst",
"jobUrl": "https://www.linkedin.com/jobs/view/4480493778",
"companyName": "I3 INFOTEK INC",
"companyUrl": "https://www.linkedin.com/company/i3infotek-inc",
"companyLogo": "https://media.licdn.com/dms/image/v2/C560BAQGO6-aVNgJ-0A/company-logo_100_100/company-logo…",
"location": "Phoenix, AZ",
"postedAt": "2026-10-20",
"postedText": "23 hours ago",
"salaryText": null,
"salaryMin": null,
"salaryMax": null,
"salaryCurrency": null,
"salaryPeriod": null,
"seniorityLevel": "Mid-Senior level",
"employmentType": "Contract",
"jobFunction": null,
"industries": "Health and Human Services and Manufacturing",
"applicantsText": "Over 200 applicants",
"applicants": 200,
"description": "Data Analysts identify, extract and mine data from designated sources, reorganize it in a format that can be easily analyzed, integrated and used by either human or machine. They develop statistical, analytical, and executive level reports, dashboards and charts that show data in a context that allows decision-makers to gain insights into the data and make informed business decisions.Knowledge of: … [trimmed for this README]",
"descriptionHtml": "<p>Data Analysts identify, extract and mine data from designated sources, reorganize it in a format that can be easily analyzed, integrated and used by either human or machine. They develop statistical, analytical, and executive level reports, dashboards and charts that show data in a context that a … [trimmed for this README]",
"applyUrl": null,
"applyType": "EASY_APPLY",
"easyApply": true,
"benefits": null,
"jobPosterName": "Aman S",
"jobPosterTitle": "Talent Acquisition Specialist (Medical / Pharma / Healthcare)",
"jobPosterProfileUrl": "https://www.linkedin.com/in/aman-s-a600b8228",
"jobPosterPhoto": "https://static.licdn.com/aero-v1/sc/h/9c8pery4andzj6ohjkjp54ma2",
"isLive": true,
"detailsFetched": true,
"companyId": null,
"companyDescription": null,
"companySlogan": null,
"companyWebsite": null,
"companyEmployeesCount": null,
"companyEmployeesRange": null,
"companyIndustry": null,
"companyHeadquarters": null,
"companyAddress": null,
"companyType": null,
"companyFounded": null,
"companySpecialties": null,
"companyFollowers": null,
"companyEnriched": false,
"searchKeywords": "data analyst",
"searchLocation": null,
"searchUrl": "https://www.linkedin.com/jobs/search/?currentJobId=4481259651&f_AL=true&f_TPR=r604800&geoId=103644278&keywords=data%20analyst&origin=JOB_SEARCH_PAGE_JOB_FILTER&refresh=true",
"scrapedAt": "2026-10-21T17:32:02.952Z"
}

A run also writes an OUTPUT record in the key-value store: records, searches, failed, companiesEnriched and a per-search summary (search, status, records, scanned). Partial results are kept if a search fails.

Pricing

Pay per event, no subscription.

EventPriceMeaning
Actor start$0.005once per run
Job$0.0015per job returned = $1.50 per 1,000 jobs
Company profile (add-on)$0.005once per unique company per run, only when enrichCompany is on; billed from the date this price takes effect

Examples: 1,000 jobs = $1.505. 1,000 jobs from 40 distinct companies with the add-on = $1.705, because the add-on is billed per company, not per job. Platform usage is included. Jobs you list in skipJobIds or skip through onlyNew are not returned and not billed.

Limits and FAQ

How many jobs per search? LinkedIn serves at most 1,000 per search (the 1,001st request returns HTTP 400). Use splitByLocation, several locations or several keywords to go beyond it.

Does it need my LinkedIn login? No. Never share a cookie with this actor.

What is missing compared with a logged-in session? The external apply URL is login-gated on most jobs (0 of 10 sampled exposed it), so applyUrl is usually null; applyType still tells you Easy Apply vs external. Structured benefit badges and employer-vs-estimate salary source are login-only; benefits is read from the description text. jobFunction is no longer served to guests.

Is "under 10 applicants" reliable? Best effort. The filter is sent, but LinkedIn's public search returned the same first page with and without it in our test, so check applicants.

Why is a job poster missing? LinkedIn shows the poster on only some jobs (2 of 15 sampled).

Why did a page return fewer jobs? LinkedIn occasionally answers a valid page with zero cards; the actor retries before treating it as the end of results.

Is scraping LinkedIn legal? The actor reads only publicly visible job postings without logging in. You are responsible for how you use the data; comply with applicable law and LinkedIn's terms for your use case, and do not use personal data (job poster names) beyond what your jurisdiction allows.

Integrations

  • API / clients. Run via the Apify API, the Python client (ApifyClient("TOKEN").actor("outstanding_vegetable/linkedin-jobs-guest-scraper").call(run_input=...)) or the JavaScript client.
  • Schedules and webhooks. Schedule daily runs with onlyNew, and send a webhook to your endpoint when a run succeeds.
  • No-code. Make, Zapier, n8n, Google Sheets and Airtable integrations work with the dataset.
  • Export. JSON, CSV, Excel, XML, RSS from the dataset.
  • AI agents. Available through the Apify MCP server, so assistants can call it as a tool.