TL;DR
- Claude Code reads a CSV export of your open deals and asks LeadOcean how many senior, mailable people exist at each account. Deals with none are your risk list.
- It takes about 20 minutes and spends 0 LeadOcean records. Counts, filter lists and enum lookups are free.
- LeadOcean is not a CRM and does not know your deal stages. You bring the CSV. LeadOcean answers who else is there.
Prerequisites
- A LeadOcean account from app.leadocean.io. The free plan has no card and 1,000 records, one-off, with 5 requests a second.
- Claude Code installed, and the LeadOcean MCP server added (see Connect LeadOcean to Claude Code). The Claude Code MCP docs cover the command.
- An API key exported as
$LEADOCEAN_API_KEY, for the scripted version in Step 3. - A CSV export of open opportunities from your CRM with
account,domain,stage,amountandownercolumns.
export LEADOCEAN_API_KEY="paste-your-key-here"
claude mcp add --transport http leadocean https://api.leadocean.io/mcpStep 1: Define "covered" as a filter
Pick the people a deal needs, then write that as filters. Here, covered means at least one mailable VP or Director in Sales & Business Development.
Ask the free tools for exact enum values first. Enum filters are exact strings, so Sales & Business Development works and sales does not.
Use leadocean_list_enum_values to confirm the jobFunction value for sales.
Then use leadocean_count_leads with jobLevel ["VP","Director"],
jobFunction ["Sales & Business Development"], country ["US"],
industry ["Software Development"], employeeRange ["51-200"],
facets false. Tell me the total and distinctCompanies.Counting costs 0 records, however often you run it. By default it counts only verified, catch_all_valid and catch_all addresses, so the total is the mailable audience.
Step 2: Check your whole market once
Before any deal-level work, size the market your deals come from. leadocean_count_companies counts companies and takes the same style of filters.
Use leadocean_count_companies with industry ["Software Development"],
employeeRange ["51-200"], hqCountry ["US"], hasMailableContacts true.
Give me the total and the top five HQ states.REST has the same free call: GET /v1/companies/count. If your open deals sit in one narrow slice of this number, you have a concentration problem the CRM will not show you.
Step 3: Count senior contacts per deal account
Now the deal-level check. Send each domain from the CSV through a free count. count=true goes in the query string, not the body, and limit stays at 1.
tail -n +2 pipeline.csv | cut -d, -f2 | sort -u | while read -r d; do
n=$(curl -s "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d "{\"domain\":[\"$d\"],\"jobLevel\":[\"VP\",\"Director\"],\"emailStatus\":[\"verified\",\"catch_all_valid\",\"catch_all\"],\"limit\":1}" \
| jq '.meta.total')
echo "$d,$n"
sleep 0.25
done > coverage.csvThe sleep 0.25 keeps you under 5 requests a second on Free. Above the limit you get a 429 with Retry-After. The emailStatus filter keeps only verified and catch-all addresses, so a zero means no senior person you can email, not no senior person. The REST search applies no email default, so leave that filter in.
Step 4: Let Claude Code join it to the pipeline
Claude Code is good at the join and the narrative. Give it both files and a plain instruction.
Read pipeline.csv and coverage.csv. Join on domain.
Output a markdown table of open deals with amount over 20000,
sorted by amount, with columns: account, stage, owner, amount, senior_contacts.
Then list every deal where senior_contacts is 0 and name the owner.
Do not call any LeadOcean tool that returns people. Counts only.The last line matters. Search, get_lead and find_phone spend records. Counts do not.
Step 5: Spend a few records on the gaps
For the worst two or three deals, pull the named people. One search page of 5 is 5 records. This is optional and the only step that spends anything.
curl -s https://api.leadocean.io/v1/people/search \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{"domain":["acme.com"],"jobLevel":["VP","Director"],"limit":5}' | jq '.data | length'To fill a gap with a direct contact, enrich by person_id with POST /v1/people/enrich. Since October 2026 the response includes career history in resume_data, which helps a rep decide who to approach first.
What you get
The Step 1 count is a real result. We ran it with the free leadocean_count_leads tool on 2026-10-21 (trimmed).
{
"total": 4926,
"totalIsExact": true,
"totalAll": 12176,
"distinctCompanies": 2348,
"credits": 0
}That is 4,926 mailable VPs and Directors in sales across 2,348 US software companies with 51 to 200 staff. Without the email condition, the same filters match 12,176 people.
The Step 2 count (leadocean_count_companies, 2026-10-21) returned 6,143 such companies with at least one mailable contact. California held 1,681 of them and New York 621.
The final report looks like this. The rows are placeholders, not real deals.
| account | stage | owner | amount | senior_contacts |
|---------|----------|----------|--------|-----------------|
| Acme | Proposal | Jane Doe | 48,000 | 6 |
| Globex | Demo | John Roe | 32,000 | 0 |
At risk: Globex (John Roe), no mailable VP or Director on file.Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Re-export $LEADOCEAN_API_KEY from app.leadocean.io. |
| 429 | Above your plan's rate limit (5 a second on Free, 200 on Agency) | Add sleep, or honour Retry-After. |
| 402 | Out of records | Counts stay free. Searching and enriching need records or a paid plan. |
meta.total is 0 for a known account | Enum value misspelled, or no mailable contact | Check values with leadocean_list_enum_values. Widen jobLevel. |
Empty data on a count | count=true returns counts only | That is expected. Read meta.total. |
| Export refused | Bulk CSV export is not on Free; limit is 50,000 rows a request and 500,000 a day | Use Solo ($97 a month) or page the search with cursor. |
FAQ
Does LeadOcean replace my CRM report?
No. LeadOcean has no deals, stages or sequencer. Your CRM owns stage and amount. LeadOcean adds who is at the account.
Does Claude Code spend my records?
Only if it calls a tool that returns people, such as search or get_lead. Tell it counts only, as in Step 4.
Can I run this on the free plan?
Yes. Counts cost nothing, and the 5-record gap check fits well inside 1,000 records.
How fresh is the data?
The dataset is refreshed monthly, and each record carries its own fetched_at date. Re-run the report monthly.
Where do I go next?
See real-time lead data for your sales pipeline and real-time B2B data for AI agents. Plans are on pricing, and more guides are on the blog.
Find out which open deals have nobody senior to call
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →