Legaltech sells to two different buyers: law firms and in-house legal teams. They have different committees, budgets and reasons to say no, so you build one list for each.
This guide picks the committee, finds it with LeadOcean filters, sizes each list with a free count and drafts the first message for each role.
TL;DR
- Split the market into law firms and corporate legal departments. Never write one message for both.
- Size first with a free count. On 2026-10-21, US companies with 1,001 or more staff held 56,410 mailable in-house legal VPs, directors and C-level people, across 8,609 companies.
- 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
Legal software is rarely bought by the person who asks for it. Name the roles before you touch a filter.
| Buyer | Economic buyer | Champion | Gatekeeper |
|---|---|---|---|
| Law firm | Managing partner, COO, CFO | Practice group leader, head of innovation | IT director, information security, risk and conflicts |
| Corporate legal department | General counsel, chief legal officer | Head of legal operations, deputy GC | IT security, procurement, finance |
Lawyers buy slowly and trust peers. A partner will not adopt a tool the firm distrusts. Security review can add weeks, so give the champion something to forward.
LeadOcean has no "legaltech" industry value. It files firms under Law Practice and Legal Services, and it carries the role itself as the job function Legal. Look up the exact strings before you use them.
for q in legal law; do
curl -s "https://api.leadocean.io/v1/enums/industry?q=$q" | jq -r '.data.values[]'
doneEnum values are exact strings. 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 with one value.
This first set targets law firms: owners and C-level people at mid-sized US firms.
{
"industry": ["Law Practice", "Legal Services"],
"jobLevel": ["C-Team"],
"employeeRange": ["51-200", "201-500"],
"country": ["US"]
}For corporate legal departments, filter on the function instead of the industry. Exclude the law industries so you only get in-house teams at large companies.
{
"jobFunction": ["Legal"],
"jobLevel": ["C-Team", "VP", "Director"],
"excludeIndustry": ["Law Practice", "Legal Services"],
"employeeRange": ["1001-5000", "5001-10000", "10001+"],
"country": ["US"]
}Keep the two segments in separate lists. The pitch, the title mix and the buying calendar all differ.
Step 3: 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 '{
"jobFunction": ["Legal"],
"jobLevel": ["C-Team", "VP", "Director"],
"excludeIndustry": ["Law Practice", "Legal Services"],
"employeeRange": ["1001-5000", "5001-10000", "10001+"],
"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, plus meta.distinctCompanies.
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 where the firms sit before you pick a region.
Step 4: 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": ["Law Practice", "Legal Services"],
"jobLevel": ["C-Team"],
"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.
Send to verified and catch_all_valid addresses first. LeadOcean does not credit back bounces, so read email_status before you send. Firm domains often accept all mail, so catch-all addresses are common here.
Step 5: Enrich the champions 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 and certifications. A head of legal operations who came from a big firm 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 6: Write messages that fit the buyer
Legal buyers answer to risk, billable hours and client confidentiality, not features. Open with the problem they have this quarter.
| Buyer | Their pressure | First line angle |
|---|---|---|
| Managing partner | Profit per partner, client retention | Hours recovered per matter, stated plainly |
| Practice group leader | Associate workload, quality | One matter type, one workflow |
| General counsel | Budget, outside counsel spend | Cost per contract or matter versus today |
| Head of legal operations | Volume, tooling sprawl | Fewer tools, one intake path |
| IT or security lead | Data handling, confidentiality | Plain answers on where data lives and who can see it |
Keep the email under 80 words. Say which firms use the product only if you have an approved reference.
Plain example for a head of legal operations:
Subject: Contract intake without a new tool
Hi Jane,
Acme helps legal operations teams route contract requests from the
business without another inbox. Setup takes a week and needs no migration.
Open to a 15-minute call before your next budget review?Names, domain and subject are placeholders. Use your own product and a claim you can back up. Do not promise outcomes you cannot show, and never imply legal advice.
Step 7: Split the list into campaigns
Do not send one message to the whole list. Run each buyer type on its own copy.
- Small and mid-sized law firms. Industry
Law PracticeandLegal Services, owners and C-level. The managing partner decides, so lead with profit and time. - Large corporate legal departments. Function
Legal, large employers. Lead with spend and speed to resolve requests. - Legal operations and technology roles. Add
titlevalues such aslegal operationsto the in-house filter. They run the evaluation, so give them detail.
Run the count again for each segment. The totals will not add up to the combined list, because a person can match more than one filter set. Use the combined count for planning and the segment counts for sending.
Step 8: Rank accounts before you send
A list of thousands is too many to write by hand. Rank accounts and send to the top group first.
- Count people per company in the test batch. An account with three matching titles is a committee you can reach from several sides.
- Prefer a work email marked
verified. It bounces less than a catch-all address. - Use
GET /v1/companies/{domain}/peoplefor your top accounts. It lists the other people at one domain, so you can fill the missing roles in a committee. - Drop accounts where the only match is a Staff or Other level title.
Send in batches of 50 to 100 and read the replies. If replies cluster on one role, shift the next batch toward it.
What you get
Output of leadocean_count_leads on 2026-10-21 for the industries Law Practice and Legal Services with jobLevel C-Team, employeeRange 51-200 and 201-500, and country US. The count includes only people whose best email is verified, catch_all_valid or catch_all.
{
"total": 17566,
"totalIsExact": true,
"totalAll": 71474,
"distinctCompanies": 2175,
"unsupportedFilters": []
}The in-house count on the same date used jobFunction Legal and jobLevel C-Team, VP and Director. It excluded the two law industries, kept employeeRange 1001-5000 and up, and set country US.
{
"total": 56410,
"totalIsExact": true,
"totalAll": 97287,
"distinctCompanies": 8609,
"unsupportedFilters": []
}Record shape, from the API reference (placeholder values).
{
"success": true,
"data": [
{
"profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "Head of Legal Operations 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 header | Check $LEADOCEAN_API_KEY is exported and sent in the x-api-key header |
| 429 | More than the plan's rate limit (5 requests a second on Free, 200 on Agency) | Wait for the Retry-After seconds, then retry slower |
| 402 | The 1,000 Free records are spent | Move to a paid plan or reduce the pull; counts still work |
| Empty results | An enum value is not an exact string, such as "Legal" for industry | Resolve the value with list_enum_values first |
unsupported_filters on a count | A filter like fundingType or hqCity is not supported in people counts | Drop it and count without it |
meta.depthCapped: true | One search stops at 10,000 rows | Split by country or headcount band |
FAQ
Is there a legaltech industry filter?
No. LeadOcean has 534 industry values and none is called legaltech. Use Law Practice and Legal Services for firms, the Legal job function for in-house teams, then check the title mix on a 25-row batch.
Which segment should I start with?
Start with the one you already close. In-house teams at large companies usually have a budget owner. Small firms decide faster but spend less.
How many records does this cost?
About 30: 25 for the test batch and a handful of enrichments. Counts, enum lookups and GET /v1/companies/count are free.
Can I download the whole list as a CSV?
Yes, on a paid plan. Bulk CSV export is not on Free. Solo is $97 a month and Agency is $497 a month, both with a fair-use pace instead of credits. See pricing.
Related
- Hub: all lead generation guides
- Lead generation for web3
- Lead generation for travel
- Lead generation for telecom
Count your legal buyers free, then pull only the ones you will email
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →