Pre-Black Friday: 20% off, for as long as you stayEARLYBFon Solo and AgencyEnds Nov 28Start free

How-to guide

How to enrich ABM target accounts (9 account enrichment tools)

Nine calls take an ABM account list from a count to a mailable buying committee. Each has a query you can run today.

Get your free API key →Free to start. No credit card. 1,000 records to spend whenever you like.

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.io only.

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=...
  • curl and jq.
  • 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.

bash
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.

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.

bash
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.

bash
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):

bash
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.

bash
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.

bash
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.

bash
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.

bash
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.

bash
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:

json
{
  "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):

json
{
  "success": true,
  "data": {
    "company_data": {"company_name": "Acme", "company_domain": "acme.com"},
    "company_detected_technologies": {},
    "company_metrics": {},
    "meta": {}
  }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-keyCheck $LEADOCEAN_API_KEY is exported and sent as x-api-key.
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Wait for Retry-After, then slow the loop.
402Out of records on the Free planPick a paid plan on pricing, or wait: counts stay free.
Empty resultsA filter value is not an exact enum stringResolve it with GET /v1/enums/{name} or leadocean_list_enum_values.
404 on enrichWe hold nothing for that company or personNothing is charged. Try the other input, such as linkedin_url.
Export refusedOver 50,000 rows a request or 500,000 a day, or Free planSplit 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 →