Catch-all verification matters because a catch-all domain accepts every address, so a basic verifier can only say "unknown". Drop those and you lose most of a real list.
This guide counts the loss on a live query, then shows how to split catch-all addresses into bands and send to them in a safe order.
TL;DR
- On one live query, 3,720 of 5,574 mailable contacts (67%) sit on catch-all domains. Dropping them cuts the list by two thirds.
- It takes about 15 minutes. Counting spends 0 records. A 25-row test pull spends 25 of your 1,000 Free records.
- The fix is not to trust catch-all blindly. It is to send
verifiedfirst,catch_all_validnext,catch_alllast.
Prerequisites
- A LeadOcean account on any plan, including Free. Sign up at app.leadocean.io, no card.
- An API key exported as
$LEADOCEAN_API_KEY. Free allows 5 requests a second. curlandjq. Optional: an AI client with the LeadOcean MCP server athttps://api.leadocean.io/mcp.
Step 1: See why a catch-all verdict is different
A catch-all server answers "yes" to every recipient, so a probe cannot confirm one mailbox. Test a made-up name on a domain you control or may test. The 250 and 550 reply codes are defined in RFC 5321 (checked September 2026).
$ dig +short MX acme.com
$ telnet <mx-host> 25
RCPT TO:<zz-not-a-real-name-91827@acme.com>
250 -> the domain accepts all
550 -> unknown users are rejectedA 250 on a fake name means a 250 on Jane's real address tells you nothing. That is why most verifiers return "risky" or "accept-all" and stop. Background: what is a catch-all email.
Three things make this worse than it sounds. Some servers accept the message and bounce it later, which a probe never sees. Others accept and silently drop it. Many also rate-limit or greylist probes, so running your own check per lead is slow.
The honest verdict on a catch-all address is therefore "cannot confirm". Two things can improve it: a provider-side identity check, or sending in small batches and reading real bounces. The rest of this guide uses both.
Step 2: Count what dropping catch-all costs you
LeadOcean stores an emailStatus on each person, and counting by status is free. Send count=true as a query parameter with limit=1. Filters are arrays.
for s in verified catch_all_valid catch_all; do
echo -n "$s: "
curl -s "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "Content-Type: application/json" \
-d "{\"jobLevel\":[\"VP\"],\"jobFunction\":[\"Sales & Business Development\"],\"country\":[\"CA\"],\"emailStatus\":[\"$s\"]}" \
| jq -r '.meta.total'
doneFilter values are exact strings. List them first (free) with GET /v1/enums/email_status, or leadocean_list_enum_values with name: "email_status" in MCP.
The result is a three-line table you can read in seconds. If the catch-all line is the largest, your verifier choice decides whether you email most of your list or almost none of it.
Step 3: Split the catch-all band by confidence
Not every catch-all address is equal. catch_all_valid means LeadOcean confirmed the mailbox exists through the provider's identity check (Microsoft 365 managed tenants and Google Workspace only), even though the domain accepts anything. catch_all means the domain was probed and nothing more can be proven (email_status reference, September 2026).
One trap: as a filter, catch_all also matches catch_all_valid. To get the confirmed set alone, filter on catch_all_valid.
| Status | What it means | Send order |
|---|---|---|
verified | Our verifier sent to the address and it accepted | First |
catch_all_valid | Domain accepts all, mailbox confirmed | Second |
catch_all | Domain accepts all, mailbox unprovable | Last, small batches |
Step 4: Pull each band and confirm on enrichment
Pull a small page of the catch_all band first.
curl -s "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "Content-Type: application/json" \
-d '{
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["CA"],
"emailStatus": ["catch_all"],
"limit": 25
}' | jq '.meta'Search status is an upper bound for verified. Enrichment applies the strict per-address rule, so confirm with POST /v1/people/enrich using person_id and reveal_email: true before a big send. For files over a few thousand rows, use POST /v1/exports (up to 50,000 rows a request, 500,000 a day, not on Free).
Step 5: Send in order and watch bounces
- Send
verifiedat normal volume. - Send
catch_all_validat about half your normal daily volume. - Send
catch_allin batches of 50 to 100. Wait two days for bounces before the next batch. - Suppress every hard bounce. LeadOcean gives no refund or credit-back for bounced emails, so read the status before you send.
Keep the bands in separate sending batches, not one blended file. A bounce spike then points at one band, and you can stop that band without pausing the rest. Use a separate sending domain for the catch-all band if you can, so a bad batch does not touch your best sender.
These ratios are a starting rule of thumb, not a benchmark. Tune them on your own bounce rate.
Step 6: Run the same count from an AI client
With the MCP server connected (OAuth sign-in, no key pasted), paste this prompt. The count tool is free, so the model can try several filter sets without touching your Free records.
Using leadocean_count_leads, count VPs in Sales & Business Development in
Canada three times: emailStatus verified, catch_all_valid, catch_all.
Report total and distinctCompanies for each, and tell me which band is
largest. Do not call any tool that spends records.Ask it to spend records only after you have picked a band. The output is the same table as above, in plain language, and it takes under a minute.
What you get
Counts from leadocean_count_leads, run 2026-10-21. Filters: jobLevel VP, jobFunction Sales & Business Development, country CA. One emailStatus per row.
| emailStatus | People | Distinct companies |
|---|---|---|
verified | 1,854 | 1,392 |
catch_all_valid | 0 | 0 |
catch_all | 3,720 | 2,567 |
| Default mailable (all three) | 5,574 | 3,873 |
| No email filter at all | 18,800 | not reported |
Catch-all addresses are the largest group here, bigger than verified by two to one. Treat the exact ratio as specific to this query, not as a market average.
Read it plainly. A tool that keeps only verified leaves you 1,854 contacts. Including the catch-all band triples that to 5,574. The catch_all_valid row is 0 on this query, so it does not rescue you here. Run it on your own filters, because it varies by market and provider mix.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Re-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY |
| 429 | Above your plan's rate limit (5 a second on Free, 200 on Agency) | Honour Retry-After, or move to a higher plan on pricing |
| 402 | The 1,000 Free records are spent | Move to Solo or Agency. Free records do not refill |
200 with meta.total 0 | Wrong enum string, such as Catch-All | Check strings with GET /v1/enums |
Data is empty with meta.countOnly true | You sent count=true, which returns no rows by design | Drop count=true to get rows |
Search stops with meta.depthCapped true | One search pages to 10,000 rows | Narrow the filters, or use POST /v1/exports |
FAQ
Is it safe to email catch-all addresses?
Partly. A catch-all address cannot be proven, so some will bounce. Send them last, in small batches, and watch bounces. catch_all_valid addresses are safer because the mailbox was confirmed.
Why not just drop every catch-all address?
On the query above that deletes 67% of mailable contacts. For small, high-value lists that is a real cost. For huge lists with plenty of verified volume, dropping them is a fair choice.
Does counting spend records?
No. Counts, list_filters, list_enum_values and an enrichment that finds nothing cost nothing. A search page of 25 spends 25 records.
Can I run this from an AI client?
Yes. With the MCP server connected, ask leadocean_count_leads for the three bands and tell it not to call any tool that spends records. For the full method, see the catch-all verification guide and best catch-all email verifiers.
Count your catch-all band free before you decide to drop it
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →