Mapping target-account criteria to company search filters

How to build a target account list with a company search API

September 18, 2026/Enrich Layer Team·8 min read

The top search results for "how to build a target account list" all teach the same three steps:

  • Look at your best current customers and write down the industry, size, and location they have in common.
  • Add buying signals that firmographics can't show, such as software a company uses, recent funding, or hiring.
  • Stack rank the companies on how close they match, and have your sales team go after the ones at the top of the list.

Okay, now you can describe your ideal customer. But you need a real list of companies that match it, with existing customers removed and the results exportable. This blog post walks through building that list with a company search API using Enrich Layer's Company Search endpoint — from filters to pagination to a clean export.

Step 1: Write the criteria down, including the exclusions

Start with a sentence, then break it into testable parts.

US-headquartered IT services companies with 50–500 employees, excluding companies we already sell to.

That's four criteria and one exclusion. The exclusion is just as important as the filters, because if you don't exclude companies you already sell to, they'll show up in the results and waste a sales rep's time.

Every request and result below was run against the live API on 10 September 2026. Result counts are point-in-time, and yours will differ.

Step 2: Map each criterion to a filter, a check, or a gap

Each criterion has three outcomes. Either the API filters on it, or you verify it after the fact, or it isn't supported.

If a criterion isn't supported, leave it out of the query and check it later by hand. Company Search does filter on a wide spread: industry, company type, employee count, country, region, city, founding year, funding amount and date, follower count, name, domain, and description. Revenue and tech stack aren't in that set, so they become manual checks or they stay out of the list.

Step 3: Size the match before you pull it

Before retrieving anything, find out how many companies match. One small request returns a total_result_count alongside the results, which tells you whether your criteria are usable.

GET /api/v2/search/company
  ?country=US
  &industry=IT Services and IT Consulting
  &employee_count_min=50
  &employee_count_max=500
  &page_size=3
text

That returned "total_result_count": 19602 — way too big to be considered a targeted list. If the count is enormous, tighten it before you pay to page through it. If the count is zero, the filter value is probably wrong, not the data.

The industry value has to be one of theirs, not one of yours

industry is matched against a published enumerator of several hundred values. If the value isn't in the list, the API returns zero results with a 200 status. Searching industry=recruitment or industry=SaaS returns nothing, not because there are no such companies, but because neither string is in the list.

The values you want here are: IT Services and IT Consulting, Software Development, Technology, Information and Internet. The full set is published in the industry values guide. The parameter also accepts Boolean expressions, so you can widen the search:

industry=IT Services and IT Consulting || Software Development
text

There's no SaaS value in the list. If your ICP targets SaaS companies, filter on description=SaaS || "Software Development" or specialities=SaaS. Neither is exact — mark that column in your export as an approximation.

Step 4: Read a sample and know what you actually got back

A plain Company Search response gives you company profile URLs and nothing else. Here's one from the request above, untouched.

{
  "linkedin_profile_url": "https://www.linkedin.com/company/example-it-services",
  "profile": null,
  "last_updated": null
}
json

No industry, no headcount, no location — just the URL, plus next_page and total_result_count at the top level. The qualification fields aren't withheld to upsell you; they simply aren't part of a discovery response.

"Search cheaply, shortlist, then enrich" only half works, because you can't shortlist on firmographics you didn't receive. What the cheap URL-only pass is good for is the identity work like removing duplicates and suppressing accounts you already own, both of which key on the URL alone.

To inspect companies, ask for the profiles inline.

GET /api/v2/search/company
  ?country=US
  &industry=IT Services and IT Consulting
  &employee_count_min=50
  &employee_count_max=500
  &enrich_profiles=enrich
  &page_size=3
text

Now each result carries a full company record: name, industry, company_size, company_size_on_linkedin, founded_year, website, description, hq, locations, last_updated. Enriched pages are smaller by design, so this is a sampling and qualification mode, not a bulk-export mode.

When we ran this search, one of the three companies returned had "industry": "Medical Practices" — a healthcare provider in a search for IT services firms.

The API matched it because Enrich Layer infers secondary industries alongside the primary one. A company whose primary industry is Computers and Electronics Manufacturing can also be classified under Software Development, and vice versa. The industry filter matches both.

If you only want to match on a company's primary industry, use primary_industry instead:

&primary_industry=IT Services and IT Consulting
text

Re-running with that one change dropped the match from 19,602 to 8,813 companies, and the healthcare provider was gone. Switching to primary_industry fixed it in a single request.

Headcount comes back two ways, and they can disagree. Two of the enriched results carried "company_size": [11, 50] while their company_size_on_linkedin values were 57 and 93. The range is approximate. Use company_size_on_linkedin — that's the integer the filter actually matched on.

Step 5: "in the US" is not "headquartered in the US"

country, region, and city filter on companies with an office in that place, not on where the company is headquartered. If your criterion is genuinely about headquarters, the filter alone won't enforce it.

This is not hypothetical. Our refined country=US search returned a company with this headquarters record.

"hq": { "country": "FJ", "city": "Suva, Fiji", "is_hq": true, "state": null }
json

A company headquartered in Fiji, matching a United States filter, correctly — because it has a US office. So if you filter on country alone, it'll likely land in your "US target accounts" list.

The enriched record is what settles it. Every company profile carries an hq object and a locations array, and each location has an is_hq flag. Headquarters becomes a post-hoc check on the sample you pulled.

keep the company when profile.hq.country == "US"
text

Applied to our three results, that dropped the Fiji company and kept the two genuinely US-headquartered firms, both of which came back with "is_hq": true and full address detail.

Treat is_hq defensively since it's not reliably populated on every location. And for the United Kingdom the v2 response returns UK rather than the ISO GB, so a strict ISO comparison will drop British companies.

Step 6: Page until the API tells you to stop

Retrieve the rest by following the cursor. The response's next_page carries a next_token; pass that back to get the following page, and stop when next_page comes back null.

Note that when you supply a token, the query is restored from the token. Your filter parameters are no longer applied even though they must still be syntactically valid or the request fails. Don't "adjust filters while paging" and expect it to take effect (that's a new search).

There's also no sort parameter, and no ordering guarantee you can rely on. Don't treat page one as your best-fit accounts. Pull the set, then rank it yourself against your own tiering rules.

Step 7: Remove accounts you already own

Every guide tells you to merge sources, but they don't mention the consequence, which is duplicates and accounts already in your pipeline.

Both are identity problems, and both are solvable on the cheap URL-only path. The identifying part of a company's profile URL — the slug, like stripe — is your key. Parse it from linkedin_profile_url on results you already have, then exclude a known set on the next request.

&public_identifier_not_in_list=acme-corp,globex,initech
text

Export your existing customers and open opportunities from your CRM, extract the slugs, and pass them in the exclusion parameter. You're doing this yourself, the API doesn't know what's in your CRM.

For anything you intend to store, keep the durable identifier too. Slugs can change; each company record also carries an immutable internal ID, and there's a zero-credit lookup to convert a numeric ID back to the slug when you need to re-query later.

Step 8: Export only what you received

Include a reason each company is on the list and a column for what you couldn't verify.

company_url,name,primary_industry,employees,hq_country,hq_verified,record_updated,included_because,unresolved
linkedin.com/company/example-it-services,Example IT Services,IT Services and IT Consulting,93,US,true,2026-07-08,"primary_industry+headcount+HQ verified","revenue unknown; tech stack unknown"
csv

employees is company_size_on_linkedin, not the band. record_updated is the last_updated timestamp from the API. Fields like revenue and tech stack go in unresolved — the workflow didn't produce them, so they stay empty.

If you don't have a value, leave the cell empty. A guess in a data column gets treated as a fact downstream.

A filter match is not a qualified account

What you have now is an actionable list of companies narrowed down to match your firmographic criteria, with headquarters verified, existing customers removed, and open questions written down.

This list tells you which companies match your criteria. It doesn't tell you who to contact at those companies or whether they're ready to buy. Those are different workflows.

If you're weighing which operation you need in the first place — discovering a population, resolving one company you already know, or adding fields to a company you've identified — that's a different decision. And if what you actually want is a defensible number rather than a list, market sizing is its own method.

Try it on your own ICP

Take the sentence describing your ideal customer, split it into criteria, and run Step 2 — map each one to a filter, a later check, or a gap. That mapping alone usually surfaces two criteria you can't query on — before you build anything.

Then run the sizing request from Step 3 against your real numbers. Start with the quickstart and a free account.

revopslead-enrichmentapi-integrationprospecting
How to build a target account list with a company search API | Enrich Layer