TL;DR
- Claude reads each competitor's team size by function, profile, leadership and technologies through the LeadOcean connector, and a short script saves the free counts every month so you can see what moved.
- It takes about 30 minutes the first time and under 5 minutes a month after. Three competitors spend about 28 of your 1,000 free records.
- Counts and filter lookups cost 0 records. LeadOcean holds no job postings, social posts, news or web traffic, so this recipe covers the people and company side only.
Prerequisites
- A LeadOcean account from app.leadocean.io. The free plan has no card and 1,000 records, one-off.
- A Claude account that can add a custom connector. The click-by-click setup is on Connect LeadOcean to Claude.
- For the monthly script: a shell with
curlandjq, and a key from the app in your environment as$LEADOCEAN_API_KEY.
export LEADOCEAN_API_KEY="paste-your-key-here"The examples use placeholder domains: acme.com is the competitor. Swap in your own three.
Step 1: Add LeadOcean to Claude
Add the connector once and every later check 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 sign-in. The server exposes 13 tools. Counting and lookups cost nothing: leadocean_count_leads, leadocean_count_companies, leadocean_list_filters, leadocean_list_enum_values and leadocean_get_account.
Step 2: Count each competitor's team by function
Team mix is the cheapest signal you can track. A competitor with 3 engineers and 2 salespeople in our data is a different bet from one with 80 and 40. The count tool is free, so run it as often as you like.
Use leadocean_count_leads with facets false for the domain acme.com, four times,
each time adding one jobFunction: "Engineering", "Sales & Business Development",
"Customer/Client Service", "Advertising & Marketing". Put the totals in a table.
Say what each total counts. Do not call any tool that spends records.The same count over REST is a people search with count=true as a query parameter and limit at 1. The body is flat JSON and filters are arrays. The data array comes back empty.
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"], "jobFunction": ["Engineering"], "limit": 1}' \
| jq '.meta | {total, totalIsExact}'Treat the numbers as a sample of the people we hold, not the real headcount. They move when the dataset refreshes, which happens monthly, and when a competitor hires.
Step 3: Pull the company profile
Ask for the firmographic profile of each competitor. It costs one record per company and gives Claude the size band, industry, headquarters 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 funding if held. Then list the detected technologies
grouped by category. Write "not held" for any null field. Do not guess.Some fields can be null, so "not held" is a normal answer. The REST route 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: .company_data.company_name, tech: .company_detected_technologies}'Step 4: List the leadership
Pull a short roster of senior people for each competitor. Each person returned costs one record, so a limit of 5 caps the spend at 15 for three companies. Search rows are thin: name, headline, role and email flags.
Use leadocean_search_leads with domain ["acme.com"], jobLevel ["C-Team","VP"],
excludeTitle ["assistant","intern"], limit 5. Show name, job title, function and
whether we hold an email. Do not pull more than 5 per company.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"],
"excludeTitle": ["assistant", "intern"],
"limit": 5
}' | jq '.data[] | .profile_data | {full_name, headline}'Need the whole roster later? GET /v1/companies/{domain}/people lists everyone we hold at a company and stops at 10,000 rows.
Step 5: Find rivals you are not tracking
New entrants hurt most when you are not watching them. Search for companies that look like your competitor on size, industry and description, then ask Claude to drop the ones you already track.
Use leadocean_search_companies with q "revenue intelligence", industry
["Software Development"], employeeRange ["51-200"], limit 10. Show name, domain,
employee band and headquarters. Remove acme.com and any domain I already track:
beta-example.com, gamma-example.com.Each company returned is one record, so the limit caps the spend. The REST body is flat JSON.
curl -s https://api.leadocean.io/v1/companies/search \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d '{
"q": "revenue intelligence",
"industry": ["Software Development"],
"employeeRange": ["51-200"],
"limit": 10
}' | jq '.data[].company_data | {company_name, company_employees}'Check the industry value first. Ask Claude to call leadocean_list_enum_values with name set to industry, because 534 values are valid and a near miss returns nothing.
Step 6: Save the counts every month
The count in Step 2 is only useful as a trend. This script runs the free counts for every competitor and function and appends them to a CSV. It spends 0 records.
#!/usr/bin/env bash
set -euo pipefail
DOMAINS=("acme.com" "beta-example.com" "gamma-example.com")
FUNCS=("Engineering" "Sales & Business Development" "Customer/Client Service" "Advertising & Marketing")
OUT=ci-snapshots.csv
[ -f "$OUT" ] || echo "date,domain,function,total" > "$OUT"
for d in "${DOMAINS[@]}"; do
for f in "${FUNCS[@]}"; do
body=$(jq -n --arg d "$d" --arg f "$f" '{domain:[$d], jobFunction:[$f], limit:1}')
total=$(curl -s "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "content-type: application/json" \
-d "$body" | jq -r '.meta.total')
echo "$(date +%F),$d,\"$f\",$total" >> "$OUT"
sleep 0.25
done
doneTwelve calls fit inside the free plan's 5 requests a second with the sleep 0.25 between them. Agency allows 200 a second. Run it on the first of the month with cron or any scheduler, since the dataset refreshes monthly and a weekly run mostly repeats itself.
Step 7: Have Claude write the diff
Paste the CSV into a chat and give Claude one rule: report only what the numbers show. Our data has no news or intent signals, so the brief must not invent a reason for a change.
Here is ci-snapshots.csv. Compare the two latest dates for each domain and function.
List every change of 5 people or 20 percent or more, largest first. For each, say
what the numbers show and nothing about why. End with the domains that have no
change. Do not add news, funding or product claims.Add the Step 3 profile and Step 4 roster to the same chat when a count jumps. A new VP in a function whose count grew is a stronger signal than either alone. Then check the competitor's own site and press page, because we hold neither.
Step 8: Decide what each signal means
Raw counts need a reading rule, or the monthly diff becomes noise. Agree the rules before the first run and put them in the prompt.
- A jump in Engineering with flat Sales usually means a product push. Check the competitor's changelog next.
- A jump in Sales and Business Development with flat Engineering usually means a go-to-market push. Look at which countries the new people sit in by re-running the count with
country. - A new C-Team or VP row in the Step 4 roster is worth a note on its own, since leadership changes tend to precede a change of direction.
- A change in
company_detected_technologiesmeans they swapped a tool on their website. It says nothing about their internal stack.
Keep the rules short. Claude applies a five-line rule set the same way every month, and a long one drifts. Review the diff yourself for the first three months, then trust it for the routine changes and read only the large ones.
What you get
Step 2 is a real run. We ran it on 2026-10-21 with leadocean_count_leads, which spends 0 records, on the placeholder domain acme.com. These totals count only people with an address worth sending to (verified, catch_all_valid or catch_all), which is the tool's default.
{ "filters": { "domain": ["acme.com"] }, "total": 32, "totalIsExact": true, "totalAll": 707 }
{ "filters": { "domain": ["acme.com"], "jobFunction": ["Engineering"] }, "total": 3, "totalIsExact": true, "totalAll": 24 }
{ "filters": { "domain": ["acme.com"], "jobFunction": ["Sales & Business Development"] }, "total": 1, "totalIsExact": true, "totalAll": 35 }
{ "filters": { "domain": ["acme.com"], "jobFunction": ["Customer/Client Service"] }, "total": 0, "totalIsExact": true, "totalAll": 1 }So on 2026-10-21 we held 32 mailable people at acme.com, 3 of them in Engineering and 1 in Sales and Business Development. totalAll is the same filters with no email condition: 707 people in all. Neither is headcount. Your numbers will differ.
The monthly file then looks like this. The rows below are the shape of the file, with the real run's date and placeholder domains.
date,domain,function,total
2026-10-21,acme.com,Engineering,3
2026-10-21,acme.com,"Sales & Business Development",1
2026-10-21,acme.com,"Customer/Client Service",0A company profile has this shape. This is the response shape from the API reference, with placeholder values.
{
"success": true,
"data": {
"company_data": { "company_name": "Acme", "company_employees": "<count>" },
"company_detected_technologies": { "<category>": ["<technology>"] },
"company_metrics": {},
"meta": { "schema": "leadocean.company.v1" }
}
}Total spend for three competitors is 3 (profiles) plus 15 (leadership) plus 10 (discovery), so 28 records. On the free plan that is about 35 rounds. Paid plans have no per-record price: Solo is $97 a month and Agency $497, each with a fair-use pace instead of credits. See pricing.
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 the plan's rate limit: 5 requests a second on Free, 50 on Solo, 200 on Agency | Wait the Retry-After seconds, then retry. Space the script's calls if you track hundreds of domains. |
| 402 | Free plan: the 1,000 records are spent | Ask Claude to read your account, then move to Solo or Agency on pricing. Free records do not reset. |
| Count or search returns 0 | A value outside the catalogue, such as jobLevel: "Vice President", or a domain we hold nobody for | Call leadocean_list_enum_values for job_level. Valid values are C-Team, Director, Manager, Other, Staff and VP. |
meta.total is null with totalWithheld | A filter in the request could not be applied, so a wrong count was withheld | Drop the filter named in totalWithheld.filters and count again. |
400 export_limit_rows or 429 export_limit_daily | Over 50,000 rows in one export, or 500,000 rows in a day | Split the filters into smaller exports and run them on separate days. |
FAQ
Does LeadOcean track competitor job postings or social posts?
No. We hold people and company records: roles, functions, technologies and firmographics. For postings, news and traffic, add a tool built for them and keep this recipe for the people side.
How many records does one monthly run cost?
Zero if you only run the Step 6 script. The counts are free. Records are spent only on the profiles, leadership rows and discovered companies you pull in Steps 3 to 5.
Can I export everyone at a competitor?
Yes, on a paid plan: bulk CSV export is not on Free. POST /v1/exports takes the same filters as people search and up to 50,000 rows a request, 500,000 a day. Every row costs one record, so size it with a free count first.
Does this work in a coding tool instead of Claude?
Yes. The same MCP URL works in other clients, and the REST calls need only curl. See lead enrichment with Claude and candidate sourcing with Claude Code, or the customer success workflows. More recipes are in the blog hub.
Track your competitors in Claude, free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →