EnergySage Scraper: Solar Installers, Reviews & Solar Costs
Installers, their reviews, and what solar costs where they work.
Three kinds of row from EnergySage, the US solar marketplace: installer companies with their business contacts, licenses and certifications; customer reviews with four sub-ratings; and the local solar cost per watt, system price and payback EnergySage publishes for every state page and 4,882 cities.
oswaldocarabano/energysage-solar-installers-scraper
{
"outputType": "installers",
"states": ["CA", "TX"],
"scrapeDetails": true,
"maxResults": 20
}- Version
- v0.1.5
- Memory
- 512 MB
- Browser
- none
- Proxy
- None needed; fallback only
Short answer
The EnergySage Scraper extracts three kinds of row from energysage.com: solar installer companies, customer reviews with four sub-ratings, and local solar cost data for 50 state pages and 4,882 city pages. With the full profile, phone was filled on 99.0%, email on 96.5% and website on 99.5% of the 200 installers EnergySage lists on its location pages, measured on 23 September 2026. Reviews were measured on 360 reviews of 15 installers, and location data on 150 state and city pages. Pricing is $0.00045 per installer, $0.0004 more for the full profile, $0.0003 per review and $0.004 per location.
Key points
- EnergySage's state and city pages list 200 unique installers nationwide, counted across all 50 state pages on 23 September 2026.
- With the full profile, phone was filled on 99.0%, email on 96.5% and website on 99.5% of those 200 installers.
- EnergySage's supplier directory holds 6,822 profiles, but only 13 of 33 sampled profiles offered installation, and the directory also holds manufacturers, lenders and inactive companies.
- EnergySage publishes solar cost per location, not per installer, so the EnergySage Scraper delivers cost per watt, system price and payback per state or city.
- Customer reviews carry four sub-ratings, filled on 97.2% to 98.1% of 360 measured reviews; the installer's reply was present on 18.6%.
- EnergySage slowed clients that opened profiles in parallel, so profiles and reviews are read one at a time, about 40 per minute.
What it does
Three kinds of row from EnergySage, the US solar marketplace: installer companies with their business contacts, licenses and certifications; customer reviews with four sub-ratings; and the local solar cost per watt, system price and payback EnergySage publishes for every state page and 4,882 cities.
{
"record_type": "installer",
"installer_id": 99999,
"name": "Example Solar LLC",
"profile_url": "https://www.energysage.com/supplier/99999/example-solar-llc/",
"tier": "Elite",
"rating": 4.9,
"review_count": 74,
"year_established": 2012,
"hq_city": "Austin",
"hq_state": "TX",
"found_in_location": "Texas",
"rank_in_location": 1,
"phone": "(512) 555-0142",
"email": "info@example.com",
"website": "https://example.com/",
"services": ["Installation", "Financing"],
"certifications": ["NABCEP"],
"workmanship_warranty": "25 years",
"rating_quality": 5,
"rating_value": 4.8,
"states_served": ["TX"],
"detail_scraped": true
}Why this one
Three outputs, one row type per run
The EnergySage Scraper returns installers, reviews or locations, chosen with `outputType`, and never mixes them in one table. A location row carries the cost per watt, average system size and price, payback years and lifetime savings EnergySage publishes for that state or city, together with the installers it ranks there.
The directory is not the installer list
EnergySage's supplier directory has 6,822 profiles, and a list built from it would mostly be manufacturers, lenders and inactive companies: 13 of 33 sampled profiles offered installation. The default source is the 200 installers EnergySage ranks on its location pages; the full directory is available with `source: directory` and `onlyInstallers` keeps the ones that install.
A rate limit respected rather than probed
Rate limiting was measured at 4 parallel profile requests and none at one request every 1.5 seconds, so profiles and reviews are read one at a time. If EnergySage asks the Actor to slow down, the run pauses, says so in its status message, and resumes without losing or double-charging a row.
Use cases
- Sell to solar installers — software, financing, equipment — using the business phone, email and website EnergySage publishes for them.
- Map the US residential solar market by state and city: installers per location, EnergySage tier, years in business and states served.
- Research competing installers through their full review history, with four sub-ratings and the installer's replies.
- Model solar prices and payback with cost per watt, average system size and price, and payback years per state and city.
- Qualify installer partners by license, insurance, NABCEP and manufacturer certifications and workmanship warranty.
Input
Every field has a default, and the defaults are deliberately small so a first run is cheap enough to inspect before you commit to a sweep. This table mirrors the Actor's own input schema field for field.
| Field | Default | What it does |
|---|---|---|
outputTypestring | installers | What to extract`installers`, `locations` or `reviews`. One row type per run. |
statesstring[] | none (CA, TX and FL when nothing else is set) | StatesUS state codes or names. Each state page lists every EnergySage installer active in that state. Alaska has no page. |
citiesstring[] | [] | Cities`City, ST` or an EnergySage city URL. 4,882 city pages exist. |
includeCityPagesboolean | true | Include every city of the chosen states (locations only)Also reads every city page of each chosen state; California alone has 566. |
installerUrlsstring[] | [] | Installer profile URLs or IDsReturns the full profile of each installer, or its reviews when `outputType` is `reviews`. |
scrapeDetailsboolean | false | Add the full installer profilepersonal dataAdds phone, email, website, badge, services, manufacturers, financing partners, licenses, insurance, certifications, warranty, sub-ratings and states served. One extra request per installer, billed as its own event. |
sourcestring | locations | Installer source`locations`: the 200 installers ranked on state and city pages, fast. `directory`: all 6,822 supplier profiles, about 40 per minute, always with the full profile. |
onlyInstallersboolean | true | Directory: installers onlyKeeps profiles that list Installation among their services, 13 of 33 in a sample. |
maxReviewsPerInstallerinteger | 24 | Max reviews per installerEnergySage serves reviews 12 at a time; 0 means all of them. |
maxResultsinteger | 50 | Max rowsHard cap on delivered rows of the chosen type. Error rows and duplicates are never charged. |
maxConcurrencyinteger | 4 | Parallel location pagesApplies to location pages only. Profiles and reviews are always read one at a time. |
proxyConfigurationobject | none | ProxyNot needed: EnergySage answered every measured request directly. Only used as a fallback. |
Output and fill rates
A field being in the schema is not the same as it having a value. The percentages below were counted on real runs; the sample sizes are in Measurements. Anything not listed here is not promised.
| Field | Filled | Meaning |
|---|---|---|
installer_idinteger | 100% | With `name`, `slug`, `profile_url`, `tier` (Elite+, Elite, Advanced, Approved), `hq_city`, `hq_state` and the location page and rank it was found at. |
ratingnumber | 93.5% | With `review_count`. New installers have no reviews yet. |
year_establishedinteger | 96.5% | Of 200 installers. |
hq_postal_codestring | 99.5% | With `hq_street` at 98.5%. |
phonestring | 99% | Full profile only, n=200. |
emailstring | 96.5% | Full profile only, n=200. |
websitestring | 99.5% | Full profile only, n=200. |
servicesstring[] | 99% | Installation, Financing, Roofing, Electrical Contracting and so on. Full profile only. |
workmanship_warrantystring | 96% | Full profile only. |
rating_qualitynumber | 93.5% | With `rating_response`, `rating_value` and `rating_service`. Full profile only. |
licensesobject[] | 92% | With license numbers when published. Full profile only. |
certificationsstring[] | 83.5% | NABCEP and others. `manufacturer_certifications` was 83.0%. Full profile only. |
insurancestring[] | 78% | Full profile only. |
financing_partnersobject[] | 65% | With `product_manufacturers` at the same rate. Full profile only. |
cost_per_wattnumber | 100% | Location rows: with `median_cost_per_watt`, `average_system_size_kw`, `average_price`, `installer_count` and the ranked `installers`. n=150 pages. |
payback_yearsnumber | 96% | Location rows, with `lifetime_savings_net` at the same rate. |
textstring | 100% | Review rows: with `title`, `rating_overall`, `date` and `reviewer_name`, the public alias. n=360 reviews of 15 installers. |
rating_valuenumber | 98.1% | Review rows. The other three sub-ratings were 97.2% to 97.8%. |
installer_responsestring | 18.6% | Review rows: the installer's reply, its author and date. |
Every key is always present. A field that exists but is empty comes back as explicit null, so a parser never has to guess.
Datasets
Different record types go to different datasets, so the main table never carries columns that are blank on most rows.
defaultOne row type per run: installers, locations or reviews, chosen with `outputType`.billedError rowsInputs that could not be resolved or fetched, with the reason.never billed
Pricing
Pay per delivered result. Charges are applied as each row is produced rather than in a lump at the end, so an aborted run bills only for what it actually gave you.
| Event | Price | Notes |
|---|---|---|
apify-actor-startActor start | $0.00001 | Charged by the platform when the run starts. |
installerInstaller | $0.00045 | One solar installer row: rating, review count, tier, year established, description and headquarters address. |
installer-detailsFull installer profile | $0.0004 | Added to an installer row: phone, email, website, badge, services, manufacturers, financing partners, licenses, insurance, certifications, warranty, sub-ratings and states served. |
locationLocation | $0.004 | One state or city row: cost per watt, average system size and price, payback years, lifetime savings and the ranked installers of that location. |
reviewReview | $0.0003 | One customer review: title, text, overall and four sub-ratings, date, verified-shopper flag and the installer's reply. |
Measurements
Each figure is shown with the method that produced it. A benchmark without a method is a marketing claim wearing a number's clothes.
Installer census
200 unique installers
Every installer on EnergySage's 50 state pages, counted on 23 September 2026. All installer fill rates on this page come from those 200, and a platform run on 30 September reproduced the contact rates.
Business contacts
phone 99.0%, email 96.5%, website 99.5%
With `scrapeDetails: true`, n=200.
Directory composition
6,822 profiles, 13 of 33 sampled offer installation
Profiles counted in EnergySage's supplier directory; installation share from a sample of 33 profiles, which is too small to quote as a precise percentage.
Location sample
150 state and city pages
Cost fields at 100%, payback years and lifetime savings at 96.0%.
Review sample
360 reviews of 15 installers
Text and overall rating at 100%, sub-ratings 97.2% to 98.1%, verified shopper true on 65.0%, installer reply on 18.6%.
Rate limit
limited at 4 parallel, clean at 1 per 1.5 s
Profile requests to www.energysage.com. A 200-installer census run with profiles made about 200 requests in 328 seconds with 0 HTTP 429 or 403.
What it will not do
Stated plainly so you can judge fit before spending anything.
- No per-installer price: EnergySage publishes cost data per location, not per company.
- 200 unique installers appear on EnergySage's location pages. The 6,822-profile directory is mostly not installers, and reading it is slow because profiles are fetched one at a time.
- Alaska has no EnergySage state page.
- Profiles and reviews are read at about 40 per minute; location pages are fast.
- Location data and the default installer list come from local-data.energysage.com, whose robots.txt is `Disallow: /`. Installer profiles and the review API on www.energysage.com are not disallowed by that host's robots.txt.
- EnergySage's terms of use prohibit automated access without its express written permission, outside the RSS and other features it provides for that.
- This is a list of solar companies, not of homeowners looking for solar.
Privacy
- Installers are businesses, and their phone, email and website are the business contacts they publish on EnergySage to win customers.
- Reviewers appear under the public alias EnergySage shows, never an internal user id.
- A phone number or email typed inside a review is replaced with `[phone removed]` or `[email removed]`.
- Removal requests: privacy@actorstack.dev
See also the data removal process.