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 Government Contractors (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.

Government contractors buy slowly, buy through a small group, and ignore anything that reads like mass email. The person who signs is rarely the person who finds you.

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 suits anyone selling software, services, compliance help or data to firms that work for government customers.

TL;DR

  • Target three roles per account: the budget owner (CEO, COO, CFO), the champion (capture, business development or program lead) and the gatekeeper (contracts or security).
  • Size first with a free count. On 2026-10-21 the Defense and Space industry held 336 mailable US directors, VPs and C-level people in sales and business development, across 99 employers.
  • 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. A contractor's purchase usually involves three groups, and each reads a cold email differently.

You sellEconomic buyerChampionGatekeeper
Proposal, capture or sales toolsCEO, presidentVP business development, capture managerDirector of contracts
Security, compliance or IT servicesCOO, CFOCIO, program directorFacility security officer, contracts manager
Staffing, training or dataCEO, COOProgram manager, operations directorContracts, finance

Company size changes the committee. At 30 people the founder decides and one contracts lead reviews terms. At 300 people a capture team, a program office and a vendor review all weigh in.

Titles run loose here. "Capture Manager", "Contracts Administrator" and "Program Director" mean different things at different firms. Test your titles on a small batch before you trust them.

LeadOcean has no "government contractor" industry. The closest fits are Defense and Space, Defense and Space Manufacturing, IT Services and IT Consulting, Engineering Services and Management Consulting. Government Administration lists agencies, not the firms that sell to them. Look the exact strings up before you use them.

bash
for q in defense government engineering consulting; do
  curl -s -G "https://api.leadocean.io/v1/enums/industry" \
    --data-urlencode "q=$q" \
    -H "x-api-key: $LEADOCEAN_API_KEY" | jq -r '.data.values[]'
done

The same lookup is free through the MCP tool leadocean_list_enum_values. Enum values are exact strings, so GovCon as an industry returns nothing.

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": ["Defense and Space", "Defense and Space Manufacturing"],
  "country": ["US"],
  "jobLevel": ["C-Team"]
}

For the champions, switch to function and level.

json
{
  "industry": ["Defense and Space"],
  "country": ["US"],
  "jobFunction": ["Sales & Business Development"],
  "jobLevel": ["Director", "VP", "C-Team"]
}

For the gatekeepers, use titles. Title values are keywords, so list the variants you want.

json
{
  "industry": ["Defense and Space", "Defense and Space Manufacturing"],
  "country": ["US"],
  "title": ["Facility Security Officer", "Contracts Manager", "Director of Contracts", "Capture Manager"]
}

Run one list per role. A CEO and a contracts manager 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, state and function

Government contracting is not one market. A 15-person subcontractor and a prime with 10,000 staff share a customer, not a buying process.

  • Headcount. Use employeeRange. From 11 to 50 people, the founder decides. From 51 to 200, a contracts function and a capture lead appear. Above 200, expect a formal vendor review.
  • Function. Use jobFunction set to Sales & Business Development for capture and growth roles, Finance & Accounting for pricing and indirect rates, and Legal for counsel. Contracts titles are best caught with title.
  • Geography. Use hqState in company search and company counts. The free people count does not take it, so size people by industry and size, then narrow by state at search time.

The companyKeywords filter matches words in the employer's description, so ["federal", "government"] can find firms filed under a generic industry such as IT Services and IT Consulting. It applies only when the matching companies number 50,000 or fewer. Add a state or a size band if it is refused.

Count each cut with leadocean_count_leads before you commit.

json
{
  "industry": ["Defense and Space", "Defense and Space Manufacturing"],
  "country": ["US"],
  "jobLevel": ["C-Team"],
  "employeeRange": ["11-50", "51-200", "201-500"]
}

If a segment holds a few hundred people or fewer, merge it with its neighbour. A list that small cannot support its own sequence.

Step 4: Size the list with a free count

Counts decide how much effort a segment deserves. A segment of 1,500 people can carry its own sequence. A segment of 40 is a hand-written list.

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": ["Defense and Space"],
    "country": ["US"],
    "jobFunction": ["Sales & Business Development"],
    "jobLevel": ["Director", "VP", "C-Team"],
    "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, HQ state and NAICS. The MCP tool leadocean_count_companies does the same. It tells you 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 manufacturers when you sell to service firms, 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": ["Defense and Space"],
    "country": ["US"],
    "jobLevel": ["C-Team", "VP"],
    "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.

Check contact_data.email_status on every row before you send. LeadOcean gives no refund for bounced emails, so drop anything that is not verified or a catch-all result.

Step 6: Enrich the people you will email

Enrich only the people who pass the read. Enrichment takes exactly one of linkedin_url, email, phone or person_id. There is no name plus domain lookup, so take the person_id from the batch.

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_BATCH", "reveal_email": true}'

A person we hold nothing for is a 404 and costs nothing. Since October 2026 the response also carries career history: past roles, education, certifications and awards. A past role at a firm your buyer respects is a better opening line than a company description.

Past employers carry no company_id yet, so match them by name only.

Step 7: Write one message per role

Contractor buyers are busy and cautious. Lead with the job you do for them, then one fact that shows you read their situation.

  • CEO or president. Name one outcome and one cost. Keep it under 70 words. Skip jargon about their customer.
  • Capture or program lead. Name the task you take off their desk and how long setup takes. Offer a test, not a call.
  • Contracts or security. Say what you do with their data, what you do not, and where the answer is written down. Link the doc. Make no claim about certifications unless you can show it.

Here is a template for a capture lead. Replace the placeholders.

text
Subject: [pain] on [pursuit_type]

Hi [first_name],

[company] works on [program_area]. Teams at that stage usually hit [pain] when a pursuit reaches [trigger].

We built [your_tool] for that. Setup is [minutes] minutes, and you can test it on one pursuit before anyone signs anything.

Worth a look this week?

Jane Doe

Keep the first email short and plain. Skip emoji, skip price talk and skip claims you cannot back with a link. One clear question beats three soft ones.

Send each role its own sequence and track replies by role. After the first 100 sends, the role that replies most tells you where the champion really sits.

What you get

The free counts from Step 4 return sizes before any record is spent. These are results from leadocean_count_leads on 2026-10-21, with country US. They count mailable people: email status verified, catch_all_valid or catch_all.

FiltersMailable peopleEmployersAll people, any email
Defense and Space, Sales & Business Development, Director, VP or C-Team33699769
Defense and Space plus Defense and Space Manufacturing, C-Team, 11 to 500 staff4,7381,60515,395
Same two industries, titles: Facility Security Officer, Contracts Manager, Director of Contracts, Capture Manager1,5504093,889

The first row shows why you size first. Ninety-nine employers is a short account list, so a hand-written sequence beats a template. The company count (leadocean_count_companies, Defense and Space, HQ in the US) returned 2,963 companies, led by Virginia (360), California (329) and Florida (236). Most are very small: 1,986 have 1 to 10 staff.

A search row has this shape. Response shape from the API reference (placeholder values):

json
{
  "success": true,
  "data": [
    {
      "profile_data": {
        "profile_full_name": "Jane Doe",
        "profile_headline": "VP Business Development at Acme",
        "profile_url": "https://www.linkedin.com/in/jane-doe"
      },
      "contact_data": {
        "has_email": true,
        "has_phone": false,
        "email_status": "verified",
        "email_type": "work"
      },
      "meta": { "source_ids": { "person_id": "1234567890" } }
    }
  ],
  "meta": { "count": 1, "credits": 1, "nextCursor": "CURSOR" }
}

Search rows carry no contact points. Enrich by person_id with reveal_email for the address and for resume_data.

Troubleshooting

ErrorCauseFix
401Missing or bad x-api-key headerRe-export $LEADOCEAN_API_KEY and check for a trailing space.
429Requests above the plan's rate limit (5 a second on Free, 200 on Agency)Wait for the Retry-After header, then slow the loop.
402The Free plan's 1,000 records are spentMove to Solo at $97 a month or Agency at $497 a month.
Empty resultsA bad enum value such as GovCon for industryLook the value up with /v1/enums or leadocean_list_enum_values.
meta.depthCapped: trueOne search reached 10,000 rowsNarrow the filters and run a second search.
Export refusedThe request is above 50,000 rows, or 500,000 rows for the daySplit the export, and note bulk CSV export is not on Free.

FAQ

Is there a "government contractor" filter?

No. Use industries such as Defense and Space and IT Services and IT Consulting, then add companyKeywords such as ["federal", "government"]. Read the first batch to see what the keyword pulls in.

How many contractor buyers can I reach for free?

The count is free, so size it as often as you like. On 2026-10-21 there were 336 mailable US directors, VPs and C-level people in sales and business development at Defense and Space firms. The Free plan spends 1,000 records, once.

Can I filter by contract vehicle, clearance or award size?

No. LeadOcean holds people and company data: roles, employers, emails and phones. It does not hold award data or clearances. Pair it with a contract-award source if you target by pursuit.

Can I filter by NAICS code?

The company count returns a NAICS breakdown, but NAICS filters count inconsistently. Size the list with industry and size filters, and check NAICS on the returned companies.

How fresh is the data?

The dataset is refreshed monthly, and each record carries its own fetched_at date. Read it on fast-moving teams, since contractors change staff when contracts end.

Related guides: lead generation for Web3, travel and telecom. See pricing for plan limits, or return to the lead generation guides.

Count your government contractor buyers free, then pull the first 25

Free to start. No credit card. 1,000 records to spend whenever you like.

Get your free API key →