ActorStack.dev
Lead generationv0.1.5updated 30 September 2026

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

input.json
{
  "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.
On this page11 sections

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.

output — one row
{
  "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.

FieldDefaultWhat it does
outputTypestringinstallersWhat 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.
includeCityPagesbooleantrueInclude 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`.
scrapeDetailsbooleanfalseAdd 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.
sourcestringlocationsInstaller 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.
onlyInstallersbooleantrueDirectory: installers onlyKeeps profiles that list Installation among their services, 13 of 33 in a sample.
maxReviewsPerInstallerinteger24Max reviews per installerEnergySage serves reviews 12 at a time; 0 means all of them.
maxResultsinteger50Max rowsHard cap on delivered rows of the chosen type. Error rows and duplicates are never charged.
maxConcurrencyinteger4Parallel location pagesApplies to location pages only. Profiles and reviews are always read one at a time.
proxyConfigurationobjectnoneProxyNot 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.

FieldFilledMeaning
installer_idinteger100%With `name`, `slug`, `profile_url`, `tier` (Elite+, Elite, Advanced, Approved), `hq_city`, `hq_state` and the location page and rank it was found at.
ratingnumber93.5%With `review_count`. New installers have no reviews yet.
year_establishedinteger96.5%Of 200 installers.
hq_postal_codestring99.5%With `hq_street` at 98.5%.
phonestring99%Full profile only, n=200.
emailstring96.5%Full profile only, n=200.
websitestring99.5%Full profile only, n=200.
servicesstring[]99%Installation, Financing, Roofing, Electrical Contracting and so on. Full profile only.
workmanship_warrantystring96%Full profile only.
rating_qualitynumber93.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_wattnumber100%Location rows: with `median_cost_per_watt`, `average_system_size_kw`, `average_price`, `installer_count` and the ranked `installers`. n=150 pages.
payback_yearsnumber96%Location rows, with `lifetime_savings_net` at the same rate.
textstring100%Review rows: with `title`, `rating_overall`, `date` and `reviewer_name`, the public alias. n=360 reviews of 15 installers.
rating_valuenumber98.1%Review rows. The other three sub-ratings were 97.2% to 97.8%.
installer_responsestring18.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`.billed
  • Error 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.

EventPriceNotes
apify-actor-startActor start$0.00001Charged by the platform when the run starts.
installerInstaller$0.00045One solar installer row: rating, review count, tier, year established, description and headquarters address.
installer-detailsFull installer profile$0.0004Added to an installer row: phone, email, website, badge, services, manufacturers, financing partners, licenses, insurance, certifications, warranty, sub-ratings and states served.
locationLocation$0.004One 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.0003One 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.

Frequently asked questions

Can I get solar installer phone numbers and emails from EnergySage?
Yes, with `scrapeDetails: true`. Phone came back on 99.0% and email on 96.5% of the 200 installers listed on EnergySage's location pages on 23 September 2026. These are the business contacts installers publish on EnergySage.
How many solar installers are on EnergySage?
200 unique installers appear across EnergySage's 50 state pages and 4,882 city pages. The supplier directory holds 6,822 profiles, but only 13 of 33 sampled offered installation; `source: directory` walks it.
Does EnergySage have an API?
EnergySage documents no public data API that this project could find. The EnergySage Scraper reads the public pages with no account, cookie, browser or key, and returns installers, reviews or location cost data as JSON, CSV or Excel.
Can I get the price per watt of a single installer?
No. EnergySage publishes solar cost per location rather than per company, so cost per watt, system price and payback arrive on state and city rows, alongside the installers ranked on that page.
Why are EnergySage profile and review runs slow?
EnergySage rate-limited clients at 4 parallel profile requests and not at one request every 1.5 seconds, so the EnergySage Scraper reads profiles and reviews one at a time, about 40 per minute. Location pages are read in parallel.

Guides for this Actor