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 Wholesale and Distribution (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.

Wholesale and distribution deals are won by two people: the buyer who picks the vendor and the sales or operations lead who has to live with it. Target Purchasing, Supply Chain, Operations and Sales leaders at Director level and above, and filter by industry label, not by guesswork.

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

TL;DR

  • Build the list in about 45 minutes: count first (free), pull 25 rows, enrich a handful.
  • It spends about 30 of your 1,000 free records. Counts and filter lookups cost nothing.
  • On 2026-10-21 the US count for Director, VP and C-Team in four functions across 23 wholesale and distribution labels was 14,432 mailable people at 4,060 US-headquartered companies.

Prerequisites

  • A LeadOcean account. The Free plan has 1,000 records for life, no card, and 5 requests a second. Start free.
  • An API key in your shell: export LEADOCEAN_API_KEY=...
  • curl and jq. Or the hosted MCP server at https://api.leadocean.io/mcp in Claude, using the free tools leadocean_count_leads and leadocean_list_enum_values.
  • A one-line description of what you sell. The roles below change with it.

Step 1: Pick the buying committee

Distributors buy and sell at the same time, so there are two kinds of buyer. Choose the persona first, then the filters.

PersonaTypical titlesCares about
PurchasingDirector of Purchasing, VP Procurement, Category ManagerUnit cost, supplier terms, lead time
Supply chain and warehouseVP Supply Chain, Director of Distribution, Warehouse Operations ManagerFill rate, inventory turns, labor
Sales and branch leadershipVP Sales, Regional Director, General ManagerMargin, customer retention, rep productivity
Owner (small distributors)Owner, President, CEOCash flow, growth, one system that works

Pick one row. A message about supplier terms means nothing to a warehouse director.

In a family-owned distributor with 50 to 200 staff, the owner is the buying committee. In a large one, Purchasing screens vendors and the VP Operations signs.

Step 2: Resolve the exact filter values

Enum values are exact strings. Look them up first so a typo does not return an empty list. Wholesale has 22 industry labels, and each company is filed under one.

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

In MCP, ask Claude to run leadocean_list_enum_values with name: industry and q: wholesale. On 2026-10-21 that returned 22 labels, from Wholesale and Wholesale Building Materials to Wholesale Food and Beverage, Wholesale Machinery and Wholesale Metals and Minerals. A search for distribut added Parts Distribution.

Job functions that fit are Supply Chain & Logistics, Operations and Sales & Business Development. Purchasing is a valid function, but on 2026-10-21 it matched no Director or VP in these labels, so find buyers with a title filter instead (Step 5). Job levels are C-Team, VP, Director, Manager, Staff, Other.

Step 3: Size the list for free

A free count tells you how big the list is before you spend a record. The default counts only people with a verified, catch-all valid or catch-all email, so the total is a mailable audience.

bash
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "industry": ["Wholesale", "Wholesale Building Materials", "Wholesale Food and Beverage",
                 "Wholesale Import and Export", "Wholesale Metals and Minerals",
                 "Wholesale Chemical and Allied Products", "Parts Distribution"],
    "jobLevel": ["C-Team", "VP", "Director"],
    "jobFunction": ["Purchasing", "Supply Chain & Logistics", "Operations",
                    "Sales & Business Development"],
    "hqCountry": ["US"],
    "limit": 1
  }' | jq '.meta'

The snippet lists seven labels to stay readable. Add the other Wholesale ... labels from Step 2 to match the 23-label count in the TL;DR.

A count never spends records, and meta.total is capped at 100,000. Size the companies the same way with GET /v1/companies/count, which takes the company-search filters and returns breakdowns by industry, headcount band and HQ state.

One thing to know about the labels. Two of them hold most of the people. In the 2026-10-21 count, Wholesale had 7,713 and Wholesale Building Materials 5,327 of the 14,432. Niche labels such as Wholesale Machinery had single digits. If you sell into a niche, add the generic Wholesale label and filter by keyword instead of relying on the niche label alone.

Step 4: Narrow to a list you can work

A count of 14,432 is too many for one message. Cut it by company size until one persona and one angle fit.

bash
curl -s -X POST "https://api.leadocean.io/v1/people/search?count=true" \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "industry": ["Wholesale", "Wholesale Building Materials", "Wholesale Food and Beverage",
                 "Wholesale Import and Export", "Wholesale Alcoholic Beverages",
                 "Wholesale Metals and Minerals", "Wholesale Chemical and Allied Products",
                 "Wholesale Motor Vehicles and Parts", "Parts Distribution"],
    "jobLevel": ["C-Team", "VP", "Director"],
    "jobFunction": ["Purchasing", "Supply Chain & Logistics", "Operations",
                    "Sales & Business Development"],
    "hqCountry": ["US"],
    "employeeRange": ["51-200", "201-500"],
    "limit": 1
  }' | jq '.meta'

On 2026-10-21 that took the count to 3,798 mailable people across 1,031 companies (14,241 with no email condition). Of the 3,798, 2,607 were Directors and 1,059 were VPs.

Mid-size distributors are the sweet spot for most software and services pitches. They are big enough to have a purchasing function and small enough that a Director still answers cold email. For a 1,000-plus enterprise pitch, switch the band and expect a longer, committee-led sale.

Step 5: Pull a 25-row test batch

Pull 25 people, not the whole list. This is the only step that spends records (25 here).

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 '{
    "industry": ["Wholesale", "Wholesale Building Materials"],
    "jobLevel": ["Director", "VP"],
    "title": ["Purchasing", "Procurement"],
    "employeeRange": ["51-200", "201-500"],
    "hqCountry": ["US"],
    "limit": 25
  }' | jq '.data[] | {name: .profile_data.profile_full_name, headline: .profile_data.profile_headline, email_status: .contact_data.email_status}'

On 2026-10-21 a free count of these filters returned 236 mailable people at 143 companies, so a 25-row batch fills. Page with cursor from meta.nextCursor when you want more. One search pages to 10,000 rows. Past that, narrow the filters.

If the batch comes back short, loosen one filter at a time and recount for free. A tight job function plus a niche industry label can leave very few rows.

Step 6: Enrich the best rows

Search rows carry the work email status. Enrich only the people you will message, using person_id from the search result.

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 now returns career history (past roles, education, certifications). A buyer who spent ten years at a food distributor reads a food-distribution pitch differently. Past employers carry no company_id yet. An enrichment that finds nothing is a 404 and costs nothing.

Step 7: Write the message by persona

Lead with the number they already track. Keep it under 80 words.

  • Purchasing: "Jane, supplier lead times decide your fill rate. We track them across [n] vendors for distributors like Acme. Want the lead-time report for your top 10 SKUs?"
  • Supply chain: "Jane, every extra touch in the warehouse costs a pick. We cut re-handling at distributors the size of Acme. Can I send the numbers?"
  • Sales leadership: "Jane, reps at distributors spend their week on quotes, not selling. We turn a quote around in minutes. Worth a 10-minute look?"
  • Owner: "Jane, I will keep this short. We help owner-run distributors like Acme see margin by customer. Worth a look this week?"

Send from a warmed mailbox, and read email_status before you send. Bounced emails are not refunded.

Step 8: Plan the sequence around how distributors buy

Distribution buyers are in meetings with vendors, on the floor and at trade shows. Plan for that.

Run three touches over ten days. Day 1 is the persona message from Step 7. Day 4 is one concrete number, such as a lead time, a pick rate or a margin point. Day 9 is a plain close that asks whether to stop.

Then split the list by company size before you write at all. A 51-200 person distributor is run by an owner or a general manager who answers their own mail. A 501-1000 person one has a buying process, so the first goal is the name of the person who runs vendor reviews.

Two filters help here:

  • seniority: use owner and c_suite for small distributors. Use vp and director for larger ones. In the 14,432 count, 322 were owners and 193 were C-suite.
  • employeeRange: use 51-200 for owner-run firms and 501-1000 for process-led buyers.

Keep the two lists separate. Do not send the same email to both.

Step 9: Add signals before you send

A list by role is a start. A list by role plus a reason to write is better. You cannot filter on a news event, but you can filter on facts that change buying.

  • Company size band. A distributor in the 201-500 band has more process than one in 51-200. Write to each band about the stage it is in.
  • Location. Find a regional cluster with the hq_state breakdown of GET /v1/companies/count, then pass hqState in the people search and write about local branches. Do not pass hqState to leadocean_count_leads, which can return unsupported_filters for it.
  • Technology. For companies with a crawled website, technologyCategories has 105 values. Check them with leadocean_list_enum_values (name: tech_category) and pick the ones that match your product.
  • Profile keywords. Use keywords such as "private label" or "cold chain" to find people who say so in their own profile.

Check each filter with a free count before you rely on it. If a count comes back empty, loosen one filter at a time.

What you get

A free count run on 2026-10-21 through the leadocean_count_leads MCP tool (industry: 23 wholesale and distribution labels; jobLevel: C-Team, VP, Director; jobFunction: Purchasing, Supply Chain & Logistics, Operations, Sales & Business Development; hqCountry: US; mailable by default):

json
{
  "total": 14432,
  "totalIsExact": true,
  "totalAll": 45013,
  "distinctCompanies": 4060,
  "credits": 0
}

total counts mailable people (verified, catch-all valid or catch-all). totalAll is the same filters with no email condition.

Response shape from the API reference, with placeholder values:

json
{
  "success": true,
  "data": [
    {
      "profile_data": { "profile_full_name": "Jane Doe", "profile_headline": "Director of Purchasing at Acme" },
      "contact_data": { "has_email": true, "has_phone": false, "email_status": "verified" },
      "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 as x-api-key
429Above the plan's rate limit (5 a second on Free, 200 on Agency)Honour Retry-After, or slow the loop
402Free records are spentUpgrade to Solo ($97 a month) or Agency ($497 a month)
Empty resultsBad enum value, such as Wholesale Distribution in industry or Director in jobFunction, or a function that matches nobody, such as Purchasing hereLook values up with /v1/enums/industry or leadocean_list_enum_values, and count before you pull
Search stops at 10,000 rowsmeta.depthCapped is true, no nextCursorAdd filters (state, headcount) and run several searches
Export refusedOver 50,000 rows a request or 500,000 a day, or on FreeSplit the export; bulk CSV is not on Free

FAQ

Which industry label should I use for wholesale and distribution?

Use several. There are 22 labels that start with Wholesale, plus Parts Distribution. On 2026-10-21 the generic Wholesale label and Wholesale Building Materials held most of the 14,432 people. Niche labels such as Wholesale Machinery were tiny.

How many records does the list cost?

Counting costs none. A 25-row test batch costs 25, and each enrichment that finds a person costs one. A full list is one record per person you receive.

Can I get phone numbers for buyers and branch managers?

Yes. Use GET /v2/people/phone. Check the hasPhone filter on a count, and label that count as phone-filtered, not mailable.

Do I need a sequencer?

LeadOcean is data, not a sending tool. It has no sequencer, dialer or CRM. Export a CSV from the app's Exports page or call the API, then load the file into the tool you already use.

How fresh is the data?

The dataset is refreshed monthly, and each record carries its own fetched_at date.

Related guides: all lead generation guides, lead generation for web3, lead generation for travel and lead generation for telecom. See pricing for plan limits.

Size your wholesale and distribution list before you spend a record

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

Get your free API key →