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

How-to guide

How to Buy an Email Database and Find a List Worth Using (LeadOcean API)

Count first, filter on email status, pull only mailable rows. A bookmarkable recipe with real queries.

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

Do not buy a static email file. Size the audience for free, filter on email status, and pull only the rows you will send to. This recipe does that against the LeadOcean API.

TL;DR

  • A bought file is a snapshot. Query a live database instead, and pay for the rows you receive.
  • Time: about 20 minutes. Records spent: 25 for the test pull, 0 for sizing and filter lookups.
  • The quality lever is emailStatus. Pull verified first, add catch_all only if you accept the bounce risk.

Prerequisites

  • A LeadOcean account. The Free plan gives 1,000 records for life, no card, 5 requests a second.
  • An API key from app.leadocean.io, exported as $LEADOCEAN_API_KEY.
  • curl and jq.

Step 1: Write down the list you want

A quality list is a written spec: who, where, how big, how fresh. Without it you buy volume, not fit.

text
Role:      VP, Sales & Business Development
Region:    Germany
Company:   51-500 employees
Email:     verified only
Size cap:  a few hundred rows, not a million

Check the spec against the closed lists before you query. Enum values are exact strings.

bash
curl -s "https://api.leadocean.io/v1/enums" -H "x-api-key: $LEADOCEAN_API_KEY" | jq 'keys'

The MCP tool leadocean_list_enum_values does the same lookup for job_level, job_function, country and email_status. Both are free.

Step 2: Count the audience for free

A count costs zero records, so run it before you spend anything. Send count=true and limit=1 as query parameters, not in the body.

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": ["Sales & Business Development"],
    "country": ["DE"],
    "employeeRange": ["51-200", "201-500"],
    "emailStatus": ["verified"]
  }' | jq '.meta'

data comes back empty and meta.countOnly is true. meta.total is capped at 100,000, so a wide filter shows a floor, not an exact figure.

Step 3: Tighten until the count fits your capacity

Narrow the filter until the number matches how many people you can contact this month. A list bigger than your sending capacity is waste.

The MCP tool leadocean_count_leads runs the same count. Its default counts only verified, catch_all_valid and catch_all addresses, so label the number as mailable, not as everyone.

Keep counts to person filters, company size, industry and country. Apply funding or revenue filters at search time, not in the count.

Step 4: Pull a small test page

Spend 25 records to inspect real rows before you commit to a big pull. Drop the count parameters and keep the same body.

bash
curl -s -X POST "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": ["DE"],
    "employeeRange": ["51-200", "201-500"],
    "emailStatus": ["verified"],
    "limit": 25
  }' > page1.json
jq '.meta' page1.json

Open ten rows by hand. Check titles against your spec, check the company sizes, and read each row's email_status.

Step 5: Paginate and export

Page with the cursor until you hit your target. Limit runs 1 to 100 per page, and one search pages to 10,000 rows. A capped page has meta.depthCapped true and no nextCursor, so narrow the filter instead.

bash
CURSOR=$(jq -r '.meta.nextCursor // empty' page1.json)
curl -s -X POST "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\":[\"DE\"],\"employeeRange\":[\"51-200\",\"201-500\"],\"emailStatus\":[\"verified\"],\"limit\":100,\"cursor\":\"$CURSOR\"}" \
  | jq '.meta'

For a CSV, use the Exports page in app.leadocean.io: filter builder, column picker and the record price before you start. Bulk CSV export is not on Free. Solo includes it, and Agency exports 50,000 rows a file. The API route is POST /v1/exports, up to 50,000 rows a request and 500,000 a day.

Step 6: Keep the list clean after you buy it

Lists decay. People change jobs and addresses bounce, and LeadOcean gives no refund for bounced emails, so read email_status before you send. The dataset refreshes monthly, and each record carries its own fetched_at date.

Re-run the count every month and re-pull instead of reusing an old file. See email list churn for why a static file loses value.

What you get

A free count run on 2026-10-21 through the leadocean_count_leads MCP tool, with the Step 2 filters minus emailStatus. The tool's default counts mailable addresses: verified, catch_all_valid or catch_all.

text
jobLevel VP, jobFunction Sales & Business Development, country DE,
employeeRange 51-200 and 201-500
total: 331 (exact)    totalAll: 1,121    distinctCompanies: 275
records spent: 0

totalAll is the same filters with no email condition. The gap between 1,121 and 331 is the point: about 70% of matching people have no mailable address on file. A bought file hides that gap.

Response shape from the API reference (openapi.json, October 2026) for one search row, placeholder values:

json
{
  "success": true,
  "data": [
    {
      "profile_data": { "profile_full_name": "Jane Doe" },
      "contact_data": { "has_email": true, "email_status": "verified" },
      "meta": { "source_ids": { "person_id": "1234567890" } }
    }
  ],
  "meta": { "count": 1, "limit": 25, "nextCursor": "CURSOR", "depthCapped": false }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerRe-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Back off for the Retry-After seconds, or upgrade the plan
402Free plan's 1,000 records are spentMove to Solo ($97 a month) or Agency ($497 a month)
Empty dataBad enum value, such as Sales instead of Sales & Business DevelopmentResolve values with /v1/enums or leadocean_list_enum_values
meta.depthCapped trueOne search hit its 10,000-row depthNarrow the filters and run several searches
Export refusedOver 50,000 rows a request or 500,000 a daySplit the export by country or industry

FAQ

Is it legal to buy an email database?

This is not legal advice. Rules differ by country and by whether the recipient is a business contact. Ask counsel before a campaign, and keep an opt-out in every message.

How much does an email database cost?

LeadOcean has no per-file price. Free is $0 for 1,000 records, Solo is $97 a month, Agency is $497 a month and Platform is $1,997 a month. See pricing for what each plan includes.

How do I know the emails are good?

Filter on emailStatus and read it on every row. verified is the safest. catch_all addresses accept all mail, so some will still bounce.

Can I compare providers first?

Size your email list for free before you buy anything

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

Get your free API key →