# Solar Roof Prospects: commercial solar leads with savings (`translucent_wire/solar-roof-prospects`) Actor

Commercial solar leads for installers: businesses with big roofs in any city. Get the rooftop solar system that fits, yearly power, bill saving, cost and payback, business email, lead score, a branded one-page solar estimate and a ready-to-send email for each roof, plus a map.

- **URL**: https://apify.com/translucent_wire/solar-roof-prospects.md
- **Developed by:** [Ghulam Nabi](https://apify.com/translucent_wire) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $100.00 / 1,000 roof prospects

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Solar Roof Prospects: roofs, savings, payback, emails

**Find the businesses in any city whose roofs are worth putting solar on, and know what to say before you call.** For each business this Actor measures the roof from the map, sizes a solar system to what that kind of business typically uses, estimates yearly power from satellite solar data, works out the bill saving, cost and payback, finds the business email on its own website, scores the roof as a lead, and writes a **branded one-page estimate** and a **ready-to-send first email**.

- 🏭 **Roofs that matter**: manufacturers, warehouses, food producers and cold storage, supermarkets and large stores, car dealers, hotels, gyms, offices
- 📐 **Roof size from the real building outline** (OpenStreetMap), drawn on the one-page estimate
- ☀️ **Yearly power for that exact spot** from PVGIS satellite solar data (EU Joint Research Centre)
- 💵 **Bill saving, installed cost, payback and 25-year saving**, using US business power prices by state (EIA) or your own price
- 🧠 **Smart lead score**: right system size for a small or mid installer, payback, daytime power use, independent owner (chains skipped), owner-occupied building (shared plazas skipped), roofs that already have solar skipped
- 📧 **Business email from the company's own website**, mail server checked, never jobs@ or billing@. Businesses with no website on the map get one looked up by name, kept only if the site mentions their city, state or phone
- 📄 **Branded one-page estimates** for your best-fit roofs (set how many with **Maximum estimate pages**; default 1) and ✍️ **a ready-to-send email** with the numbers and your booking link
- 🗺️ **Map of all roofs** with size, saving and score

### Example (real run, Fresno, California, October 2026; numbers are estimates)

| Business type | Roof | System | Yearly saving | Payback after 30% credit |
|---|---|---|---|---|
| Custom closet manufacturer | 30,400 sq ft | 252 kW | ~$79,200 | ~4.2 years |
| Electronics manufacturer | 24,400 sq ft | 201 kW | ~$63,500 | ~4.2 years |
| Auto electric workshop | 48,700 sq ft | 251 kW | ~$65,400 | ~5.1 years |
| Refrigeration wholesaler | 30,200 sq ft | 101 kW (sized to its use, not the whole roof) | ~$22,600 | ~6.0 years |

168 business roofs found in Fresno; chains, shared buildings and roofs under 600 m² skipped; 12 prospects with a business email and a score of 60+.

### How to use it

1. Enter a **city or area** (e.g. "Fresno, California") and pick the **business types**.
2. Keep the defaults or set your **installed cost per watt**, **tax credit** and, outside the US, your **electricity price** and **currency**.
3. Add your **branding** and booking link, set the **maximum prospects**, click **Start**.
4. Download the roofs (Excel, CSV, JSON). Each row has the email draft; the best-fit rows also have the one-page estimate link. Open the map from the Output tab.

### How the estimate works (and its limits)

- **Roof**: area of the building outline on OpenStreetMap. About 60% of a flat roof (40% of other roofs) is treated as usable, at 150 W per m² (rows of modern panels with spacing and walkways).
- **System size**: the smaller of what fits the roof and ~90% of the yearly power a business of that type and size typically uses (US CBECS averages).
- **Power**: PVGIS yearly output for fixed panels at this location (10° tilt on flat roofs).
- **Saving**: the share of solar power a business of that type uses on site, valued at 75% of the average business power price (bills include demand charges solar does not fully remove). Exported power and future price rises count as zero, so savings are on the careful side.
- **Cost**: your cost per watt, a little higher for small systems and lower for big ones. US federal credit default 30%: it generally needs the system in service by 31 December 2027; eligibility depends on the project.
- Map coverage varies by city: a business is included only when its building outline is mapped. Big cities and counties give the most roofs. Every number is a first estimate; confirm with a site visit and real bills.

### Output fields

`name`, `category`, `address`, `city`, `state`, `website`, `bestEmail`, `bestEmailType`, `emailDomainAcceptsMail`, `phone`, `roofAreaM2`, `roofLikelyFlat`, `buildingType`, `floors`, `businessesInBuilding`, `roofFitsKwp`, `estimatedSystemKwp`, `panels`, `yieldKwhPerKwp`, `estimatedYearlyUseKwh`, `yearlyKwh`, `electricityPrice`, `priceSource`, `yearlySaving`, `costPerWatt`, `estimatedCost`, `taxCreditPercent`, `costAfterCredit`, `paybackYears`, `saving25Years`, `co2TonsPerYear`, `fitScore`, `fitLabel`, `fitReasons`, `solarPageUrl`, `emailSubject`, `emailBody`, `latitude`, `longitude`, `osmUrl`.

### Pricing

Pay per event, no subscription. Roofs that fail your filters are free.

| Event | Price |
|---|---|
| Roof prospect (sizing, saving, payback, lead score, contact, email draft) | **$0.10** |
| One-page solar estimate, up to **Maximum estimate pages** | **$0.50** |
| Map of all roofs, once per run, if on | **$0.50** |

Examples:

- **Default run** (5 roofs, 1 estimate page, map): 5 × $0.10 + $0.50 + $0.50 = **$1.50**
- 50 roofs with 10 estimate pages and the map: **$10.50**

Runs are paid from your Apify balance; the free plan's $5 monthly credit covers a few default runs. Use **Maximum cost per run** in the run options to set a hard cap.

### Good use

Business data comes from OpenStreetMap and each company's own public website; emails are business addresses the company publishes. Use the results for relevant business-to-business outreach with your real address and an easy opt-out, and stop when asked. Data: © OpenStreetMap contributors (ODbL); PVGIS © European Union; US electricity prices: EIA.

### More tools from translucent_wire

| Tool | What it does |
|---|---|
| [Local Business Leads](https://apify.com/translucent_wire/local-business-email-finder) | Local businesses by type and city: email, website gaps, fit score, audit pages, map |
| [Hiring Signals to Proposals](https://apify.com/translucent_wire/hiring-signals-to-proposals) | Companies hiring for a role your service can do: tasks covered, saving, email, proposal page |
| [GeoRisk Site Screener](https://apify.com/translucent_wire/georisk-site-intelligence) | Flood, contamination, climate, EUDR forest and solar risk for any site or plot, A-F grades + report |
| [EUDR Plot File Fixer](https://apify.com/translucent_wire/eudr-plot-file-fixer) | Fix GeoJSON/KML/CSV/Shapefile plot files so the EU Information System accepts them |

### Use it from an AI assistant (MCP)

Add Apify's MCP server to Claude, ChatGPT, Cursor or any MCP client and this Actor becomes a tool your assistant can run:

```json
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?tools=translucent_wire/solar-roof-prospects"}}}
```

AI agents without an Apify account can also run it and pay per run in USDC through Apify's x402 support.

# Actor input Schema

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

City, county or area plus state or country, e.g. 'Fresno, California' or 'Leeds, UK'.

## `countryCode` (type: `string`):

Two-letter code like US or GB to make the location search exact.

## `radiusKm` (type: `integer`):

Search this many km around the location instead of inside its official boundary.

## `businessTypes` (type: `array`):

Types of business with big roofs and daytime power use.

## `minRoofM2` (type: `integer`):

Skip smaller roofs. 600 m² is about 6,500 sq ft (roughly a 50 kW system).

## `includeChains` (type: `boolean`):

Off: skip branded chain stores, whose solar decisions are usually made at head office.

## `includeSharedBuildings` (type: `boolean`):

Off: skip buildings with 3 or more businesses inside (the landlord usually owns the roof).

## `electricityPricePerKwh` (type: `string`):

US: leave empty to use the EIA average business price for the state. Other countries: enter your local price (e.g. 0.25) to get savings and payback.

## `currency` (type: `string`):

Three-letter currency of your price and cost inputs, e.g. GBP or EUR. US always uses USD.

## `installCostPerWatt` (type: `string`):

Average installed price for business solar in your market (US Q2 2026 about 1.77). Small systems are priced higher, big ones lower, automatically.

## `taxCreditPercent` (type: `integer`):

US default 30 (federal credit for systems in service by 31 Dec 2027, if eligible). Elsewhere default 0.

## `minFitScore` (type: `integer`):

Only return roofs with at least this score (size, payback, daytime use, independent owner, contact found).

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

Stop after this many prospects.

## `onlyWithEmail` (type: `boolean`):

Return only businesses whose own website publishes an email fit for a sales message.

## `solarPages` (type: `boolean`):

A page per business with its roof drawing, system size, saving, cost and payback, in your branding.

## `maxSolarPages` (type: `integer`):

Estimate pages are made for your best-fit roofs first, up to this number ($0.50 each). Set 0 for a page for every roof.

## `makeMap` (type: `boolean`):

One interactive map with every roof, its size, saving and score.

## `emailOffer` (type: `string`):

One sentence added to each ready-to-send email, e.g. 'We handle permits and the utility connection.'

## `brandName` (type: `string`):

Shown on pages and the map.

## `brandLogoUrl` (type: `string`):

Public https link to your logo image.

## `brandColor` (type: `string`):

Hex colour like #d97706.

## `brandContact` (type: `string`):

e.g. 'Jane Smith, Sunny Solar, jane@sunnysolar.com, (555) 010-0000'. Used as the email signature.

## `brandCtaUrl` (type: `string`):

Your booking page or website.

## `brandCtaText` (type: `string`):

Text on the button.

## Actor input object example

```json
{
  "location": "Fresno, California",
  "businessTypes": [
    "manufacturers",
    "warehouses_wholesale",
    "cold_storage_food",
    "supermarkets_big_retail",
    "car_dealers_repair"
  ],
  "minRoofM2": 600,
  "includeChains": false,
  "includeSharedBuildings": false,
  "currency": "USD",
  "installCostPerWatt": "1.77",
  "minFitScore": 50,
  "maxResults": 5,
  "onlyWithEmail": true,
  "solarPages": true,
  "maxSolarPages": 1,
  "makeMap": true,
  "brandColor": "#d97706",
  "brandCtaText": "Book a free site check"
}
```

# Actor output Schema

## `roofs` (type: `string`):

No description

## `map` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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": "Fresno, California",
    "maxResults": 5,
    "maxSolarPages": 1,
    "brandColor": "#d97706"
};

// Run the Actor and wait for it to finish
const run = await client.actor("translucent_wire/solar-roof-prospects").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": "Fresno, California",
    "maxResults": 5,
    "maxSolarPages": 1,
    "brandColor": "#d97706",
}

# Run the Actor and wait for it to finish
run = client.actor("translucent_wire/solar-roof-prospects").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": "Fresno, California",
  "maxResults": 5,
  "maxSolarPages": 1,
  "brandColor": "#d97706"
}' |
apify call translucent_wire/solar-roof-prospects --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,translucent_wire/solar-roof-prospects"
        }
    }
}
```

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/jKIcVF21XqDiPB8tB/builds/gCnI7F8o1CVqBDr0u/openapi.json
