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

How-to guide

How to Run Lead Generation Tactics (With an API and No Sales Tool)

Four tactics that work: size the list first, search narrow, enrich only winners, export in bulk. Each step has a query you can run.

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

TL;DR

  • Four tactics: size the list for free, search narrow, enrich only the people you will contact, export in bulk.
  • Time: about 45 minutes the first time, a few minutes after that.
  • Records: about 50 for search and enrich on the Free plan (1,000 records for life). Counts cost nothing. The export costs one record per row and needs a paid plan.

Most lead generation advice is a list of channels. Channels tell you where to look, not who to contact. This guide is the data side: how to build a list you can act on. Pair it with smart lead generation for the process and the best lead generation tools for stack choices.

Prerequisites

  • A LeadOcean account on the Free plan. No card needed.
  • An API key stored as $LEADOCEAN_API_KEY.
  • curl and jq.
  • An ideal customer profile written as filters: title, level, country, company size, technology.

Step 1: Size the list before you spend anything

Count first. A count is free, so you can try ten versions of your profile at no cost.

Send count=true as a query parameter with limit 1 in the body. The body stays flat JSON and filters are arrays.

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", "Director"],
    "jobFunction": ["Sales & Business Development"],
    "country": ["US"],
    "employeeRange": ["51-200"],
    "technologies": ["HubSpot"],
    "limit": 1
  }' | jq '.meta'

In Claude or any MCP client, the same sizing call is the leadocean_count_leads tool. Use leadocean_list_enum_values first if you are unsure of an exact value such as Sales & Business Development.

Step 2: Search narrow, not wide

A list of 14,000 is a research project. A list of 300 is a campaign. Add filters until the count fits what one sender can work in a month.

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": ["US"],
    "employeeRange": ["51-200"],
    "technologies": ["HubSpot"],
    "limit": 25
  }'

Three narrowing moves cover most profiles. Pick one title band, not five. Pair jobFunction with jobLevel so a "Head of Sales" at a 20-person shop and a VP at a 5,000-person shop do not land in one list. Add technologies when the buyer's stack is the trigger, for example a CRM you integrate with.

Run the count from Step 1 after every added filter. If the total drops below your monthly send capacity, you have narrowed far enough.

Narrow by what changes buying intent: headcount band, detected technology, recent funding. Page with cursor when you need more. One search pages to 10,000 rows, so narrow the filters instead of walking the index.

Step 3: Enrich only the people you will contact

Search returns the person. Reach data is the second step. Enrich one person at a time, with exactly one of linkedin_url, email, phone or person_id.

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_STEP_2", "reveal_email": true}'

Do not enrich the whole search result. Read the headline and current role in the search output, drop the misfits, and enrich the rest.

Career history now comes back from person enrich too (past roles, education, certifications). Use it to write one specific opening line. Past employers carry no company_id yet, so match them by name.

An enrichment that finds nobody is a 404 and costs nothing. Check email_status before you send: bounced emails are not refunded. For phones, use GET /v2/people/phone.

Step 4: Export the rest in bulk

When the list is final, export it instead of looping over the API. Bulk CSV export is not on Free; Solo ($97 a month) includes it. An export takes up to 50,000 rows a request and 500,000 a day.

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": "us-vp-sales-hubspot",
    "filters": {
      "jobLevel": ["VP"],
      "jobFunction": ["Sales & Business Development"],
      "country": ["US"],
      "employeeRange": ["51-200"],
      "technologies": ["HubSpot"]
    },
    "limit": 300,
    "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.

Export columns are requested as email_N_address, email_N_status and phone_N_number, and the CSV headers come back as email_1_address, email_2_address. Filter on email_1_status in your sequencer so catch-all addresses go into a separate, slower batch.

Re-run the same export next month. The dataset is refreshed monthly and each record carries its own fetched_at date.

The app at app.leadocean.io has an Exports page with a filter builder, a column picker and the record price before you start. Load the CSV into your sequencer or CRM. LeadOcean does not send emails.

What you get

This is a live free count run on 2026-10-21 through the leadocean_count_leads MCP tool. It counts mailable people (verified, catch_all_valid or catch_all emails).

json
{
  "total": 14188,
  "totalIsExact": true,
  "totalAll": 40849,
  "distinctCompanies": 6444,
  "credits": 0
}

Filters: jobLevel VP or Director, jobFunction Sales & Business Development, country US, employeeRange 51-200, technology HubSpot. Mailable is 14,188 of 40,849 matching people, across 6,444 companies.

A person row from search has this shape (response shape from the API reference, 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",
        "contact_current_experiences": [{ "...": "company name, domain, job title" }]
      },
      "meta": { "source_ids": { "person_id": "1234567890" } }
    }
  ],
  "meta": { "count": 25, "nextCursor": "(opaque string)" }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-keyRe-copy the key from the app and export $LEADOCEAN_API_KEY
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Honor the Retry-After header and slow the loop
402Out of recordsFree is 1,000 records for life; move to Solo or Agency
Empty resultsEnum value is not an exact string (VP, not vp)Check leadocean_list_enum_values
Search stops with meta.depthCappedOne search pages to 10,000 rowsNarrow the filters
Export refusedOver 50,000 rows a request or 500,000 a day, or on FreeSplit the export; bulk CSV needs a paid plan

FAQ

Which lead generation tactic works best for B2B?

The one you can repeat: a tight profile, a sized list and a message that names a reason. Data quality decides whether the list is worth the effort.

How many leads should I pull at once?

As many as one sender can work in a month. Size with a free count, then pull 100 to 300 and measure replies before pulling more.

Is the count the same as what I can email?

No. The default count covers verified and catch-all emails only. Without that filter the same query matched 40,849 people on 2026-10-21.

Can I run this without writing code?

Yes. Use the MCP server from Claude or ChatGPT for counts and searches, and the app's Exports page for CSV.

What does it cost?

The Free plan is 1,000 records for life. Paid plans start at $97 a month. See pricing and the guide for contractor lead generation.

Size your first list free and see who is in it

Free to start. No credit card. 1,000 records to spend whenever you like.

Get your free API key →