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 Insurance (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.

An insurance sale is slow because the person who wants the product rarely owns the budget. A claims leader may champion it, but IT, compliance and finance all get a vote.

This guide picks that committee, finds it with LeadOcean filters, sizes the list with a free count and drafts a first message per role. It works if you sell software, data or services to carriers, agencies and brokers.

TL;DR

  • Target three roles per account: the budget owner (CEO, COO or CFO), the champion (claims, underwriting or operations lead) and the gatekeeper (IT, security or compliance).
  • Size first with a free count. On 2026-10-21, US-headquartered insurance companies with 51 to 1,000 employees held 40,446 mailable VPs and C-level people across 2,624 employers.
  • The recipe takes about 40 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. Insurance buyers split into three groups, and each reads a cold email differently.

You sellEconomic buyerChampionGatekeeper
Claims or policy softwareCOO, Chief Claims OfficerVP Claims, head of operationsIT, security
Data, analytics or underwriting toolsChief Underwriting Officer, CFOHead of underwriting, actuarial leadCompliance, IT
Services, marketing or staffingCEO, president, managing partnerVP Sales, head of distributionFinance, legal

Company type changes the committee. A 50-person agency is bought by its owner, who is also the sales lead. A 500-person carrier has a claims division, a vendor review and a security questionnaire before any contract.

Check the industry strings before you filter. LeadOcean splits the sector across several labels: Insurance, Insurance Carriers, Insurance Agencies and Brokerages and Claims Adjusting; Actuarial Services. Enum values are exact strings, so look them up.

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

The same lookup is free through the MCP tool leadocean_list_enum_values. A value such as Reinsurance is not an industry here, and a filter that uses it returns nothing.

One warning. The plain Insurance label holds most of the sector, including agencies. If you sell only to carriers, add Insurance Carriers alone, then read the first batch.

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": ["Insurance", "Insurance Carriers", "Insurance Agencies and Brokerages", "Claims Adjusting; Actuarial Services"],
  "hqCountry": ["US"],
  "employeeRange": ["51-200", "201-500", "501-1000"],
  "jobLevel": ["C-Team", "VP"]
}

For the champions, switch to titles. Title values are keywords, so list the variants you want.

json
{
  "industry": ["Insurance", "Insurance Carriers", "Insurance Agencies and Brokerages", "Claims Adjusting; Actuarial Services"],
  "hqCountry": ["US"],
  "employeeRange": ["51-200", "201-500", "501-1000"],
  "title": ["Chief Claims Officer", "VP Claims", "Head of Claims", "Chief Underwriting Officer", "Head of Underwriting"]
}

Run one list per role. A claims leader and a security lead on one sequence get a message that fits neither.

Exclude what you cannot sell to. Add excludeTitle values such as ["intern", "assistant"] and excludeCompanyName for competitors and existing customers.

Step 3: Split by size, function and region

Insurance is not one market. A regional carrier, a managing general agent and a benefits broker feel different pressure.

  • Headcount. Use employeeRange. From 51 to 200 people, the owner or president decides. From 201 to 1,000, a claims or underwriting lead and a vendor process exist. Above 1,000, expect procurement and a security review.
  • Function. Use jobFunction set to Information Technology or Engineering for builders, Finance & Accounting for the money side and Operations for claims handling. Underwriting titles are best caught with title.
  • Region. Use hqCountry for the account and country for the person. State rules differ across the US, so a UK lead and a US lead need separate lines.

Count each cut with leadocean_count_leads before you commit. If a segment holds a few hundred people or fewer, merge it with its neighbour. A list that small cannot support its own sequence.

The companyKeywords filter matches words in the employer's description, so ["insurtech"] can find companies the industry label misses. It applies only when the matching companies number 50,000 or fewer, so add a state, a size band or an industry before you rely on it.

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": ["Insurance", "Insurance Carriers", "Insurance Agencies and Brokerages", "Claims Adjusting; Actuarial Services"],
    "hqCountry": ["US"],
    "employeeRange": ["51-200", "201-500", "501-1000"],
    "title": ["Chief Claims Officer", "VP Claims", "Head of Claims", "Chief Underwriting Officer", "Head of Underwriting"],
    "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 company 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 which states hold the accounts before you pick a region.

Step 5: Pull a 25-row test batch

Pull a small batch first. Read the titles and employers. If half are the wrong kind of firm, 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": ["Insurance Carriers"],
    "hqCountry": ["US"],
    "employeeRange": ["201-500", "501-1000"],
    "jobFunction": ["Operations", "Information Technology"],
    "jobLevel": ["Director", "VP", "C-Team"],
    "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 publications, each when held. An underwriting head often lists a designation, and a past role at a large carrier tells you which systems they know. That is a better opener than a job title. 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

Insurance buyers are cautious by training. Open with a specific problem and a small first step, not a claim about speed.

BuyerTheir pressureFirst line angle
COO or Chief Claims OfficerCycle time, leakage, adjuster workloadName the one claims step you remove
Head of underwritingSubmission volume, data qualitySay which data you add and where it lands
CIO or IT leadLegacy systems, integrations, security reviewsSay what it connects to and how long setup takes
Agency ownerProducer time, renewals, marginOffer the smallest first step, with a price

Keep claims you can prove. Do not cite a customer, a regulator or a result you cannot show. Insurance staff check claims, and they distrust urgency.

Do not promise compliance outcomes. Say what your product does. Let their team decide what it means for their filings.

A three-line email works better than a pitch. One line on their situation, one on what you do, one question.

text
Subject: Claims intake at Acme

Jane, carriers your size often triage new claims by hand from a shared
inbox. We route each claim to an adjuster and log the reason.
Worth a look, or is intake settled for 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": ["Insurance Carriers"],
      "hqCountry": ["US"],
      "employeeRange": ["201-500", "501-1000"],
      "jobLevel": ["VP", "C-Team"]
    },
    "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. They count mailable people (verified, catch_all_valid or catch_all email), not everyone. Industry is the four labels from Step 2: Insurance, Insurance Carriers, Insurance Agencies and Brokerages and Claims Adjusting; Actuarial Services. HQ is the US and size is 51 to 1,000 employees.

FilterMailable peopleEmployers
VP or C-Team40,4462,624
Information Technology or Engineering, Director, VP or C-Team2,274723
Title Chief Claims Officer, VP Claims, Head of Claims, Chief Underwriting Officer or Head of Underwriting301175
Title Chief Compliance Officer, Head of Compliance or Chief Risk Officer160101

Without the email condition, the first filter matches 130,920 people, the second 6,401, the third 992 and the fourth 482. The gap is people with no usable address. A company count for the same industry, country and size bands returned 6,264 companies, led by California (588), New York (501), Florida (498) and Texas (485).

Most of those companies sit in one niche. By NAICS code, 4,743 of the 6,264 are filed as insurance agencies and brokerages (524210). If you sell to carriers, start from Insurance Carriers and read the batch.

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": "Chief Claims Officer 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 Reinsurance 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 state 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 one insurance industry filter?

No. The sector is split across Insurance, Insurance Carriers, Insurance Agencies and Brokerages and Claims Adjusting; Actuarial Services. Pass the ones you sell to, then narrow by headcount and role.

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 by funding stage?

Funding filters narrow a search, but they do not work in the free count tool, so the counts here leave them out. Count without them, then add them when you search.

Where is the phone number?

Call GET /v2/people/phone. Each call costs one record, including a call that finds no number.

Count your insurance 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 →