The job in one paragraph
TAM sizing answers one question: how many buyers could you sell to if everyone said yes? Most teams answer it with a top-down analyst figure. A better B2B answer is bottom-up: define the ICP as filters, then count the people who match. LeadOcean returns that count without charging a record. You get a number tied to a filter, not a guess tied to a slide. The count covers contacts, so it tells you how many people you can reach, which is the number a sales plan needs.
The workflow
- Resolve the filter values.
GET /v1/enums(MCP:leadocean_list_enum_values). Free. Enum values are exact strings, and industry alone has 534 of them. - Count the narrowest ICP first.
POST /v1/people/search?count=truewith"limit": 1(MCP:leadocean_count_leads). Free. Sendcount=trueas a query parameter, not in the JSON body. - Widen one filter at a time. Add a second employee band, a second country, a second job level. Each run is free, so log every count with its filters and the date.
- Split the total. Run the same filters per country, per industry or per seniority to see where the market sits.
meta.totalis capped at 100,000, so split any count that hits the cap into smaller slices and add them up. - Check reach. Add
hasPhone: trueto one run and compare it with the base count. That is a reach figure, labelled by the filter you passed. - Sample before you commit.
POST /v1/people/searchwith"limit": 25returns real rows. 1 record per person returned. Read them to confirm the filters describe the people you mean. - Pull the list when you are ready.
POST /v1/exports(MCP:leadocean_export_leads) writes a CSV. 1 record per row, up to 50,000 rows per request.
curl -X POST "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{"industry":["Software Development"],"country":["US"],"employeeRange":["51-200"],"jobLevel":["VP","C-Team"],"jobFunction":["Sales & Business Development"],"limit":1}'The response has an empty data array and meta.countOnly set to true. Read the number from meta.total.
A worked example
We ran leadocean_count_leads on 1 October 2026 with these filters: industry Software Development, country US, employeeRange 51-200, jobLevel VP or C-Team, jobFunction Sales & Business Development. It returned 2,060 people. The call cost 0 records.
By default the count only includes people whose best email is verified, catch_all_valid or catch_all. So 2,060 is the count under that default, not everyone who matches the other filters.
We then added the 201-500 employee band and ran it again. The total rose to 3,449 people, also at 0 records. The second band adds 1,389 people, so it is worth including if your product fits a 500-person company.
Those two counts are an example, not your market. Run your own filters and keep the date, because the dataset is refreshed monthly.
Tools that fit
- Audience Sizer skill: describe your ICP to Claude and get the count back with a country, industry and seniority split, for 0 records.
- ICP Qualifier skill: test whether specific accounts fit before you widen the filters.
- Claude Code setup: connect the hosted MCP server at
https://api.leadocean.io/mcpand run counts from your terminal. - The Exports page in the app at app.leadocean.io: filter builder, column picker and the record price before you start. It has no workflow builder, so the sizing log lives in your own sheet.
- List building: the next step once the number looks right.
For the method behind the number, read how to size a TAM and how to source TAM data. To check your own figures against a calculator, use the TAM calculator.
Pitfalls
- Stale data. The dataset is refreshed monthly, and each record carries its own
fetched_atdate. A TAM is a snapshot. Re-run your counts each quarter and date every figure you put in a deck. - Catch-all emails. The default count includes
catch_alladdresses, which accept any mail, so a send can still bounce. There is no refund for bounces. To size the safest slice, passemailStatusas["verified"]and label the number that way. - Rate limits. The limit is 100 requests per second per key, on every plan. A sweep of per-country counts will not reach it, but a 429 is never metered. Back off and retry.
- Enum strings. Filter values are exact strings: jobLevel is
C-Team,VPorDirector, and seniority is lowercase, such asc_suite. A wrong string returns a smaller number, not an error. Resolve values first.
FAQ
Does a count call spend records?
No. count_leads and search with count=true and limit=1 cost nothing. A normal search costs 1 record per person returned.
Does the count cover companies or people?
People. The count tells you how many contacts match a filter set. It is the figure a sales plan needs, but it is not a count of distinct companies.
How exact is the number?
The call reports totalIsExact. When it is false, counting stopped at the 100,000 cap and the total is a floor. Split the filters into smaller slices to get exact figures.
How much does it cost to size a market?
Sizing is free on both plans. Free gives you 1,000 records once, with no card, for the sample and export steps. Pro is $499 a month, flat, inside fair use. See pricing.
Size your market free, then pull the list
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →