Pre-Black Friday: 20% off, for as long as you stayEARLYBFon Solo and AgencyEnds Nov 28Start free

How-to guide

How to Pull the Cold Email Statistics That Matter (From Your Own Audience)

Benchmarks tell you what others got. Four free count queries tell you what your list can do before you send.

Get your free API key →Free to start. No credit card. 1,000 records to spend whenever you like.

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
  • curl and jq, or any MCP client connected to https://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.

bash
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.

bash
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.

bash
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.

text
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)PeopleShare of all
All people, any email status (totalAll)350,517100%
Mailable: verified, catch_all_valid or catch_all (default)129,49436.9%
emailStatus verified only31,1418.9%
emailStatus risky only9,8212.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:

json
{
  "success": true,
  "data": [],
  "meta": {
    "total": 100000,
    "totalIsExact": false,
    "distinctCompanies": 12345,
    "countOnly": true
  }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerExport a key from the app and send it as x-api-key: $LEADOCEAN_API_KEY
429Above 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
402Out 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 0Enum value spelled wrong, such as vp for jobLeveljobLevel takes VP, C-Team, Director, Manager, Staff, Other. Check GET /v1/enums
meta.total stops at 100,000The REST count capNarrow the filters, or use leadocean_count_leads for an exact total
Export refusedOver 50,000 rows a request or 500,000 a daySplit 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 →