New York City rooftop solar, 2002 to 2026
Each dot is one completed solar electric project in one of the five boroughs of New York City, drawn at its reported location. As the timeline plays, projects appear in the year their incentive application was received, so the animation traces where and when solar spread across the city.
All points come from a single public dataset: Solar Electric Programs Reported by NYSERDA: Beginning 2000, published by the New York State Energy Research and Development Authority on the NY Open Data portal (dataset id 3x8r-34rs). The data used here was pulled on July 29, 2026.
This dataset covers projects that went through NYSERDA's NY-Sun incentive program. It is the most complete public, address-level record of distributed solar in New York, but it is not a literal census of every panel ever installed: systems built entirely outside NYSERDA programs may not appear, and utility-scale projects larger than 5 megawatts (alternating current) are excluded by NYSERDA. In practice, the overwhelming majority of residential and small-commercial rooftop systems in New York City run through NY-Sun, so coverage of the rooftop segment shown here is high.
New York City does not publish a more complete address-level alternative. The city's own solar datasets are narrow (the Local Law 24 set covers only city-owned buildings). The exhaustive records sit with the utility (Con Edison interconnection) and the Department of Buildings (DOB NOW solar job filings), neither of which is released as a clean point-level public dataset.
project_status = "Complete". Pipeline (not-yet-built) projects are excluded.After filtering, the map contains 59,545 completed installations totaling about 616 megawatts of nameplate direct-current capacity.
The per-year chart shows a steep fall in 2025 and a near-empty 2026. That is not a collapse in rooftop solar. It is the incentive program this dataset tracks running out of money in New York City.
Applications fall off a cliff in a single month:
| Month | NYC applications received |
|---|---|
| March 2025 | 599 |
| April 2025 | 617 |
| May 2025 | 737 |
| June 2025 | 185 |
| July 2025 | 227 |
| Monthly average, July 2025 to June 2026 | about 120 |
The date lines up with a specific administrative event. NYSERDA allocates NY-Sun incentives in capacity blocks by utility territory and sector, and when a block is fully subscribed it closes. Per NYSERDA's Con Edison dashboard, the Con Edison residential Block 10 closed on May 29, 2025, exhausting the residential megawatt-block capacity for the territory that covers most of New York City. The nonresidential block for systems up to 200 kW had closed on May 1, 2025. NYSERDA's July 2025 operating plan update replaced the closed residential block with a narrower SEEF block aimed at low- and moderate-income customers.
Because this dataset is a record of NY-Sun program participation, a project with no incentive to apply for generates no row. The composition of what survives confirms the mechanism. Comparing average monthly applications in January to May 2025 against June 2025 to June 2026:
| Segment | Before | After | Change |
|---|---|---|---|
| Residential, outside a disadvantaged community | 376 | 48 | -87% |
| Residential, inside a disadvantaged community | 169 | 30 | -82% |
| Non-residential | 60 | 43 | -29% |
Market-rate residential, exactly the segment whose block closed, falls hardest. Non-residential holds up best, consistent with its larger block staying open until September 2025.
The federal tax credit is not the explanation for this break. The Section 25D residential clean energy credit was repealed by Public Law 119-21, signed July 4, 2025, for expenditures made after December 31, 2025 (see the IRS guidance and the Congressional Research Service summary). That is a month after the break in this data, and it would produce the opposite shape: a rush to finish systems through late 2025, then a fall in 2026. It may well be adding to the weakness in the 2026 figures, but it cannot have caused a drop that had already happened.
A second, smaller effect: the map is filtered to completed projects, and projects take time to move from application to completion, so the most recent years are also understated by that lag. As of this pull, New York City applications received in 2025 number 3,683 complete plus 521 still in the pipeline; for 2026, 140 complete plus 346 in the pipeline. Only the completed ones are drawn.
For both reasons, the 2025 and 2026 bars are drawn in a muted color and fenced off. They should not be read as a measure of how much solar New York City installed in those years.
| Map element | Source field |
|---|---|
| Dot position | latitude / longitude (NYSERDA-geocoded) |
| Year on the timeline | date_application_received (year) |
| Dot size | totalnameplatekwdc (larger systems read larger) |
| Home vs. business color | sector (Residential vs. Non-Residential) |
| Borough | county |
The borough panel can show totals, installations per square mile of land or installations per 10,000 residents. The denominators are fixed reference values, not from the solar dataset:
| Borough | Land area (sq mi) | Population (2020) |
|---|---|---|
| Manhattan | 22.83 | 1,694,251 |
| Bronx | 42.10 | 1,472,654 |
| Brooklyn | 69.40 | 2,736,074 |
| Queens | 108.53 | 2,405,464 |
| Staten Island | 58.37 | 495,747 |
Land areas are the U.S. Census Bureau land-area figures for each county (water excluded). Population is the 2020 Decennial Census count for each county. Rates divide the cumulative installation count for the selected year by these constant denominators; the denominators do not change over the timeline, so early-year rates are indicative rather than point-in-time accurate.
The borough totals and the statewide figures can be reproduced against the live API. For example, completed New York City projects by borough:
https://data.ny.gov/resource/3x8r-34rs.json?$select=county,count(*),sum(totalnameplatekwdc)&$where=county in('Bronx','Kings','New York','Queens','Richmond') AND project_status='Complete'&$group=county
The exact pull and transformation script is in data/fetch.py in this project.