Persona-based TAM

Build your TAM from the people inside it

Describe a persona, get a market back: deduplicated companies that employ enough people matching your filters, each carrying a matched-people count.

Trusted by the best GTM teams

Built for ICPs that start with a persona

Industry codes describe what a company filed. Its people describe what it does.

Search people, get companies

Take the exact input of People Search: job-title keywords with exclusions (wrap a title in square brackets for an exact match), LinkedIn headline matching, function, level, minimum connections, geography from city to sales region, and education. Then receive distinct employers, not individual profiles.

Combine both layers

Stack the people filters with company firmographics: industry, type, size and headcount, revenue, funding stage and amount, lead investors, keywords, NAICS and SIC codes, web traffic, ad spend, founding year and HQ. Results match your ICP and actually staff the persona.

Set a persona floor

Use people.min_per_company, from 1 to 25, to keep only companies with enough matching people: one person is an individual, five is a team.

One row per company

Every company comes back once, however many employees matched, with a matched_people count on the row. Sort by it and you have persona density for free.

From persona filters to account list

One endpoint, POST /v2/company/tam-by-people, takes the same input as People Search and turns person-level criteria into a deduplicated market.

  1. Describe the persona

    Match on job-title keywords, with exclusions for the titles you never want and square brackets for exact titles. Add LinkedIn-headline matching, job function and level, a minimum connections floor, education, and location from city up to continent or sales region.

  2. Scope the companies

    Layer firmographics on top: industry, type, size and headcount, revenue, funding, lead investors, keywords, NAICS and SIC codes, web traffic, ad spend, founding year, HQ. The people filters find the right humans; the company filters keep the right employers.

  3. Set your threshold

    Floor the matched-people count with people.min_per_company, up to 25, so only companies that staff the persona at meaningful depth make the list.

  4. Page the market

    Ask for up to 50 companies per page with max_results and walk cursor-based pages until the cursor comes back null. Each row is a full company profile (identity, industry, type, size, headcount, HQ, domain, revenue, growth) carrying its matched_people count.

The endpoint

A persona in, the companies that employ it

The TAM by People API runs people filters (job title keywords, level, function, location) and returns the distinct companies that employ enough matching people, each with a matched_people count. Usage counts one result per company returned, never per employee matched.

POST/v2/company/tam-by-people
curl -X POST https://api.blitz-api.ai/v2/company/tam-by-people \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "company": {
      "industry": {"include": ["Software Development"]},
      "employee_range": ["51-200", "201-500", "501-1000", "1001-5000", "5001-10000", "10001+"]
    },
    "people": {
      "job_title": {"include": ["Sales"]},
      "location": {"country_code": ["US"]},
      "min_per_company": 3
    },
    "max_results": 50
  }'
200 OKresults[].companyresults[].matched_peoplecursor

SEARCH & DISCOVERY

Every search endpoint shares the same filters, the same pagination, and the same response shape.

API Docs
TIER 1VP SalesTIER 2Sales DirectorTIER 3Head of GrowthTIER 3Head of Growth

Frequently asked questions

How is this different from People Search?

People Search returns individual profiles. TAM by People takes the same input and runs the same person filters, but returns the distinct companies that employ them, deduplicated, each with a matched_people count, so the output is an account list, not a contact list.

How does it compare to TAM by Jobs?

Same mechanism, different signal. TAM by Jobs reads live postings: companies trying to hire a role. TAM by People reads current employees: companies that already staffed it. Postings catch intent; people map the installed base. Plenty of teams run both and diff the lists.

How do the filters combine?

All filters combine with AND. Multiple values inside a single include list combine with OR: two industries return companies in either one, and exclude lists remove matches. Job titles match as keywords by default; wrap a value in square brackets for an exact, case-insensitive match.

What does a typical request look like?

Take 'at least 3 US-based Sales people, Software Development industry, more than 50 employees'. That is one POST to /v2/company/tam-by-people: a title keyword and a country code on the people layer, an industry and an employee range on the company layer, and people.min_per_company set to 3. The response is the deduplicated list of companies that clear the floor, each with its matched_people count.

How is usage counted?

One result per company returned, never per employee matched: a company that clears the floor counts once, however many of its people matched. max_results caps the count per request at 50 (10 by default).

How does pagination work?

Pagination is cursor-based: pass each response's cursor into the next request until it comes back null. When people.min_per_company filters heavily, a page can come back partial, so keep paging: a short page is not the end of the market, the null cursor is.

Data shouldn't be
the problem

Grab. Connect. Build.