Advanced LinkedIn Jobs Scraper — No Cookies, Bulk, Company Data avatar

Advanced LinkedIn Jobs Scraper — No Cookies, Bulk, Company Data

Pricing

from $0.80 / 1,000 job delivereds

Go to Apify Store
Advanced LinkedIn Jobs Scraper — No Cookies, Bulk, Company Data

Advanced LinkedIn Jobs Scraper — No Cookies, Bulk, Company Data

Scrape LinkedIn jobs in bulk by title, location, company, seniority, salary, industry and posting date. Every job: full description, company card (website, size, industry, funding) and recruiter. No cookies, no 1,000-job cap, 1,000 jobs in ~30 s, free count first. $0.80 per 1,000 jobs.

Pricing

from $0.80 / 1,000 job delivereds

Rating

5.0

(1)

Developer

B2B Enrich Search

B2B Enrich Search

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Share

What does Advanced LinkedIn Jobs Scraper do?

Advanced LinkedIn Jobs Scraper turns LinkedIn job postings into structured rows: the job with its full description, the employer's company card (website, industry, headcount, country, funding) and the recruiter or hiring manager when the posting names one. Search in bulk by job title, location, company, seniority, employment type, salary, industry and posting date, then export to JSON, CSV or Excel, or read the dataset through the API.

The rows come from our own database of 50M+ postings from the last 180 days, not from a browser session on LinkedIn. There are no cookies, no login, no proxies, no CAPTCHAs and no 1,000-jobs-per-search ceiling, and a search that matches nothing costs nothing. $0.80 per 1,000 jobs, company card and recruiter card included.

At a glance

What you getOne row per job: title, description (text and HTML), location, posted date, seniority, employment type, salary, applicants, benefits, required experience, the company card and the recruiter card
Search byJob titles (boolean search allowed), locations (country, US state, city), companies, seniority, employment type, salary, industry, posting date, applicant count
Price$0.80 per 1,000 jobs delivered. Company and recruiter cards are included; empty searches and refused inputs are free
Speed1,000 jobs in about 30 seconds (measured 26 October 2026)
ScaleUp to 10,000 jobs per run in one search across all your titles and locations; free Apify plan up to 100
Free previewpreviewOnly counts the matches and breaks them down by country, seniority, type, industry, employer, title and city before you buy
Add-onsThe employer's hiring pace on every row (free), the recruiter's full profile, the employer's decision makers
LoginNo LinkedIn account, cookies or API key
Runs fromApify Console, REST API, schedules and webhooks, n8n, Make, Zapier, and MCP for AI agents

Why use a database scraper instead of a browser scraper?

  • Filters that are applied, not guessed. Since LinkedIn moved its job search to an AI mode (August 2026), live scrapers can no longer apply seniority, employment type or industry as filters and rewrite them into search text instead. Here they are columns of a database and are applied exactly. The seniority field is filled in every country, not only English-speaking ones; half to two thirds of developer postings name a level (Entry, Mid-Senior, Director …), the rest read Not Applicable (measured on backend roles in five countries, 27 October 2026).
  • No 1,000-job ceiling, no double billing. Titles, locations and companies combine into one search. A job that matches two of your titles is delivered and charged once, and the walk continues to your cap, up to 10,000 jobs.
  • Faster. 1,000 software engineer postings in the United States from the last month arrived in 29 seconds on 26 October 2026. The best-known browser-based scraper on this Store quotes about two minutes per 1,000.
  • Cheaper, with more on the row. $0.80 per 1,000 jobs against $1.00 for that scraper (price read from its Store page on 26 October 2026), with the company card and the recruiter card included.
  • Locations as you write them. UK, United Kingdom, gb and London all work. No geo ids, and no scraper reading UK as Ukraine.
  • Count first, free. previewOnly tells you how many jobs match and how they split before you spend anything.
  • Your saved input runs unchanged. jobTitles, locations, company, employmentType, experienceLevel, salary, under10Applicants, postedLimit, industryIds and maxItems keep their names and values.
  • From the job to the buyer. employerHiring adds how many roles the employer has open and how fast it posts. decisionMakers adds its founders, C-level, VPs and directors as rows of their own.

Who uses LinkedIn job data, and how?

If you areYou canStart with
A recruiter or staffing agencyWatch new openings at target accounts, see which companies are scaling a team, reach the recruiter named on the postingTitles or company, postedLimit: "24h", a daily schedule, employerHiring: true
A job board or newsletterFill the site with fresh postings and push only the new ones into your databaseTitles and a country, postedLimit: "24h", jobId as the unique key
A B2B sales teamTurn hiring into prospect lists. A company hiring for the roles your product serves is a company spending on that problem; add its decision makers in the same runTitles that match your ideal customer, excludeAgencies: true, decisionMakers: true
A market researcherMeasure demand for a role across countries and cities, benchmark the salaries employers publish, follow hiring over timepreviewOnly: true for the breakdown, then the rows with salaryOnly: true
A competitive-intelligence teamFollow how competitors hire: which roles, where, at what levelcompany with the competitors, postedLimit: "week", a weekly schedule
An AI agent builderGive an agent live job data through MCP, with a free count before any paid callThe AI agents section below

What data do you get for each job?

FieldExampleFilled
jobId, url4012345678, https://www.linkedin.com/jobs/view/4012345678/always
titleSenior Software Engineer, Paymentsalways
postedAt, validUntil, isOpen, closedAt2026-10-15T09:30:00Z, truealways; validUntil when stated
companyName, companyDomain, companyIndustry, companyEmployeeCount, companyCountryCode, companyUrlExample Corp, example.com, Software Development, 1240, USthe card is on 99% of postings
companythe full card: website, industry, headcount, HQ, founded, funding, descriptionsame
locationText, locationAustin, TX; { countryCode, region, locality, postalCode, lat, lon }always; coordinates on 57%
seniorityLevel, employmentTypeNameMid-Senior level, Full-time99%; half to two thirds of developer postings name a level (Entry, Mid-Senior, Director …), the rest read Not Applicable
industries[{ id: 4, name: "Software Development" }]99%
salaryText, salary$150K/yr - $190K/yr; { min, max, currency, period, annualMin, annualMax }13% overall; 50% in the Netherlands, 41% in China
applicants, applicantRange48, 25-50 applicantsthe count on 10%, the bucket on every posting
requiredExperienceMonths, education, benefits60, Bachelor degree, ["Medical insurance"]experience on 22%
description, descriptionHtmlthe posting text, plain and as HTMLalways, when descriptionType asks for it
recruiterName, recruiterHeadline, recruiterUrl, recruiterJane Doe, Technical Recruiter at Example Corpon the 11% of postings that name one (28% in India, 17% in the UK, 7% in the US)
recruiterProfilethe recruiter's full career profilewith recruiter: "profile", where the profile is on record
employerOpenJobs, employerJobs7d, employerJobs30d, employerJobs90d, employerLastPostedAt, employerTopTitles30d, employerHiring42, 6, 19, 41, 2026-10-21T08:00:00Z, ["Software Engineer", "Account Executive"]with employerHiring: true, where the employer has a signal on record
_type, _status, _inputjob, found, the filters and dataAsOfalways

Unknown facts are left out, never shipped as empty strings. Every row's _input.dataAsOf is the date of the newest posting in the database at the time of the run.

How to scrape LinkedIn jobs (3 steps)

  1. Enter one or more job titles and one or more locations (a country by name or code, a US state, a city), or a list of companies.
  2. Narrow with seniority, employment type, salary, industry and posting date. Set Max jobs, your spend cap. Press Start. To size the search first, tick Preview only: the count and the breakdown are free.
  3. Export the dataset as JSON, CSV or Excel, or read it through the API. Run it on a schedule with Posted in the last: 24 hours for a daily feed.

A search needs a country or a company: a job title or a city alone is not a search here.

How do I scrape LinkedIn jobs without cookies or a login?

You do not log in anywhere. The Actor reads a database of postings, so it never touches a LinkedIn account, yours or anyone's. There is nothing to authenticate, no session to keep alive and no account to put at risk.

How do I get more than 1,000 LinkedIn jobs?

Set Max jobs to the number you want, up to 10,000, or to 0 for the full 10,000. The 1,000-per-search ceiling of browser scrapers does not exist here: one search walks the database to your cap, across all your titles and locations at once.

How much does it cost to scrape LinkedIn jobs?

$0.80 per 1,000 jobs delivered ($0.0008 per job), plus the Actor start fee of $0.0002 per run.

RowPrice
Job delivered (_status: found, _type: job)$0.0008
Company card and recruiter card on the row$0, included
The employer's hiring pace on the row (employerHiring: true)$0, included
Recruiter's full profile (recruiter: "profile"), per job that carries one$0.0032
Decision maker of the employer (decisionMakers: true), per person$0.0032
Preview and breakdown rows (previewOnly)$0
Search that matches nothing, refused input, company entry that is not usable$0

maxItems is your spend cap: at the default of 100 a run costs at most $0.08 for the jobs. The decision-maker add-on is capped by decisionMakersPerCompany (default 3) per employer. Prices are the same on every Apify plan.

Input

The form has five sections: Search, Filters, People behind the job, Output and Compatibility. An agent or an API call sends the same field names as JSON:

{
"jobTitles": ["software engineer", "data engineer"],
"locations": ["United States", "California"],
"company": ["https://www.linkedin.com/company/google", "stripe.com", "Netflix"],
"maxItems": 500,
"postedLimit": "week",
"experienceLevel": ["mid-senior", "director"],
"employmentType": ["full-time"],
"industryIds": ["Software Development"],
"salary": ["120k+"],
"excludeAgencies": true,
"employerHiring": true,
"recruiter": "card",
"descriptionType": "both"
}

Search

  • jobTitles: words the title must contain, one query per line; a job matching any line is kept. A line may use boolean search: AND, OR, NOT, "exact phrase", parentheses. Up to 10.
  • locations: countries by name or two-letter code (United States, Germany, gb; UK and USA are read as the countries they name), US states (California), cities (Berlin, Austin, Texas). Any of them. A whole country next to a city elsewhere is refused rather than searched as nothing. Up to 60.
  • maxItems: jobs for the whole run (default 100, 0 = up to 10,000). Free Apify plan: up to 100.
  • previewOnly: the count and breakdown instead of the rows, free. compact: short rows for AI agents.
  • company: page URL, page slug, website domain, numeric id or company name (matched as part of the name). Up to 100. An entry that cannot be read is a free row and is left out.
  • postedLimit: any, 1h, 24h, week, month, 3months, 6months.

Filters

  • experienceLevel: internship, entry, associate, mid-senior, director, executive, not-applicable.
  • employmentType: full-time, part-time, contract, internship, temporary, volunteer, other.
  • industryIds: industry names (Software Development, Hospitals and Health Care) or numeric ids (4 for Software Development); an industry covers its sub-industries. Up to 30.
  • salary: yearly ranges, one per line: 100k+, 60k-80k, 100000-150000, in salaryCurrency (default USD). Postings without a stated salary never match. salaryOnly keeps every posting that states one.
  • under10Applicants: keeps the lowest applicant bucket, fewer than 25 applicants. The data keeps applicant counts in buckets of 25.
  • excludeAgencies: drops postings by staffing firms and job-board aggregators (by the posting's industry, and by the employer's own card: its industry and what its description says it does), and by employers with far more postings than employees (at least 200 open, or 100 posted in the last 30 days, and more than two per employee). Off by default.
  • postedLimitDate: a date instead of the window; with both, the later one wins.

People behind the job

  • recruiter: card (default, free), profile (the full career profile, $3.20 per 1,000 jobs that carry one) or none.
  • employerHiring: the employer's hiring signal on each row, free: employerOpenJobs, employerJobs7d, employerJobs30d, employerJobs90d, employerLastPostedAt, employerTopTitles30d.
  • decisionMakers, decisionMakerRoles, decisionMakersPerCompany, decisionMakerTitleKeywords: the leadership add-on, see below.

Output and compatibility

  • descriptionType: both (default), text, html or none. Same price.
  • sortBy: accepted for other scrapers' saved inputs; rows are always newest first.

Output

One row per job. The flat columns lead (what a spreadsheet reads), then the job as recorded. Values below are made up:

{
"_status": "found",
"_type": "job",
"_input": { "filters": { "title": "software engineer", "countries": ["us"] }, "dataAsOf": "2026-10-21" },
"jobId": 4012345678,
"title": "Senior Software Engineer, Payments",
"url": "https://www.linkedin.com/jobs/view/4012345678/",
"postedAt": "2026-10-15T09:30:00Z",
"companyName": "Example Corp",
"companyDomain": "example.com",
"companyIndustry": "Software Development",
"companyEmployeeCount": 1240,
"companyCountryCode": "US",
"locationText": "Austin, TX",
"countryCode": "US",
"seniorityLevel": "Mid-Senior level",
"employmentTypeName": "Full-time",
"salaryText": "$150K/yr - $190K/yr",
"applicantRange": "25-50 applicants",
"recruiterName": "Jane Doe",
"recruiterHeadline": "Technical Recruiter at Example Corp",
"recruiterUrl": "https://www.linkedin.com/in/jane-doe-example",
"employerOpenJobs": 42,
"employerJobs7d": 6,
"employerJobs30d": 19,
"employerJobs90d": 41,
"employerLastPostedAt": "2026-10-21T08:00:00Z",
"employerTopTitles30d": ["Software Engineer", "Account Executive"],
"isOpen": true,
"validUntil": "2026-11-14T09:30:00Z",
"location": { "text": "Austin, TX", "countryCode": "US", "region": "TX", "locality": "Austin" },
"seniority": { "id": 16, "name": "Mid-Senior level" },
"employmentType": { "id": 1, "name": "Full-time" },
"industries": [{ "id": 4, "name": "Software Development" }],
"salary": { "min": 150000, "max": 190000, "currency": "USD", "period": "year", "text": "$150K/yr - $190K/yr" },
"benefits": ["Medical insurance", "401(k)"],
"description": "About the role…",
"descriptionHtml": "<p>About the role…</p>",
"company": { "id": 123456, "name": "Example Corp", "domain": "example.com", "employeeCount": 1240, "industry": "Software Development", "countryCode": "US", "funding": { "hasFunding": true, "lastRoundType": "series_c" }, "hq": { "locality": "Austin, TX", "region": "TX" } },
"recruiter": { "kind": "person", "slug": "jane-doe-example", "url": "https://www.linkedin.com/in/jane-doe-example", "fullName": "Jane Doe", "headline": "Technical Recruiter at Example Corp" },
"employerHiring": { "openJobs": 42, "jobs7d": 6, "jobs30d": 19, "jobs90d": 41, "lastPostedAt": "2026-10-21T08:00:00Z", "seniorities30d": [{ "id": 16, "name": "Mid-Senior level", "count": 11 }], "countries30d": ["us"], "topTitles30d": ["Software Engineer", "Account Executive"], "asOf": "2026-10-22T00:00:00Z" }
}

The employer… columns are there when employerHiring is on. Free rows say why they are not a result: no_results (nothing matched), invalid (a company entry that could not be read), input_problem (a refused input, with the field named), no_decision_makers (an employer with nobody at the chosen roles), error (the service could not answer; nothing charged).

The Output tab has five views: Overview, Company & recruiter, Employer hiring, Decision makers and Preview & breakdown.

Decision makers: from a job to the people who hire

Turn on decisionMakers and every employer in the result is followed by its decision makers, each as a row of its own (_type: decision_maker): founders and owners, C-level, VPs and directors, ranked founder + CEO first, assistants and "Office of the CEO" staff removed, each person once per run. Each row carries fullName, jobTitle, seniority, headline, linkedinUrl, location, forJobId and forJobTitle; the email that reaches the person today rides the row when one is on record and the contact tier is on.

  • decisionMakerRoles: founder, cxo, vp, director; default all four.
  • decisionMakersPerCompany: people per employer, in rank order (default 3, maximum 25).
  • decisionMakerTitleKeywords: keep only titles containing any of these words (sales, engineering, talent). C-level acronyms (cto, coo, cfo …) match as whole words, so cto finds "Co-Founder & CTO" and not "Director".

$3.20 per 1,000 people delivered; an employer with nobody at the chosen roles is a free row. For the same list without the jobs, use Companies Hiring Now.

Migrating from another LinkedIn job scraper

Your saved input runs as it is: the field names and values are the same.

Their fieldHere
jobTitles, locations, company, employmentType, experienceLevel, salary, under10Applicants, postedLimit, industryIdssame names, same values
maxItemsper run, not per title and location
sortBy, pageaccepted and ignored: newest first, the walk pages itself
cookie, userAgent, proxynot needed
workplaceType (remote / hybrid / office), easyApply, geoIdsnot in this database: a run that sets one stops before anything is charged and names the field

The last line is deliberate. A remote-only run that silently came back with office jobs would be a wrong answer sold as a right one.

Use Advanced LinkedIn Jobs Scraper with AI agents and MCP

This Actor works as a tool for AI agents. Add it to Claude, ChatGPT, Cursor or any other MCP client through the Apify MCP server:

https://mcp.apify.com?tools=b2bsearch/linkedin-jobs-scraper

The same Actor is a tool in LangChain, CrewAI and the OpenAI Agents SDK, and a step in n8n, Make and Zapier through the Apify integrations.

What an agent should know before calling it

  • When to pick it. The user wants LinkedIn job postings by job title, location or company, in bulk, with the employer's details and the recruiter. For a database-style search with description keywords, employer size and expired postings, pick LinkedIn Jobs Database API instead. For the list of companies hiring, pick Companies Hiring Now.
  • Minimal input. jobTitles (array) plus locations (array with at least one country), or company (array). Set maxItems to what the user needs; the default is 100.
  • Count first. Send previewOnly: true to get the number of matches and their breakdown for free, then decide how many rows to buy.
  • Cost. $0.0008 per found job row; rows with any other _status are free. Cap a call with maxTotalChargeUsd in the run options.
  • Read the rows. _status is found for a job. A row that is not a result says why in _status and _error. The useful columns are flat: title, companyName, companyDomain, locationText, postedAt, seniorityLevel, employmentTypeName, salaryText, applicantRange, recruiterName, recruiterUrl, url.
  • Small rows. compact: true keeps every plain column and cuts the description to 300 characters. descriptionType: "none" drops it.
  • Fast. A small request finishes in seconds, inside one tool call.

Input an agent can send as is:

{
"jobTitles": ["software engineer"],
"locations": ["United States"],
"postedLimit": "week",
"maxItems": 25,
"compact": true
}

Example prompts

Use b2bsearch/linkedin-jobs-scraper. Count the data engineer jobs posted in Germany in the last week and show the breakdown by seniority and city (preview only), then fetch the 30 newest with their salaries.
Use b2bsearch/linkedin-jobs-scraper with company = ["stripe.com", "shopify.com", "atlassian.com"] and postedLimit = "24h". List what each company posted today and who the recruiter is.
Use b2bsearch/linkedin-jobs-scraper: account executive jobs in the United Kingdom from the last month, excludeAgencies true, employerHiring true, 100 rows. Rank the employers by how many roles they have open.
Use b2bsearch/linkedin-jobs-scraper: "head of talent" OR "talent acquisition lead" in the United States, last week, decisionMakers true with decisionMakerRoles ["founder", "cxo"]. Give me the job, the company and the two people to contact for each.

FAQ

How fresh are the jobs?

The database holds the last 180 days of postings and is reloaded after each data update, not on a clock. Every row says what the data runs to: _input.dataAsOf is the date of the newest posting in the database at the time of your run, and the preview's note repeats it. A job posted in the last hours may not be there yet. Use postedLimit or postedLimitDate on a schedule to collect what is new since your last run.

Is this a scraper or an API?

Both, in the way that matters: it returns the data a scraper would, through an Actor you can call as an API, from a database we fill and refresh ourselves. Nothing runs against LinkedIn when you press Start, which is why it is fast, needs no cookies and charges nothing for a miss.

Can I filter remote or hybrid jobs?

Not yet: the data carries no remote / hybrid flag, so workplaceType is refused rather than faked. A title search for remote finds the postings that say so in the title: about 1 in 100 US postings of the last month (27,000 of 2.5 million on 26 October 2026), so treat it as a sample, not as the remote market.

What does the employer's hiring pace tell me?

employerHiring: true puts the employer's signal on each job row: how many postings it has open now, how many it posted in the last 7, 30 and 90 days, when it last posted and which titles it posts most. An employer with 40 open roles and 20 posted this month is scaling; one with a single posting is filling a seat. It is free and comes from the same database.

Are there duplicate jobs?

Each posting is one row with its own jobId, delivered and charged once per run even when it matches several of your titles. An employer that posts the same role in several cities has several postings, as on the source; deduplicate on title + companyId for one row per role.

Does every job have a salary?

No. About one posting in seven states one (half in the Netherlands, two in five in China, one in seven in the US). salaryOnly keeps just those; salary ranges compare the stated pay in the posting's own currency.

Does every job name a recruiter?

About one in nine, and it depends on the country: 28% in India, 17% in the United Kingdom, 7% in the United States. The card is free on every such row; recruiter: "profile" adds the full career profile for $3.20 per 1,000 jobs that carry one.

Why is maxItems per run and not per title?

Because titles, locations and companies combine into one search: a job matching two of your titles is delivered and charged once, and maxItems is a spend cap you can read. Other scrapers run one search per title and location, bill the overlap twice and stop at 1,000 per search; here the walk continues to your cap, up to 10,000.

How do I get all jobs of a few companies?

Put the companies in company (page URLs, website domains, slugs or ids) and leave jobTitles empty. An employer alone is a complete search.

Am I charged when nothing is found?

No. Empty searches, unusable company entries and refused inputs are free rows with a _status and an explanation. Only found rows are charged.

Does it need cookies, a login or an API key?

No. The Actor does not sign in to any website and asks for no credentials.

NeedActor
Jobs by title, location and company, in the input names of the best-known scraperAdvanced LinkedIn Jobs Scraper (this Actor)
Database-style job search: description keywords, exclusions, employer size, expired postings, decision makersLinkedIn Jobs Database API
The companies hiring for a role, with their hiring pace and decision makersCompanies Hiring Now
Company domain → decision makersDecision Maker Email Finder by Domain
Company domain → current employeesCompany Employees
LinkedIn URL → full profileProfile Lookup
LinkedIn URL → email addresses on recordLinkedIn Email Finder
Filters → list of peoplePeople Database Search
Filters → leads with an emailB2B Leads Finder
Filters → list of companiesCompany Database Search

Free Apify plan

A run started from a free Apify plan delivers the first 100 results and stops; the run's status line says so. Any paid Apify plan lifts the cap. The rows are the same rows a paid run returns.

Feedback and reviews

How did it go? A rating in the Reviews tab of this Actor tells the next buyer what to expect; we read every word, good or bad. Got a wrong or stale row? Open the Issues tab with the run ID. Issues are public, so leave out emails, phones and names; the run ID is enough for us to find the row. We check every report, fix what is ours to fix and answer in the thread.

Disclaimer and permitted use

Independent product. This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by LinkedIn Corporation. LinkedIn® is a trademark of its owner. It is named here only to describe the kind of public job postings and profile links this Actor returns.

No platform access. This Actor does not log in to, crawl or collect pages from LinkedIn or any other service. Every answer comes from our own database of job postings and business-contact records. It never returns passwords, messages, or content from non-public accounts.

Permitted use. Business purposes only: job market research, recruiting, sales prospecting, CRM enrichment and building job feeds. You may not use this Actor or its output to:

  • stalk, harass, threaten, dox or publicly expose any person;
  • decide on anyone's eligibility for credit, employment, housing or insurance. This Actor is not a consumer reporting agency and its output is not a consumer report under the U.S. Fair Credit Reporting Act;
  • send unsolicited bulk messages, or place autodialed or prerecorded calls or texts without the consent the law requires;
  • profile people by health, religion, political opinion, sexual orientation, ethnicity or union membership;
  • build or resell a contact database from the results.

Your responsibilities. You decide what to search for and what to do with the result. You are responsible for having a lawful basis for that use and for complying with the laws that apply to you, including GDPR and UK GDPR, ePrivacy and PECR, CCPA/CPRA, CAN-SPAM, and the TCPA and Do Not Call rules. Honor every opt-out you receive.

Removal requests. To have a person's data removed, open an issue on this Actor with only the profile link. Nothing else is needed, and the record is removed from every listing.

Accuracy. Records can be incomplete or out of date. Output is provided as is. Check before you rely on it.