An account-based strategy is a short list of named companies, the people who buy at each one, and a plan per tier. The data work takes about 45 minutes and is the part most guides skip.
This guide builds the list with the LeadOcean API. Every query is runnable, and the output is from a real count run on 2026-10-21.
TL;DR
- Pick accounts by firmographic filters, size them with a free count, then split them into tiers.
- Map 3 to 6 buyers per account by title and seniority, enrich only the accounts you will work.
- Time: about 45 minutes. Records: about 90 on the example run. Counts and company sizing are free.
Prerequisites
- A LeadOcean account on the free plan (1,000 records for life, no card). Sign up at app.leadocean.io.
- An API key in your shell:
export LEADOCEAN_API_KEY=your_key_here. curlandjq.- A one-line ICP. Ours for this guide: US software companies with 201 to 1000 employees, selling to VPs of Sales.
Step 1: Write the ICP as filters
An account-based strategy starts with a filter, not a list. Write the ICP as filters you can run, because a filter can be re-run next quarter and a spreadsheet cannot.
Keep it to four or five fields. Industry, headcount band, HQ country, and one more: a technology on the website, a funding stage or a keyword. Industry and country values are exact strings, so resolve them first. This call lists every enum name; GET /v1/enums/industry returns the values.
curl -s "https://api.leadocean.io/v1/enums" \
-H "x-api-key: $LEADOCEAN_API_KEY" | jq -r '.data.enums[].name'In an MCP client the same check is the free leadocean_list_enum_values tool. For example, industry with q: "software" returns the exact label Computer Software.
Step 2: Size the account list for free
Count before you pull. A count tells you whether the ICP is 200 companies or 200,000, and it costs nothing.
curl -s "https://api.leadocean.io/v1/companies/count" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-G --data-urlencode 'industry=Computer Software' \
--data-urlencode 'hqCountry=US' \
--data-urlencode 'employeeRange=201-500,501-1000' \
--data-urlencode 'hasMailableContacts=true'Arrays go comma-separated in a query string. GET /v1/companies/count returns an exact total plus breakdowns by industry, headcount band, HQ country, HQ state and NAICS. The MCP tool leadocean_count_companies runs the same call.
Step 3: Split the list into tiers
Tier the accounts before you write a single email. Three tiers is enough.
| Tier | Share | Treatment | Contacts per account |
|---|---|---|---|
| 1 | Top 5 to 10% | One-to-one: custom research, multi-thread | 4 to 6 |
| 2 | Next 20 to 30% | One-to-few: segment messaging | 2 to 3 |
| 3 | The rest | One-to-many: programmatic | 1 |
Tier on fit and on a signal you can verify in data. Headcount band, funding recency and the technologies on the site all work as filters, so tiering is a set of extra filters on the same query.
curl -s -X POST "https://api.leadocean.io/v1/companies/search" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"industry": ["Computer Software"],
"hqCountry": ["US"],
"employeeRange": ["501-1000"],
"hasMailableContacts": true,
"limit": 25
}'Company search returns one record per company, so this call spends 22 records on our example (the 501-1000 band). Skip it until Step 2 tells you the number is worth it.
The filter above is the larger band only. To add a signal, stack one more filter: minLastFundingYear for recent funding, technologies for a tool on the website, or keywords for what the company says it does. Each filter shrinks the list, so re-run the free count after each one and stop when tier 1 is a number your team can work by hand.
Write the tier rules down next to the query. A rule such as "501 to 1000 employees and funded since 2025" is testable. "Looks like a good fit" is not, and it breaks the first time a second person edits the list.
Step 4: Map the buying committee
Find the buyers, then count them. A tier 1 account needs more than one name: the economic buyer, the champion and a technical or ops voice.
Start with a free people count on the same company filters. Titles go in as arrays.
curl -s "https://api.leadocean.io/v1/people/search?count=true" \
-H "x-api-key: $LEADOCEAN_API_KEY" \
-H "Content-Type: application/json" \
-X POST \
-d '{
"industry": ["Computer Software"],
"hqCountry": ["US"],
"employeeRange": ["201-500", "501-1000"],
"jobLevel": ["VP", "C-Team"],
"jobFunction": ["Sales & Business Development"],
"limit": 1
}'Send count=true as a query parameter with limit 1. The body rejects unknown fields. For a named account, use GET /v1/companies/{domain}/people instead and filter the rows by seniority.
Enum values are exact and case-sensitive: jobLevel is C-Team, VP, Director, Manager, Staff or Other, and seniority is lowercase (c_suite, vp, director).
Step 5: Enrich and export the list
Enrich only the accounts you will work this quarter. Search returns the record, and enrich adds the contact detail and career history for one person at a time.
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": "1234567", "reveal_email": true}'Enrich takes exactly one of linkedin_url, email, phone or person_id. Each search row carries its id at meta.source_ids.person_id. There is no name plus domain lookup, so search by domain first. The response includes career history (resume_data), which tells you if your champion came from a customer.
For the whole committee list, export it. One request takes up to 50,000 rows, and the cap is 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-sales-leaders",
"filters": {
"industry": ["Computer Software"],
"hqCountry": ["US"],
"employeeRange": ["201-500", "501-1000"],
"jobLevel": ["VP", "C-Team"],
"jobFunction": ["Sales & Business Development"],
"emailStatus": ["verified", "catch_all_valid", "catch_all"]
},
"limit": 68
}'The export takes a filters object and a row limit, and bills one record per row written. You can also build the same export in the app, which shows the record price before you start.
Step 6: Keep the list alive
Re-run the same filters every month and diff the result. The dataset is refreshed monthly. Each record carries its own fetched_at date, so new matching accounts appear on their own and people who changed jobs drop out.
Treat the diff as the trigger for outreach. A new VP of Sales at a tier 1 account is a better reason to write than a calendar reminder. Drop accounts that have gone quiet for two quarters and promote the ones that replied. A list that is never pruned turns back into the broad audience you started with.
Check email_status before every send. The default mailable set is verified, catch_all_valid and catch_all. Bounced addresses are not refunded, so filter first.
What you get
Output of the two free counts, run on 2026-10-21 through the LeadOcean MCP server:
leadocean_count_companies
industry: Computer Software | hqCountry: US
employeeRange: 201-500, 501-1000 | hasMailableContacts: true
total: 217 (exact)
employee_range: 201-500 = 195, 501-1000 = 22
hq_state: California 55, Massachusetts 16, Texas 14, Florida 11, New York 11
credits: 0
leadocean_count_leads
same company filters | jobLevel: VP, C-Team | jobFunction: Sales & Business Development
total: 68 (mailable: verified, catch_all_valid or catch_all)
totalAll: 378 (no email condition)
distinctCompanies: 29
credits: 0Read it like this. 217 companies fit, but only 29 of them have a mailable sales leader, and the committee for those is 68 people. That is the real account list. Roughly 190 companies need a different route: a different title, or a phone.
A person record has this shape, from the API reference (placeholder values):
{
"profile_data": { "profile_full_name": "Jane Doe" },
"contact_data": {
"email_status": "verified",
"contact_current_experiences": [{ "job_title": "VP Sales", "company_name": "Acme", "company_domain": "acme.com" }]
},
"meta": { "source_ids": { "person_id": "1234567" } }
}Response shape from the API reference. The values above are placeholders, not a real person.
Two checks keep the list honest before you hand it to sales. First, spot-check ten random accounts by opening their sites: if three are not a fit, tighten the industry or keyword filter and re-run the count. Second, check that every tier 1 account has at least two mailable contacts. An account with one reachable person is a thin thread, so either find a second name with GET /v1/companies/{domain}/people or move the account down a tier.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Check $LEADOCEAN_API_KEY is exported in this shell |
| 429 | Above the plan's rate limit (5 requests a second on Free, 200 on Agency) | Wait for the Retry-After value, then retry |
| 402 | Out of records | The free 1,000 are spent. Move to Solo ($97 a month) or Agency ($497 a month) |
| Empty results | A wrong enum value, such as Software instead of Computer Software | Look the value up with /v1/enums or leadocean_list_enum_values |
Search stops with meta.depthCapped true | One search pages to 10,000 rows | Add filters to narrow the list instead of paging further |
| Export refused | Over 50,000 rows a request, or 500,000 a day | Split the filters into several exports |
FAQ
What is an account-based strategy?
It is a plan to sell to a defined list of companies instead of a broad audience. You pick the accounts, map the buyers at each one, and run tailored outreach per tier. See account-based selling and account-based marketing.
How many accounts should be on the list?
Fewer than you think. Start with 50 to 200 named accounts split into tiers, then widen. The Step 2 count tells you the ceiling, and your capacity sets the real number.
How many contacts do I need per account?
Four to six for tier 1, two or three for tier 2 and one for tier 3. In our example the 29 reachable accounts hold 68 mailable VPs and C-level sales leaders, about 2.3 per account.
How is this different from account-based everything?
ABX adds sales, marketing and customer success moving together on the same accounts. The data step is the same. See account-based everything.
What does it cost?
Counts, sizing and enum lookups are free. The example above spends about 90 records (22 companies, 68 enrichments), well inside the free plan. The export in Step 5 needs a paid plan. Paid plans start at $97 a month; see pricing.
Build your first target account list with a free API key
Free to start. No credit card. 1,000 records to spend whenever you like.
Get your free API key →