A SaaS deal is rarely one person's decision. The user feels the pain, a department head owns the budget, and someone in IT or finance can block it.
This guide picks that committee, finds it with LeadOcean filters, sizes the list with a free count and drafts a first line per role. It works whether you sell software to SaaS companies or to any company that runs on software.
TL;DR
- Target three roles per account: the budget owner, the champion who uses the tool and the gatekeeper in IT, security or finance.
- Size first with a free count. On 2026-10-21, US-headquartered software development companies held 262,486 mailable VPs and C-level people.
- The recipe takes about 45 minutes and spends about 30 records, so it fits inside the Free plan's 1,000.
Prerequisites
- A LeadOcean account on the Free plan. Sign up at app.leadocean.io, no card.
- An API key exported as
$LEADOCEAN_API_KEY. curlandjq, or any HTTP client.- Optional: the hosted MCP server at https://api.leadocean.io/mcp if you would rather run the counts from Claude.
Step 1: Pick the buying committee
Pick the roles before you touch a filter. The committee depends on what you sell and on the size of the account.
| You sell | Economic buyer | Champion | Gatekeeper |
|---|---|---|---|
| Sales or marketing software | CRO, VP Sales, CMO | Director of sales ops or demand gen | IT, finance |
| Developer or infrastructure tools | CTO, VP Engineering | Staff engineer, engineering manager | Security, procurement |
| HR, finance or ops software | CFO, CHRO, COO | Head of the function | IT, legal |
| Services into SaaS companies | CEO, CRO | VP Marketing or Customer Success | Finance |
Size changes the committee. At 50 people the CEO or CTO signs and uses the tool. At 500 there is a VP, a director layer and a review by IT or security.
LeadOcean files SaaS companies under several industry labels. Look up the exact strings before you use them.
for q in software; do
curl -s "https://api.leadocean.io/v1/enums/industry?q=$q" | jq -r '.data.values[]'
doneEnum values are exact strings, so SaaS is not an industry and Software Development is. The same lookup is free through the MCP tool leadocean_list_enum_values.
Step 2: Turn the committee into filters
Write the filters as flat JSON. Every filter is an array, even when it holds one value.
{
"industry": ["Software Development"],
"jobLevel": ["VP", "C-Team"],
"jobFunction": ["Sales & Business Development"],
"employeeRange": ["51-200", "201-500"],
"country": ["US"]
}That targets sales leaders at mid-size software companies. Run one list per role. A VP Sales and a head of engineering need different messages, so give them different sequences.
Add companyKeywords when the industry label is too narrow. It matches words in the employer's description, specialties and tags, so ["B2B SaaS"] finds companies filed under other labels. It applies when the matching companies number 50,000 or fewer. Check the effect with a count first.
Exclude what you cannot sell to. Use excludeTitle for ["intern", "assistant"] and excludeCompanyName for competitors and current customers.
Step 3: Split by size, function and stack
SaaS is not one market. A seed-stage startup and a 500-person company buy differently.
- Headcount. Use
employeeRange. Under 50 people the founder buys. From 51 to 500 a department head buys. Above 500, expect a review by IT and finance. - Function. Use
jobFunction:Sales & Business Development,Engineering,Information Technology,Finance & Accounting,Human Resources. - Stage. Funding stage is a useful signal, but the free count does not support the funding filters. Count without them, then apply
fundingTypeat search time, where it narrows the list further. - Stack. Use
technologiesortechnologyCategories(for exampleCRMorMarketing automation) when you sell an integration. They read what is detected on a company's website and cover about 7.8M crawled companies, so a missing match does not prove a company lacks the tool.
Count each cut before you commit. If a segment holds a few hundred people, merge it with its neighbour. A list that small cannot support its own sequence.
Step 4: Size the list with a free count
Count before you pull. A count costs no records and can run as often as you like.
curl -s "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"],
"jobLevel": ["VP", "C-Team"],
"jobFunction": ["Sales & Business Development"],
"employeeRange": ["51-200", "201-500"],
"country": ["US"],
"limit": 1
}' | jq '.meta'count=true goes in the query string. The JSON body rejects unknown fields. The response has no rows, only meta.total (capped at 100,000) and meta.countOnly: true.
For the account side, GET /v1/companies/count takes the company-search filters and returns an exact total with breakdowns by industry, headcount band, HQ country and HQ state. Use it to see where the accounts sit before you pick a region.
Step 5: Pull a 25-row test batch
Pull a small batch first. Read the titles. If half are the wrong role, tighten the filters before you spend more.
curl -s "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{
"industry": ["Software Development"],
"jobLevel": ["VP", "C-Team"],
"jobFunction": ["Sales & Business Development"],
"employeeRange": ["51-200", "201-500"],
"country": ["US"],
"limit": 25
}' > batch.json
jq '.data | length' batch.jsonA page of 25 is 25 records. Page with cursor from meta.nextCursor when you want more. One search pages to 10,000 rows, and the last page carries meta.depthCapped: true. Narrow the filters instead of walking further.
Each row carries an email status. Send to verified and catch_all_valid. Read the status before you send, because LeadOcean does not credit back bounces.
Step 6: Enrich the people you will contact
Enrich only the people you will contact. Enrich takes exactly one of linkedin_url, email, phone or person_id.
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 in resume_data: past roles, education, certifications and awards, each when held. A past role at a company you already serve is a better opener than a job title. Past employers carry no company_id yet. An enrichment that finds nothing is a 404 and costs nothing.
For a phone number, call GET /v2/people/phone. A v2 contact call costs one record even when it finds nothing.
Step 7: Write messages that fit the buyer
SaaS buyers get a lot of vendor mail. Open with a situation you can see, then ask one question.
| Buyer | Their pressure | First line angle |
|---|---|---|
| CRO or VP Sales | Pipeline coverage, rep ramp time | Name the task your product removes from a rep's week |
| CTO or VP Engineering | Roadmap load, tool sprawl | Say what it replaces or plugs into, not what it adds |
| Head of RevOps | Data quality, tool cost | Lead with the manual step you cut |
| CFO | Spend control | Offer a fixed price and a short first step |
| Founder at a small company | No time, no specialist | Offer the smallest useful first step |
Keep claims you can prove. Do not cite a customer or a result you cannot show.
Sequence by role, not by company. Send the champion a note about fit and the budget owner a note about outcome. When one replies, you can name the others at the account.
Timing and angle change by account stage. These are working rules, not measured results.
- Early-stage accounts (under 50 people). Write to the founder. Keep the email to two sentences and offer one concrete first step.
- Growth accounts (51 to 500 people). Write to the department head. Name the team's current tool category and say what you replace or connect to.
- Larger accounts (500 and up). Start with the champion, and mention security or compliance basics early. Expect the gatekeeper to join by the second week.
Run the sequence per role for four to five touches. Change the angle on each touch: situation, outcome, proof you can show, then a short close. Stop a role's sequence when anyone at the account replies, and move the rest of the committee to a manual note.
Check your list before you send. Read email_status, drop risky and unknown addresses, and suppress anyone who has opted out. A smaller list with clean addresses protects your sending domain.
A three-line email works better than a pitch.
Subject: Pipeline reports at Acme
Jane, sales teams at your size often rebuild the weekly pipeline
report by hand. We generate it from the CRM. Worth a short look,
or is reporting not on your list this quarter?The names above are placeholders. Replace them with fields from your batch.
Step 8: Export the full list
When the test batch reads right, export the rest. Bulk CSV export is not on Free; it comes with Solo at $97 a month and with Agency at $497 a month. On Free, page the search endpoint inside your 1,000 records.
curl -s -X POST "https://api.leadocean.io/v1/exports" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{
"filters": {
"industry": ["Software Development"],
"jobLevel": ["VP", "C-Team"],
"jobFunction": ["Sales & Business Development"],
"employeeRange": ["51-200", "201-500"],
"country": ["US"]
},
"limit": 5000
}'An export takes up to 50,000 rows a request and 500,000 a day. The app at app.leadocean.io has an Exports page with a filter builder, a column picker and the record price before you start.
What you get
These are free counts from the LeadOcean MCP tools on 2026-10-21. People counts include only mailable people (verified, catch_all_valid or catch_all email), not everyone.
| Filter | Count | Employers |
|---|---|---|
| Software Development, US HQ, VP or C-Team | 262,486 people | about 44,220 |
| Software Development, US, Sales & Business Development, VP or C-Team, 51 to 500 employees | 3,940 people | 2,239 |
| Software Development, US, Information Technology, VP or C-Team, 51 to 500 employees | 473 people | 367 |
| Software Development, titles Head, VP or Director of Revenue Operations, US HQ | 541 people | 478 |
| Software Development, US HQ, 51 to 500 employees (company count) | 11,577 companies | not applicable |
Without the email condition, the first filter matches 722,251 people and the second matches 8,977. The gap is people with no usable address. The employer figure in the first row is an estimate; the others are exact.
The shape of one search row follows (response shape from the API reference, placeholder values).
{
"success": true,
"data": [
{
"profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "VP Sales at Acme" },
"contact_data": { "has_email": true, "has_phone": false, "email_status": "verified" }
}
],
"meta": { "nextCursor": "CURSOR" }
}Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Re-export $LEADOCEAN_API_KEY and check the header name |
| 429 | Above the plan's rate limit (5 requests a second on Free, 200 on Agency) | Wait for Retry-After, then slow the loop |
| 402 | The 1,000 Free records are spent | Move to Solo or Agency, or narrow the pull |
| Empty results | A misspelled enum value such as SaaS as an industry | Look the value up with /v1/enums/industry or leadocean_list_enum_values |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split by country or headcount band and run several exports |
| Export rejected on Free | Bulk CSV export is not on Free | Page the search endpoint, or move to Solo |
FAQ
Is there a SaaS industry filter?
No. Use Software Development and check related labels such as Computer Software and Technology; Information and Internet. Add companyKeywords to catch SaaS companies filed elsewhere.
Does the count include people I can email?
The default count includes only people whose best email is verified, catch_all_valid or catch_all. Pass emailStatus to widen it, and label the number by what you filtered.
How many records does this guide spend?
About 30: a 25-row test batch plus a few enrichments. Counts, enum lookups and enrichments that find nothing cost no records.
Can I filter SaaS companies by funding stage?
Yes at search time with fundingType. The free count does not support it, so size the list without it and expect the real list to be smaller.
Where is the phone number?
Call GET /v2/people/phone. Each call costs one record, including a call that finds no number.
Related guides
- All B2B lead generation guides
- B2B lead generation for web3
- B2B lead generation for travel
- B2B lead generation for telecom
- LeadOcean pricing
Count your SaaS list free, then pull the first 25 contacts
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →