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 DTC Brands (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.

A DTC brand is a small company that sells its own product straight to consumers. If you sell software, services or supplies to these brands, the buyer is a founder or a growth, ecommerce or operations lead, not a retail buyer.

This guide picks the roles, finds them with LeadOcean filters, sizes the list with a free count and drafts the first message for each buyer.

TL;DR

  • DTC brands are small. Of 35,809 US consumer-brand companies with 11 to 500 people, 31,579 have 11 to 50 (count on 2026-10-21). The committee is a founder plus one or two leads in growth and operations.
  • Size first with a free count. On 2026-10-21, five consumer-brand industries held 29,822 mailable C-level, VP and director contacts at 6,152 US companies with 11 to 500 people.
  • 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

DTC brands buy fast and with few people. Name the roles before you touch a filter.

Brand stageEconomic buyerChampionGatekeeper
11 to 50 peopleFounder, CEOHead of Growth or EcommerceFounder (often the same person)
51 to 200 peopleCOO, CMODirector of Retention, Director of EcommerceFinance lead
201 to 500 peopleCMO, VP OperationsDirector of Operations or Supply ChainFinance, IT

What you sell decides the champion. Marketing tools go to growth and brand. Fulfilment, packaging and returns products go to operations and supply chain. Payment and fraud tools go to ecommerce and finance.

LeadOcean has no single "DTC" industry. DTC is a business model, not a category, so you build it from industries and check the result. Look up the exact strings first, because enum values are exact.

bash
for q in "Online and Mail Order" "Consumer Goods" "Cosmetics" "Retail Apparel" "Personal Care"; do
  curl -s -G "https://api.leadocean.io/v1/enums/industry" \
    --data-urlencode "q=$q" \
    -H "x-api-key: $LEADOCEAN_API_KEY" | jq -r '.data.values[]'
done

The same lookup is free through the MCP tool leadocean_list_enum_values. On 2026-10-21 a search for "Retail" returned 21 values, including Online and Mail Order Retail and Retail Apparel and Fashion.

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
{
  "industry": [
    "Online and Mail Order Retail",
    "Consumer Goods",
    "Cosmetics",
    "Retail Apparel and Fashion",
    "Personal Care Product Manufacturing"
  ],
  "jobLevel": ["C-Team", "VP", "Director"],
  "employeeRange": ["11-50", "51-200", "201-500"],
  "country": ["US"]
}

Know what this list contains. On 2026-10-21 a company count of those five industries at 11 to 500 people with a US headquarters returned 35,809 companies. Of those, 15,698 were filed under Retail Apparel and Fashion and only 186 under Online and Mail Order Retail. The largest NAICS group was 459999 (miscellaneous retail), so expect some physical shops and wholesalers next to the true DTC brands.

Two filters clean this up. Add technologyCategories with Ecommerce to keep brands whose site runs a store. On 2026-10-21 that cut the Step 2 count from 29,822 to 3,592 mailable people at 834 companies. Use Shopify apps instead when you sell into the Shopify stack: 194 people at 34 companies on the same date. Technology data covers the crawled sites only, about 7.8M companies, so a brand with no crawl is dropped.

Narrow by function when one product has one owner:

  • Marketing and retention tools: Advertising & Marketing.
  • Fulfilment, 3PL and returns: Operations and Supply Chain & Logistics.
  • Fraud, payments and finance tools: Finance & Accounting.

Step 3: Size the list with a free count

Count before you pull. A count costs no records and you can run it 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 '{
    "industry": ["Online and Mail Order Retail","Consumer Goods","Cosmetics","Retail Apparel and Fashion","Personal Care Product Manufacturing"],
    "jobLevel": ["C-Team","VP","Director"],
    "employeeRange": ["11-50","51-200","201-500"],
    "country": ["US"],
    "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. In the 2026-10-21 run, California held 5,936 of the 35,809 companies and New York 3,127. Use the breakdown to pick a region before you pull anyone.

Step 4: Pull a 25-row test batch

Pull a small batch first. Read the titles. If half 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 '{
    "industry": ["Online and Mail Order Retail","Consumer Goods","Cosmetics"],
    "jobLevel": ["C-Team","VP","Director"],
    "jobFunction": ["Advertising & Marketing"],
    "employeeRange": ["11-50","51-200"],
    "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 contact_data.email_status. Send to verified and catch_all_valid. LeadOcean does not credit back bounces, so read the status before you send.

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 growth lead who came from a known marketplace or an agency gives you a better opener than a job title. An enrichment that finds nothing is a 404 and costs nothing.

For a phone number, call GET /v2/people/phone. A v2 contact call costs one record even when it finds nothing.

Step 6: Write messages that fit the buyer

DTC buyers watch customer acquisition cost, repeat rate and margin per order. Open with the number they check every Monday.

BuyerTheir pressureFirst line angle
Founder, 11 to 50 peopleCash, ad spend, timeOne task you take off their plate this month
Head of GrowthRising acquisition cost, flat repeat rateA lift in retention or conversion, stated as a range you can back
Director of OperationsShipping cost, returns, stock-outsCost per order or days saved
Finance leadChargebacks, payment feesFees or fraud rate, with a source

Timing matters. Q4 is peak selling season for consumer brands, so pitch new tools before or after it. Keep the email under 80 words.

Plain example for a growth lead:

text
Subject: Repeat orders at Acme

Hi Jane,

Acme sells mostly to first-time buyers. We help stores your size
bring buyers back for a second order without more ad spend.

Open to a 15-minute call next week?

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 by what you sell and run each segment on its own copy.

  1. Founders at brands of 11 to 50 people. jobLevel C-Team, seniority founder or owner. They read their own email, so keep it short and name one task.
  2. Growth and retention leads at 51 to 200 people. jobFunction Advertising & Marketing, level Director or VP. Lead with the metric.
  3. Operations and supply chain leads at 51 to 500 people. jobFunction Operations and Supply Chain & Logistics. Lead with cost per order.

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

On 2026-10-21 the marketing segment (C-Team, VP and Director, Advertising & Marketing, 11 to 500 people, US) counted 2,629 mailable people at 1,397 companies. The operations and supply chain segment counted 1,532 at 952 companies.

Step 8: Rank accounts before you send

A list of 29,822 people 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 your top accounts. It lists the other people at one domain, so you can add 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, move effort toward it.

What you get

Output of leadocean_count_leads on 2026-10-21 for the Step 2 filters: five consumer-brand industries, jobLevel C-Team, VP and Director, headcount 11 to 500, country US. The count includes only people whose best email is verified, catch_all_valid or catch_all.

json
{
  "total": 29822,
  "totalIsExact": true,
  "totalAll": 98246,
  "distinctCompanies": 6152
}

The gap between 29,822 and 98,246 is the people with no mailable email on file. Read it as the share you cannot email yet, not as lost data.

Response shape from the API reference (placeholder values). Search rows carry no contact points. Enrich with reveal_email for the address.

json
{
  "success": true,
  "data": [
    {
      "profile_data": {
        "profile_full_name": "Jane Doe",
        "profile_headline": "Head of Growth at Acme",
        "profile_url": "https://www.linkedin.com/in/jane-doe"
      },
      "contact_data": {
        "has_email": true,
        "has_phone": false,
        "email_status": "verified",
        "email_type": "work"
      },
      "meta": { "source_ids": { "person_id": "1234567890" } }
    }
  ],
  "meta": { "count": 1, "credits": 1, "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 "DTC" or "Ecommerce brand"Resolve the value with list_enum_values first
unsupported_filters on a countA filter such as fundingType or hqCity is not supported in people countsDrop it and count without it
meta.depthCapped: trueOne search stops at 10,000 rowsSplit by state, headcount band or function

FAQ

Is there a DTC industry filter?

No. LeadOcean has 534 industry values and DTC is a business model. Build the segment from Online and Mail Order Retail, Consumer Goods, Cosmetics, Retail Apparel and Fashion and Personal Care Product Manufacturing, then check the title mix on a 25-row batch.

Why does the list include some physical retailers?

The industry labels group by what a company sells, not how. The largest NAICS group in the company count was 459999, miscellaneous retail. Add the Ecommerce technology category to keep brands whose site runs a store.

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 a fair-use pace instead of credits. See pricing.

Count your DTC 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 →