TL;DR
- Claude reads one company and a short list of its people through the LeadOcean connector, then writes a one-page brief you can skim before the call.
- It takes about 15 minutes the first time. One account spends about 14 of your 1,000 free records: 1 company, 10 roster rows and 3 enrichments.
- Sizing counts and filter lookups cost 0 records. A lookup that finds nobody costs nothing either.
Prerequisites
- A LeadOcean account from app.leadocean.io. The free plan has no card and 1,000 records, one-off. It needs a work email.
- A Claude account that can add a custom connector. The click-by-click setup is on Connect LeadOcean to Claude.
- 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 to Claude
Add the connector once and every later account takes minutes. Claude signs in with OAuth, so no key is pasted into the chat.
Name: LeadOcean
URL: https://api.leadocean.io/mcp
Request headers: leave emptyOpen a new chat, switch the connector on, and approve the LeadOcean sign-in. The Claude setup page covers Team and Enterprise too.
Step 2: Size the account for free
Check what we hold on the company before you spend a record. The count tool is free, and it takes a company domain. The example uses acme.com as a placeholder.
Use leadocean_count_leads with domain ["acme.com"], facets false. Then run it again
adding jobLevel ["C-Team","VP","Director"]. Say what each total counts. Do not call
any tool that spends records.The REST route is a search with count=true as a query parameter and limit at 1. The body is flat JSON and filters are arrays.
curl -s "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{"domain": ["acme.com"], "jobLevel": ["C-Team", "VP", "Director"], "limit": 1}' \
| jq '.meta | {total, totalIsExact, credits}'If the senior count is 0, stop here. We hold nobody senior at that company, and the rest of the recipe would spend records on thin results.
Step 3: Pull the company profile
Ask for the firmographic profile first. It is one record and gives Claude the facts to frame the call: size, industry, headquarters, funding where held, and the technologies found on the company website.
Use leadocean_get_company for acme.com. List employee count and band, industry,
headquarters, year founded, and total funding if held. Then list the detected
technologies grouped by category. Write "not held" for any null field.
Do not guess.Fields we do not hold come back null, not invented. Funding and revenue are thinly held, so "not held" is a normal answer there. The REST equivalent is POST /v1/companies/enrich.
curl -s https://api.leadocean.io/v1/companies/enrich \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{"domain": "acme.com"}' | jq '.data.company_data | {company_name, company_employees}'Step 4: Find the people who matter
Pull a short roster of senior people, not everyone. Each person returned costs one record, so a limit of 10 caps the spend. Search rows are thin: name, headline, role, company and email flags, with no addresses.
Use leadocean_search_leads with domain ["acme.com"], jobLevel ["C-Team","VP","Director"],
excludeTitle ["assistant","intern"], limit 10. Show a table of name, job title,
function, and whether we hold an email or a phone. Keep each person_id. Do not pull
more than 10.The REST call is the same search without count=true.
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", "Director"],
"excludeTitle": ["assistant", "intern"],
"limit": 10
}' | jq '.data[] | {name: .profile_data.profile_full_name, has_email: .contact_data.has_email}'Need more than 10 later? Page with the cursor from meta.nextCursor, unchanged. You can also list a whole company with GET /v1/companies/{domain}/people, which stops at 10,000 rows.
Step 5: Enrich the two or three you will meet
Enrich only the people on the call. One enrichment is one record and returns past roles (title, company name, dates), education, certifications, skills and, with reveal_email, every email and phone we hold. Skip rows where both has_email and has_phone are false, since there is nothing to return.
From the table, take the three people I will meet: the VP of Sales, the Head of
Marketing and the CFO. Use leadocean_get_lead on each, one call per person. For each,
summarise current role, tenure, previous employers and one thing worth asking about.
Tell me the email status. Do not enrich anyone else.The REST route takes a person_id from the search row's meta.source_ids.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}'Send exactly one identifier. Two is a 400.
Step 6: Have Claude write the brief
Give Claude a fixed template and one rule: use only what the tools returned. LeadOcean holds firmographics, technologies and people. It has no news, intent signals or call transcripts, so the brief must not invent them.
Write a one-page brief for my call with Acme using only the data above. Sections:
1. Company snapshot (size, industry, HQ, funding if held).
2. Tech stack (3 to 5 notable tools by category).
3. Who is on the call (role, tenure, background, one question each).
4. Who else to know (two senior people not on the call).
5. Gaps: every field that came back "not held".
Do not add news, quotes or numbers that did not come from the tools.Section 5 matters. A brief that lists its own gaps tells you where to check a news site or the company's own page before you dial.
Step 7: Save the prompt and reuse it
The whole run is six prompts, so make it one. Paste Steps 2 to 6 into a single message with the domain as the only variable. Save it as a Claude project instruction or a note, and change acme.com for each call.
Research the account at {domain} for a call on {date}. Run the free count first and
stop if there are no C-Team, VP or Director people. Otherwise get the company, pull
10 senior people, enrich only the {names} I list, and write the five-section brief.
Report how many records you spent at the end.Ask for the record total in every run. It keeps the spend visible, and it catches a prompt that quietly pulls 100 rows instead of 10.
Before you dial, check three things by hand. Look at the company's own site for news, since we hold none. Read email_status before you send anything, because there is no refund for bounces. Confirm the person still holds the role on LinkedIn, because each record carries its own fetched_at date and the dataset is refreshed monthly.
What you get
Step 2 is a real run. We ran it on 2026-10-21 with leadocean_count_leads, which spends 0 records, using the placeholder domain acme.com. Both totals count only addresses worth sending to (verified, catch_all_valid or catch_all), which is the tool's default.
{ "filters": { "domain": ["acme.com"] }, "total": 32, "totalAll": 707, "credits": 0 }
{ "filters": { "domain": ["acme.com"], "jobLevel": ["C-Team", "VP", "Director"] },
"total": 13, "totalAll": 276, "credits": 0 }So on 2026-10-21 we held 32 people at acme.com with a mailable email, and 13 of them at C-Team, VP or Director level. totalAll is the same filters with no email condition: 707 and 276. Your numbers will differ as the data changes.
A roster row has this shape. This is the response shape from the API reference, with placeholder values.
{
"success": true,
"data": [
{
"profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "<headline>" },
"contact_data": {
"has_email": true,
"has_phone": false,
"email_status": "verified",
"email_type": "work"
},
"meta": { "source_ids": { "person_id": "<person id>" }, "schema": "leadocean.person.v1" }
}
],
"meta": { "count": 1, "limit": 10, "credits": 1, "nextCursor": "<cursor>" }
}Total spend for one account is 1 (company) plus 10 (roster) plus 3 (enrichments), so 14 records. On the free plan that is about 70 accounts. On a paid plan (Solo at $97 a month or Agency at $497) there is no per-record price, only a fair-use pace.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 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 limit (5 requests a second on Free, 200 on Agency), or a paid plan's fair-use window reached | Wait the Retry-After seconds and send one search of 10 to 100 rows, not many single calls. |
| 402 | Free plan: the 1,000 records are spent | Ask Claude to read your account, then move to a paid plan. Free records do not reset. |
| Count or search returns 0 | A filter value outside the catalogue, such as jobLevel: "Vice President", or a domain we hold nobody for | Ask Claude to call leadocean_list_enum_values for job_level. The valid values are C-Team, Director, Manager, Other, Staff and VP. |
| 404 on enrich | We hold no contactable record for that person or company | Nothing to fix and nothing is charged. Try another person from the roster. |
| 400 "Invalid cursor" | A cursor was edited, or is from before 2026-09-19 | Restart the search and pass back meta.nextCursor exactly as returned. |
FAQ
How many records does one account cost?
About 14 in this recipe: 1 for the company, 10 for the roster and 3 for enrichments. Counts, filter lookups and account checks are free. Lower the roster limit to spend less.
Will Claude make up news about the company?
Not if you tell it not to. The tools return firmographics, technologies and people, with nulls where we hold nothing. Step 6 tells Claude to list gaps instead of filling them.
Can I research ten accounts in one chat?
Yes, but ask for the free count on each domain first and drop accounts with no senior people. Spend is about 14 records per account, so ten accounts is about 140.
Does this work in a coding tool instead?
Yes. The same MCP URL works elsewhere. See account research in Claude Code, in Windsurf and in VS Code. More recipes are in the blog hub.
Research your next account in Claude, free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →