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

How-to guide

How to verify business emails without a download (with the LeadOcean API)

Searching for a business email verifier to download? Skip the install. Read the deliverability status the API already returns, with real queries and output.

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

"Business email verifier herunterladen" means "download a business email verifier". You rarely need to. Desktop verifier software checks an address you already hold. An API can hand you the address with its status attached, so there is nothing to install and nothing to run overnight.

This guide shows the three-call version: size a list, read the status, export only what you can send to.

TL;DR

  • Three calls replace a downloaded verifier: a free count, one enrichment, one CSV export.
  • It takes about 20 minutes and spends 1 to 3 LeadOcean records. Counts and the enum lookup cost 0.
  • The Free plan (1,000 records for life, no card) covers all of it except bulk CSV export, which starts on Solo at $97 a month.

Prerequisites

  • A LeadOcean API key from https://app.leadocean.io/register, stored as $LEADOCEAN_API_KEY.
  • curl and jq.
  • One business address you already hold, written here as jane.doe@acme.com (a placeholder).

Step 1: Learn the 13 statuses

Every record carries an email_status. The values are exact strings, so look them up instead of guessing. The lookup is free.

bash
curl -s https://api.leadocean.io/v1/enums/email_status \
  -H "x-api-key: $LEADOCEAN_API_KEY"

The same call is available to an MCP client as leadocean_list_enum_values with name: "email_status". The 13 values group like this:

GroupStatuses
Sendverified, catch_all_valid
Cannot confirmcatch_all
Do not sendinvalid, spam_trap, abuse, disposable
Use with carerisky, role, derived
Not checkeduntested, unknown, none

A verified address was either tested by LeadOcean's own verifier or asserted by a supplier held to the same standard. The ones LeadOcean tested carry a verified_batch_date.

Step 2: Size the list before you spend anything

A count is free, so measure first. This call uses the search endpoint with count=true as a query parameter and limit=1. The body is flat JSON and filters are arrays.

bash
curl -s -X POST "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": ["Advertising & Marketing"],
    "country": ["DE"],
    "emailStatus": ["verified"]
  }'

meta.total is the number of people who match. data comes back empty with meta.countOnly true, so no records are spent.

Drop emailStatus and the total grows. That gap is your unverified share. A search count of verified is an upper bound: confirm each address on enrichment in Step 3.

Step 3: Check one address you already hold

To verify a single address, enrich it. Send exactly one identifier and set reveal_email so the status and the address come back.

bash
curl -s -X POST https://api.leadocean.io/v1/people/enrich \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{"email": "jane.doe@acme.com", "reveal_email": true}' \
  | jq '.data.contact_data | {email_status, email_type, contact_emails}'

A hit costs one record. If we hold nobody for that address you get a 404 and it costs nothing. That makes enrichment a pay-per-answer check: you only spend on addresses we know.

Read contact_emails[].status and contact_emails[].verified_batch_date. A null date means LeadOcean's verifier never tested that address.

Step 4: Export only the mailable rows

For a whole list, filter on status and export. Bulk CSV export is not on Free. It is included on Solo and Agency (50k rows a file on Agency).

bash
curl -s -X POST https://api.leadocean.io/v1/exports \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "name": "de-marketing-vps-verified",
    "filters": {
      "jobLevel": ["VP"],
      "jobFunction": ["Advertising & Marketing"],
      "country": ["DE"],
      "emailStatus": ["verified", "catch_all_valid"]
    },
    "limit": 200,
    "columns": ["profile_full_name", "email_N_address", "email_N_status"],
    "caps": { "emails": 1 }
  }'

An export runs async. Poll GET /v1/exports/{id}, then fetch GET /v1/exports/{id}/download. The CSV headers come back as email_1_address and email_1_status. One export takes up to 50,000 rows, and an account gets 500,000 rows a day. Every row costs one record.

No code? The Exports page at app.leadocean.io does the same job: a filter builder, a column picker, the record price before you start, and a CSV download.

What you get

This is the email_status enum lookup from the LeadOcean MCP server on 2026-10-21. It costs no records.

json
{
  "name": "email_status",
  "total": 13,
  "values": [
    "verified", "catch_all_valid", "catch_all", "risky", "unknown",
    "untested", "invalid", "role", "disposable", "spam_trap",
    "abuse", "derived", "none"
  ]
}

A free count run on the same date with leadocean_count_leads:

FilterTotal
VP, Advertising & Marketing, DE, emailStatus verified194
Same filters, default mailable set (verified, catch_all_valid, catch_all)490
Same filters, no email condition (totalAll)1,340

Those 194 VPs span 140 companies. Only 194 of 1,340 carry a status we would call verified in search. That gap is why a verifier step matters.

The enrichment from Step 3 returns this shape (response shape from the API reference, placeholder values):

json
{
  "success": true,
  "data": {
    "contact_data": {
      "has_email": true,
      "email_status": "verified",
      "email_type": "work",
      "contact_emails": [
        {
          "email": "jane.doe@acme.com",
          "type": "work",
          "status": "verified",
          "verified_batch_date": "2026-09-20"
        }
      ]
    }
  }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerRe-copy the key from the app and send it as x-api-key.
402Fewer records left than the call needsCheck GET /v1/usage. Spend fewer rows or move to a paid plan.
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Wait for the Retry-After header, then retry.
404 on enrichLeadOcean holds nobody for that addressNothing was billed. Try linkedin_url or search by domain first.
Zero resultsAn enum value in the wrong caseCopy values exactly from /v1/enums/email_status.
400 on exportOver the 50,000 rows per export ceiling, or a filter that cannot be appliedLower limit or split the filter.

FAQ

Is there anything to download?

No. The API runs over HTTPS and the MCP server at https://api.leadocean.io/mcp signs in with OAuth. The only file you download is your own CSV export.

Can LeadOcean verify a list I upload?

Not as a standalone job. There is no upload-and-clean endpoint. You enrich addresses one at a time with POST /v1/people/enrich, or you export fresh rows already carrying a status.

Does it verify personal addresses?

No. LeadOcean's verifier has not tested personal addresses. On a personal address, verified means a supplier asserted it. Treat it as a lead to check.

What if a verified email bounces?

There is no refund or credit-back for bounces. Read email_status before sending, and prefer verified and catch_all_valid.

Next steps

Verify business emails with one API call, not a download

Free to start. No credit card. 1,000 records to spend whenever you like.

Get your free API key →