An ABM team needs nine enrichment jobs done in order: size the list, build it, fill firmographics, read the tech stack, find the buying committee, enrich each person, then get email, phone and a file. LeadOcean covers all nine with one key. This guide runs each as a real call.
TL;DR
- Nine calls, about 45 minutes. Sizing the account list is free.
- The walk-through spends roughly 60 records (an estimate): a few companies, 10 people from one account, then a few contact lookups. The free plan's 1,000 records cover it.
- Output is a CSV of accounts and named, mailable contacts, built from
https://api.leadocean.ioonly.
Prerequisites
- A LeadOcean key from app.leadocean.io/register. Free is $0, 1,000 records for life, no card, 5 requests a second.
- The key in your shell:
export LEADOCEAN_API_KEY=... curlandjq.- A target account profile. The examples use US software companies with 201 to 1000 employees.
Step 1: Size the account list (free count)
Count before you pull anything. GET /v1/companies/count takes the company-search filters and returns an exact total with breakdowns. It costs no records. In an AI client the same call is the leadocean_count_companies MCP tool.
curl -s -G "https://api.leadocean.io/v1/companies/count" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
--data-urlencode "hqCountry=US" \
--data-urlencode "employeeRange=201-500,501-1000" \
--data-urlencode "industry=Computer Software" \
--data-urlencode "hasMailableContacts=true"hasMailableContacts=true keeps accounts where at least one person has a verified or catch-all email. If the total is too big for your team, narrow it here, not after you pay for rows.
Step 2: Build the account list (company search)
POST /v1/companies/search takes a flat JSON body. Filters are arrays, limit is 1 to 100, and you page with cursor. One search pages to 10,000 rows.
curl -s -X POST "https://api.leadocean.io/v1/companies/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "Content-Type: application/json" \
-d '{
"hqCountry": ["US"],
"employeeRange": ["201-500", "501-1000"],
"industry": ["Computer Software"],
"hasMailableContacts": true,
"slim": true,
"limit": 25
}'Each company returned is one record. Use fields or slim to keep the response small. Funding filters (fundingType, minLastFundingYear) work here and in the Step 1 company count. They do not work in the free people count, so size funded accounts with GET /v1/companies/count.
Step 3: Fill firmographics for accounts you already have
If sales brought a named-account list, skip search and enrich by domain. POST /v1/companies/enrich takes domain or linkedin_url.
curl -s -X POST "https://api.leadocean.io/v1/companies/enrich" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "Content-Type: application/json" \
-d '{"domain": "acme.com"}'The record has company_data, company_detected_technologies and company_metrics. An account we hold nothing for returns 404 and costs nothing.
Step 4: Read the tech stack (technology filters)
Tech signals decide which accounts fit your pitch. The technologies and technologyCategories filters cover about 7.8M crawled sites. Categories are exact strings, so resolve one first (free):
curl -s "https://api.leadocean.io/v1/enums/tech_category" -H "x-api-key: $LEADOCEAN_API_KEY" | jq '.data.values[:5]'Then add it to the Step 2 body, for example "technologyCategories": ["Marketing automation"]. This splits a list into accounts that already own a tool in your category and those that do not.
Step 5: Map the buying committee (people at an account)
GET /v1/companies/{domain}/people lists people at one domain, thin records, paged by cursor. To target roles, use people search with the domain and a level filter.
curl -s -X POST "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"],
"jobFunction": ["Sales & Business Development", "Advertising & Marketing"],
"limit": 10
}'Each row carries meta.source_ids.person_id. Keep it: steps 6 to 8 use it. Enum values are exact strings, so check them with leadocean_list_enum_values if a filter returns nothing.
Step 6: Enrich each person (career history)
POST /v1/people/enrich takes exactly one of linkedin_url, email, phone or person_id. Since October 2026 it returns career history: past roles, education, certifications and awards. Past employers have no company id yet.
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": "1234567890", "reveal_email": true}'Use past roles for a warmer first line: a prior employer your customers share is a better opener than a job title.
Step 7: Get the work email
If you only need the address, GET /v2/people/email/work takes person_id or linkedin_url.
curl -s -G "https://api.leadocean.io/v2/people/email/work" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
--data-urlencode "person_id=1234567890"The answer is one address or data: null. Check its status before you send: verified and catch_all_valid are the safe ones. A v2 contact call costs one record even when it finds nothing.
Step 8: Get the phone number
Phone is for the top tier of accounts only. GET /v2/people/phone takes the same inputs.
curl -s -G "https://api.leadocean.io/v2/people/phone" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
--data-urlencode "person_id=1234567890"Numbers come back in phones[], best first, each with phone and type, and best holds the top one. This call also costs one record on a miss.
Step 9: Export the list as CSV
POST /v1/exports runs a bulk CSV export of people for a filter set. It takes up to 50,000 rows a request and 500,000 a day. Bulk CSV export is not on the Free plan.
curl -s -X POST "https://api.leadocean.io/v1/exports" \
-H "x-api-key: $LEADOCEAN_API_KEY" -H "Content-Type: application/json" \
-d '{
"name": "abm-tier-1",
"filters": {"domain": ["acme.com"], "jobLevel": ["C-Team", "VP"]},
"limit": 500,
"preset": "search"
}'The search preset has no contact columns. The default full preset adds emails and phones, and every row costs one record either way. You can also run exports from the Exports page in the app, which shows the price before you start.
What you get
Step 1 on 2026-10-21, run through the free leadocean_count_companies tool with the same filters:
{
"total": 217,
"totalIsExact": true,
"facets": {
"employee_range": [
{"value": "201-500", "count": 195},
{"value": "501-1000", "count": 22}
],
"hq_state": [
{"value": "California", "count": 55},
{"value": "Massachusetts", "count": 16},
{"value": "Texas", "count": 14}
]
},
"credits": 0
}That is 217 US software companies of 201 to 1000 employees with at least one mailable contact. It cost nothing. A record-level company response has this shape (response shape from the API reference, placeholder values):
{
"success": true,
"data": {
"company_data": {"company_name": "Acme", "company_domain": "acme.com"},
"company_detected_technologies": {},
"company_metrics": {},
"meta": {}
}
}Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key | Check $LEADOCEAN_API_KEY is exported and sent as x-api-key. |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Wait for Retry-After, then slow the loop. |
| 402 | Out of records on the Free plan | Pick a paid plan on pricing, or wait: counts stay free. |
| Empty results | A filter value is not an exact enum string | Resolve it with GET /v1/enums/{name} or leadocean_list_enum_values. |
| 404 on enrich | We hold nothing for that company or person | Nothing is charged. Try the other input, such as linkedin_url. |
| Export refused | Over 50,000 rows a request or 500,000 a day, or Free plan | Split the filters into several exports, or move off Free. |
FAQ
Do I need all nine tools?
No. Most teams use steps 1, 2, 5 and 7. Add technology filters when your pitch depends on the stack, and phone for tier-1 accounts only.
What does it cost against other tools?
LeadOcean paid plans are Solo $97 a month and Agency $497 a month, with a fair-use pace instead of credits. Apollo charges 1 credit for organization enrichment (Apollo API pricing, September 2026). Clay Growth starts at $495 a month billed monthly and $446 billed yearly (Clay pricing, September 2026).
Can I run this from an AI client instead of curl?
Yes. The hosted MCP server at https://api.leadocean.io/mcp has 13 tools, including leadocean_count_companies and leadocean_count_leads, both free.
How fresh is the data?
The dataset is refreshed monthly, and each record carries its own fetched_at date.
For tool comparisons, see best enrichment APIs for B2B sales teams, lead enrichment tools for RevOps and data enrichment tools for RevOps.
Size your ABM account list for free
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →