in LinkedIn API Live in production. Email, messengers & calendars next
Pricing Blog
Get API key Sign in

LinkedIn Search API

LinkedIn Search API

Two official APIs answer to the name, only one searches people, and what the account-based route returns depends on the engine that ran it.

Updated October 2026 · 15 min read

LinkedIn publishes two search APIs and neither one searches LinkedIn. People Typeahead matches names against your own Page’s followers, ten at a time, on a restricted permission. Unified Search is an iframe for applicant tracking systems on a Recruiter contract. Nothing official queries the member graph and hands back rows.

That gap is why LinkedIn search integrations run inside a LinkedIn account, and why the results look different from what people expect when they arrive. A search returns what the result card shows, and the profile behind it is a second call. That is the model gtm-api.com runs: 20,000+ LinkedIn accounts on its stack, and under 1% of them ever restricted.

How LinkedIn search works through an API

Searching LinkedIn from code takes one of two routes, and only one of them searches people. The official platform has no endpoint that runs a keyword or filter search over members. Three of its surfaces carry the word search or something close to it, and each one does something narrower: autocompleting names among a Page’s followers, showing ATS candidates next to Recruiter results, or confirming profiles a partner already holds.

The route that does search people runs inside a LinkedIn account you connect, and it behaves like the search page a person uses. A call returns one page of result cards, so a row carries what the card shows, and the full profile is a second call into enrichment. Two practical questions follow: how to describe the search, as filters or as a pasted search URL, and how far it can go, which a page ceiling and LinkedIn’s own monthly limit on search decide. The sections below take the official APIs first, then the account-based route in that order.

LinkedIn’s official search APIs

The three official surfaces are easy to mistake for each other because LinkedIn documents them in three different product areas. Laid side by side, the scope of each one is the whole story.

Surface What it actually searches Who can call it
People Typeahead API Followers of the Page making the call, by name prefix Restricted, granted to select developers
Unified Search (Recruiter System Connect) Your own ATS records, rendered next to Recruiter results ATS vendors on an RSC contract
Sales Navigator (SNAP) Matched profiles you already identify, not open search Closed to new partners
The member graph, by keyword and filters Nothing official reaches it No documented endpoint
The distinction that matters is between searching and matching. SNAP’s profile permission is described as access to endpoints that “present matched, publicly available member profile information”, which means you bring the identifiers and LinkedIn confirms them. That is a lookup wearing a search label, and it is the shape most official LinkedIn data access takes. What SNAP covers for the partners who still hold it is on Sales Navigator API.

The People Typeahead API is the closest thing LinkedIn publishes to a people search, and it exists for one job: finding someone to @mention while composing a post as a company Page. LinkedIn’s own summary says it “facilitates the discovery of members who can be mentioned in the organization page posts”, and that Page admins “can search for Page followers by keyword or vanity URL”.

Two sentences in that document close the door on every other use. The first is about reach: “Search response contains only members that are followers of the company.” So the index is not LinkedIn, it is your own follower list. The second is about access: “The People Typeahead API endpoint is restricted. This permission is granted to select developers only.” The permission is r_organization_followers, a Community Management scope whose name tells you what the endpoint really is.

The shape of the query is narrow too. Keyword search “returns up to 10 profiles matching the first few characters of first or last name”, so it is a name-prefix autocomplete with a ten-row cap. There is no title filter, no location, no industry, and no way to widen it past the people who already follow you.

Unified Search sits in a different product and answers a different question. It lets a recruiter on a Recruiter System Connect contract run one query and see candidates from their applicant tracking system next to LinkedIn’s, with keyword, location, job title, an in-ATS toggle and an open-to-work toggle. The results arrive as “a LinkedIn iframe widget” inside the ATS, which is the detail that decides whether it can help you: it renders results for a human to read, and the data it moves travels from your ATS into LinkedIn.

Searching through a connected account

With no official route to the member graph, the working answer is to run the search inside a LinkedIn account you own and connect. GTM API takes that route, and the practical consequence is that a search reaches exactly what the person behind that account would see in their browser, subject to the same platform limits.

Five of the methods on that surface are list searches: people, companies, service providers, and the Sales Navigator people and company engines. Three are neighbourhood finders that take one entity and return related ones: similar profiles, similar companies, and a company’s employees. One returns a company’s decision makers, and typeahead lookups turn a human word like a city or an industry into the id a filter needs. An account with a Recruiter seat also gets the Recruiter people search, which pages differently: 25 rows a page, up to page 40.

Every one of them is a POST under https://app.gtm-api.com/linkedin/v4/api/linkedin-scraping/, and every one of them behaves the same way about state: a search runs now, returns one live page inside the HTTP response, and stores nothing. Nothing is cached, so two identical calls a minute apart both spend a search and both re-run against LinkedIn.

Seats are a per-method requirement. The regular people, company and service-provider searches run on any connected account. The Sales Navigator pair, the decision-makers finder and the Sales Navigator typeahead all need the executing account to hold a Sales Navigator seat, because the call is driving that product directly. Whether the seat itself is worth buying is a separate question, answered on Is Sales Navigator worth it.

What a search result contains

This is where most integrations get their first surprise, and it is worth knowing before you design a schema around it. A search result is a discovery record. It carries what LinkedIn’s results page shows about a person, and the regular and Sales Navigator pages show different things.

Field People search Sales Navigator people search
ln_member_id, full_name, avatar_url Filled Filled
ln_id Filled Null
sn_id Null Filled
nickname (vanity slug) Filled Null
headline Filled Null
location Filled Filled
connection_degree Filled when the card shows a badge Filled
position, company_name Null Filled
Lead facts (company_ln_id, seniority, tenure, open_profile and more) Not in the row Filled where the lead has them

The regular result card shows a headline and a location under the name, plus a degree badge when LinkedIn prints one. It shows no structured job, so position and company_name stay null there, and the job title, if it appears at all, sits inside the headline as free text. Sales Navigator works the other way round. Its rows are read from the search page’s own answer, so they carry the current position and company, the location and the degree, then lead facts after the common fields: the company’s numeric id and industry, the About text, tenure, seniority, the Open Profile flag, a pending-invitation flag and badges such as recently hired. Sales Navigator shows no headline, so that one field is null on its rows.

The degree and the invitation flag are relative to the account that ran the search, and the degree is spelled differently by engine: 3rd+ on the regular card, 3rd or out_of_network on Sales Navigator.

What no search row carries is the rest of the profile: experience, skills and contact details. Those are a second call into enrichment, keyed on the ln_id or nickname a people-search row hands you, or the sn_id from a Sales Navigator row. What enrichment returns about a member, and what you are allowed to keep, is on LinkedIn profile data API.

That sets the order of work: filter on what the row already carries, then enrich only the rows that survive. A search page brings back a page of people for one slot of the account’s daily scraping budget, while enrichment spends a separate daily budget one profile at a time.

search, then enrich the ids it returnedbash
# 1. one live page of a people search, composed from filters
curl -X POST https://app.gtm-api.com/linkedin/v4/api/linkedin-scraping/search-people \
  -H "Authorization: Bearer $GTM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "page": 1, "filters": { "keywords": "growth marketing", "network": ["2nd"] } }'

# 2. the row carries the card: ids, name, headline, location, degree.
#    Take a row's ln_id and read the full profile.
curl -X POST https://app.gtm-api.com/linkedin/v4/api/linkedin-enrichment/person-full-profile \
  -H "Authorization: Bearer $GTM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "profile_id": "ACoAA..." }'

Filters or a search URL

The five list searches take either a pasted LinkedIn search url or a structured filters object. Same route, same parser, same cost, because the structured half composes the same LinkedIn URL and then runs the same page. Send filters when a program or an agent builds the query, send a URL when a person built it in the LinkedIn interface or the filter vocabulary cannot express what they want.

Exactly one of the two is required, and the validation is stricter than it first looks. Sending both is rejected. Sending neither is rejected. Sending a filters object whose members are all empty is rejected, and a lone false counts as empty, so a single "hiring_on_linkedin": false fails the same way an empty object does.

A misspelled filter name is not an error. On the people, company and Sales Navigator engines an unknown key is dropped before dispatch and the search runs unconstrained, so a broad result reads exactly like a filtered one and the row count looks plausible. Retired names are the exception and fail loudly with a 422. Copy member names out of the reference, and sanity-check a new filter by running it once with an absurdly narrow value to confirm the count moves.

Three filters mean something other than what the name suggests, and each one costs you a run while raising no error. On the Sales Navigator company search, annual_revenue is expressed in millions, so a 10 means ten million dollars and a wrong unit is off by a factor of a million without complaining. On the Sales Navigator people search, company_headquarters filters on where the person’s employer is headquartered rather than where the person is. And the account-activity codes carry fixed windows that are not yours to set: a senior-leadership change means the last three months, a funding event means the past twelve.

Filters that take numeric ids need those ids first, and the regular and Sales Navigator typeahead lookups run over separate id spaces. An id from the regular lookup never works on a Sales Navigator engine, and the reverse is equally true. One quirk is worth memorising because it fails quietly: the school lookup returns real school ids, but the people search has no school-id member, so those ids only reach LinkedIn inside a pasted search URL.

Paging and the limits that stop a search

Paging on the list searches runs from 1 to 100, and 100 is a hard ceiling. A page number above it is rejected outright. On the people and company engines there is no total to count against, since the field comes back null, so the loop has to be driven by the has_more flag, which goes false at page 100 whatever LinkedIn still holds. An empty page is terminal. The Sales Navigator people search is the exception: its total is LinkedIn’s own count, exact on a small search and an estimate on a large one, and has_more turns false on the page that reaches it, one page before the empty one.

Rows arrive in LinkedIn’s own order. There is no sort axis and no deduplication across pages, which means a naive loop that collects everything can hand you the same person twice. Past roughly five pages, or for anything on a schedule, a scheduled scrape suits the job better than a paging loop.

The ceiling is rarely what stops you first. LinkedIn meters regular people search with a monthly commercial-use limit, tightest on free accounts, and the people search reports it directly: a commercial_use_limit_hit boolean comes back true when the paywall has fired and the rows may be truncated. The Sales Navigator people search does not spend that limit. What it counts, who gets a higher one and when it resets is on LinkedIn search limits.

One useful asymmetry sits next to it. A typeahead lookup types into the account’s already open tab, so it loads no search page, spends no LinkedIn search and leaves the commercial-use limit untouched. It still costs a slot of the account’s daily budget, which the platform enforces on every action type. Those daily budgets and how an account earns a bigger one are on LinkedIn limits. The rest of the surface, from messaging to enrichment, is on LinkedIn API: the developer guide.

Frequently Asked Questions

Is there a LinkedIn search API?

There are two, and neither searches LinkedIn the way the question means. The People Typeahead API finds members to @mention in a Page post, and its response contains only members that are followers of the company. Unified Search is a widget for applicant tracking systems on a Recruiter System Connect contract, rendered inside a LinkedIn iframe for a human to read. No documented endpoint queries the member graph and hands back rows.

Can I search LinkedIn profiles by keyword through an API?

Not through an official one. LinkedIn’s own keyword search on the People Typeahead API matches the first few characters of a first or last name, returns up to ten profiles, and is limited to followers of the Page making the call. An account-based API runs the search inside a LinkedIn account you connect, which is why it reaches the same results a person sees in the browser.

Does a LinkedIn search result include the job title and company?

On Sales Navigator, yes. Its search page carries the lead’s current position and company, so an account-based search returns both, along with the location, the connection degree and lead facts such as seniority and months in the role. LinkedIn’s regular people search shows no structured job on its result card, only a headline, a location and usually a degree badge, so position and company come back null there and the job title, if it appears at all, sits inside the headline as free text. Experience, skills and contact details are on neither page and take a second call to enrichment, keyed on the id the search returned.

Do I need a Sales Navigator seat to search through an API?

Only for the Sales Navigator methods. The regular people, company and service-provider searches run on any connected account. The Sales Navigator people and company searches, the decision-makers finder and the Sales Navigator typeahead all require the executing account to hold a seat, because the API is driving the same product a person would open. No API conjures Sales Navigator results out of a plain account.

How many pages of LinkedIn search results can I pull?

One hundred on the people, company and Sales Navigator searches (the Recruiter search stops at page 40), and a page number above it is rejected. Most engines return no total to count against, so the loop runs on the has_more flag instead. Past roughly five pages, or for anything on a schedule, a scheduled scrape suits the job better than a paging loop, and LinkedIn’s monthly commercial-use limit binds before the ceiling does on free accounts.

Sources & Further Reading

Search the way a person does, then enrich what you found.

People, company and Sales Navigator search on LinkedIn accounts you connect, filters or a pasted URL, with the ids feeding straight into enrichment. On that stack, gtm-api.com runs 20,000+ accounts with under 1% of them ever restricted. Free plan, then from $10 per account at volume.

Get your API key →

Last updated: October 2026 · Definitions and benchmarks verified at time of publication