You can size a startup cohort for free and only spend records on the people you will actually contact. This guide does that for small US AI companies founded in 2022 and 2023, the age of a Y Combinator W23 batch.
LeadOcean has no Y Combinator batch field. Say so up front: you approximate a batch with founding year, headcount and keywords, then check the list against the public batch directory.
TL;DR
- Takes about 20 minutes. Sizing costs 0 records, because company counts are free.
- Pulling a 100-row sample of founders spends about 100 records, which fits inside the Free plan's 1,000.
- The result is a sized cohort, a breakdown by state and industry, a comparison with the cohort before it, and a list of founders.
Prerequisites
- A LeadOcean account. The Free plan gives 1,000 records for life, no card, 5 requests a second.
- An API key stored as
$LEADOCEAN_API_KEY. curlandjq. The same filters work in the MCP toolleadocean_count_companiesif you use Claude.
export LEADOCEAN_API_KEY="paste-your-key-here"Step 1: Size the cohort (free)
Start with a count, not a search. GET /v1/companies/count takes the company-search filters and returns an exact total with breakdowns. It spends nothing. Array filters go in one parameter, comma-separated.
curl -s -G "https://api.leadocean.io/v1/companies/count" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
--data-urlencode "keywords=artificial intelligence" \
--data-urlencode "minFounded=2022" \
--data-urlencode "maxFounded=2023" \
--data-urlencode "employeeRange=1-10,11-50" \
--data-urlencode "hqCountry=US" \
| jq '.data.total'If a filter cannot be applied, the response names it in meta.unsupportedFilters and returns total as null. A wrong number never comes back as a right one.
Step 2: Read the breakdown
The same call returns counts by industry, headcount band, HQ country, HQ state and NAICS code. Read them before you pull anything. They tell you where the cohort actually sits.
curl -s -G "https://api.leadocean.io/v1/companies/count" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
--data-urlencode "keywords=artificial intelligence" \
--data-urlencode "minFounded=2022" --data-urlencode "maxFounded=2023" \
--data-urlencode "employeeRange=1-10,11-50" \
--data-urlencode "hqCountry=US" \
| jq '.data.facets.hq_state[:5], .data.facets.industry[:6]'Two checks matter. If one state or industry dominates, your keyword is catching a different kind of company. If the 1-10 band is most of the total, expect thin data per company, so plan to enrich later.
Step 3: Narrow until the cohort is a list you could act on
A 3,000-row cohort is a market map. A list you contact is smaller. Add filters and count again. Each count is free, so iterate.
curl -s -G "https://api.leadocean.io/v1/companies/count" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
--data-urlencode "keywords=artificial intelligence" \
--data-urlencode "minFounded=2022" \
--data-urlencode "maxFounded=2023" \
--data-urlencode "employeeRange=1-10,11-50" \
--data-urlencode "hqCountry=US" \
--data-urlencode "hasMailableContacts=true" \
| jq '.data.total'hasMailableContacts=true keeps only companies with at least one person whose best email is verified, catch_all_valid or catch_all. Use it when the output is for outreach. Leave it off for pure market analysis. Add hqState=California to cut by state.
Step 4: Compare with the cohort before it
One number is a size. Two numbers are an analysis. Run the same filters on companies founded in 2020 and 2021, then compare the totals and the mix.
for years in "2020 2021" "2022 2023"; do
set -- $years
curl -s -G "https://api.leadocean.io/v1/companies/count" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
--data-urlencode "keywords=artificial intelligence" \
--data-urlencode "minFounded=$1" --data-urlencode "maxFounded=$2" \
--data-urlencode "employeeRange=1-10,11-50" \
--data-urlencode "hqCountry=US" \
| jq -c --arg y "$1-$2" '{years: $y, total: .data.total, top: .data.facets.industry[:3]}'
sleep 0.3
doneBoth calls are free. Keep the filters identical except the years, or the comparison means nothing.
Step 5: Pull the people at the cohort
Now spend records. People search takes a flat JSON body, filters are arrays, and limit runs 1 to 100. Fetch a 100-row sample of founders first.
curl -s -X POST "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"companyKeywords": ["artificial intelligence"],
"minFounded": 2022,
"maxFounded": 2023,
"employeeRange": ["1-10", "11-50"],
"hqCountry": ["US"],
"seniority": ["founder", "c_suite"],
"limit": 100
}' | jq '.meta.nextCursor, [.data[] | {name: .profile_data.profile_full_name, person_id: .meta.source_ids.person_id}]'Page with meta.nextCursor, passed back as the cursor. One search pages to 10,000 rows. If meta.depthCapped is true, narrow the filters instead of walking further.
A search row has flags such as has_email but no address. To get one person's contact details, enrich by person_id. It costs one record. There is no name-plus-domain lookup.
curl -s -X POST "https://api.leadocean.io/v1/people/enrich" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"person_id": "PERSON_ID_FROM_SEARCH", "reveal_email": true}'Step 6: Export the list
For more than a sample, export. POST /v1/exports takes the people-search filters under filters, up to 50,000 rows a request and 500,000 a day. Each row costs one record. Bulk CSV export is not on Free, so this step needs Solo ($97 a month) or higher. On Free, page the search instead.
curl -s -X POST "https://api.leadocean.io/v1/exports" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "AI startups 2022-2023 founders",
"filters": {
"companyKeywords": ["artificial intelligence"],
"minFounded": 2022,
"maxFounded": 2023,
"employeeRange": ["1-10", "11-50"],
"hqCountry": ["US"],
"seniority": ["founder"]
},
"limit": 1000,
"preset": "full"
}' | jq '.data | {id, status, estimatedTotal}'Poll GET /v1/exports/{id}, then download from GET /v1/exports/{id}/download when the status is done. You can also build the same export in the app at app.leadocean.io: filter builder, column picker, a record price preview, then CSV download.
What you get
Step 1 as a live free MCP call on 2026-10-21 (leadocean_count_companies, keywords "artificial intelligence", founded 2022 to 2023, 1-10 and 11-50 employees, HQ US). It spent 0 records. The breakdown lists are cut to the top rows.
{
"total": 3613,
"totalIsExact": true,
"facets": {
"employee_range": [
{ "value": "1-10", "count": 3159 },
{ "value": "11-50", "count": 454 }
],
"hq_state": [
{ "value": "California", "count": 700 },
{ "value": "Texas", "count": 326 },
{ "value": "New York", "count": 306 },
{ "value": "Florida", "count": 297 },
{ "value": "Delaware", "count": 140 }
],
"industry": [
{ "value": "Technology; Information and Internet", "count": 704 },
{ "value": "Software Development", "count": 509 },
{ "value": "IT Services and IT Consulting", "count": 408 },
{ "value": "Business Consulting and Services", "count": 266 },
{ "value": "Technology; Information and Media", "count": 178 },
{ "value": "Marketing Services", "count": 128 }
]
},
"unsupportedFilters": []
}Read it honestly. 3,613 is every US company that matches the keyword, age and size, not a YC batch. California is the largest state at 700, but Texas, New York and Florida together hold more. Business consulting and marketing services rank fourth and sixth, which tells you the keyword catches companies that merely mention AI.
The same day, the same filters with hasMailableContacts true counted 642 companies. The 2020 to 2021 cohort counted 2,428, with Software Development (381) and IT Services (380) on top instead of Technology; Information and Internet. All three calls spent 0 records.
A person-level search returns this shape (response shape from the API reference, placeholder values):
{
"success": true,
"data": [
{
"profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "Co-founder and CEO at Acme" },
"contact_data": { "has_email": true, "email_status": "verified" },
"meta": { "source_ids": { "person_id": "1234567890" } }
}
],
"meta": { "count": 1, "nextCursor": "..." }
}How to read the cohort
Counting is the analysis. Three habits keep it honest.
First, label every number by what you filtered. "3,613 US companies with the AI keyword, founded 2022 to 2023, 1 to 50 staff" is a fact. "3,613 AI startups" is a claim you cannot defend.
Second, compare a loose filter with a tight one. The gap between them is your noise. Here only 642 of 3,613 companies have someone with a mailable address, so most of the cohort is a market map, not an outreach list.
Third, compare neighbouring cohorts on the same filters. The 2022 to 2023 cohort is larger than 2020 to 2021 (3,613 against 2,428), and its top industry changed. A shift in the mix is a finding. A shift in the total alone may only mean the newer companies tag themselves with the keyword more often.
Funding stage is a common next cut, but funding filters on people counts are not reliable, so apply them at search time and not in your sizing numbers. For where to buy the data once the cohort is sized, see best B2B data providers for startups. For regional cuts, see best B2B databases for Israel. For plans that avoid long contracts, see B2B data for startups with flexible plans, and check current plans on pricing.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header. | Check $LEADOCEAN_API_KEY is exported and sent as x-api-key. |
| 429 | Requests above the plan's rate limit (5 a second on Free, 200 on Agency). | Honor Retry-After, or slow the loop. |
| 402 | The Free plan's 1,000 records are spent. | Counts stay free. Move to Solo or Agency to keep pulling. |
| Empty results | A bad enum value, such as employeeRange written as "1 to 10". | Use exact strings from GET /v1/enums, for example 1-10. |
total is null | A filter could not be applied to a count; meta.unsupportedFilters names it. | Drop it, recount, and apply it at search time. |
| 400 or 429 on export | Over 50,000 rows a request (400) or 500,000 a day (429). | Split by state, or wait for the daily reset. |
FAQ
Can LeadOcean filter by Y Combinator batch?
No. There is no batch field. Approximate a batch with founding year, headcount and keywords, then check against the public YC directory.
Does the count spend records?
No. GET /v1/companies/count, leadocean_count_companies and a search with count=true and limit=1 are free.
Why is my cohort bigger than the real batch?
A keyword matches every company that mentions it. Add hasMailableContacts, a state or a tighter headcount band, and recount.
Can an AI agent run the analysis?
Yes. Connect the hosted MCP server and ask it to size and compare cohorts with leadocean_count_companies. That tool is free, so the agent can iterate on filters without spending records.
What does a full pull cost?
One record per person returned, by search or export. On Free that comes out of the 1,000 one-off records. Solo ($97 a month) and Agency ($497 a month) have a fair-use pace instead of credits, so a cohort of a few thousand founders fits inside an ordinary month.
How fresh is the data?
The dataset is refreshed monthly, and each record carries its own fetched_at date.
Size your own startup cohort for free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →