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 Solar (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.

B2B solar is not one market. A project developer, an installer and an equipment maker buy different things on different timelines, so you build one list per buyer type.

This guide picks the buying committee, finds it with LeadOcean filters, sizes the list with a free count and drafts the first message for each role. It covers companies that sell to solar businesses. It does not cover homeowner leads.

TL;DR

  • Target three groups: developers and independent power producers, installers and EPCs, and equipment makers. Each has its own committee.
  • Size first with a free count. On 2026-10-21, four renewable industries held 31,425 mailable VPs, directors and C-level people across 7,695 companies.
  • The whole 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

Solar deals rarely close on one signature. Pick the roles before you touch a filter.

Buyer typeEconomic buyerChampionGatekeeper
Developer or IPPCEO, Chief Development OfficerVP Development or ProcurementCFO, legal, asset management
Installer or EPCOwner, PresidentDirector of Operations or SalesProcurement, engineering
Equipment makerVP Sales, CEODirector of Business DevelopmentProduct and compliance

The right buyer depends on what you sell. Software for project design sells to engineering. Financing sells to the CFO. Trucks, tools and insurance sell to operations and the owner.

Small installers are often owner-run. For them the owner is the whole committee, so target owner and C-level titles, not directors.

LeadOcean has a Solar Electric Power Generation industry and several renewable ones around it. Look the exact strings up before you use them. The lookup is free.

bash
for q in solar renewable; 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

On 2026-10-21 that returned these values: Solar Electric Power Generation, Renewable Energy Power Generation, Renewable Energy Equipment Manufacturing, Renewable Energy Semiconductor Manufacturing, Renewables and Environment and Services for Renewable Energy. The same lookup runs from Claude through 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
{
  "industry": [
    "Solar Electric Power Generation",
    "Renewable Energy Power Generation",
    "Renewable Energy Equipment Manufacturing",
    "Services for Renewable Energy"
  ],
  "jobLevel": ["C-Team", "VP", "Director"],
  "employeeRange": ["51-200", "201-500", "501-1000"],
  "country": ["US"]
}

Map the industry values to buyer types. Solar Electric Power Generation and Renewable Energy Power Generation hold developers and producers. Services for Renewable Energy holds installers, EPCs and consultants. Renewable Energy Equipment Manufacturing holds panel, inverter and mounting makers.

Narrow by function when one product has one owner. A project-management tool sells to Operations and Engineering. A financing product sells to Finance & Accounting. Check the exact function strings with list_enum_values.

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 '{
    "industry": ["Solar Electric Power Generation","Renewable Energy Power Generation","Renewable Energy Equipment Manufacturing","Services for Renewable Energy"],
    "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 '{
    "industry": ["Solar Electric Power Generation","Services for Renewable Energy"],
    "jobLevel": ["C-Team","VP","Director"],
    "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 contact_data.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 call

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 NABCEP certification or a past role at a utility-scale developer is 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. Phones suit installer owners and sales directors, who often answer from a truck or a site. A v2 contact call costs one record even when it finds nothing.

Step 6: Write messages that fit the buyer

Solar buyers answer to interconnection queues, permitting delays, equipment cost and policy changes. Open with the problem they have this quarter.

BuyerTheir pressureFirst line angle
Developer, VP DevelopmentInterconnection queue, site controlTime saved from lead to permit
Installer, ownerCrew utilization, lead cost, marginsOne number: hours or dollars per job
EPC, Director of OperationsSchedule slips, change ordersFewer surprises between design and build
Equipment maker, VP SalesChannel reach, distributor mixAccess to installers they do not sell to

Incentive rules shift often, and each state differs. Name a rule only if you have checked the current text. A wrong claim about a tax credit ends the thread.

Keep the first email under 80 words. Plain example for an installer:

text
Subject: Fewer site revisits at Acme Solar

Hi Jane,

Crews at Acme Solar lose a day when a roof survey is missing a detail.
We give your estimators a checklist that catches it before the truck rolls.

Open to a 15-minute call this week?

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

Timing matters. Solar demand follows project calendars, tax-year deadlines and the building season. Developers plan a year ahead, so reach them early in a cycle. Installers are busiest in warm months, so write to them in the shoulder weeks, when owners read their own inbox.

One more filter helps here. Use GET /v1/companies/{domain}/people on a developer you already know, to see who else sits on that account. A project team often spans development, finance and construction, and a good first email names the one who owns your problem.

Step 7: Split the list into three campaigns

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

  1. Developers and producers. Industry Solar Electric Power Generation and Renewable Energy Power Generation. Target C-Team and VP titles in development, finance and operations. Long cycles, so use fewer and better emails.
  2. Installers and EPCs. Industry Services for Renewable Energy. Target owners, presidents and operations directors. Shorter cycles and a faster reply.
  3. Equipment makers. Industry Renewable Energy Equipment Manufacturing. Target sales, business development and procurement titles. They care about channel and supply terms.

Run the count again for each segment. The three 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.

Step 8: Rank accounts before you send

A list of 3,000 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 to a committee.
  • Drop accounts where the only match is a Staff or Other level title. Those rarely sign.

Then send in batches of 50 to 100 and read the replies. If replies cluster on one role, move effort toward it. A bad first send burns a domain, so go slow.

What you get

Output of leadocean_count_leads on 2026-10-21 for the Step 2 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": 31425,
  "totalIsExact": true,
  "totalAll": 129291,
  "distinctCompanies": 7695,
  "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": 3125,
  "totalIsExact": true,
  "totalAll": 10157,
  "distinctCompanies": 442
}

That is a 3,125-person mailable list at 442 mid-sized US companies. The seniority split was 1,640 directors, 698 C-suite, 541 VPs and 246 owners.

For small installers, count Solar Electric Power Generation alone in the US with the same job levels. On 2026-10-21 that gave 1,627 mailable people at 654 companies, and 399 of them were owners. 1,044 of those people work at companies of 50 or fewer staff.

On a Free plan you cannot pull all of it. Rank by title and pull the first few hundred.

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": "VP Sales 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 "Solar"Resolve 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 solar industry filter?

Yes. Solar Electric Power Generation is one of 534 industry values. It covers developers and producers more than installers. Add Services for Renewable Energy and Renewable Energy Equipment Manufacturing to reach the rest of the supply chain.

Does this find homeowners or residential leads?

No. LeadOcean is a B2B people and company database. It finds people at solar companies and at businesses that buy solar, such as commercial property owners. It does not hold consumer leads.

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 solar 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 →