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

How-to guide

How to Prospect Better (10 Techniques With Real Queries)

Ten prospecting techniques, each one a request you can run against a live database. Counts are free.

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

Prospecting techniques convert when the list is narrow, the contact is reachable and the first line refers to something true. Every step below serves one of those three things.

Most guides on this topic describe habits. This one gives the query behind each technique, so you can size it, run it and see what it costs before you write a single email.

TL;DR

  • Ten techniques, each a request or prompt against https://api.leadocean.io. About 45 minutes end to end.
  • The walkthrough spends about 60 records. Counts, filter lookups and empty enrichments are free.
  • The Free plan (1,000 records, no card) covers all of it.

The order matters. Steps 1 to 3 size and shape the list for free. Steps 4 to 6 add signals. Steps 7 to 10 spend records on the few people who passed every filter.

Prerequisites

  • A LeadOcean account on the free plan: app.leadocean.io/register. Free allows 5 requests a second.
  • Your key in the shell: export LEADOCEAN_API_KEY=...
  • curl and jq. Optionally an MCP client such as Claude, which connects to https://api.leadocean.io/mcp with OAuth sign-in, no key pasted.

Step 1: Define the ICP as filters, then count it

Write the ideal customer as filters before you pull a single row. If the count is 40, the ICP is too tight. If it is 4 million, it is not an ICP.

Write the count next to the filters in your notes. When a campaign underperforms, you can tell whether the list was too wide or the message was wrong. A count of 5,574 mailable VPs in one country is a real list. It also hides about 13,000 more people with no usable email, which is why the status filter in Step 8 matters.

Sizing is free. Send count=true as a query parameter with limit 1. meta.total is capped at 100,000.

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}'

Step 2: Resolve enum values before you guess

Closed-list filters take exact strings. A wrong value returns an empty result, not an error. Look the value up first.

Run the lookup once per field and keep the exact strings in your repo. Job functions look like Sales & Business Development, and levels like C-Team, VP and Director. Seniority is lowercase, such as c_suite or vp.

bash
curl -s "https://api.leadocean.io/v1/enums" | jq -r '.data.enums[].name'
curl -s -G "https://api.leadocean.io/v1/enums/job_function" --data-urlencode "q=sales" | jq -r '.data.values[]'

In MCP, leadocean_list_enum_values does the same with a q substring. It is free.

Step 3: Target by title and level, not by title alone

Seniority decides who reads the message as their own problem. A VP reads a message about revenue. A manager may forward it. Pick the person who owns the problem, then add one level above and below as a second list to test.

Titles vary ("Head of Revenue", "VP Sales", "Sales Director"). Pair a title array with jobLevel or seniority so you catch the role, not the wording.

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 '{"title":["Head of Sales","VP Sales"],"seniority":["vp","head"],"employeeRange":["51-200"],"limit":25}'

Step 4: Filter by what the company runs

Tech stack is the cheapest buying signal for a tool vendor. If you sell to HubSpot users, filter on technologies. Detection covers about 7.8M crawled sites, so treat it as a strong signal, not a complete census.

Tech stack also tells you what to say. A company that runs a CRM you integrate with gets a one-line reason to reply. A company that runs nothing in the category gets a different message, or no message.

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 '{"technologies":["HubSpot"],"title":["Head of Sales"],"employeeRange":["51-200"],"limit":1}'

Step 5: Add a timing filter with funding

A funded company hires and buys. Use fundingType and minLastFundingYear at search time to narrow to recent rounds. Do not size this with a count call: funding filters are not supported by the free counter, so the number would be wrong.

Combine this with Step 3. A Series A company with a new VP of Sales is a stronger prospect than either fact alone. Keep each list small enough to write to by hand.

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":["C-Team","VP"],"fundingType":["Series A"],"minLastFundingYear":2025,"limit":25}'

Step 6: Build the account list first, people second

Account-first prospecting starts with companies. Size a company list for free with GET /v1/companies/count, then pull the buyers at each domain.

The count call returns an exact total with breakdowns by industry, headcount band and HQ country, so you see where the list is thin before you spend anything. One search pages to 10,000 rows. If meta.depthCapped is true, narrow the filters instead of walking the index.

bash
curl -s "https://api.leadocean.io/v1/companies/count?hqCountry=US&employeeRange=51-200" \
  -H "x-api-key: $LEADOCEAN_API_KEY"
curl -s "https://api.leadocean.io/v1/companies/acme.com/people?limit=25" \
  -H "x-api-key: $LEADOCEAN_API_KEY"

The people endpoint stops at 10,000 rows per company. Narrow with filters before that.

Step 7: Enrich the people you will actually contact

Search returns the list. Enrich returns the detail. Pass exactly one of linkedin_url, email, phone or person_id. An enrichment that finds nothing is a 404 and costs nothing.

Enrich in small batches and read the result before you scale. Ten enrichments tell you whether the fields you want are filled for your segment. Past employers carry no company id yet, so match them by name.

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}'

Since October 2026 the response carries career history: past roles, education, certifications and awards. That is your personalisation line, and it is a fact, not a guess.

Step 8: Read email status before you send

A bounce is a prospecting cost. Filter on emailStatus so you only mail what is likely to land. The free counter defaults to verified, catch_all_valid and catch_all. LeadOcean does not refund or credit back bounced emails, so read the status.

Treat catch_all as sendable with a lower expectation, and keep risky and unknown out of cold sequences. Sort the list by status and send the verified group first, so you learn the reply rate from clean data.

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 '{"title":["Head of Sales"],"emailStatus":["verified"],"limit":25}'

Step 9: Add a phone only where a call is worth it

Phones are for the top of your list, not the whole list. Use GET /v2/people/phone for the few contacts that justify a dial. Not every person has a number on file (166M of 693M people do), so check hasPhone when you size the list.

Call the list in order of fit, and email the rest. A phone number is a cost per record, and a dial that reaches voicemail is a wasted one. Two columns in the export, phone_1_number and phone_2_number, hold the numbers when you export in bulk.

bash
curl -s "https://api.leadocean.io/v2/people/phone?person_id=PERSON_ID_FROM_SEARCH" \
  -H "x-api-key: $LEADOCEAN_API_KEY"

Step 10: Export the list, then let an agent do the repeat work

Once the filters are proven, export the rows. A request takes up to 50,000 rows, and 500,000 a day. The app has an Exports page with a filter builder, a column picker and a price preview before you start. Bulk CSV export is not on the Free plan.

Keep one saved filter set per segment. When a campaign works, you re-run the same export a month later and get new people, because the dataset is refreshed monthly.

bash
curl -s -X POST https://api.leadocean.io/v1/exports \
  -H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
  -d '{"filters":{"title":["Head of Sales"],"emailStatus":["verified"]},"limit":1000}'

For repeat research, give the same filters to an agent over MCP. A prompt that works:

text
Count VPs of Sales in Canada, then show me the top five industries.
Do not search until I confirm the count.

What you get

Two free counts run on 2026-10-21 with the MCP tool leadocean_count_leads. Both count mailable people (verified, catch_all_valid or catch_all email). The second has no country filter, so it is worldwide.

FiltersMailable peopleWithout the email conditionEmployers
jobLevel VP, jobFunction Sales & Business Development, country CA5,57418,8003,873
technologies HubSpot, title Head of Sales, employeeRange 51-2001,3614,2081,174

Response shape from the API reference, with placeholder values. Search rows carry no contact points; enrich by person_id with reveal_email for the address.

json
{
  "success": true,
  "data": [
    {
      "profile_data": {
        "profile_full_name": "Jane Doe",
        "profile_headline": "Head of Sales at Acme",
        "profile_url": "https://www.linkedin.com/in/jane-doe"
      },
      "contact_data": {
        "has_email": true,
        "has_phone": true,
        "email_status": "verified",
        "email_type": "work"
      },
      "meta": { "source_ids": { "person_id": "1234567890" } }
    }
  ],
  "meta": { "count": 1, "limit": 25, "credits": 1, "nextCursor": "CURSOR" }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-keyCheck $LEADOCEAN_API_KEY is exported and sent as the x-api-key header
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Honour the Retry-After header and slow the loop
402Out of recordsThe 1,000 Free records are spent. Move to a paid plan
Empty resultsA bad enum value, such as "VP Sales" for jobLevelLook the value up in /v1/enums or leadocean_list_enum_values
Count withheld, or exactly 1,000A funding filter in a count call (totalWithheld names it)Count without funding filters and apply them at search time
Export refusedOver 50,000 rows a request or 500,000 a daySplit by country or seniority and export in batches

FAQ

What is the best prospecting technique for a small team?

Account-first with a tight count. Size the list for free, pick one title band and enrich only the people you will write to. Solo ($97 a month) covers one person.

How many prospects should one list hold?

Enough for the week, not the market. A few hundred people with a verified email beats 20,000 unchecked rows.

Does counting cost records?

No. Counts, breakdowns, filter lookups and empty enrichments are free. A search page of 25 is 25 records.

Can I run these from an AI agent?

Yes. LeadOcean has 13 MCP tools. Counting and filter lookups are free, search spends records per person returned.

Related: best AI tools for sales prospecting, sales intelligence and B2B prospecting platforms, B2B prospecting essentials, pricing and all guides on the blog.

Size your first prospect list for free

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

Get your free API key →