TL;DR
- Lead generation builds a pool of people who fit your market. Prospecting picks named people from that pool and researches them before you contact them.
- In practice both are queries: size the market (free), pull a page, enrich the few you will contact.
- The walkthrough takes about 20 minutes and spends about 26 LeadOcean records. The Free plan has 1,000 for life.
The textbook split is short. Lead generation is volume: a defined audience, filled by outbound lists, ads, content or events. Prospecting is selection: from that audience, which 20 people get a personal message this week.
The split matters because the tools differ. Generation needs counts and bulk export. Prospecting needs filters tight enough to return a handful of people, plus the profile of each.
Prerequisites
- A LeadOcean account on the Free plan. Start free, no card.
- An API key exported as
$LEADOCEAN_API_KEY. curlandjq.- A rough ideal customer profile: a job function, a seniority and a country.
Step 1: Size the pool (lead generation)
Count before you pull anything. A count with count=true and limit=1 is free and returns the match total in meta.total, which is capped at 100,000. Send count=true as a query parameter, not in the JSON body.
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["CA"],
"limit": 1
}' | jq '.meta'If the number is under a few hundred, you are looking at a prospecting list. If it is in the thousands, you are looking at a pool, and the next question is how to cut it.
The same count works through the MCP tool leadocean_count_leads, which also reports how many employers the people span.
Step 2: Check the enum values before you filter
Enum filters are exact strings. A wrong value returns an empty page, not an error. jobLevel takes C-Team, VP, Director, Manager, Staff or Other. Seniority is lowercase (c_suite, vp, director).
curl -s "https://api.leadocean.io/v1/enums" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq 'keys'GET /v1/enums and GET /v1/filters are free. Through MCP, use leadocean_list_enum_values and leadocean_list_filters.
Step 3: Narrow the pool to a prospecting list
Prospecting is the same query with more conditions. Add a headcount band and a title, and drop the page size. Filters are arrays, the body is flat JSON, and limit runs from 1 to 100.
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": ["CA"],
"employeeRange": ["51-200"],
"limit": 25
}' | jq '{count: .meta.count, next: .meta.nextCursor}'This page spends 25 records, one per person returned. Pass meta.nextCursor as cursor for the next page. One search pages to 10,000 rows. Past that, meta.depthCapped is true: narrow the filters instead of walking further.
Step 4: Enrich the people you will actually contact (prospecting)
Pick the few people worth a personal message and enrich them by person_id. Enrich takes exactly one of linkedin_url, email, phone or person_id. Set reveal_email to get the address.
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_SEARCH", "reveal_email": true}'It costs one record when it finds the person. A person we hold nothing for is a 404 and costs nothing. Since October 2026 enrich also returns career history (resume_data: past roles, education, certifications), which is the research a good first line needs. Read email_status before you send: bounced emails are not refunded.
Step 5: Export the pool for the generation side
When the pool is for campaigns, ads or a CRM load, export it instead of paging. POST /v1/exports takes up to 50,000 rows a request and 500,000 a day. Bulk CSV export is not on Free; it is included on Solo ($97 a month).
curl -s -X POST "https://api.leadocean.io/v1/exports" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "ca-vp-sales",
"filters": {
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["CA"]
},
"limit": 5000,
"preset": "full"
}'filters takes the people-search filters and limit the row count. Every row costs one record. Poll GET /v1/exports/{id} until status is done, then download the file.
The app at app.leadocean.io has an Exports page with the same filters, a column picker, the record price before you start, and a CSV download. It is a data tool, not a rep workspace: no sequences, dialer or CRM.
What you get
A free count for the Step 1 query, run on 2026-10-21 through leadocean_count_leads:
{
"total": 5574,
"totalIsExact": true,
"totalAll": 18800,
"distinctCompanies": 3873,
"credits": 0
}total counts people whose best email is verified, catch_all_valid or catch_all. totalAll is the same filters with no email condition. So the pool is 5,574 mailable VPs of sales in Canada across 3,873 employers. That is generation scale. Step 3's headcount band is what turns it into a prospecting list.
Response shape from the API reference for a search row (placeholder values):
{
"success": true,
"data": [
{
"profile_data": {
"profile_full_name": "Jane Doe",
"profile_headline": "VP Sales at Acme"
},
"contact_data": {
"has_email": true,
"email_status": "verified",
"email_type": "work",
"contact_current_experiences": [{ "...": "company name, domain, job title" }]
},
"meta": { "source_ids": { "person_id": "1234567890" } }
}
],
"meta": { "count": 25, "nextCursor": "(opaque string)" }
}Search rows carry no email address. The person_id is what you pass to enrich in Step 4.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Re-copy the key from app.leadocean.io and export it as $LEADOCEAN_API_KEY |
| 429 | Above the plan's rate limit (5 requests a second on Free, 200 on Agency) | Honor the Retry-After header and slow the loop |
| 402 | The 1,000 Free records are spent | Move to Solo ($97 a month) or Agency ($497 a month) |
| Empty results | An enum value is not an exact string | Check GET /v1/enums or leadocean_list_enum_values |
depthCapped: true | One search reached 10,000 rows | Add filters and run narrower searches |
| Export refused | Over 50,000 rows a request or 500,000 a day | Split the filter into slices and export each |
FAQ
Is prospecting part of lead generation?
Yes, in the common funnel view. Generation produces the pool. Prospecting is the selection and research step on the outbound side. See lead generation funnel.
Which one needs more data volume?
Generation. Prospecting needs fewer rows with more fields per person: title, history, email status.
Is outbound lead generation the same as prospecting?
Not quite. Outbound lead generation is the whole motion of reaching out to a defined audience. Prospecting is how you choose and research who goes first.
Can predictive scoring replace prospecting?
It can rank the pool, but you still need contact data on the winners. See predictive lead generation.
What does the walkthrough cost?
About 26 records on a plan with 1,000 free for life. Counts, enum lookups and the account endpoints cost nothing. See pricing.
Size your market, then pick your first 25 prospects
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →