TL;DR
Three points.
- Developer tools sell to a committee, not a person. An engineering leader picks, a developer champions, a platform or security lead vetoes, and finance or a founder signs. Pick one of them per list.
- It takes about 35 minutes. Sizing 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 113 mailable VP and C-level engineering people at 58 US software companies. Those companies have 51 to 200 staff and describe themselves as developer tools, platforms or APIs.
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. Its count tools are free.
export LEADOCEAN_API_KEY="paste-your-key-here"Step 1: Map the buying committee
Developer tools are bought bottom-up and signed top-down. Name each role before you touch a filter, because each one needs a different message.
| Role | What they do in the deal | Filter to use |
|---|---|---|
| Developer or tech lead | Tries it first, becomes the champion | jobFunction: ["Engineering"], jobLevel: ["Manager", "Staff"] |
| Engineering manager or director | Owns the team's tooling and the roadmap | jobFunction: ["Engineering"], jobLevel: ["Director", "Manager"] |
| VP Engineering or CTO | Approves spend and vetoes anything that touches the stack | jobFunction: ["Engineering"], jobLevel: ["VP", "C-Team"] |
| Platform, DevOps or security lead | Blocks on access, data and uptime | title: ["Head of Platform", "Head of DevOps", "CISO"] |
| Founder or CEO | Signs when the company is small | jobLevel: ["C-Team"] |
Do not mix all five in one sequence. Pick one role for the first list. Selling a seat-based tool to teams? Start with the engineering manager. Selling infrastructure with a security review? Start with the VP Engineering or CTO and name the platform lead in the follow-up.
Step 2: Find the filter values
Industry, size and job 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 -r '.data.values[]'Through MCP, call leadocean_list_enum_values with name: "industry" and q: "software". On 2026-10-21 it returned seven values. They include Computer Software, Embedded Software Products, IT System Custom Software Development and Software Development.
"Developer tools" is not an industry label. Most developer-tool companies sit under Software Development, so combine that industry with a company keyword. The keyword matches the company description, specialties, tags or name.
Use these filters.
industry: ["Software Development"]companyKeywords: ["developer tools", "developer platform", "API"]. Several values OR together.employeeRange: ["51-200"]. Valid ranges include 11-50, 51-200 and larger bands.hqCountry: ["US"](ISO two-letter codes).
For a second angle, filter on what a company runs. technologyCategories: ["Development"] keeps companies whose own site shows development tooling. The category is detected from site crawls, so it covers about 7.8M sites, not every company.
Pick the industry by what the buyer does, not by what you sell. A cloud security vendor may want Data Security Software Products alongside Software Development. A tool for embedded teams may want Embedded Software Products. Run one count per industry value and compare. Counts cost nothing, so there is no reason to guess.
Check job values the same way. jobLevel takes C-Team, VP, Director, Manager, Staff or Other. Seniority uses lowercase values such as c_suite and vp. Mixing the two styles is the most common reason a first count comes back at zero.
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": ["developer tools", "developer platform", "API"],
"employeeRange": ["51-200"],
"hqCountry": ["US"],
"jobFunction": ["Engineering"],
"jobLevel": ["VP", "C-Team"],
"limit": 1
}' | jq '.meta'In an AI assistant, the same filters work in leadocean_count_leads. The response also carries distinctCompanies, which tells you how many employers the people span.
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 so when you report it.
Step 4: Narrow to a list you can write to
Cut the list by one signal your message can use, then count again.
- Seniority. Swap
["VP", "C-Team"]for["Director", "Manager"]to reach champions instead of approvers. The list grows, so cut something else. - Size. Move from 51-200 to 11-50 for tools a founder buys alone. Small companies have a shorter committee.
- Geography. Use
hqCountryto match a time zone, a meetup or a data-residency story. - Company count.
GET /v1/companies/countsizes the company list for free, with breakdowns by HQ state. In MCP it isleadocean_count_companies, where the keyword filter is calledkeywords. Use it to see where the companies are before you pick a region. - Funding. Funding filters narrow the list further at search time, but free counts do not support them. Count without funding, then add
fundingTypeto the search and watchmeta.totalfall.
Stop when the list is a size one person can write to in a week. For a cold email run, 100 to 300 people per message is a sane ceiling. The 113 in the example above is already there. If your list is larger, cut by size first, then by role, and count again after each cut.
Also check where the people are, not only the companies. The facet on the example count below showed 69 of the 113 people in the US, with the rest in Poland, France, Germany and other countries. The hqCountry filter sets the company's HQ, while the person can sit in another country. If you need people in one country, add the person country filter as well.
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": ["developer tools", "developer platform", "API"],
"employeeRange": ["51-200"],
"hqCountry": ["US"],
"jobFunction": ["Engineering"],
"jobLevel": ["VP", "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. Engineers move between the same handful of companies, so a shared former employer or a stack they used before makes a real opener.
Step 6: Match the message to the role
Engineers distrust sales copy. Write three lines: what you noticed, what you do, one question. No adjectives.
- Developer or tech lead. Lead with the problem in their words. Link the docs, not a deck. Offer a free tier or a sandbox if you have one.
- Engineering manager. Lead with team time. Name the task your tool removes and how many hours it takes today.
- VP Engineering or CTO. Lead with the cost or the risk. Say what it replaces, how it integrates and who else in the stack touches it.
- Platform or security lead. Lead with access, data handling and uptime. Answer the review questions before they ask.
- All roles. Do not open with "I saw you raised." Say what you saw in their repo, docs or 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 runs through the LeadOcean MCP tools on 2026-10-21. Both spent 0 records.
People count: industry Software Development, companyKeywords developer tools, developer platform and API, employeeRange 51-200, hqCountry US, jobFunction Engineering, jobLevel VP or C-Team. Mailable (verified, catch_all_valid or catch_all) by default.
{
"total": 113,
"totalIsExact": true,
"totalAll": 198,
"distinctCompanies": 58
}Company count: the same industry, size and country, with the keyword phrases passed as keywords (the company-count name for the filter).
{
"total": 231,
"totalIsExact": true,
"facets": {
"hq_state": [
{"value": "California", "count": 86},
{"value": "New York", "count": 27},
{"value": "Massachusetts", "count": 15},
{"value": "Texas", "count": 15}
]
}
}Read it this way: 231 US developer-tool companies of 51 to 200 staff match the keywords. 113 people with a mailable address span 58 of them. totalAll of 198 is the same people filters with no email condition. Of the 113 people, 81 are C-suite and 31 are VP level.
A person row from Step 5 looks like this. It is the response shape from the API reference, with placeholder values.
{
"success": true,
"data": [
{
"profile_data": {
"profile_full_name": "Jane Doe",
"profile_headline": "VP Engineering at Acme"
},
"contact_data": {
"has_email": true,
"has_phone": false,
"email_status": "verified",
"contact_current_experiences": [
{ "company_name": "Acme", "company_domain": "acme.com", "job_title": "VP Engineering" }
]
},
"meta": { "source_ids": { "person_id": "PERSON_ID" } }
}
],
"meta": { "nextCursor": "CURSOR", "depthCapped": false }
}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 "Developer Tools" as an industry | Look values up with /v1/enums 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 a developer-tool buyer?
Start with the engineering manager or director if you sell to teams, and the VP Engineering or CTO if you sell infrastructure. Below 50 people the founder is often both. The champion can try the product, but the approver needs the cost and risk story.
Can LeadOcean tell me which companies make developer tools?
It matches the words in each company's description, specialties, tags and name, through companyKeywords. That finds companies that describe themselves that way. It will miss some and include a few that use the phrase 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 developer-tool list for free, then pull the first 25 buyers
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →