# ☀️ Solar Installer Leads Scraper - Solar Company Emails (`renzomacar/solar-installer-leads-scraper`) Actor

Solar installers, EPCs, storage and commercial solar companies for any market, with phone, website, emails and socials pulled live from each company's own site. For equipment distributors, solar software, lenders and agencies. $8 per 1,000 leads.

- **URL**: https://apify.com/renzomacar/solar-installer-leads-scraper.md
- **Developed by:** [Renzo Madueno](https://apify.com/renzomacar) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## ☀️ Solar Installer Leads Scraper — Solar Company Emails

Solar is the most volatile local vertical in B2B. Incentive changes, interest rates and net-metering rules reshape the installer population every single year: companies appear, merge, pivot into batteries and roofing, or vanish. Which is exactly why a **purchased** solar installer list is the worst kind of list — it was assembled during a different policy regime.

This Actor rebuilds it from scratch on demand. Give it a city; it reads the live map, visits each company's own website, and returns **company name, phone, website, address, emails and social profiles** at $8 per 1,000 companies.

### Why freshness is the whole product here

Run the same query on the same metro twice a year apart and a double-digit percentage of the rows will have changed. Installers that were residential-only now sell storage. EPCs that were regional got acquired. Sales orgs that were pure door-knock now hold their own license. A dataset generated **today** encodes today's market structure — that is the difference between a 2% and a 12% reply rate, and it is not something a static database can offer at any price.

Schedule the same input monthly and the dataset diff becomes a market-entry and consolidation tracker for your territory.

### Selectable installer types

| Option | Segment |
|---|---|
| Solar installer | The general population — the default sweep |
| Solar panel installation company | Residential install-focused operators |
| Solar energy company | Broader energy players, often multi-service |
| Solar contractor | Licensed contractors, subcontract capacity |
| Battery storage installer | The fastest-growing attach segment |
| Commercial solar company | C\&I projects, largest deal sizes |

Leave the field empty to sweep all six. Adjacent trades — EV charger installers, generator installers, roofing-and-solar hybrids, solar panel cleaning — work as free text in `searchQueries`.

### Data on every company

`name`, `category`, `phone` plus `websitePhones[]`, `website`, `email` with `emails[]` and `emailFound`, `socialProfiles` (Facebook, Instagram, LinkedIn, Twitter), `address`/`city`/`country`, `rating` and `reviewsCount`, `techStack[]`, `placeUrl`, coordinates, and the `searchQuery` that found each row. CSV, Excel, JSON or API.

### Who is buying solar installer lists

- **Equipment distributors and manufacturers** — panels, inverters, racking, batteries. A per-state installer census is a channel plan.
- **Solar software** — proposal and design tools, CRM, permitting, monitoring, O\&M platforms. `techStack` separates the modern operators from the ones still quoting in spreadsheets.
- **Lead sellers and marketing agencies** — installers are chronic, repeat buyers of customer acquisition; `reviewsCount` tells you which ones have volume to protect.
- **Financing and PPA providers** — every installer needs a lender panel, and adding one is a fast, high-value integration.
- **Recruiters and subcontract crews** — install labor is the industry's permanent bottleneck.

### Price

$0.008 per company delivered ($8 per 1,000) plus a $0.01 start fee per run. A sun-belt metro across all six types normally returns 150–400 companies: **$1.20 to $3.20**. Colder markets return fewer, and you pay only for what a run actually delivers. No subscription, no minimum, no annual license.

### Example input

```json
{
  "location": "Las Vegas, NV",
  "keywords": ["solar installer", "battery storage installer"],
  "maxResults": 150,
  "maxPagesPerSite": 2
}
```

State sweep: `"searchQueries": ["solar installer in Phoenix, AZ", "solar installer in Tucson, AZ", "solar installer in Mesa, AZ"]`.

### FAQ

**Are these installers or door-to-door sales orgs?**
Both appear, because both list themselves on the map. The distinction is not exposed as a field. A practical filter: sales-only outfits usually have thin sites and few reviews relative to their claimed footprint, while installers publish licensing, service areas and project galleries. If you only want licensed EPCs, cross-check the shortlist against your state's contractor license board.

**What email hit rate should I plan for?**
Solar companies market aggressively and usually publish a contact address — commonly 50–65% of those with a website. Every row keeps a phone number either way, and `emailFound` splits the file cleanly.

**Does it cover NABCEP certification or license numbers?**
No. That data lives with NABCEP and state licensing boards, not on business listings. This Actor gives you the company's contact surface; certification checks are a separate enrichment step on a much shorter shortlist.

**Can I target commercial-only installers?**
Select `Commercial solar company` and add terms like "C\&I solar" or "solar EPC" via `searchQueries`. Expect small counts per metro — this segment is thin by nature, so run several cities in one go.

**How do I estimate company size?**
Use `reviewsCount` as an install-volume proxy and check whether the site lists multiple offices. Solar review counts track completed residential jobs fairly closely.

**Do you cover markets outside the US?**
Yes — pass any location string and set `language` to match, e.g. `"location": "Madrid, Spain", "language": "es"`. European and Australian solar markets return results the same way.

**What about companies with no website?**
Delivered by default with name, phone, address and rating. Set `onlyWithWebsite: true` to drop them; dropped rows are never charged.

**Is this compliant to use?**
The Actor collects publicly listed business information and emails companies publish on their own sites for inbound contact. No homeowner, permit or consumer data is involved. Your outreach must follow CAN-SPAM, GDPR where applicable, and TCPA rules for calls and texts.

### Off-grid, RV and small-system installers

The six presets are built around grid-tied residential and commercial work. The off-grid world is a separate supply chain with separate distributors, and it is invisible in a standard solar list:

```
off grid solar installer in Flagstaff, AZ
rv solar installer in Phoenix, AZ
marine solar installer in San Diego, CA
solar generator dealer in Prescott, AZ
cabin solar installation in Payson, AZ
```

These go in **Custom search queries**, which override both the installer-type picker and `location`. Companies are smaller here — often two people and a van — and the person on the published email is the owner.

### Geothermal, heat pumps and the wider electrification trade

Anyone selling into home electrification is selling into more than photovoltaics:

```
geothermal installation company in Madison, WI
heat pump installer in Milwaukee, WI
ev charger installation company in Madison, WI
home battery storage installer in Green Bay, WI
energy efficiency contractor in Appleton, WI
```

Worth knowing before you build the list: a large share of these companies are HVAC or electrical contractors who added the service, so their Maps category may not say "solar" at all. Searching the service rather than the industry is what surfaces them.

### Panel cleaning, O\&M and the aftermarket

Every installed system becomes somebody's maintenance contract:

```
solar panel cleaning service in Las Vegas, NV
solar panel repair company in Henderson, NV
solar operations and maintenance company in Phoenix, AZ
solar system monitoring service in Tucson, AZ
```

The aftermarket buys different things than installers do — route software, insurance, drone inspection, cleaning equipment — and is almost never separated out in purchased lists. Result counts per metro are small by nature; if a search returns nothing, the actor logs it and finishes successfully with an empty dataset rather than failing, and nothing is charged per lead.

# Actor input Schema

## `location` (type: `string`):

City, region or country to search in, e.g. 'Las Vegas, NV', 'Austin, TX', 'London, UK'.

## `keywords` (type: `array`):

Which solar business types to search for. Pick one or several; leave empty to sweep all six at once. Need something adjacent (e.g. 'ev charger installer', 'generator installer')? Use Custom search queries below.

## `searchQueries` (type: `array`):

Full searches, one per line (e.g. 'commercial solar company in Austin, TX'). When set, these override Location + installer types, and any wording is allowed here — use it for segments outside the list above or to cover several cities in one run.

## `maxResults` (type: `integer`):

Maximum number of companies to find per search. One search typically yields up to ~120 companies.

## `maxPagesPerSite` (type: `integer`):

How many pages to check on each company website when hunting for emails (homepage, /contact, /about...). More pages = more emails found, slightly slower run.

## `onlyWithWebsite` (type: `boolean`):

Drop companies that have no website (they can never have an email). You are not charged for dropped companies.

## `includeGenericEmails` (type: `boolean`):

Keep every published address, including shared inboxes like info@, hello@ and contact@. Disable to drop only non-deliverable system addresses (noreply@, no-reply@, donotreply@, mailer-daemon@, postmaster@, webmaster@, hostmaster@, abuse@).

## `language` (type: `string`):

Language code for the discovery search (e.g. 'en', 'es', 'fr', 'de').

## Actor input object example

```json
{
  "location": "Las Vegas, NV",
  "keywords": [
    "solar installer"
  ],
  "maxResults": 5,
  "maxPagesPerSite": 1,
  "onlyWithWebsite": false,
  "includeGenericEmails": true,
  "language": "en"
}
```

# Actor output Schema

## `leads` (type: `string`):

Complete B2B leads (company, website, phone, address, emails, social profiles), one item per lead in the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "location": "Las Vegas, NV",
    "keywords": [
        "solar installer"
    ],
    "maxResults": 5,
    "maxPagesPerSite": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("renzomacar/solar-installer-leads-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "location": "Las Vegas, NV",
    "keywords": ["solar installer"],
    "maxResults": 5,
    "maxPagesPerSite": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("renzomacar/solar-installer-leads-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "location": "Las Vegas, NV",
  "keywords": [
    "solar installer"
  ],
  "maxResults": 5,
  "maxPagesPerSite": 1
}' |
apify call renzomacar/solar-installer-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,renzomacar/solar-installer-leads-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/lnuzT9TWegWfhI5kn/builds/U7UY56kQWs38FnyU4/openapi.json
