Lead generation turns a known person into a conversation. Demand generation makes a whole market aware you exist. You need an account list for one and a people list for the other, and both come from the same filters.
Demand generation is content, ads, events and free tools. You do not need to know who read them. Lead generation is a form fill, a reply or a booked call, and it needs a name and a channel.
TL;DR
- Demand generation targets accounts and runs on ads, content and events. Lead generation targets named people and runs on email, calls and forms.
- You can size both audiences with free count calls in about 20 minutes.
- The only step that spends records is pulling one page of 25 people. That is 25 of the 1,000 records on the Free plan.
Prerequisites
- A LeadOcean API key from the free plan, exported as
$LEADOCEAN_API_KEY. curlandjq.- Optional: the LeadOcean MCP server at
https://api.leadocean.io/mcp, to run the counts from an AI client. - An ICP you can write as filters. This guide uses US companies with 201-500 employees and VPs of marketing.
Step 1: Write the ICP as filters
Write the buyer once. Both motions reuse it.
{
"country": ["US"],
"employeeRange": ["201-500"],
"jobFunction": ["Advertising & Marketing"],
"jobLevel": ["VP"]
}Enum values are exact strings. Check a value before you use it:
curl -s "https://api.leadocean.io/v1/enums" -H "x-api-key: $LEADOCEAN_API_KEY" | jq 'keys'jobLevel accepts C-Team, VP, Director, Manager, Staff and Other. GET /v1/enums costs no records.
Step 2: Size the lead generation list (people)
A lead generation list is named people with a working email. Count them first with count=true as a query parameter and limit 1.
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 '{
"country": ["US"],
"employeeRange": ["201-500"],
"jobFunction": ["Advertising & Marketing"],
"jobLevel": ["VP"],
"limit": 1
}' | jq '.meta'The same count through the MCP tool leadocean_count_leads ran on 2026-10-21 and returned 5,339 people with a verified, catch_all_valid or catch_all email, across 3,311 companies. Without the email condition the same filters match 14,508 people. The count is capped at 100,000 in meta.total, so a wide filter shows a floor.
Step 3: Size the demand generation list (accounts)
Demand generation does not need a name. It needs the right companies in front of your ads and content. Count accounts with GET /v1/companies/count or the MCP tool leadocean_count_companies. Both are free.
Add a technology category to describe the company, not the person. This call asks for US companies with 201-500 employees that run marketing automation software:
{
"hqCountry": ["US"],
"employeeRange": ["201-500"],
"technologyCategories": ["Marketing automation"]
}On 2026-10-21 it returned 2,636 companies, with breakdowns by industry, HQ state and NAICS code. California had 524 and New York 243. Software Development led the industries with 162. The technology filter covers about 7.8M crawled sites, so a company we did not crawl will not match.
Use that list for ad audiences, event invites and account-level content. The counts show where to spend: a state with 524 accounts earns a regional event, a state with 20 does not.
Step 4: Pull the lead generation contacts
Now spend records. Pull one page of 25 and read the fields before you pull more.
curl -s -X POST "https://api.leadocean.io/v1/people/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"country": ["US"],
"employeeRange": ["201-500"],
"jobFunction": ["Advertising & Marketing"],
"jobLevel": ["VP"],
"limit": 25
}' > page1.json
jq '.meta' page1.jsonPage with the cursor from meta. One search pages to 10,000 rows, and meta.depthCapped turns true at the cap. Narrow the filters instead of walking further. For a larger file, POST /v1/exports takes up to 50,000 rows a request and 500,000 a day. Bulk CSV export is not on Free.
Step 5: Split the list by motion
Use one list, two jobs.
| Output | Demand generation | Lead generation |
|---|---|---|
| Unit | Company | Person |
| Source | /v1/companies/search | /v1/people/search |
| Used for | Ads, events, content | Email, calls, forms |
| Success metric | Reach, branded search | Replies, meetings |
| Cost to size | 0 records | 0 records |
Load the company list into your ad platform. Send the people list to your email tool. Check email_status on each record before you send. A bounced email is not refunded.
Step 6: Measure each motion on its own number
Do not judge demand generation on leads. Judge it on reach into the account list from Step 3: how many of the 2,636 accounts saw the campaign, visited the site or searched for you by name.
Judge lead generation on the contacts from Step 4: how many replied, how many booked. Keep the denominator honest. If you sent to 25 people, say 25, not "the market".
A simple weekly check:
accounts_in_list = 2636
accounts_reached = (from your ad platform)
contacts_pulled = 25
replies / meetings = (from your email tool)Re-run the free counts each month. The dataset is refreshed monthly, so the totals move.
What you get
The count outputs above are real and dated 2026-10-21:
leadocean_count_leads (US, 201-500 employees, Advertising & Marketing, VP)
total: 5339 (verified, catch_all_valid or catch_all email)
totalAll: 14508 (no email condition)
distinctCompanies: 3311
credits: 0
leadocean_count_companies (US HQ, 201-500 employees, Marketing automation)
total: 2636
credits: 0A row from the people search has this shape (response shape from the API reference, placeholder values):
{
"success": true,
"data": [
{
"profile_data": {
"profile_full_name": "Jane Doe",
"profile_headline": "VP Marketing at Acme",
"profile_url": "https://www.linkedin.com/in/jane-doe-example"
},
"contact_data": {
"has_email": true,
"has_phone": false,
"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 emails or phones. Enrich a person with POST /v1/people/enrich and reveal_email: true to get them.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Re-export $LEADOCEAN_API_KEY and check the header name. |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Honor Retry-After, or slow the loop. |
| 402 | Out of records on the Free plan | Count and breakdown calls stay free. Move to Solo ($97 a month) to keep pulling. |
| Empty results | A filter value is not an exact enum string, such as vp for jobLevel | Look the value up in GET /v1/enums. |
meta.depthCapped is true | One search reached 10,000 rows | Add filters and split the pull. |
| Export refused | Over 50,000 rows in a request or 500,000 in a day | Split the export into smaller requests. |
FAQ
What is the difference between lead generation and demand generation?
Demand generation builds awareness across a market of accounts. Lead generation captures named people who show intent. Demand generation feeds lead generation: it fills the pool you later contact.
Which should I do first?
Lead generation, if you have no pipeline. It pays back in weeks. Add demand generation once you can name your top 1,000 accounts, because it pays back over quarters.
Can one dataset support both?
Yes. Companies drive demand generation and people drive lead generation, and the filters are the same: industry, headcount, country, technology and job level.
How many records does sizing cost?
None. Count calls, GET /v1/enums and GET /v1/companies/count are free. Records are spent only when a person or company is returned.
What does it cost to run both?
The Free plan gives 1,000 records for life, with no card. Solo is $97 a month for one person. Agency is $497 a month for teams. See pricing.
Related
Size your lead generation and demand generation lists free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →