The cold email statistic that moves your results most is not a benchmark. It is the share of your audience you can safely email. You can measure that for free before you send a single message.
TL;DR
- Industry reply-rate averages describe other people's lists. Your mailable rate and email status mix are the numbers you can measure today.
- It takes about 10 minutes and four count queries.
- It spends 0 LeadOcean records. Counts are free on every plan, including Free.
Prerequisites
- A LeadOcean account on the Free plan (no card): https://app.leadocean.io/register
- An API key exported as
$LEADOCEAN_API_KEY curlandjq, or any MCP client connected tohttps://api.leadocean.io/mcp
For reply-rate benchmarks from other sources, see cold email response rate. This page covers the part benchmarks cannot: your own list.
Step 1: Size the whole audience
Start with the filter set you would actually send to. Here it is US VPs in sales. A count with count=true and limit=1 is free. Send count=true as a query parameter, not in the JSON body.
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"limit": 1
}' | jq '.meta'With no emailStatus in the body, you get everyone who matches the other filters. Enum values are exact strings. Check them with leadocean_list_enum_values or GET /v1/enums.
meta.total is capped at 100,000 on the REST search, so a total of 100,000 is a floor. For larger audiences use the MCP tool leadocean_count_leads (Step 4), which returns an exact total.
Step 2: Count the slice worth sending to
Pass the three statuses worth sending to: verified, catch_all_valid and catch_all. This is the same set leadocean_count_leads uses by default.
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"emailStatus": ["verified","catch_all_valid","catch_all"],
"limit": 1
}' | jq '.meta.total'Divide this by the Step 1 total. That ratio is your mailable rate. It is a real statistic about your audience, and no blog benchmark can give it to you.
Step 3: Split out the strict slice
Catch-all domains accept any address, so a catch-all result is a weaker promise than verified. Narrow to verified to see how much of your list is high confidence.
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"emailStatus": ["verified"],
"limit": 1
}' | jq '.meta.total'A search count of verified is an upper bound: enrichment confirms each address, and the enriched status is the correct one. Run it again with ["risky"] to see the slice you should not send to by default. Read email_status on each record before sending. There is no refund for bounced emails.
Step 4: Run it from an MCP client
The same four counts work from Claude, ChatGPT or any MCP client. leadocean_count_leads is free and returns totalAll beside the mailable total, so the gap is visible in one call.
Use leadocean_count_leads with jobLevel VP, jobFunction
"Sales & Business Development", country US, facets false.
Then repeat with emailStatus ["verified"], then ["risky"].
Report each total and its share of totalAll.What you get
These are live results from leadocean_count_leads on 2026-10-21. Facets were off, and every call spent 0 records.
| Filter (VP, Sales & Business Development, US) | People | Share of all |
|---|---|---|
All people, any email status (totalAll) | 350,517 | 100% |
| Mailable: verified, catch_all_valid or catch_all (default) | 129,494 | 36.9% |
emailStatus verified only | 31,141 | 8.9% |
emailStatus risky only | 9,821 | 2.8% |
Three things stand out:
- Only 36.9% of this audience is mailable under the default definition. A list quoted as "350k VPs" is a third of that for sending.
- Verified alone is 8.9% of all people, or 24.0% of the mailable slice. The rest of the mailable slice is catch-all.
- The mailable count spans an estimated 58,121 distinct employers (
distinctCompanies, not exact at that size).
A count with emailStatus is labelled by what you filtered. It is a size of a slice, not a promise of inbox placement.
Response shape from the API reference (placeholder values), for a REST count call that hit the 100,000 cap:
{
"success": true,
"data": [],
"meta": {
"total": 100000,
"totalIsExact": false,
"distinctCompanies": 12345,
"countOnly": true
}
}Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Export a key from the app and send it as x-api-key: $LEADOCEAN_API_KEY |
| 429 | Above the plan's rate limit (5 requests a second on Free, 200 on Agency) | Respect the Retry-After header and space the four counts out |
| 402 | Out of records (Free is 1,000 for life) | Counts never cost records. A 402 means a non-count call spent the balance. Check GET /v1/account |
| Empty results or a total of 0 | Enum value spelled wrong, such as vp for jobLevel | jobLevel takes VP, C-Team, Director, Manager, Staff, Other. Check GET /v1/enums |
meta.total stops at 100,000 | The REST count cap | Narrow the filters, or use leadocean_count_leads for an exact total |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split the export by country or seniority. Bulk CSV export is not on Free |
FAQ
Do these counts cost records?
No. A count costs nothing, however many times you ask. One record is one person you receive, and a count returns none.
Why not just quote an industry reply rate?
An average reply rate blends thousands of lists with different quality. It cannot tell you how many of your 350,000 contacts will bounce. Your email status mix can. See cold email response rate for the benchmark side.
Should I send to catch-all addresses?
Only if you accept more uncertainty. Start with verified, then test a small catch-all batch and watch bounces before you scale. How you run the sending side is covered in B2B cold emailing and cold email marketing tools.
How fresh is the data?
The dataset is refreshed monthly. Each record also carries its own fetched_at date. More guides are on the blog.
What does it cost to send to the mailable slice?
The Free plan gives 1,000 records for life. Paid plans are Solo at $97 a month and Agency at $497 a month, with a fair-use pace instead of credits. See pricing.
Count your own list before you send. Free, no card.
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →