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

How-to guide

How to Size and Use Catch-All Emails Instead of Dropping Them (LeadOcean API)

A verifier that throws away every catch-all address deletes most of your list. Count the bands, then send in order.

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

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 verified first, catch_all_valid next, catch_all last.

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.
  • curl and jq. Optional: an AI client with the LeadOcean MCP server at https://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).

text
$ 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 rejected

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

bash
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'
done

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

StatusWhat it meansSend order
verifiedOur verifier sent to the address and it acceptedFirst
catch_all_validDomain accepts all, mailbox confirmedSecond
catch_allDomain accepts all, mailbox unprovableLast, small batches

Step 4: Pull each band and confirm on enrichment

Pull a small page of the catch_all band first.

bash
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

  1. Send verified at normal volume.
  2. Send catch_all_valid at about half your normal daily volume.
  3. Send catch_all in batches of 50 to 100. Wait two days for bounces before the next batch.
  4. 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.

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

emailStatusPeopleDistinct companies
verified1,8541,392
catch_all_valid00
catch_all3,7202,567
Default mailable (all three)5,5743,873
No email filter at all18,800not 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

ErrorCauseFix
401Missing or wrong x-api-keyRe-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY
429Above your plan's rate limit (5 a second on Free, 200 on Agency)Honour Retry-After, or move to a higher plan on pricing
402The 1,000 Free records are spentMove to Solo or Agency. Free records do not refill
200 with meta.total 0Wrong enum string, such as Catch-AllCheck strings with GET /v1/enums
Data is empty with meta.countOnly trueYou sent count=true, which returns no rows by designDrop count=true to get rows
Search stops with meta.depthCapped trueOne search pages to 10,000 rowsNarrow 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 →