TL;DR
- Claude reaches LeadOcean through one custom connector URL. You give it a company domain and a seniority filter, and it returns the people who hold budget.
- It takes about 15 minutes. The example spends 13 of your 1,000 free records: 10 for the roster search and 3 for work emails.
- Counts and filter lookups cost 0 records. Only people you receive count, one record each.
Prerequisites
- A LeadOcean account from app.leadocean.io. The free plan has no card, 1,000 records one-off, and needs a work email.
- A Claude account that can add a custom connector. Per the Claude docs, October 2026, that covers Free, Pro, Max, Team and Enterprise. Free allows one custom connector, and Team and Enterprise limit who can add one.
- Optional, for the REST checks:
curland a key in your shell as$LEADOCEAN_API_KEY. The chat steps need no key.
export LEADOCEAN_API_KEY="paste-your-key-here"Step 1: Add LeadOcean as a custom connector
Claude connects from Anthropic's cloud, so you add a public URL and sign in with OAuth. No key is pasted. On Pro and Max, go to Customize, then Connectors, then "+ Add", then "Add custom connector".
Name: LeadOcean
URL: https://api.leadocean.io/mcp
Request headers: leave emptyClick "Continue", review the authentication settings, then "Add". Sign in on the LeadOcean page and approve. Team and Enterprise steps are on Connect LeadOcean to Claude.
In a new chat, click "+" at the lower left, then "Connectors", and switch LeadOcean on. Claude asks before it runs a tool.
Step 2: Define "decision maker" with exact values
A decision maker is a filter, not a guess. Pick the seniority bands and the department, and let Claude confirm the exact strings first. A wrong string returns nothing.
Use leadocean_list_enum_values for job_level and for job_function. Show me the exact
values. I want C-level and VP people in Sales & Business Development. Do not search yet.The jobLevel values are C-Team, VP, Director, Manager, Staff and Other. For a finer cut, seniority takes lowercase bands such as c_suite, vp and director. Pick one of the two, not both.
Step 3: Size the buyer pool for free
Count before you pull anyone. The count tool takes the same filters as search and spends nothing. This sizes the pool of buyers across companies like yours, so you know the role filter is not empty.
Use leadocean_count_leads with jobLevel ["C-Team","VP"], jobFunction ["Sales & Business
Development"], country ["US"], employeeRange ["201-500"], facets false. Report the
total and say which email statuses it counted. Do not call a tool that spends records.Claude reports the total and notes that the default counts verified, catch_all_valid and catch_all addresses only. That is a mailable count, not everyone we hold. Narrow one filter at a time if the number is wrong for your team.
Step 4: Pull the roster at one company
Now point the same filters at a single domain. Use the domain filter with a limit of 10. A search returns thin records: name, headline, current role, company and location, plus email flags. It does not return addresses.
Use leadocean_search_leads with domain ["acme.com"], jobLevel ["C-Team","VP"], limit 10.
Show a table of name, job title and whether an email is on file. Rank the rows by who
most likely signs off on a data purchase. Tell me the record cost before you run it.Each person returned costs one record, so this step spends up to 10. If acme.com has four VPs and C-level on file, you pay for four. Claude should read the flags and stop there.
The REST route is the same search. The body is flat JSON and every filter is an array.
curl -s https://api.leadocean.io/v1/people/search \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{
"domain": ["acme.com"],
"jobLevel": ["C-Team", "VP"],
"limit": 10
}' | jq '.data[] | {person: .meta.source_ids.person_id, email: .contact_data.has_email}'To list everyone we hold at a company instead, call GET /v1/companies/acme.com/people. It bills one record per person returned and stops at 10,000 rows. Filter by level first on a large company.
Step 5: Enrich the three you will contact
Enrich only the people worth a message. leadocean_get_lead accepts the person_id a search row carries at meta.source_ids.person_id. Search publishes email flags, not addresses, so enrich by the person_id that search returned. Set reveal_email to true to get the address. It costs no extra record.
For the three people you ranked highest, use leadocean_get_lead with their person ids
and reveal the email. Show name, title, work email and email_status. Flag any email_status
other than verified. Do not enrich anyone else.The REST call takes exactly one of linkedin_url, email, phone or person_id.
curl -s 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 the search row>", "reveal_email": true }' \
| jq '.data.contact_data | {has_email, email_status, contact_emails}'A person we hold nothing for is a 404 and costs nothing. Read email_status before you send. Bounced emails are not refunded.
What you get
The count in Step 3 is a real run. We ran it on 2026-10-01 with leadocean_count_leads, which spends 0 records, and it returned this.
{
"total": 22662,
"totalIsExact": true,
"credits": 0,
"defaults": "Counted only addresses worth sending to (emailStatus: verified or catch_all_valid or catch_all), which is this tool's default.",
"unsupportedFilters": []
}So 22,662 C-Team and VP sales leaders at US companies with 201-500 staff had a verified, catch_all_valid or catch_all email on 2026-10-01. Your number will differ as the data changes.
The roster search returns rows like this. This is the response shape from the API reference, with placeholder values.
{
"success": true,
"data": [
{
"profile_data": { "...": "name, headline, current role, company, location" },
"contact_data": { "has_email": true, "has_phone": false, "email_status": "verified" },
"meta": { "source_ids": { "person_id": "<person id>" } }
}
],
"meta": { "count": 1, "nextCursor": null }
}The enrich response has the same shape. With reveal_email true, contact_data also carries contact_emails and contact_phones. Total spend for the run is 10 plus 3, so 13 records at most.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| Connector shows, but no tools appear | The sign-in window closed before approval, or the connector is off in this chat | Click "Connect" again and approve. Then switch LeadOcean on under "+", then "Connectors". |
| 401 | Missing, wrong or revoked key on a REST call | Re-copy the key from app.leadocean.io and export $LEADOCEAN_API_KEY again. |
| 429 | Above your plan's rate (5 requests a second on Free, 200 on Agency) | Wait the Retry-After seconds and send full pages of 100 instead of many small calls. |
| 402 | Free plan: the 1,000 records are spent | Ask Claude to read the account, or move to a paid plan. Free records do not reset. |
| Empty results for a real company | A wrong enum value such as jobLevel: "Executive", or the domain is written with www. | Use leadocean_list_enum_values for the exact string and pass the bare domain, such as acme.com. |
| 400 "Invalid cursor" on a roster walk | The cursor was edited or came from a different search | Restart the query. Pass back exactly the meta.nextCursor string, unchanged. |
FAQ
How many records does it cost to find decision makers at one company?
One record per person returned. A roster of four VPs and C-level costs four, and each enrichment costs one more. Counts, filter lookups and enum lookups are free.
Does LeadOcean tell me who the budget owner is?
No. It filters by jobLevel, seniority, jobFunction and title, so you decide who counts. Ask Claude to rank the rows, then check the ranking yourself.
Does Claude see my API key?
Not through the connector. The MCP server uses OAuth sign-in and you paste no key into the chat. The optional REST steps read $LEADOCEAN_API_KEY from your own shell.
Can I do this in a coding tool instead?
Yes. The same MCP URL works elsewhere. See Claude Code, Windsurf and VS Code. Free is enough for this run. Paid plans start at $97 a month for Solo; see pricing.
Find the decision makers at your next account, free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →