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 Spaceindustry 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. 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. A contractor's purchase usually involves three groups, and each reads a cold email differently.
| You sell | Economic buyer | Champion | Gatekeeper |
|---|---|---|---|
| Proposal, capture or sales tools | CEO, president | VP business development, capture manager | Director of contracts |
| Security, compliance or IT services | COO, CFO | CIO, program director | Facility security officer, contracts manager |
| Staffing, training or data | CEO, COO | Program manager, operations director | Contracts, 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.
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[]'
doneThe 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.
{
"industry": ["Defense and Space", "Defense and Space Manufacturing"],
"country": ["US"],
"jobLevel": ["C-Team"]
}For the champions, switch to function and level.
{
"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.
{
"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
jobFunctionset toSales & Business Developmentfor capture and growth roles,Finance & Accountingfor pricing and indirect rates, andLegalfor counsel. Contracts titles are best caught withtitle. - Geography. Use
hqStatein 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.
{
"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.
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.
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.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.
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.
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.
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 DoeKeep 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.
| Filters | Mailable people | Employers | All people, any email |
|---|---|---|---|
Defense and Space, Sales & Business Development, Director, VP or C-Team | 336 | 99 | 769 |
Defense and Space plus Defense and Space Manufacturing, C-Team, 11 to 500 staff | 4,738 | 1,605 | 15,395 |
| Same two industries, titles: Facility Security Officer, Contracts Manager, Director of Contracts, Capture Manager | 1,550 | 409 | 3,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):
{
"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
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or bad x-api-key header | Re-export $LEADOCEAN_API_KEY and check for a trailing space. |
| 429 | Requests above the plan's rate limit (5 a second on Free, 200 on Agency) | Wait for the Retry-After header, then slow the loop. |
| 402 | The Free plan's 1,000 records are spent | Move to Solo at $97 a month or Agency at $497 a month. |
| Empty results | A bad enum value such as GovCon for industry | Look the value up with /v1/enums or leadocean_list_enum_values. |
meta.depthCapped: true | One search reached 10,000 rows | Narrow the filters and run a second search. |
| Export refused | The request is above 50,000 rows, or 500,000 rows for the day | Split 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 →