TL;DR
- Sales and marketing drift apart when each team enriches its own list. Fix it with one audience definition, one enrichment pass and one export both teams read.
- It takes about 30 minutes and spends about 21 LeadOcean records: 20 for a sample pull and 1 for a single enrichment. Counting the audience is free.
- Eleven tools are named below by the job they do. Pick one per job, not all eleven.
Prerequisites
- A LeadOcean account from app.leadocean.io. The free plan has no card and 1,000 records, one-off.
- An API key exported as
$LEADOCEAN_API_KEY, pluscurlandjq. - Whatever your sales and marketing teams already use as a system of record. You only need a CSV import there.
export LEADOCEAN_API_KEY="paste-your-key-here"Step 1: Agree the audience as filters
Write the shared audience as filters, not adjectives. Marketing and sales then argue about a number, not a story.
The example is marketing directors at US software companies with 51 to 200 staff. Use the free count to size it. In an MCP client, leadocean_count_leads does the same job. Over REST, send count=true as a query parameter with limit at 1.
curl -s "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{
"jobLevel": ["Director"],
"jobFunction": ["Advertising & Marketing"],
"country": ["US"],
"industry": ["Software Development"],
"employeeRange": ["51-200"],
"limit": 1
}' | jq '.meta'A count costs 0 records. If the number is too big for one campaign, add a filter. If it is too small, drop one.
Step 2: Pull a 20-row sample both teams review
Twenty rows is enough to see whether the filters match who you mean. Put the sample in front of one sales lead and one marketer before you spend more.
curl -s https://api.leadocean.io/v1/people/search \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{
"jobLevel": ["Director"],
"jobFunction": ["Advertising & Marketing"],
"country": ["US"],
"industry": ["Software Development"],
"employeeRange": ["51-200"],
"excludeTitle": ["assistant", "intern"],
"limit": 20
}' > sample.json
jq -r '.data[] | [.meta.source_ids.person_id, .contact_data.email_status] | @csv' sample.json
jq '.data[0].profile_data' sample.jsonThis spends 20 records. The first jq line prints each person id with its email status. The second prints one profile, so you can read the names and titles inside profile_data. If a title looks wrong, add it to excludeTitle and run again.
Step 3: Enrich one person to fill the gaps
Enrichment takes exactly one of linkedin_url, email, phone or person_id. Use the person_id from the sample. Set reveal_email to true only for rows you will actually contact.
curl -s 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 sample.json>", "reveal_email": true}' | jq .A person we hold nothing for is a 404 and costs nothing. Since October 2026 the response also carries career history in resume_data, such as past roles and education. Past employers have no company_id yet.
Step 4: Export one file for both teams
Bulk CSV export is on Solo ($97 a month) and above, not on Free. An export takes up to 50,000 rows a request and 500,000 a day. On Free, page the search with cursor instead.
curl -s https://api.leadocean.io/v1/exports \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{
"name": "US marketing directors, software, 51-200",
"filters": {
"jobLevel": ["Director"],
"jobFunction": ["Advertising & Marketing"],
"country": ["US"],
"industry": ["Software Development"],
"employeeRange": ["51-200"],
"emailStatus": ["verified", "catch_all_valid", "catch_all"]
},
"limit": 500
}' | jq '.data | {id, status, requested}'Import the CSV into the CRM that sales uses and the ad or email platform that marketing uses. One file means one count, one definition and one place to fix a bad row.
The LeadOcean app has the same export on its Exports page: a filter builder, a column picker, the record price before you start and a Download button. LeadOcean has no CRM, sequencer or dialer, so the file goes into those tools.
Step 5: Pick one tool per job
Eleven tools show up in GTM stacks. They do different jobs, so choose by the gap you have. Every claim below is from the vendor's own page, checked in September 2026.
| Job | Tool | One fact from its own docs |
|---|---|---|
| Shared data layer (search, enrich, export, MCP) | LeadOcean | 13 MCP tools, and counts are free. See pricing. |
| Table and waterfall workflow | Clay | The Free plan lists waterfalls. |
| All-in-one prospecting seat | Apollo | An email costs 1 credit and a phone number 8. |
| Enterprise database | ZoomInfo (GTM AI) | Search and lookup are free. One data credit enriches or exports one record. |
| Email finding by domain | Hunter | No credit is used when nothing is found. |
| Waterfall for emails and mobiles | FullEnrich | A lookup that finds nothing costs 0 credits. |
| Contact data with a waterfall option | Lusha | Data Waterfall charges only on a successful match. |
| EMEA-focused sales data | Cognism | One credit is one revealed contact. |
| Verified emails and mobiles | Prospeo | No result costs 0 credits. |
| Raw person and company profiles | People Data Labs | Requests that return nothing are not billed. |
| Waterfall for valid contacts | BetterContact | Credits are charged only on valid results. |
Our view: use one data layer for the shared list, then add a waterfall such as Clay or FullEnrich only where that layer leaves holes. Two overlapping waterfalls just double the bill and the argument. For vendor-by-vendor detail, see best enrichment APIs for B2B sales teams.
What you get
The Step 1 count is a real result. We ran the same filters through the free leadocean_count_leads tool on 2026-10-21 (trimmed).
{
"total": 1576,
"totalIsExact": true,
"totalAll": 3817,
"distinctCompanies": 998,
"credits": 0,
"defaults": "Counted only addresses worth sending to (emailStatus: verified or catch_all_valid or catch_all)",
"facets": {
"country": [{ "value": "US", "count": 1576 }],
"industry": [{ "value": "Software Development", "count": 1576 }],
"seniority": [{ "value": "director", "count": 1576 }],
"company_size": [{ "value": "51-200", "count": 1576 }]
}
}That is 1,576 mailable people across 998 companies. Without the email condition the same filters match 3,817 people. Your number will move as the data changes.
The export request returns a job. This is the response shape from the API reference, with placeholder values.
{
"success": true,
"data": {
"id": "<export id>",
"name": "US marketing directors, software, 51-200",
"status": "queued",
"requested": 500
}
}Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing, wrong or revoked API key | Re-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY again. |
| 429 | Above your plan's rate (5 requests a second on Free, 200 on Agency) | Wait the Retry-After seconds, then retry. Use pages of 100 instead of more calls. |
| 402 | Free plan: the 1,000 records are spent | Check GET /v1/account, lower limit, or move to a paid plan. |
| Count of 0 or a 400 on a filter | A value outside the catalogue, such as industry: "Software" | Call leadocean_list_enum_values or GET /v1/enums and pass the exact string. |
| Export refused | Bulk CSV export is not on Free, or the request is above 50,000 rows or the 500,000 daily ceiling | Page the search on Free, or split the export across requests and days. |
FAQ
Why do sales and marketing disagree on lead data?
Each team builds its own list with its own filters and its own enrichment tool. The same account then shows different titles and emails in two systems. A single audience definition and one export removes most of that.
Do I need all 11 tools?
No. Most teams need one data layer, one place to run workflows and, rarely, a second source for a gap. Pick one per job from the table in Step 5.
Does LeadOcean replace my CRM or sequencer?
No. LeadOcean is the data API and MCP server, plus an app with an Exports page. It has no rep workspace, sequencer, dialer, CRM or Chrome extension.
How fresh is the data?
The dataset is refreshed monthly, and each record carries its own fetched_at date. Read email_status before you send, because bounced emails are not refunded.
Can marketing use this without writing code?
Yes. The Exports page in the app builds the same file with a filter builder and a column picker, and shows the record price before you start.
Related
- Best enrichment APIs for B2B sales teams
- Best AI agent tools for GTM and sales teams
- How to build your Claude sales team for B2B GTM
- LeadOcean blog
- Pricing
Give sales and marketing one list to work from
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →