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

How-to guide

How to Tell Lead Generation From Prospecting (and Run Both by API)

Lead generation fills the pool. Prospecting picks the people in it you will contact. Both are queries against the same data.

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

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.
  • curl and jq.
  • 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.

bash
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).

bash
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.

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": ["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.

bash
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).

bash
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:

json
{
  "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):

json
{
  "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

ErrorCauseFix
401Missing or wrong x-api-keyRe-copy the key from app.leadocean.io and export it as $LEADOCEAN_API_KEY
429Above the plan's rate limit (5 requests a second on Free, 200 on Agency)Honor the Retry-After header and slow the loop
402The 1,000 Free records are spentMove to Solo ($97 a month) or Agency ($497 a month)
Empty resultsAn enum value is not an exact stringCheck GET /v1/enums or leadocean_list_enum_values
depthCapped: trueOne search reached 10,000 rowsAdd filters and run narrower searches
Export refusedOver 50,000 rows a request or 500,000 a daySplit 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 →