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

How-to guide

How to Build an Account-Based Strategy (With a Data API)

Define the accounts, size them for free, map the buying committee and export a list. Six steps, real queries, about 90 records.

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

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

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

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

TierShareTreatmentContacts per account
1Top 5 to 10%One-to-one: custom research, multi-thread4 to 6
2Next 20 to 30%One-to-few: segment messaging2 to 3
3The restOne-to-many: programmatic1

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.

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 '{
    "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.

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

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": "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.

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

text
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: 0

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

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

ErrorCauseFix
401Missing or wrong x-api-key headerCheck $LEADOCEAN_API_KEY is exported in this shell
429Above the plan's rate limit (5 requests a second on Free, 200 on Agency)Wait for the Retry-After value, then retry
402Out of recordsThe free 1,000 are spent. Move to Solo ($97 a month) or Agency ($497 a month)
Empty resultsA wrong enum value, such as Software instead of Computer SoftwareLook the value up with /v1/enums or leadocean_list_enum_values
Search stops with meta.depthCapped trueOne search pages to 10,000 rowsAdd filters to narrow the list instead of paging further
Export refusedOver 50,000 rows a request, or 500,000 a daySplit 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 →