Skip to main content
search_companies is how you build and qualify an account list before you go looking for people at those accounts. It shares most of its vocabulary with search_people, so filters you learn here transfer directly.

Probe with limit: 1 before you pull a page

search_companies has no free dry run — count_only exists only on search_linkedin_profile — so run every new search once at limit: 1 before you fetch it at volume.
One record costs one search record against your fair use pool. The same query at limit: 25, walked five pages deep, costs 125 — and every filter here is exact-match, so a single wrong string spends all 125 on the wrong list. The usual culprits are all silent: a value that isn’t in the enumeration at all, "TX" instead of "Texas", a linkedin_industry label capitalised differently from the stored one, or a country filter pulling a multinational to the wrong office. Read two things off the single result before you widen:
  1. total — is the account universe the size you expected? A thin total means a filter value is off, not that the segment is empty. Try the neighbouring industry value or shorten the naics_code. total sits at the top level of the response, alongside results — not inside it. Over raw HTTP the body nests one level deeper, so the path is results.total.
  2. The record itself — does this company actually match your intent? Check domain, industry, employee_range, and location against what you asked for.
Only then re-run with a real limit and start paginating.
Search records are capped separately from enrichment records and are consumed per record returned, on a rolling 5-hour window. This matters most when chaining — a search_companies result of 25 domains, each fanned out into a search_people call at limit: 25, is 625 search records from one loop. Probe both searches at limit: 1 before running the chain. See Rate Limits.

Filters are free precision

Search cost is driven by the free-text query, not by the filters attached to it. Two rules follow. Never send a bare query. Adding industry, employee_range, or revenue_range costs nothing and sharply narrows the result set. A query-only call is the least precise shape available and no cheaper than a filtered one. Drop query entirely when filters can carry the whole intent. Most account lists are pure firmographics — “software companies with 51–200 employees and 10M10M–20M revenue” needs no free text at all, and runs much faster without it.
Reach for query only when you’re matching a company by name. Everything else belongs in a filter.
This is about execution cost, not billing. Tokens are charged per record returned regardless of query shape — a cheaper query returns faster and puts less load on search capacity, but it doesn’t change what you’re charged.

Use domain when you have one

If you know the website domain, domain is an exact match and always beats a free-text query:
Full URLs are normalised automaticallyhttps://www.acme.com/about becomes acme.com. There’s no need to strip the protocol or path first. Reach for query only when you have a name and no domain. It searches the company name only; domain and industry are keyword fields and aren’t covered by it.

Choose your industry granularity

As with people search, three filters describe industry at different resolutions: The 22 industry buckets are the complete list — anything outside it matches nothing and returns zero results silently. Several niches have no bucket of their own: insurance carriers, aerospace and defence, mining, electronics, and biotech all fall inside broader buckets. When you need one of those specifically, use linkedin_industry instead — "Insurance", "Aerospace and Defense", "Mining and Metals" and hundreds more exist there as exact labels.
naics_code matches at any hierarchy level. Use a 2-digit sector ("23" = Construction) to cast wide, a 6-digit code ("511210" = Software Publishers) to go narrow. Shortening the code is the cleanest way to widen a search that’s returning too little.

Exclude what you don’t want

Four filters remove companies instead of selecting them. Each takes a list, and each mirrors a filter you already know: exclude_domain is your suppression list. Pass the accounts you already have — existing customers, current vendors, your own company — and they never appear:
The others carve out segments you don’t sell to:
Exclude in the query, not after it. A company you exclude is never returned, so it costs you no tokens and no search records. Pulling 25 results and dropping five yourself costs you all 25.
Exclusions narrow a search — they can’t be the whole search. At least one positive input (query, domain, or a regular filter) is still required.
exclude_industry only drops companies that positively carry one of the values you list. Companies with no industry on record aren’t excluded by it, so they still come through. The same holds for the other exclusions — a missing value is not an excluded value.

Understand the location caveat

country and state filter the company’s location — but that location is derived from where the company’s team is based.
This is accurate for the small companies that dominate the index, but large multinationals are attributed to a single one of their offices. A global company headquartered in one country may resolve to another entirely. When targeting large or international companies, combine location with other filters rather than relying on it alone.
Both require exact stored values with standard capitalisation — "Texas", not "TX". Combine state with country for precision.
Every company record comes back with a city, but there is no city filter on search_companiescountry and state are the only location filters. To narrow to a city, filter on state and read city off the results. (search_people does have a city filter.)

Watch the size and revenue distributions

Both range filters are exact-match, and both have a heavily skewed distribution. employee_range"1-10" is the most common value by a wide margin. A search filtered to small bands will return a great deal; one filtered to "5001+" will return very little. These eight bands are the complete list. Older documentation mentioned "Small", "Mid-Market", "Enterprise", and "Unknown" — those are retired and now return nothing. revenue_range"$500k - $1M" is the most common band.
"Above $50M" is a flat catch-all for all revenue over 50Mthereisnofinerbandaboveit.Askingfor50M — there is no finer band above it. Asking for 100M, 1B,or1B, or 5B companies means asking for "Above $50M" and narrowing with employee_range. Bands like "$100M - $250M" and "Over $5B" appeared in older documentation and are retired: they return nothing.

Identify companies from traffic

ip_to_company resolves an IPv4 address to the domain of the organisation behind it — useful for de-anonymising website visitors and triggering account-based workflows.
This is a B2B tool. Consumer ISP addresses will typically not resolve to a named company, so expect a meaningful miss rate on general web traffic.
The most common workflow is two calls: qualify accounts, then find contacts at them.
  1. search_companies with your firmographic filters → gives you a list of domains
  2. search_people with company_domain set to each domain → gives you contacts
Run the first iteration of that loop at limit: 1 on both calls. A chain that looks right at one company per account is safe to fan out; one that isn’t costs you the whole fan-out to find that out. search_people can also filter on employee_range and revenue_range directly, applied to the person’s current employer. If firmographics are the only reason you’re calling search_companies, you can often skip it and filter in one call.

Paginate deliberately

Results are ranked by _score, so the first page is the strongest. Read the top-level total before walking pages (results.total in the raw HTTP body), then increment offset by your limit. Every page you walk draws from the same search-record pool, so confirm the search is right at limit: 1 before you commit to walking it.
total stops counting at 10,000, and pagination stops there too. A total of 10000 means at least 10,000 matches, not exactly 10,000 — don’t size a run off it. offset + limit can’t exceed 10,000 either, so no amount of paging reaches record 10,001. To pull a larger account list, split the search into narrower slices — by country, state, employee_range, or revenue_range — and walk each slice separately.

Searching for People

Find contacts at the accounts you’ve qualified.

Rate Limits

Search records are capped separately from enrichment.