An AI prospecting tool is two parts: a model that turns a plain-English target into filters, and a data source that returns real people. Most roundups compare the first part. This guide builds the whole loop so you can see where each part earns its keep.
TL;DR
- The model writes the filters and reads the results. The data API supplies the people. Keep them separate and you can swap either.
- It takes about 25 minutes. Sizing a list costs nothing, and the full run spends about 30 LeadOcean records.
- The Free plan covers it: 1,000 records for life, no card.
Prerequisites
- A LeadOcean account and API key, stored as
$LEADOCEAN_API_KEY. Sign up free at app.leadocean.io. curlandjqfor the REST steps.- An MCP client for the agent step. Any client that can add a remote MCP server works. The LeadOcean server is at
https://api.leadocean.io/mcpand signs in with OAuth, so no key is pasted. - A target in one sentence. Ours: VPs of Sales at 51 to 500 person US companies that sell AI products.
Step 1: Turn the sentence into filters
Filters are exact strings, so a model that guesses them returns empty lists. Have it look them up first. The free leadocean_list_enum_values tool and the GET /v1/enums endpoint return the allowed values. The index below lists each enum and its size; GET /v1/enums/{name} returns the values.
curl -s "https://api.leadocean.io/v1/enums" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq '.data.enums[] | {name, count}'For our target the exact values are jobLevel: VP, jobFunction: Sales & Business Development, country: US and employeeRange: 51-200, 201-500. "Sell AI products" is not an enum: it goes in companyKeywords, which matches the employer's own description. Case matters. vp is a seniority value, not a jobLevel value.
Step 2: Size the list before you spend anything
Counting is free, however many times you run it. In an MCP client, ask the model to call leadocean_count_leads. Over REST, send count=true and limit=1 as query parameters.
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true&limit=1" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "content-type: application/json" \
-d '{
"jobLevel": ["VP"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"employeeRange": ["51-200", "201-500"],
"companyKeywords": ["artificial intelligence"]
}' | jq '.meta'meta.total is capped at 100,000, and data comes back empty with meta.countOnly true. Use the count to tighten the filters until the list is one you would actually work.
Step 3: Let an agent run the search
Add the server to your MCP client with the URL https://api.leadocean.io/mcp. The server exposes 13 tools. Three matter here: leadocean_count_leads (free), leadocean_search_leads (1 record per person returned) and leadocean_get_lead (1 record).
Give the model a prompt that forces the free call first:
Find VPs of Sales at US companies with 51 to 500 employees that sell AI products.
1. Call leadocean_list_enum_values for any filter you are unsure of.
2. Call leadocean_count_leads and tell me the total and the filters you used.
3. Stop and wait. Do not call leadocean_search_leads until I say go.The stop at step 3 is the guardrail. A search that returns people spends records, so the human approves the number first. Then say "go, limit 25".
Step 4: Pull one page over REST
The same search, as a script you can schedule. The body is flat JSON, filters are arrays, limit runs 1 to 100, and cursor pages forward.
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", "201-500"],
"companyKeywords": ["artificial intelligence"],
"limit": 25
}' > page1.json
jq '.meta' page1.jsonThis returns 25 people and spends 25 records. One search pages to 10,000 rows. When meta.depthCapped is true there is no nextCursor, so narrow the filters instead of walking further.
Step 5: Enrich the few that matter
Do not enrich the whole page. Have the model rank the 25 against your pitch, then enrich the top five. Enrich takes exactly one of linkedin_url, email, phone or person_id.
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_placeholder", "reveal_email": true}'Since October 2026 the response includes career history in resume_data: past roles, education, certifications and awards, each when held. That is the text a model needs to write a specific first line. Past employers carry no company_id yet. An enrichment that finds nothing is a 404 and costs nothing.
What you get
This is the sizing call from Step 2, run through the free MCP tool on 2026-10-21. It counts mailable people (verified, catch_all_valid or catch_all email), not everyone.
leadocean_count_leads
jobLevel: VP
jobFunction: Sales & Business Development
country: US
employeeRange: 51-200, 201-500
companyKeywords: artificial intelligence
total (mailable): 245
totalAll (no email condition): 542
distinctCompanies: 153So 245 mailable VPs across 153 companies, at no cost. The search and enrich calls return records in this shape (response shape from the API reference, 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": [
{ "job_title": "VP Sales", "company_name": "Acme", "company_domain": "acme.com" }
]
},
"meta": { "source_ids": { "person_id": "1234567" }, "fetched_at": "2026-10-01" }
}
],
"meta": { "count": 1, "limit": 25, "credits": 1, "nextCursor": null }
}Search rows carry the id you enrich by at meta.source_ids.person_id. The full schema is in the API reference (October 2026). Search returns a thin projection without contact points. Enrichment adds them, and reveal_email returns the address.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Re-copy the key from app.leadocean.io and check the header name |
| 429 | Above your plan's rate limit (5 requests a second on Free, 200 on Agency) | Honor the Retry-After header and slow the loop |
| 402 | Records spent (Free is 1,000 for life) | Check GET /v1/usage, or move to Solo at $97 a month |
| Empty results | A filter value is not an exact enum string | Resolve it with leadocean_list_enum_values; jobLevel is VP, not vp |
meta.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 export; bulk CSV is not on Free |
FAQ
Do AI prospecting tools find new contacts or just filter existing data?
They filter an existing database. The model reads your goal and picks filters. It cannot create a verified email. Data quality sets the ceiling, so check email_status before you send.
Why use MCP instead of a built-in AI feature?
MCP lets any compatible model call the same tools, so you are not tied to one vendor's assistant. LeadOcean's server has 13 tools, and counting is free.
How many records does an AI prospecting run cost?
Sizing is free. A search page of 25 spends 25 records, and each enrichment that finds someone spends one. This guide uses about 30.
Can I run this without an agent?
Yes. Steps 2, 4 and 5 are plain REST calls. The agent only adds the filter translation and the ranking.
Where do the larger lists come from?
Use POST /v1/exports or the Exports page in the app. Bulk CSV export is not on Free. See best leads scraper tools for B2B prospecting and lead generation or prospecting for the wider picture, sales intelligence platforms for the alternatives, and pricing for plans.
Run your AI prospecting workflow on real data
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →