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

How-to guide

How to Build a B2B Lead List for Martech (Buyers, Filters and Messaging)

Pick the buying committee, count the list for free, then spend records only on the people you will email.

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

Martech is sold to a committee, not a person. The CMO owns the budget, marketing ops runs the tool, and RevOps and IT sign off.

This guide picks that committee, finds it with LeadOcean filters, sizes the list with a free count and drafts a first message for each role.

TL;DR

  • Target four roles: the CMO or VP Marketing, the head of marketing operations, RevOps, and a technical gatekeeper in IT or engineering.
  • Size first with a free count. On 2026-10-21, software and internet companies that describe themselves as marketing technology or marketing automation held 32,052 mailable C-level, VP and director contacts across 6,030 companies.
  • The recipe takes about 45 minutes and spends about 30 records, so it fits inside the Free plan's 1,000.

Prerequisites

  • A LeadOcean account on the Free plan. Sign up at app.leadocean.io, no card.
  • An API key exported as $LEADOCEAN_API_KEY.
  • curl and jq, or any HTTP client.
  • Optional: the hosted MCP server at https://api.leadocean.io/mcp if you would rather run the counts from Claude.

Step 1: Pick the buying committee

A martech purchase touches marketing, revenue operations and IT. Choose the roles before you touch a filter.

Buyer typeEconomic buyerChampionGatekeeper
Demand gen or campaign toolCMO, VP MarketingDirector of demand generationMarketing ops, security
Data, CDP or analytics toolCMO, CROHead of marketing ops or RevOpsIT, data engineering
Sales-aligned tool (attribution, ABM)CRO, VP RevenueDirector of RevOpsFinance, procurement

Marketing ops is the real gatekeeper. If that team says the tool breaks the stack, the CMO rarely overrules it. Write one message for the champion and one for the gatekeeper.

LeadOcean has no "martech" industry value. You pair a company keyword with the software and internet industries, and you pick the buyer by job function. Look the exact strings up first.

bash
for q in marketing advertising software; do
  curl -s "https://api.leadocean.io/v1/enums/industry?q=$q" | jq -r '.data.values[]'
done

Enum values are exact strings. The same lookup is free through the MCP tool leadocean_list_enum_values.

Step 2: Turn the committee into filters

Write the filters as flat JSON. Every filter is an array, even when it holds one value.

json
{
  "companyKeywords": ["marketing technology", "marketing automation"],
  "industry": [
    "Software Development",
    "Computer Software",
    "Technology; Information and Internet",
    "Information Technology and Services"
  ],
  "jobLevel": ["C-Team", "VP", "Director"],
  "employeeRange": ["51-200", "201-500", "501-1000"],
  "country": ["US"]
}

companyKeywords matches what the employer says about itself, so it finds the martech vendors that an industry label alone misses. That makes this a list of companies that sell martech. To sell to the marketing teams of other companies instead, drop companyKeywords and filter people by jobFunction.

Narrow by function when one product has one owner. A campaign tool sells to Advertising & Marketing. A data tool sells to Information Technology and Operations.

Step 3: Size the list with a free count

Count before you pull. A count costs no records and can run as often as you like.

bash
curl -s "https://api.leadocean.io/v1/people/search?count=true" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "companyKeywords": ["marketing technology","marketing automation"],
    "industry": ["Software Development","Computer Software","Technology; Information and Internet","Information Technology and Services"],
    "jobLevel": ["C-Team","VP","Director"],
    "limit": 1
  }' | jq '.meta'

count=true goes in the query string. The JSON body rejects unknown fields. The response has no rows, only meta.total (capped at 100,000) and meta.countOnly: true.

For the company side, GET /v1/companies/count takes the company-search filters and returns an exact total with breakdowns by industry, headcount band, HQ country and HQ state. Use it to see where the accounts sit before you pick a region.

Step 4: Pull a 25-row test batch

Pull a small batch first. Read the titles. If half of them are the wrong role, tighten the filters before you spend more.

bash
curl -s "https://api.leadocean.io/v1/people/search" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "companyKeywords": ["marketing technology","marketing automation"],
    "industry": ["Software Development","Computer Software"],
    "jobLevel": ["C-Team","VP","Director"],
    "jobFunction": ["Advertising & Marketing"],
    "employeeRange": ["51-200","201-500"],
    "country": ["US"],
    "limit": 25
  }' > batch.json

jq '.data | length' batch.json

A page of 25 is 25 records. Page with cursor from meta.nextCursor when you want more. One search pages to 10,000 rows, and the last page carries meta.depthCapped: true. Narrow the filters instead of walking further.

Each row carries an email status. Send to verified and catch_all_valid. Read the status before you send, because LeadOcean does not credit back bounces.

Step 5: Enrich the champions you will contact

Enrich only the people you will contact. Enrich takes exactly one of linkedin_url, email, phone or person_id.

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": "PERSON_ID_FROM_SEARCH", "reveal_email": true}'

Enrich also returns career history in resume_data: past roles, education and certifications. A marketing ops lead who came from a rival platform is a better opener than a job title. Past employers carry no company_id yet, so match them by name. An enrichment that finds nothing is a 404 and costs nothing.

For a phone number, call GET /v2/people/phone. Phones suit the CRO and VP Revenue, who take calls. A v2 contact call costs one record even when it finds nothing.

Step 6: Write messages that fit the buyer

Marketers get pitched by software all day. Open with a number from their own funnel, not a feature.

BuyerTheir pressureFirst line angle
CMOPipeline target, budget scrutinyCost per qualified lead
Director of demand genCampaign volume, lead qualityHours saved or conversion lift
Marketing opsStack sprawl, data hygieneWhat it replaces, how it integrates
RevOpsAttribution, handoff to salesClean data into the CRM

Marketing ops reads the integration list first. Name the systems you connect to in the second sentence, and keep the email under 80 words.

Plain example for a marketing ops lead:

text
Subject: One less sync to maintain

Hi Jane,

Acme Cloud teams I talk to run three tools to keep contact data clean.
We replace two of them and write straight to your CRM.

Worth a 15-minute look at the field mapping?

Names, domain and subject are placeholders. Use your own product and a claim you can back up.

Step 7: Split the list into three campaigns

Do not send one message to the whole list. Split it by role and run each segment on its own copy.

  1. Economic buyers. jobLevel C-Team, jobFunction Advertising & Marketing or Sales & Business Development. Short, outcome first.
  2. Champions. jobLevel Director and VP in marketing, jobFunction Advertising & Marketing. These people trial the tool, so offer a pilot.
  3. Gatekeepers. jobFunction Information Technology and Operations, jobLevel Director. Lead with security and integrations.

Run the count again for each segment. The three totals will not add up to the combined list, because one person can match more than one filter set. Use the combined count for planning and the segment counts for sending.

Step 8: Rank accounts before you send

A list of thousands is too many to write by hand. Rank the accounts and send to the top group first.

  • Count people per company in the test batch. An account with three matching titles is a committee you can reach from several sides.
  • Prefer a work email marked verified. It bounces less than a catch-all address.
  • Use GET /v1/companies/{domain}/people for the accounts you rank highest. It lists the other people at one domain, so you can add the missing roles.
  • Drop accounts where the only match is a Staff or Other level title.

Then send in batches of 50 to 100 and read the replies. If replies cluster on one role, shift effort toward it.

What you get

Output of leadocean_count_leads on 2026-10-21 for the Step 2 company keywords and industries with jobLevel C-Team, VP and Director. The count includes only people whose best email is verified, catch_all_valid or catch_all.

json
{
  "total": 32052,
  "totalIsExact": true,
  "totalAll": 102612,
  "distinctCompanies": 6030,
  "unsupportedFilters": []
}

Now add employeeRange of 51-200, 201-500 and 501-1000, and country US. The same count on the same date narrows to this:

json
{
  "total": 5083,
  "totalIsExact": true,
  "totalAll": 12649,
  "distinctCompanies": 458
}

That is a 5,083-person mailable list at 458 mid-sized US companies. A Free plan cannot pull all of it, so rank by title and pull the first few hundred.

Record shape, from the API reference (placeholder values):

json
{
  "success": true,
  "data": [
    {
      "profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "VP Marketing at Acme" },
      "contact_data": { "has_email": true, "has_phone": false, "email_status": "verified" }
    }
  ],
  "meta": { "nextCursor": "CURSOR" }
}

Troubleshooting

ErrorCauseFix
401Missing or wrong x-api-key headerCheck $LEADOCEAN_API_KEY is exported and sent in the x-api-key header
429More than the plan's rate limit (5 requests a second on Free, 200 on Agency)Wait for the Retry-After seconds, then retry slower
402The 1,000 Free records are spentMove to a paid plan or reduce the pull; counts still work
Empty resultsAn enum value is not an exact string, such as "Marketing" for jobFunctionResolve the value with list_enum_values first
unsupported_filters on a countA filter like fundingType or hqCity is not supported in people countsDrop it and count without it
meta.depthCapped: trueOne search stops at 10,000 rowsSplit by country or headcount band

FAQ

Is there a martech industry filter?

No. LeadOcean has 534 industry values and none is called martech. Combine companyKeywords with the software and internet industries, then check the title mix on a 25-row batch.

Should I target martech vendors or their buyers?

It depends on what you sell. To sell to other martech companies, use companyKeywords as above. To sell to the marketing teams of any company, filter by jobFunction Advertising & Marketing and jobLevel, and skip the keyword.

How many records does this cost?

About 30: 25 for the test batch and a handful of enrichments. Counts, enum lookups and GET /v1/companies/count are free.

Can I download the whole list as a CSV?

Yes, on a paid plan. Bulk CSV export is not on Free. Solo is $97 a month and Agency is $497 a month, both with fair-use pace instead of credits. See pricing.

Count your martech buyers free, then pull only the ones you will email

Free to start. No credit card. 1,000 records to spend whenever you like.

Get your free API key →