AI startups buy through two or three people. Find those people with an industry, a company keyword and a size band, count them for free, then pull only the rows you will write to.
TL;DR
- AI startups are small, so the buying committee is two or three people. Usually a founder, a head of engineering or product, and sometimes a head of go-to-market. Target those roles, not the whole company.
- It takes about 30 minutes. Sizing the list is free. The first pull of 25 people spends about 25 of your 1,000 free records.
- Count first, then search. A free count on 2026-10-21 showed 757 mailable C-level people at 285 small US software companies that describe themselves as artificial intelligence.
Prerequisites
- A LeadOcean account and key from app.leadocean.io. The free plan has no card and 1,000 records, one-off, at 5 requests a second. Free keys get both search and enrich scopes.
- The key in your shell as
$LEADOCEAN_API_KEY. curlandjq. Optional: the hosted MCP server athttps://api.leadocean.io/mcpif you work from an AI assistant. The count tools are free there too.
export LEADOCEAN_API_KEY="paste-your-key-here"Step 1: Decide who buys inside a small AI company
A 20-person AI startup has no procurement team. One person signs, one person vetoes, and one person feels the pain. Name the roles before you touch a filter.
| Role | Why they matter | Filter to use |
|---|---|---|
| Founder or CEO | Holds the budget and signs | jobLevel: ["C-Team"] |
| CTO or Head of Engineering | Vetoes anything that touches the stack | jobFunction: ["Engineering"], jobLevel: ["C-Team", "VP", "Director"] |
| Head of Product | Owns the roadmap you want to fit into | title: ["Head of Product", "VP Product"] |
| Head of Growth or Sales | Owns pipeline and the tooling budget | jobFunction: ["Sales & Business Development"] |
Pick one role for the first list. Mixing all four in one email sequence makes the message vague. Selling developer tooling? Start with the CTO. Selling go-to-market tooling? Start with the founder, since at this size the founder is also the head of sales.
Step 2: Find the right filter values
Industry and size values are exact strings. Guessing returns empty results. Look them up first. These calls are free.
curl -s "https://api.leadocean.io/v1/enums/industry?q=software" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq '.data.values'Through MCP, ask for leadocean_list_enum_values with name: "industry" and q: "software". "AI" is not an industry label in LeadOcean. Most AI startups are filed under Software Development or Technology; Information and Internet. So combine an industry with a company keyword. The keyword matches the company description, specialties, tags or name.
Use these four.
industry: ["Software Development"]companyKeywords: ["artificial intelligence"]employeeRange: ["11-50"](valid ranges include 1-10, 11-50, 51-200).hqCountry: ["US"](ISO two-letter codes).
Run the keyword as a phrase list. Several values OR together, so add "machine learning" or "generative AI" to widen it. Each phrase must have all its words present in the company text.
Step 3: Size the list for free
Never pull before you count. Send count=true as a query parameter with limit 1. The count comes back in meta.total and costs nothing.
curl -s -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"],
"companyKeywords": ["artificial intelligence"],
"employeeRange": ["11-50"],
"hqCountry": ["US"],
"jobLevel": ["C-Team"],
"limit": 1
}' | jq '.meta'If you use an AI assistant, the same filters work in leadocean_count_leads. Use leadocean_count_companies to count the companies alone. The company count is exact and carries a breakdown by HQ state.
The count is a size check, not a promise. A person count with default settings covers addresses worth sending to (verified, catch_all_valid or catch_all). Say that when you report it.
Step 4: Narrow to a list you can write to
A list of 757 is still too big to personalise. Cut it by one signal that your message can use.
- Location. The company breakdown below put 244 of 792 companies in California and 78 in Texas. A local angle (a meetup, a time zone) beats a generic one.
- Headcount. Move from
11-50to51-200for companies that have a budget line. - Technology. Add
technologyCategories: ["Artificial Intelligence"]to keep companies whose site shows AI tooling. That covers the roughly 7.8M crawled sites, not every company. - Funding. Funding filters narrow the list further at search time, but free counts do not support them. Count without funding, then add
fundingTypein the search and watchmeta.totalfall.
Count again after each cut. Stop when the list is a size one person can write to in a week. For a cold email run, 200 to 500 people per message is a sane ceiling.
Step 5: Pull the first 25 rows
Now spend records. Drop count=true, set limit to 25 and read the rows before you scale.
curl -s -X POST "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"industry": ["Software Development"],
"companyKeywords": ["artificial intelligence"],
"employeeRange": ["11-50"],
"hqCountry": ["US"],
"jobLevel": ["C-Team"],
"limit": 25
}' | jq '.meta, .data[0]'Each person returned costs one record. Page with the cursor from meta for the next 25. One search pages to 10,000 rows, so narrow the filters rather than walking the index.
To get an email for someone you picked, enrich by person_id. A person we hold nothing for is a 404 and costs nothing.
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}'Enrich also returns career history: past roles, education and certifications. Past employers carry no company_id yet. Use it to find a real opener, such as a shared former employer.
Step 6: Match the message to the role
Short messages win at this size. Write three lines: why them, what you do, one question.
- Founder. Lead with speed. "You are probably the one doing outbound yourself. Here is how to fill a list in an afternoon."
- CTO. Lead with the stack. Name the API, the integration or the failure you remove. Skip the pitch.
- Head of product. Lead with the user problem you solve, in their terms.
- All roles. Do not open with "I saw you raised." Say what you saw on their site or in their role history.
Read email_status before sending. LeadOcean gives no refund or credit-back for bounced emails, so filter to verified rows first.
What you get
Two free counts, run through the LeadOcean MCP tools on 2026-10-21. Both spent 0 records.
People count: industry Software Development, companyKeywords artificial intelligence, employeeRange 11-50, hqCountry US, jobLevel C-Team. Mailable (verified, catch_all_valid or catch_all) by default.
{
"total": 757,
"totalIsExact": true,
"totalAll": 2086,
"distinctCompanies": 285,
"credits": 0
}Company count (leadocean_count_companies): the same industry, size and country filters, with the phrase passed as keywords, the company-side name for the same text match.
{
"total": 792,
"totalIsExact": true,
"facets": {
"hq_state": [
{"value": "California", "count": 244},
{"value": "Texas", "count": 78},
{"value": "New York", "count": 65}
]
},
"credits": 0
}Read it this way: 792 companies match, 285 of them have a mailable C-level contact, and the 757 people span those 285 employers. totalAll of 2,086 is the same filters with no email condition.
A person row from Step 5 looks like this. It is the response shape from the API reference, with placeholder values.
{
"profile_data": {
"profile_full_name": "Jane Doe",
"profile_headline": "Co-founder and CEO at Acme"
},
"contact_data": {
"has_email": true,
"email_status": "verified",
"contact_current_experiences": [{
"job_title": "Co-founder and CEO",
"company_name": "Acme",
"company_domain": "acme.com"
}]
}
}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 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Honour the Retry-After header and slow the loop |
| 402 | Out of records (the Free plan has 1,000, one-off) | Spend fewer per list, or move to Solo at $97 a month |
| Empty results | A bad enum value, such as "AI" as an industry | Look values up with GET /v1/enums/industry?q=... or leadocean_list_enum_values |
meta.depthCapped is true | One search reached its 10,000-row depth | Narrow the filters and run a second search |
| Export refused | Over 50,000 rows a request or 500,000 a day, or Free plan | Split the export. Bulk CSV export is not on Free |
FAQ
Who should I contact first at an AI startup?
The founder, if the company has fewer than 50 people. At that size the founder owns budget, roadmap and often sales. Add the head of engineering when your product touches the stack.
Can LeadOcean tell me which companies are AI companies?
It matches the words in each company's description, specialties, tags and name, through companyKeywords. That finds companies that describe themselves as AI. It will miss some and include some that only use the word once. Spot-check the first 25 rows.
Is the count exact?
The count is exact for the filters it accepts, and it reports totalIsExact. A person count defaults to mailable addresses only. Funding, revenue and HQ city filters are not supported in free person counts, so size without them.
How many records does a list cost?
One record per person or company you receive. Counts, empty pages and enrichments that find nothing cost nothing. See pricing for the paid plans. Solo is $97 a month for one person. Agency is $497 a month for teams.
What else should I read?
Size your AI startup list for free, then pull the first 25 people
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →