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. Pullverifiedfirst, addcatch_allonly 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. curlandjq.
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.
Role: VP, Sales & Business Development
Region: Germany
Company: 51-500 employees
Email: verified only
Size cap: a few hundred rows, not a millionCheck the spec against the closed lists before you query. Enum values are exact strings.
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.
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.
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.jsonOpen 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.
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.
jobLevel VP, jobFunction Sales & Business Development, country DE,
employeeRange 51-200 and 201-500
total: 331 (exact) totalAll: 1,121 distinctCompanies: 275
records spent: 0totalAll 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:
{
"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
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Re-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Back off for the Retry-After seconds, or upgrade the plan |
| 402 | Free plan's 1,000 records are spent | Move to Solo ($97 a month) or Agency ($497 a month) |
Empty data | Bad enum value, such as Sales instead of Sales & Business Development | Resolve values with /v1/enums or leadocean_list_enum_values |
meta.depthCapped true | One search hit its 10,000-row depth | Narrow the filters and run several searches |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split 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?
Yes. Read best email list providers and the guide to B2B sales leads databases.
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 →