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=... curlandjq. Or the hosted MCP server athttps://api.leadocean.io/mcpin Claude, using the free toolsleadocean_count_leadsandleadocean_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.
| Persona | Typical titles | Cares about |
|---|---|---|
| Purchasing | Director of Purchasing, VP Procurement, Category Manager | Unit cost, supplier terms, lead time |
| Supply chain and warehouse | VP Supply Chain, Director of Distribution, Warehouse Operations Manager | Fill rate, inventory turns, labor |
| Sales and branch leadership | VP Sales, Regional Director, General Manager | Margin, customer retention, rep productivity |
| Owner (small distributors) | Owner, President, CEO | Cash 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.
for q in wholesale distribut; do
curl -s "https://api.leadocean.io/v1/enums/industry?q=$q" | jq -r '.data.values[]'
doneIn 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.
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.
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).
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.
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: useownerandc_suitefor small distributors. Usevpanddirectorfor larger ones. In the 14,432 count, 322 were owners and 193 were C-suite.employeeRange: use51-200for owner-run firms and501-1000for 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_statebreakdown ofGET /v1/companies/count, then passhqStatein the people search and write about local branches. Do not passhqStatetoleadocean_count_leads, which can returnunsupported_filtersfor it. - Technology. For companies with a crawled website,
technologyCategorieshas 105 values. Check them withleadocean_list_enum_values(name: tech_category) and pick the ones that match your product. - Profile keywords. Use
keywordssuch 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):
{
"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:
{
"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
| Error | Cause | Fix |
|---|---|---|
| 401 | Missing or wrong x-api-key header | Check $LEADOCEAN_API_KEY is exported and sent as x-api-key |
| 429 | Above the plan's rate limit (5 a second on Free, 200 on Agency) | Honour Retry-After, or slow the loop |
| 402 | Free records are spent | Upgrade to Solo ($97 a month) or Agency ($497 a month) |
| Empty results | Bad enum value, such as Wholesale Distribution in industry or Director in jobFunction, or a function that matches nobody, such as Purchasing here | Look values up with /v1/enums/industry or leadocean_list_enum_values, and count before you pull |
| Search stops at 10,000 rows | meta.depthCapped is true, no nextCursor | Add filters (state, headcount) and run several searches |
| Export refused | Over 50,000 rows a request or 500,000 a day, or on Free | Split 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 →