We did not publish a 50-rep survey. Distrust any post that quotes one without a spreadsheet. This guide gives you the method instead. You run it on your own reps and get numbers you can defend.
TL;DR
- Survey 50 reps with five questions, tally the CSV in a short script, then enrich the same 50 contacts.
- It takes about 2 hours of your time plus a few days for replies.
- The API test spends at most 50 LeadOcean records (the free plan has 1,000). Sizing and counting spend none.
Prerequisites
- A LeadOcean account on the free plan, with the key exported as
$LEADOCEAN_API_KEY. - A form tool that exports CSV (any will do) and Python 3.
- A list of 50 reps. Your own team, or a community you belong to and may ask.
- 50 LinkedIn URLs of contacts your reps worked last quarter, for step 4.
Step 1: Write five questions that force a real answer
Ask what reps did last week, not what they like. Opinions about tools are noise. Usage is signal.
Q1. Which tools did you open in the last 7 days to find an email or phone? (tick all)
Q2. Which one did you open first?
Q3. How many contacts did you look up last week? (0 / 1-10 / 11-50 / 50+)
Q4. When a lookup failed, what did you do next? (try another tool / guess the email / skip)
Q5. Which tool do you pay for yourself, outside the company plan?Q2 matters most. Q1 shows the sprawl, Q2 shows the default. Q5 exposes shadow spend.
Step 2: Size the pool so you know what 50 means
50 answers from one team is a sample of one team. Size the wider population before you claim anything about it. This call is free.
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 '{
"title": ["Account Executive", "Sales Development Representative"],
"jobFunction": ["Sales & Business Development"],
"country": ["US"],
"limit": 1
}'The count=true flag goes in the query string, not the body. The body is flat JSON and filters are arrays. meta.total is capped at 100,000, so a larger pool reads as the cap. The MCP tool leadocean_count_leads takes the same filters.
Step 3: Collect replies and tally them
Export the form to replies.csv. Q1 holds a semicolon-separated list. This script counts tools mentioned and tools named first.
import csv
from collections import Counter
mentioned, first = Counter(), Counter()
with open("replies.csv", newline="") as f:
rows = list(csv.DictReader(f))
for r in rows:
for tool in r["q1_tools"].split(";"):
if tool.strip():
mentioned[tool.strip().lower()] += 1
first[r["q2_first"].strip().lower()] += 1
n = len(rows)
print(f"replies: {n}")
for tool, c in mentioned.most_common():
print(f"{tool:<20} mentioned {c:>3} ({c/n:.0%}) first {first[tool]:>3}")Look for the gap between "mentioned" and "first". A tool many reps mention but few name first is a fallback. The tool named first most often is the real default.
Step 4: Test the same 50 contacts
Take the 50 LinkedIn URLs, one per line in contacts.txt. Enrich each one. Enrich takes exactly one of linkedin_url, email, phone or person_id. A miss is a 404 and costs nothing.
while read -r url; do
code=$(curl -s -o /dev/null -w "%{http_code}" -X POST \
"https://api.leadocean.io/v1/people/enrich" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"linkedin_url\": \"$url\", \"reveal_email\": true}")
echo "$code $url"
sleep 0.25
done < contacts.txt | tee enrich-log.txt
cut -d' ' -f1 enrich-log.txt | sort | uniq -cThe sleep 0.25 keeps you under the Free plan's 5 requests a second. Run the same 50 URLs through the tool your reps named first, then compare hit rates. Same inputs, same week. Anything else is not a comparison.
Third-party tools in your survey have their own export and API docs. Read those for their output shape before you build the comparison columns.
Step 5: Put the two results side by side
Join the survey tally with the hit rates in one table. Keep it plain.
tool named first hit rate on 50 cost for the 50
tool_a (your number) (your number) (your number)
tool_b (your number) (your number) (your number)
leadocean n/a (your number) at most 50 recordsIf the tool named first has the lowest hit rate, you found the waste. If it has the highest, leave it alone and move on.
What you get
Step 2 returns a count. This is the result of the free leadocean_count_leads MCP tool on 2026-10-21, with the filters from step 2.
{
"total": 289171,
"totalIsExact": true,
"totalAll": 766511,
"distinctCompanies": 48903,
"credits": 0
}total counts US people with those titles and a verified, catch_all_valid or catch_all email, because the tool defaults to mailable addresses. totalAll is the same filters with no email condition. It spent 0 records.
Step 4 returns one JSON object per found person. This is the response shape from the API reference, with placeholder values:
{
"success": true,
"data": {
"profile_data": { "profile_full_name": "Jane Doe" },
"contact_data": {
"has_email": true,
"email_status": "verified",
"contact_emails": [
{ "email": "jane.doe@acme.com", "type": "work", "status": "verified" }
],
"contact_phones": [{ "phone": "+1 415 555 0133", "type": "mobile" }],
"contact_current_experiences": [
{ "job_title": "Account Executive", "company_name": "Acme" }
]
},
"resume_data": { "experiences": [], "educations": [] }
}
}Past employers in resume_data carry no company_id yet. Your tally from step 3 prints one line per tool in the format shown in the script.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Re-export $LEADOCEAN_API_KEY and send it as x-api-key. |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Keep the sleep. Honour Retry-After. |
| 402 | The 1,000 free records are spent | Check GET /v1/account, then move to Solo at $97 a month. |
Empty data on a search | A bad enum value, such as Sales for Sales & Business Development | Look it up with GET /v1/enums. |
| 404 on enrich | Nobody matched that LinkedIn URL | Free. Count it as a miss in your hit rate. |
| Search stops paging | One search pages to 10,000 rows (meta.depthCapped is true) | Narrow the filters instead of walking the index. |
FAQ
How many reps do I need for the survey to mean anything?
Fifty is enough to see a default tool, not to measure market share. Report it as "50 reps on our team", never as an industry figure.
Can I ask reps outside my company?
Only where they agreed to be asked, such as a community you run. Do not scrape a list and email it cold. Use the count in step 2 to size the wider group, not to build a mailing list.
Does the 50-contact test cost anything?
At most 50 records, one per person found. Misses are free. The free plan holds 1,000 records for life, so you can run the test twenty times over.
What if the tool my reps use has no API?
Export a CSV from it for the same 50 contacts and compare fields by hand. The hit-rate logic is identical.
For CRM-side examples, see which enrichment tools work with Zendesk and the monday CRM guide. For a wider list, see 11 enrichment tools GTM teams use.
What does it cost when the test is done?
Free covers the test. For ongoing volume, see pricing: Solo is $97 a month for one person, Agency is $497 a month for teams. More reading is in the enrichment API hub.
Test your reps' favourite tool against 50 real contacts, free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →