~ / guides / How to Scrape LinkedIn Search Results (2026)

How to Scrape LinkedIn Search Results (2026)

PN
Priya Nair
LinkedIn data engineer · about the author
the short version
  • LinkedIn has one search surface you can scrape logged-out: job search, through the guest endpoint /jobs-guest/jobs/api/seeMoreJobPostings/search. I got HTTP 200 and parseable job cards in July 2026.
  • People and company search are walled. The /search/results/people/ page serves a sign-in shell to logged-out clients and loads its results from the authenticated Voyager API, so those need a logged-in session or a scraper API.
  • Pagination differs by surface: job search pages with a start offset in steps of 25; people search pages with &page=, but a free people search is capped at about 1,000 results and throttled by a monthly commercial-use limit.
  • For people search at volume I send the query to a scraper API that returns parsed JSON rows and handles the login, proxies, and retries, so my own account never runs the job.

I ran a LinkedIn people search logged out and got a sign-in wall before a single result loaded. Then I ran a LinkedIn job search the same way and got ten clean job cards back. That split is the whole story of how to scrape LinkedIn search results: one search surface is open, the rest are walled behind a login.

This guide is what I tested in July 2026. The exact endpoints, the Python for each search type, how pagination and result caps actually work, and the managed route when you need volume. Every code sample is something I ran against live LinkedIn targets, and where a route is gated I show you the response so you can recognize it in your own logs.

Can you scrape LinkedIn search results without logging in?

You can scrape LinkedIn search results without logging in for one search type, jobs, and not for the others. Job search has an undocumented guest endpoint that returns public job cards as HTML with no session. People search and company search sit behind LinkedIn’s authwall: request /search/results/people/ while logged out and LinkedIn returns a sign-in shell instead of the results. Scrapfly’s teardown of LinkedIn puts it plainly, noting public users are completely blocked from using search.

There is no official escape hatch either. LinkedIn’s Consumer and partner APIs only return your own account data after OAuth or require approval into the LinkedIn Partner Program, so no sanctioned call hands a general developer a people-search result set. That leaves three practical routes, and which one you use is decided entirely by which search you run.

Search typeLogged-out accessWhat comes backRoute that works
Job searchYes, guest endpointPublic job cards (HTML)requests + parse
People searchNo, authwallSign-in shell, no dataLogged-in browser or API
Company searchNo, authwallSign-in shell, no dataLogged-in browser or API

The one open door is the guest jobs endpoint, so start there before touching a login.

How do you scrape LinkedIn job search results with Python?

You scrape LinkedIn job search results with Python by calling the guest jobs endpoint, which returns public job cards as HTML with no login. The URL is https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search, and it takes keywords, location, and a start offset for pagination in steps of 25. This is the cleanest search surface LinkedIn exposes, and it is the route behind most working job-search scripts.

Here is the code I ran. It fetches one page of results and parses the title, company, and location out of each card with BeautifulSoup:

import requests
from bs4 import BeautifulSoup

URL = "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search"
params = {"keywords": "growth marketing manager", "location": "United States", "start": 0}

resp = requests.get(URL, params=params, timeout=25)
print(resp.status_code)                      # -> 200

soup = BeautifulSoup(resp.text, "html.parser")
cards = soup.select("div.base-card")
for card in cards:
    title = card.select_one("h3.base-search-card__title")
    company = card.select_one("h4.base-search-card__subtitle a")
    location = card.select_one("span.job-search-card__location")
    print(
        title.get_text(strip=True) if title else "",
        "|", company.get_text(strip=True) if company else "",
        "|", location.get_text(strip=True) if location else "",
    )

When I ran this in July 2026, LinkedIn returned HTTP 200 and a page of ten job cards with real titles, companies, and locations. To page through the full result set, increment start by 25 on each call (0, 25, 50) and add a short time.sleep(2) between requests so the cadence stays human. The endpoint did not require a User-Agent in my tests, which makes it the most forgiving way to collect LinkedIn search data in Python.

The tradeoff is that it is undocumented, so LinkedIn can change the card markup or tighten access without notice, and it only covers jobs. People search has no equivalent open endpoint, which is the next problem.

How do you scrape LinkedIn people search results?

Scraping LinkedIn people search results requires a logged-in session, because the people-search page at /search/results/people/ sits behind the authwall and loads its results from LinkedIn’s internal Voyager API. Fetch that URL logged out and you get a sign-in shell with none of the result rows in it. The real data renders from /voyager/api/... calls that need a session cookie plus a CSRF token, so a bare requests call cannot reach them the way it reaches job cards.

The practical route is a real logged-in browser driven by Selenium, which loads the authenticated search page where the results render. You navigate to the people-search URL with your keywords, let it load, scroll to trigger the lazy list, then parse the result cards:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()                 # Selenium Manager fetches chromedriver
driver.get("https://www.linkedin.com/login")
driver.find_element(By.ID, "username").send_keys("you@example.com")
driver.find_element(By.ID, "password").send_keys("your_password")
driver.find_element(By.XPATH, "//button[@type='submit']").click()
time.sleep(3)

keywords = "growth marketing manager"
for page in range(1, 4):                     # pages 1-3
    url = f"https://www.linkedin.com/search/results/people/?keywords={keywords}&page={page}"
    driver.get(url)
    time.sleep(2)
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)
    cards = driver.find_elements(By.CSS_SELECTOR, "li.reusable-search__result-container")
    for card in cards:
        print(card.text.split("\n")[0])      # result name line
driver.quit()

I did not run this against a live login, because automating a personal account is the fastest way to a restriction and I will not risk a real account for a demo. The mechanics are real: the &page= parameter drives pagination on people search, and the open-source linkedin_scraper library wraps the same login-and-parse flow with Person and Company objects if you want a higher-level API. Two things bite here. The result selectors are obfuscated and change often, so a card class that works today can return blanks next month. And every request counts against your own account, which runs straight into LinkedIn’s search limits. For the full authenticated Python build, I go deeper in how to scrape LinkedIn with Python.

What are LinkedIn’s search result limits?

LinkedIn’s search result limits cap how many results a query returns and how many searches you can run, and they hit people search hardest because that is where the data is richest. Two separate limits apply, and both catch scrapers off guard.

Automation reaches both limits far faster than a human clicking through pages, so a script that looks like it is working can quietly start returning three rows per search. Job search through the guest endpoint has its own practical ceiling too, where the start offset eventually returns empty pages once the result pool runs out. Hitting these caps quickly usually means you are also tripping LinkedIn’s anti-bot layer, which is the next thing to manage.

You avoid getting blocked while scraping LinkedIn search by changing the IP reputation, the request fingerprint, and the request rate together, since LinkedIn scores all three. These are the levers that move the result, in rough order of impact:

LinkedIn’s robots.txt states plainly that automated access without express permission is prohibited and disallows the search paths for general bots, so ignoring it is part of what gets an IP flagged. The honest cost of doing all of this yourself is a standing project: a residential proxy pool, a warm logged-in session, retries on soft failures, and selector repairs every time the markup shifts. I cover the full block breakdown in my complete guide to scraping LinkedIn. Past a few thousand rows, most teams move that work off their own machines.

How do you scrape LinkedIn search results at scale without proxies?

A scraper API scrapes LinkedIn search results at scale without proxies by taking your search query and returning parsed JSON rows, with the residential proxies, the login, and the retries handled server-side. You send one authenticated request and get structured results back, with no authwall to defeat and no account of yours running the job. In my testing, ChocoData accepts a search query on its LinkedIn endpoint and returns the result rows as clean JSON.

The request is a plain GET with your search keywords and API key as query parameters:

curl "https://chocodata.com/api/v1/linkedin/search?keywords=growth+marketing+manager&api_key=$CHOCO_API_KEY"

The Python version is the same shape, and it pages through results by incrementing a page parameter, collecting each batch of rows straight into a DataFrame you can write to CSV:

import requests
import pandas as pd

CHOCO_API_KEY = "your_api_key"   # from your ChocoData dashboard

rows = []
for page in range(1, 6):                      # first five pages
    resp = requests.get(
        "https://chocodata.com/api/v1/linkedin/search",
        params={
            "keywords": "growth marketing manager",
            "page": page,
            "api_key": CHOCO_API_KEY,
        },
        timeout=60,
    )
    results = resp.json().get("data", [])
    if not results:
        break                                 # no more pages
    rows.extend(results)

df = pd.json_normalize(rows)
df.to_csv("linkedin_search.csv", index=False)
print(len(df), "search results saved")

Each call returns a page of parsed result rows without a session cookie, a CSRF token, or a proxy of your own, so the per-account daily ceiling and the commercial use limit stop being your bottleneck. The free tier covers 1,000 requests with no card, and you are billed only for successful requests. The same request shape covers the other LinkedIn objects by swapping the path: a profile scrape for expanding each result row, a company scrape, or a job scrape, each accepting a URL and returning the same JSON style.

Which method fits your LinkedIn search scrape?

The right method depends on which search you run, the volume, and how much risk you want to put on a personal account. Here is the summary I give people who ask.

If you need…UseWhy
Public job search, modest volumerequests + guest jobs endpointNo login, returned HTTP 200 in my tests, parses cleanly
A few people-search pagesSelenium + a logged-in sessionLoads the walled results, but risks your own account
People or company search at scaleScraper API (ChocoData)Login, proxies, retries, and paging handled server-side

Before you collect at volume, it is worth knowing where the legal line sits. Scraping publicly visible LinkedIn data was treated as defensible under the Computer Fraud and Abuse Act in hiQ v. LinkedIn, where the Ninth Circuit held that scraping public data likely does not violate the CFAA.

That ruling covers the statute, not the contract. LinkedIn’s User Agreement still forbids scraping with software and bots, so an account used for automation can be restricted, which is the strongest argument for keeping your own login out of the job. This is general information, not legal advice. For the wider ranking of tools that pull search rows, see my rundown of the best LinkedIn scrapers in 2026.

FAQ

Can you scrape LinkedIn search results without a LinkedIn account?

You can scrape LinkedIn job search results without a LinkedIn account, because the guest jobs endpoint returns public job cards to logged-out clients. People search and company search are different: the /search/results/people/ page serves a sign-in wall to anyone not logged in, so those results need an authenticated session or a scraper API that supplies one.

How many LinkedIn search results can you scrape per query?

A free LinkedIn account is commonly limited to about 1,000 people-search results per query, roughly 100 pages of 10, and Sales Navigator is reported around 2,500. On top of that, LinkedIn's monthly commercial use limit throttles how many searches a free account can run before it shows only a few results per query. A scraper API that rotates its own accounts and IPs is not bound by your single account's ceiling.

Why does my LinkedIn search suddenly show only a few results?

Your LinkedIn search shows only a few results because you hit the commercial use limit, LinkedIn's monthly cap on searching from a free account. Once you reach it, LinkedIn restricts each query to a handful of results until the limit resets at the start of the next month. Running searches through automation makes you reach it faster, and it is separate from an anti-bot block, which returns an error or a checkpoint instead.

Does LinkedIn have an API for search results?

LinkedIn has no public API that returns people or company search results to a general developer. The official APIs are gated behind the LinkedIn Partner Program and, for member data, the member's own OAuth consent, so there is no self-serve search endpoint. Job search is the exception in practice, reachable through LinkedIn's undocumented guest jobs endpoint, and everything else is scraped from the logged-in pages or sent to a third-party scraper API.

Can you scrape LinkedIn Sales Navigator search results?

You can scrape Sales Navigator search results, but they sit behind a paid seat and a login, so driving your own Sales Navigator session carries the most account risk under LinkedIn's User Agreement. Managed scraper APIs return the rows without you running your seat, which is why teams that pull Sales Navigator at volume usually route it through an API rather than a personal login.

PN
Priya Nair
I've built LinkedIn data pipelines for years. On linkedinscraperapi.com I run LinkedIn scraping methods against live pages and publish what actually holds up.