Accept-all means the recipient's mail server said yes to your address and would have said yes to any other. The verifier learned nothing about the mailbox.
So the label is not a verdict. It sits between valid and invalid, and you handle it as its own batch. This guide shows the queries, with real output.
TL;DR
- Accept-all, catch-all, risky and unknown overlap. Accept-all is the server behavior; the others are verifier labels for it.
- On LeadOcean the filter is
emailStatus. Counting it is free, so size the problem before you spend anything. - The whole run takes about 15 minutes and spends about 6 records.
Prerequisites
- A LeadOcean account on the free plan (1,000 records, no card): sign up.
- An API key exported as
$LEADOCEAN_API_KEY. curlandjq, or the hosted MCP server athttps://api.leadocean.io/mcpin an MCP client.
Step 1: Understand what the server did
Email verification starts with the mail server, not the person. If the server will not tell you whether a mailbox exists, no tool downstream can invent that answer. Anything that claims to is guessing from other signals.
A probe asks the mail server about one recipient with RCPT TO. A 250 means accepted and a 550 means the mailbox is not available (RFC 5321, September 2026).
An accept-all server answers 250 to everything. You can see it yourself with a random name:
$ nc mail.acme.com 25
RCPT TO:<jane.doe@acme.com>
250 OK
RCPT TO:<zz-no-such-person-91827@acme.com>
250 OKBoth accepted, so the first answer proves nothing. Use a domain you own or have permission to test, and note that many networks block outbound port 25.
Common reasons a domain behaves this way: a security gateway in front of the mailbox, a typo-catching admin setting, or a small team with no IT admin. The server may deliver, route to a shared inbox, or bounce after accepting.
For the receiver, accept-all means no message is lost to a typo. The cost lands on senders, who cannot tell a real mailbox from a dead one. Dropping every accept-all address also drops the real people behind those domains, as the counts below show.
Step 2: Count accept-all addresses for free
Counting never spends records. Ask how many VPs of sales in Canada sit on each status. This uses the free leadocean_count_leads tool.
{
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["CA"],
"emailStatus": ["catch_all"],
"facets": false
}Over REST, send count=true as a query parameter with limit=1. The JSON body rejects unknown fields.
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": ["catch_all"]
}' | jq '.meta'The response meta gives the total and the number of distinct employers behind it. A people count that spans 2,567 companies is a wide list, so a few bad domains will not sink it.
Run it once per status you care about: verified, catch_all_valid, catch_all. The default mailable count includes all three unless you override emailStatus.
Step 3: Pull a small accept-all sample
Now spend a few records to look at real rows. Five is enough. Page size is limit (1 to 100), and the body is flat JSON with array filters.
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": 5
}' | jq '.data | length'That costs 5 records. For more, pass the cursor from the previous page.
Step 4: Read the status and the check date
Enrich one person by person_id with reveal_email on. The response carries each address with its status and verified_batch_date.
curl -s -X POST https://api.leadocean.io/v1/people/enrich \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{"person_id": "PERSON_ID_FROM_STEP_3", "reveal_email": true}' \
| jq '.data.contact_data.contact_emails'This costs 1 record if the person is found. A 404 costs nothing. Enrich costs more than a count, so use it on a handful of rows, not the whole list. Read two fields before you act.
status:catch_allmeans the domain accepts everything.verifiedmeans we sent to the address and the server accepted it.verified_batch_date: the verification run that produced the verdict, shared by the whole batch. Null means the verdict was not ours, not that the address is bad (API reference, October 2026).
Step 5: Split the list and send in two batches
Run the same search twice, once per status, so the two lists never mix. Treat catch_all as its own batch. Send verified first, then a small catch-all batch, and watch bounces before you scale it.
jq -n '{emailStatus: ["verified"]}'
jq -n '{emailStatus: ["catch_all"]}'Why a separate batch? One bad catch-all send bounces the same way as any other, and the bounce counts against your domain. A small batch limits the damage while you learn how that slice behaves.
A practical rule: cap the catch-all batch at a few hundred, send from a warmed domain, and stop the batch as soon as hard bounces start to climb.
To pull the rows in bulk, create an export with the same filters. It takes up to 50,000 rows a request and 500,000 a day. Bulk CSV export is not on the free plan.
curl -s -X POST https://api.leadocean.io/v1/exports \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{
"name": "catch-all batch",
"filters": {"jobLevel": ["VP"], "jobFunction": ["Sales & Business Development"], "country": ["CA"], "emailStatus": ["catch_all"]},
"limit": 500,
"columns": ["person_id", "profile_full_name", "current_company_domain", "email_N_address", "email_N_status"],
"caps": {"emails": 1}
}'LeadOcean refreshes the dataset monthly and does not refund or credit back bounced emails, so read email_status before you send.
What you get
Read the table as sizing, not as a send list. Before you email any of these, pull rows, read each status, and send in the order from Step 5.
Counts below come from the free leadocean_count_leads tool, run on 2026-10-21. Filters: jobLevel VP, jobFunction Sales & Business Development, country CA. The first column is what you filtered.
| emailStatus filter | People | Distinct companies |
|---|---|---|
verified | 1,854 | 1,392 |
catch_all | 3,720 | 2,567 |
catch_all_valid | 0 | 0 |
These are counts by status, not a mailable total. In this slice catch_all is roughly twice verified, which is why throwing accept-all away costs real reach.
Response shape from the API reference (placeholder values):
{
"success": true,
"data": {
"contact_data": {
"has_email": true,
"email_status": "catch_all",
"email_type": "work",
"contact_emails": [
{
"email": "jane.doe@acme.com",
"type": "work",
"status": "catch_all",
"verified_batch_date": "2026-09-20"
}
]
}
}
}Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Check $LEADOCEAN_API_KEY is exported and sent as the x-api-key header |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Honor Retry-After, then retry or move up a plan |
| 402 | Out of records | Free has 1,000 records for life. Upgrade to Solo ($97 a month) or Agency ($497 a month) |
| Zero results | Bad enum value, for example Catch_All instead of catch_all | Enum values are exact strings. Check leadocean_list_enum_values with name email_status |
| 404 on enrich | Nobody matched the person_id | Free, no record spent. Re-check the id from your search page |
| Export refused | Over 50,000 rows a request or 500,000 a day, or on the Free plan | Split the export or narrow the filters |
FAQ
Are accept-all and catch-all the same thing?
Yes. Both describe a domain that accepts mail for every address. Verifiers also use risky and unknown for the same unresolved state, but those labels are not standard, so read each tool's definition.
Is it safe to email accept-all addresses?
Not blindly. Some mailboxes are real and some are not, and you cannot tell which from the server. Send a small separate batch, watch bounces, and do not mix it into a verified list.
Why does LeadOcean have catch_all and catch_all_valid?
They are two of the 13 emailStatus values. catch_all_valid is a mailbox on a catch-all domain whose existence was confirmed through the provider's identity check (Microsoft 365 managed tenants and Google Workspace). catch_all is a domain where no per-address test can confirm or refute it. The default mailable count includes verified, catch_all_valid and catch_all.
Can I check an accept-all address from an AI assistant?
Yes. The hosted MCP server has leadocean_count_leads for free counts by status and leadocean_list_enum_values to look up exact values. Tools that return rows spend records.
How often is the status updated?
The dataset is refreshed monthly, and each address carries its own verified_batch_date when we ran the check.
Count your accept-all addresses before you send
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →Related: catch-all verification guide for accept-all domains, how to verify email addresses, what is a catch-all email, pricing, and the blog hub.