Pre-Black Friday: 20% off, for as long as you stayEARLYBFon Solo and AgencyEnds Nov 28Start free

How-to guide

How to Build a B2B Lead List for SaaS (Buyers, Filters and Messaging)

Pick the buying committee, count the list for free, then spend records only on the people you will email.

Get your free API key →Free to start. No credit card. 1,000 records to spend whenever you like.

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.
  • curl and jq, 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 sellEconomic buyerChampionGatekeeper
Sales or marketing softwareCRO, VP Sales, CMODirector of sales ops or demand genIT, finance
Developer or infrastructure toolsCTO, VP EngineeringStaff engineer, engineering managerSecurity, procurement
HR, finance or ops softwareCFO, CHRO, COOHead of the functionIT, legal
Services into SaaS companiesCEO, CROVP Marketing or Customer SuccessFinance

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.

bash
for q in software; do
  curl -s "https://api.leadocean.io/v1/enums/industry?q=$q" | jq -r '.data.values[]'
done

Enum 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.

json
{
  "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 fundingType at search time, where it narrows the list further.
  • Stack. Use technologies or technologyCategories (for example CRM or Marketing 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.

bash
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.

bash
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.json

A 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.

bash
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.

BuyerTheir pressureFirst line angle
CRO or VP SalesPipeline coverage, rep ramp timeName the task your product removes from a rep's week
CTO or VP EngineeringRoadmap load, tool sprawlSay what it replaces or plugs into, not what it adds
Head of RevOpsData quality, tool costLead with the manual step you cut
CFOSpend controlOffer a fixed price and a short first step
Founder at a small companyNo time, no specialistOffer 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.

text
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.

bash
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.

FilterCountEmployers
Software Development, US HQ, VP or C-Team262,486 peopleabout 44,220
Software Development, US, Sales & Business Development, VP or C-Team, 51 to 500 employees3,940 people2,239
Software Development, US, Information Technology, VP or C-Team, 51 to 500 employees473 people367
Software Development, titles Head, VP or Director of Revenue Operations, US HQ541 people478
Software Development, US HQ, 51 to 500 employees (company count)11,577 companiesnot 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).

json
{
  "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

ErrorCauseFix
401Missing or wrong x-api-keyRe-export $LEADOCEAN_API_KEY and check the header name
429Above the plan's rate limit (5 requests a second on Free, 200 on Agency)Wait for Retry-After, then slow the loop
402The 1,000 Free records are spentMove to Solo or Agency, or narrow the pull
Empty resultsA misspelled enum value such as SaaS as an industryLook the value up with /v1/enums/industry or leadocean_list_enum_values
Export refusedOver 50,000 rows a request or 500,000 a daySplit by country or headcount band and run several exports
Export rejected on FreeBulk CSV export is not on FreePage 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.

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 →