How we score NYC parking buildings for EV battery fire risk
This tool scores approximately 6,350 parking buildings across New York City on the Fire Risk Index, a weighted sum of structural, regulatory, and EV-infrastructure risk factors. The index reflects how vulnerable each location is to an EV battery fire event in an enclosed structure — specifically, the factors that would determine whether a single-vehicle thermal runaway cascades into a multi-vehicle fire like the August 2024 Incheon, South Korea incident (140 vehicles destroyed, 23 hospitalized, 8 hours to extinguish).
The Fire Risk Index is not bounded at 100. Each building's score reflects the actual severity of the signals attached to it; capping at a round number would erase the gap between a building with a few issues and one with many. Alongside the raw number, each building has a percentile rank ("worse than X% of NYC garages") so the relative severity is legible without needing to know the whole distribution.
"Parking buildings" is broader than "parking garages" as most people think about them. Only about 1,600 of the scored buildings are standalone parking structures (PLUTO class G). The rest are residential, office, or institutional buildings with dedicated parking space inside them — the kind of ground-floor or basement garage that sits under apartments, under an office tower, or under a hospital. Most NYC parking exists this way. See Why garagearea, not just G-class below.
The score does not predict the probability of an EV fire occurring. EVs catch fire 20-60x less frequently than gasoline vehicles (~25 per 100,000 vs ~1,530 per 100,000). The score instead measures how bad it would be if one did occur at this specific location.
Earlier pre-v1 versions of this map scored only PLUTO building class G (dedicated garages) plus any non-G building that happened to match an EV charger location. That second category definitionally meant "has EV charger," which made the map biased — any "buildings with parking" number we reported was inflated by EV presence rather than actual parking capacity. It also meant any apartment building with a real parking garage but no EV chargers was invisible to the tool.
v1 replaces that with a more honest selection: a building is "a parking building" if it is either G-class OR has garagearea ≥ 1,000 sqft (roughly 3 or more cars) in PLUTO. PLUTO classifies buildings by their dominant use, so most NYC parking ends up inside buildings classified as something else:
Adding garagearea ≥ 1000 to the selection adds about 4,500 buildings the previous version missed, most of them in the exact "people sleeping above parking" configuration that makes battery fires dangerous at night. The Reims, June 2025 e-scooter fire — 4 dead in a social housing tower — happened in a building of this type.
Every dot on the map encodes four things. Each visual channel maps to an independent dimension of risk, so you can scan multiple things at once:
| Channel | Dimension | Details |
|---|---|---|
| Color | Fire Risk Index tier (severity) | Red = High (score ≥70 OR multiple hazard mechanisms maxed out), orange = Elevated (≥50 OR 2+ mechanisms maxed), yellow = Moderate (≥30), green = Low (<30). Semantic escalation catches buildings whose individual mechanism contributions saturate without the raw score crossing a threshold. See the Scoring Formula below. |
| Size | Garage capacity (how many cars are at stake) | Square-root-scaled on PLUTO garagearea. Bigger dot = bigger garage. Roughly: 1K sqft → 3.5px, 10K sqft → 5px, 100K sqft → 9px, 250K+ sqft → 14px (capped). Buildings with garagearea = 0 in PLUTO use a default 5px. Size does not encode risk; color does. |
| Border | EV charger presence (binary) | White ring = one or more AFDC-listed EV chargers at this building. Black border otherwise. Charger count is already baked into the score via the EV bonus — the ring is just a "heads up, EVs congregate here" flag. |
| Opacity | Data confidence | Three tiers based on the combined count of DOB sprinkler permits + FDNY violation records for the building. Solid (~49% of buildings): 3+ records on file. Medium (~11%): 1-2 records; thin data backing. Translucent (~39%): no records either way; the score is inferred from the absence of evidence and should be interpreted with caution. See Sprinkler System Evidence for how we reason about this. |
The Fire Risk Index is a weighted sum of structural, regulatory-compliance, and EV-infrastructure factors. Points are additive, then hazard-mechanism caps bound how much any single failure mode (sprinkler, structural, egress, etc.) can contribute regardless of how many sources cite it. This prevents double-counting: one failing sprinkler system can show up as a DOB permit gap, an FDNY maintenance violation, and an ECB Class 1 citation, each contributing points. The cap bounds the mechanism's total contribution to the p95 of its raw distribution across all NYC garages.
Hazard-mechanism caps, set at the p95 of each mechanism's raw distribution:
| Mechanism | Cap | Typical contributors |
|---|---|---|
| sprinkler | 30 | DOB sprinkler permit gap, LL26 retrofit flag, FDNY BF12/BF20, DOB NOW sprinkler filings, ECB sprinkler-keyword Class 1/2 |
| structural | 23 | DOB LL126 PS unsafe/initial, DOB ECB construction Class 1, DOB NOW structurally-compromised |
| egress | 18 | ECB exit/egress-keyword Class 1/2, DOB NOW photoluminescent, LL26/2004 exit-sign active |
| fireman_service | 16 | ECB elevator fireman-service Class 1 |
| other | 8 | ECB other elevator / uncategorized fire |
| power | 7 | DOB NOW emergency power, LL26/2004 emergency power active |
| alarm | 6 | FDNY other fire-protection charges, ECB alarm/smoke-keyword |
Each building's popup shows both the raw per-mechanism contribution and any cap applied, so readers can see "sprinkler had 113 raw points of signal but only 30 counted toward the Index." Tier assignment uses a score-threshold backbone (70/50/30) with escalation safety nets: if a building has 2+ maxed mechanisms it rises to Elevated, 3+ rises to High, and sprinkler+structural both maxed rises to High. These catch buildings whose severity is legible across multiple failure modes without any single source crossing a numeric threshold.
| Year Built | Points | Rationale |
|---|---|---|
| Before 1968 | 30 | Built under pre-modern NYC building code. Maximum structural deterioration time. Original fire safety standards were designed for lighter vehicles and different fire profiles. |
| 1968-2003 | 15 | Built under 1968 NYC Building Code but before IBC adoption. |
| 2004 or later | 5 | Built under International Building Code with modern fire safety requirements. |
| Unknown | 20 | No year recorded in PLUTO — treated as likely pre-1968. |
Why 1968? NYC adopted its first comprehensive modern building code in 1968. Buildings built before this date were designed to varied and often undocumented standards. The 1968 code established uniform structural and fire safety requirements for the first time.
This factor measures evidence that a building has a sprinkler system, combining two independent data sources:
Important distinction: DOB vs FDNY. DOB permits measure presence (was a system installed or modified?). FDNY violations measure maintenance (is the system being kept in working order?). A building can have a DOB permit AND open FDNY violations — system was installed correctly, but isn't being maintained. A building can have FDNY violations but no DOB permit — system exists (pre-1990 install) but was never modified in the digital era. These are different risk profiles, scored by different factors.
| Evidence | Points | What we know |
|---|---|---|
| DOB sprinkler permit exists (any date) | 0 | System confirmed present with activity in modern DOB records. |
| No DOB permit, but FDNY sprinkler violation confirms system | 5 | System confirmed present (FDNY proves it), but no modern installation/modification record. Likely a pre-1990 install. |
| No DOB + no FDNY, but post-2004 residential ≥4 floors | 10 | Local Law 26 of 2004 required sprinklers at construction for residential buildings ≥40 ft. Sprinkler install was likely bundled into the New Building (NB) permit, which our pipeline doesn't capture as a separate sprinkler record. Some uncertainty remains. |
| No evidence + any other building | 15 | No DOB permit, no FDNY sprinkler violations. System status genuinely unknown. Some buildings may have pre-1990 systems that have never been cited; others may have no system at all. |
| No evidence + pre-2004 residential ≥10 floors | 30 | Local Law 26 required these buildings to retrofit sprinklers by July 1, 2019. A retrofit on an existing building requires its own dedicated DOB sprinkler permit. Absence of any permit is a strong signal the legally-mandated retrofit was missed. Flagged in the popup as LL26 retrofit deadline likely missed. |
| No evidence + post-1984 office ≥7 floors | 30 | Local Law 16 of 1984 required sprinklers at construction for new office buildings ≥75 ft. No DOB permit for these buildings is concerning. Flagged as LL16. |
Why not use the permit DATE as a signal? We explored using the age of the most recent DOB sprinkler permit as a risk differentiator (e.g., "pre-2010 permit = higher risk"). This doesn't hold up to scrutiny: most NFPA 25-mandated sprinkler maintenance (annual inspections, head testing, flow tests) is performed by Certificate of Fitness holders and does NOT require a DOB permit. A building with a 1995 DOB permit could have a perfectly maintained system with annual FDNY inspections for 30 years without ever filing another permit. The date of the permit tells us when the system was installed or last substantially modified — not its current condition. We use binary presence (permit or no permit) rather than date-based tiers.
Can sprinklers stop an EV fire? No. Sprinklers cannot extinguish a lithium-ion thermal runaway — the fire happens inside a sealed battery pack. But full-scale testing (Fire Technology, 2024) found that sprinklers at adequate density prevent fire spread to adjacent vehicles, which is the difference between a single-car event and a 140-car catastrophe.
NYC is behind on sprinkler density standards. In 2022, NFPA 13 reclassified parking garages from Ordinary Hazard Group 1 to Group 2 (OH1 → OH2), increasing the required sprinkler water discharge density by 33% (0.15 → 0.20 GPM/SF) to address modern vehicle fire loads including EVs. NYC's 2022 Building Code still references NFPA 13-2016, meaning even brand-new NYC sprinkler permits default to the old OH1 density. This is a parallel to the LL39 / EN 15194 e-bike certification gap — in both cases, NYC is behind on adopting stricter safety standards that specifically address vehicle/battery fire risks. San Francisco goes even further, requiring double the OH2 density (0.40 GPM/SF) at DC fast charging spots.
Can we get actual system specifications? Sprinkler engineering drawings filed with DOB are public records, obtainable through DOB BIS Options record requests (~$8/page) or FOIL requests. These would show the actual GPM/SF a system was designed for. This is not scalable to thousands of buildings but is a viable path for investigating individual high-scoring locations.
| Floors | Points | Rationale |
|---|---|---|
| 3+ floors | 10 | Multi-story enclosed structure — more vehicles, harder evacuation, heat rises to upper floors. |
| 2 floors | 5 | Partial enclosure risk. |
| 1 floor | 0 | Single-level structure. |
v1.3 dropped the keyword-matched DOB Violations filter (too narrow — caught only 406 garages on a taxonomy that's mostly administrative follow-up records) in favor of three targeted DOB sources. Each attributes to specific hazard mechanisms so double-counting is prevented at the cap layer.
The Local Law 126 periodic parking-garage inspection mandate (from DOB NOW, device_type='Parking Structures'). Picks up buildings with filed-but-not-corrected "unsafe" reports (+12 flat) and buildings that never filed the mandated inspection at all (+8 flat). No age decay because the LL126 program is only ~4 months old.
Active+uncured Immediately Hazardous / Class 1 and fire-relevant Class 2 violations from the DOB ECB Violations dataset, weighted by category and multiplied by age since issue (older uncured = ×1.25–×2):
| Category | Base Points | Age multiplier |
|---|---|---|
| Class 1 Construction, fire keyword | 6 | 3y → ×1.25, 5y → ×1.5, 10y+ → ×2 |
| Class 1 Elevator, fireman-service keyword | 4 | Same |
| Class 1 Construction, other (non-fire) | 3 | Same |
| Class 2, fire keyword | 2 | Same |
| Class 1 Elevator, other | 1 | Same |
Each record's points are attributed to a hazard mechanism by description keyword: SPRINKLER/STANDPIPE → sprinkler, EXIT/EGRESS → egress, ALARM/SMOKE → alarm, construction-other or unclassified fire-relevant → structural, elevator fireman-service → fireman_service.
v2.0 tightened the fire-keyword classifier: dropped UNSAFE (was sweeping LL11/FISP facade-cycle reports that are structural defects, not fire risks) and added a negative filter so "GAS FIRED BOILER" / "FIRE-HYDRANT" don't count unless paired with a real fire indicator elsewhere in the description.
Open violations from DOB NOW Safety Violations (855j-jady) on fire-relevant device types:
| Device type | Points | Attributes to |
|---|---|---|
| Sprinklers | 6 | sprinkler |
| Emergency Power | 6 | power |
| Photoluminescent | 1 | egress |
| Structurally Compromised Buildings | 8 | structural |
Narrow slice of the 3h2n-5cm9 DOB Violations dataset restricted to active LL26/2004 retrofit-mandate records:
| Subtype | Points | Attributes to |
|---|---|---|
| LL2604S (sprinkler) | 2 | sprinkler |
| LL2604E (emergency power) | 1 | power |
| LL2604 (photoluminescent) | 1 | egress |
This is a new factor based on FDNY fire-protection violation data from the OATH/ECB Hearings dataset — the administrative hearings tribunal where FDNY violations get adjudicated. The FDNY-named datasets on NYC Open Data contain fewer than 50 records; the actual ~926,000 FDNY violation records live in the OATH dataset.
We filter to fire-protection-relevant charges (sprinkler maintenance failures, inspection/testing failures, fire protection system deficiencies) and score only OPEN (unresolved) violations. Resolved violations ("All Terms Met") do not add to the score — a building that gets cited and fixes the problem is being managed, not neglected.
Time weighting: older open violations indicate persistent non-compliance and score higher. A building with a 10-year-old unresolved sprinkler maintenance violation has demonstrated sustained neglect — worse than a building with a recent citation still in its remediation window.
| Open violation type | 0-2 years | 2-5 years | 5-10 years | 10+ years |
|---|---|---|---|---|
| BF12 — sprinkler/standpipe maintenance failure | 3 | 5 | 7 | 10 |
| BF20 — inspection and testing failure | 2 | 3 | 5 | 7 |
| Other fire protection system charges | 1 | 2 | 3 | 4 |
v2.0 removed the 25-point factor-level cap in favor of the hazard-mechanism caps described above. BF12 and BF20 points attribute to the sprinkler mechanism (FDNY BF20 "inspection/testing" citations are almost always sprinkler/standpipe in practice); "other fire protection" charges attribute to alarm. So a building with 10 unresolved 10-year-old BF12s adds +100 raw sprinkler points to the score, then the sprinkler cap subtracts 70 as excess — the building still scores higher than a building with just 2 recent BF12s, but the evidence is only counted once at the mechanism level.
Why do open violations persist? FDNY can issue citations and levy fines but cannot physically force a building to upgrade its systems. Penalties are often modest relative to the cost of compliance (a $1,500 fine vs. a $200,000 sprinkler upgrade). Many violations result from default judgments where the respondent never appeared. In our scored buildings, 61% of open fire-protection violations are 5+ years old, and 37% are 10+ years old. This is structural non-compliance, not recent oversights.
Garages with EV chargers concentrate vehicles that may be actively charging at high state of charge, which increases thermal runaway severity. DC fast chargers put more thermal stress on batteries than Level 2.
| Weighted Ports | Points | Calculation |
|---|---|---|
| 20+ | 15 | Weighted ports = L2 count + (DC fast count × 3) |
| 4-19 | 10 | |
| 1-3 | 5 | |
| None | 0 |
Existing chargers only. v2.0 only counts AFDC stations with status_code='E' (existing/operational) toward the EV bonus. AFDC "planned" stations (registered with AFDC but not yet energized) don't contribute to the score — there's no thermal stress from a charger that isn't live. Planned stations and DOB-filed-but-not-AFDC-listed installs are surfaced separately as a pending EV install flag (see Data Sources below), not baked into the score.
Why is charger presence a bonus, not a requirement? Roughly 56% of documented EV battery fires occur while the vehicle is parked and not charging. Any garage where EVs park is at risk — chargers just increase the concentration and add charging-related thermal stress.
Two forward-looking signals are surfaced on the map as a Pending EV install filter and popup badge, but not added to the Fire Risk Index:
status_code='P' (planned). Operator has told AFDC a charger is coming but it's not yet live.The two signals are largely disjoint — only one BBL overlaps. Together they flag ~110 parking structures in the pipeline of rollout, catching both the "operator registered early" and "permit filed quietly, AFDC hasn't caught up" patterns. See also the DOB ECB and DOB NOW Electrical deep links in each popup for drilling into the underlying records.
The foundation of the analysis. PLUTO contains building-level data for all ~870,000 NYC properties including building class, year built, number of floors, building area, basement type, and — critical to v1 — garagearea (sqft of dedicated parking space within a building).
garagearea ≥ 1,000. See Why garagearea, not just G-class.bsmtcode field (1=full basement, 2=partial basement) combined with OpenStreetMap parking=underground tagsUsed in v1 for address-to-BBL resolution of AFDC chargers. Geosearch is a free, keyless API maintained by the NYC Department of City Planning's Planning Labs team, wrapping the Property Address Directory (PAD) — the authoritative NYC dataset for mapping every address, including aliases, to its BBL.
Used in v1 as fallback for chargers whose address doesn't resolve via Geosearch. Exposes tax lot polygons (not just centroids) so we can do true point-in-polygon queries.
Historical building permit records. We query for sprinkler permits (permit_subtype='SP') to determine fire suppression history.
Newer permit system (2021+). Queried separately because it uses different field formats (BBL as a single field, ISO dates).
work_type='Sprinklers' or job_description LIKE '%SPRINKLER%'Legacy BIS DOB violations dataset. In v1.3+ we narrowed this to active LL26/2004 retrofit-mandate records only (sprinkler, emergency power, photoluminescent exit signs). The broader keyword filter (IMEGNCY/UB/COMPBLD) was dropped — it caught only ~400 buildings on a taxonomy dominated by administrative follow-up records, and the real hazard signal moved to the DOB ECB and DOB NOW sources below.
DOB violations adjudicated at OATH/ECB, with the full violation description text and hazard class (Class 1 / Class 2) we need for keyword classification. This is the main source of DOB-side signal for the Fire Risk Index.
ecb_violation_status='ACTIVE' AND certification_status in {"NO COMPLIANCE RECORDED", "CERTIFICATE DISAPPROVED", "REINSPECTION SHOWS STILL IN VIOLATION", "CERTIFICATE PENDING", null}) Class 1 / Hazardous and fire-relevant Class 2Post-2021 DOB violations with structured device_type metadata. Drives the LL126 parking-structure signal and the fire-system device signals (sprinkler / emergency power / photoluminescent / structurally compromised).
FDNY violations are adjudicated through the Office of Administrative Trials and Hearings (OATH). The actual violation records (~926,000 total) live in the OATH ECB Hearings dataset — the FDNY-named datasets on NYC Open Data contain fewer than 50 records.
issuing_agency='FIRE DEPARTMENT OF NYC'compliance_status distinguishes open ("Compliance Due" / "Both Due") from resolved ("All Terms Met") violations. Only open violations contribute to the score.Why OATH and not FDNY directly? FDNY publishes two named datasets on NYC Open Data (ktas-47y7 and avgm-ztsb) but they contain fewer than 50 records combined. The actual FDNY violation universe flows through the OATH hearings process and is only accessible in bulk via the OATH dataset. FDNY annual inspection data (as distinct from violation data) is not available as open data — it's maintained internally by FDNY and accessible only through FOIL requests or the FDNY Business Portal (per-building lookup, not bulk).
US Department of Energy database of EV charger locations.
/v1/nearest.json endpoint with 15 center points across NYC at 8-mile radius each, to ensure full geographic coveragefacility_type. v1.x filtered to PAY_GARAGE / PARKING_GARAGE only, which dropped Tesla Superchargers at mall locations (classified as RETAIL/MALL/OTHER) and any station with null facility_type. Now pulls access=public,private and status=E,P (existing + planned) and lets the spatial matching cascade decide which stations actually sit on a parking BBL.has_chargers=True.Limitation: AFDC is voluntary — operators self-register. Even with the v2.0 widening, our count remains a lower bound. Some garages with installed chargers (tenant-only, fleet, older installs) may not be in the federal database even as private entries. See the charger source audit for the 2×2 breakdown of AFDC presence × DOB permit paper trail across the has_chargers=True set.
Used in v2.0 to detect recent EV-charger electrical-permit activity at buildings that don't yet appear in AFDC as existing chargers. Drives the Pending EV install flag and a deep-link in each popup.
job_description field — keyword filtering isn't possible there, so older installs aren't in this signal.Community-edited map data. Queried via Overpass API for parking facilities tagged as parking=underground or parking=multi-storey within the NYC bounding box.
Connecting AFDC charger stations to specific NYC tax lots (BBLs) is the hardest data problem in this project. AFDC gives us the charger's coordinates plus its street address, but doesn't identify the building it's in. PLUTO tells us about buildings but not chargers. We need a reliable method to link them.
Pre-v1 used a simple nearest-centroid approach: for each charger, find the PLUTO tax lot whose centroid is closest and call that the charger's building. This failed for two common cases:
v1 replaces that with a cascade of matching methods, in priority order:
We query NYC Planning Labs Geosearch with the charger's street address from AFDC. Geosearch is backed by the NYC Property Address Directory (PAD), which maps every address-and-alias in the city to its BBL. PAD handles the common NYC quirk that one BBL can have multiple addresses on different street frontages — which PLUTO doesn't expose.
Example: an AFDC charger at "377 E 33rd St" (the NYU Langone Garage H). PAD knows that address is an alias for BBL 1009390028, which is the luxury apartment tower whose primary PLUTO address is 347 E 33 Street. PLUTO alone has no record of "377 E 33rd" — PAD does.
We bias the query with the charger's own lat/lon (focus.point) and skip results whose returned coordinates are more than 1,000 ft from the charger, so fuzzy text matches like "251 New Jersey Avenue" don't get returned when we asked for "251 Avenue C."
When the AFDC address doesn't resolve cleanly (typographical errors, stale address strings, facility renamings), we fall back to geometry. The NYC ArcGIS MapPLUTO REST endpoint exposes every tax lot's actual polygon. We query with the charger's lat/lon and ask which polygon contains it. If the point is inside a polygon, we have an unambiguous match.
Points that are outside all polygons (curbside AFDC markers in the street) still usually have a building within a sidewalk's width. We use shapely to compute the distance from the charger to each nearby polygon edge and take the closest within 20 ft (approximately one sidewalk). More than 20 ft means the charger isn't adjacent to any building — usually a data error.
If all three steps fail, the charger is shown on the map as a "floating" dot with its AFDC street address label but no building association and no scoring effect. This is rare (typically 1 out of 264 chargers) and almost always due to AFDC data errors — e.g., a street address and a latitude/longitude that disagree with each other.
Match results are cached in charger_bbl_map.json between runs so we don't re-query external APIs unless the cache is cleared.
Every NYC tax lot where either (a) the PLUTO building class starts with G (dedicated parking/automotive use) or (b) PLUTO reports garagearea ≥ 1,000 sqft regardless of class. Approximate v1 counts:
| Category | Approx. count | Source |
|---|---|---|
| Standalone parking garages (G1/GU/GW) | 1,650 | PLUTO building class |
| Multi-story G0 residential garages | <50 | PLUTO class + numfloors > 1 |
| Under-residential (apartments, condos) | ~3,000 | PLUTO class D/C/R/A/B + garagearea ≥ 1,000 |
| Under-commercial (offices, retail, stores w/ apts) | ~780 | PLUTO class O/K/S + garagearea ≥ 1,000 |
| Institutional (hospitals, religious, schools) | ~145 | PLUTO class H/I/M + garagearea ≥ 1,000 |
| Other (warehouses, utilities, mixed) | ~630 | Other PLUTO classes + garagearea ≥ 1,000 |
| Total scored | ~6,350 | Slight increase over v1.x (~6,200) because the broadened AFDC fetch surfaced ~190 additional BBLs with real charger matches that weren't in the original garagearea-filtered set. |
Buildings with garagearea between 1,000 and 2,500 sqft (roughly 3-7 cars) are tagged with a small_garage flag. The scoring formula applies uniformly to them, but the flag exists so filtering and interpretation can distinguish small ground-floor parking from full multi-car garage operations.
garagearea field appears to exclude residential attached garages (class A), so the 1,000 sqft threshold naturally excludes them even without explicit filtering.garagearea for these (Hudson River piers historically had vehicle/warehouse space) but they are not parking garages in any meaningful sense for this analysis. Managed by Port Authority, Hudson River Park Trust, etc. with their own fire safety programs.garagearea in these is typically vehicle maintenance space, not public/commercial parking.We combine two sources — DOB sprinkler permits and FDNY fire-protection violations — to infer whether a building has a sprinkler system. Neither source directly confirms current system status:
For buildings where a legal mandate (LL26 or LL16) specifically required sprinklers and neither data source shows evidence, we flag the building and apply a higher penalty. For all other buildings with no evidence, we apply a moderate penalty that reflects genuine uncertainty. Bulk data cannot confirm system specifications (GPM/SF) — that requires DOB engineering drawings obtainable through record requests (~$8/page) or FOIL.
Buildings that get inspected more frequently (high-rise commercial, places of assembly, hospitals) will have more FDNY violations recorded than buildings that are rarely inspected (smaller residential, some commercial). A building with zero FDNY violations may be genuinely compliant — or may simply never have been inspected. The FDNY compliance factor scores only when violations ARE present; absence is treated as neutral, not positive.
NFPA distinguishes between enclosed parking garages and "open parking structures" (multi-story with adequate ventilation through open sides). These have different sprinkler requirements. We cannot reliably distinguish them from PLUTO data — we exclude surface parking lots (G6/G7) but cannot differentiate an enclosed multi-story from an open-sided one within the remaining set. This may cause some open parking structures to be scored higher than their actual risk profile warrants.
The garagearea field on PLUTO is populated during Department of Finance assessment and reflects what the city has on file. Some ground-floor garages may be under-reported; some "garagearea" values may conflate parking with storage or service space. The 1,000 sqft threshold filters the most obvious noise (single-car residential) but the exact size of the captured set will shift quarterly as PLUTO updates.
Roughly 311 E-class (warehouse) and 86 F-class (factory) buildings in the scored set qualify via garagearea ≥ 1,000 sqft. In some cases these "garage areas" are truck loading docks or service-vehicle staging rather than passenger parking, which is a different fire-risk profile (different fleet composition, different maintenance regime, commercial-only access). The inclusion is intentional — our filter is owner-agnostic and class-permissive by design, and industrial buildings with significant enclosed vehicle space are legitimate fire-risk context — but users filtering by garage_type should know that "other" (the default category for non-residential, non-commercial, non-institutional) captures most of these.
The "View FDNY violations on NYC Open Data" and "View all active DOB ECB violations" popup links construct SoQL filters using BBL-derived borough/block/lot fields. The OATH Hearings dataset stores ~3% of violation_location_lot_no values without leading zeros (e.g. lot 42 as "42" rather than "0042"), so the FDNY link uses an IN clause covering both padded and unpadded forms. For low-lot-number pre-war Manhattan buildings especially, the older unpadded convention persists.
PLUTO basement codes + OSM identify approximately 200 underground garages. The true number in Manhattan alone is likely much higher — virtually every large residential or office building built since the 1960s has below-grade parking. The INRIX parking API has a "Subterranean" classification for 350K+ facilities globally but requires enterprise licensing.
AFDC is voluntary and self-reported. Our ~264 NYC garage stations likely undercount the true number. Smaller operators and recently installed chargers may not be registered.
The v1 PAD-plus-geometry cascade resolves almost every AFDC charger to the correct BBL, but rare cases remain where AFDC's street address and coordinate disagree with each other — one or both is wrong. Those chargers appear as unmatched "floating" dots on the map with no building association.
A high score means a building has risk factors — it does not mean the building is unsafe or will have a fire. Only a licensed engineer can assess structural integrity, and only an on-site fire safety inspection can determine actual suppression capability. The 57 Ann Street collapse investigation took two years to determine the actual cause.
A building with extensive DOB records will have more data points to score against. Absence of violations may mean a clean record or may mean the building hasn't been inspected recently.
This project began as an investigation into whether heavier EVs were stressing old parking structures. The engineering evidence says no: even a worst-case scenario with every spot filled with a 9,063 lb GMC Hummer EV produces only ~38.7 psf — still under the 40 psf IBC design minimum (Pankow Foundation, 2024). The weight concern was amplified by the April 2023 Ann Street garage collapse, where officials initially blamed vehicle weight. The actual cause (revealed two years later) was unauthorized removal of a load-bearing masonry pier.
EV battery fires differ fundamentally from gasoline fires: they burn at ~5,000°F vs ~1,500°F, last 60-90+ minutes vs ~30 minutes, can reignite days later, and produce toxic hydrogen fluoride gas. Roughly 56% of documented EV battery fires occur while the vehicle is parked. The primary causes at rest are manufacturing defects in battery cells (torn anode tabs, folded separators, metal particle contamination) that can lie dormant for months before triggering thermal runaway.
After the Incheon fire, South Korea mandated retroactive sprinkler upgrades in existing garages, battery chemistry disclosure, state-of-charge limits for underground parking, and mandatory fire liability insurance. The US has none of these. NFPA actively voted to remove EV charging provisions from NFPA 30A in 2024. Meanwhile, NYC Local Law 55 (2024) requires 20% of commercial parking spaces to be EV-ready — with no fire safety conditions attached. More chargers in old garages, no sprinkler upgrades required.
Sprinklers can contain an EV fire but cannot extinguish it. However, there is a window for earlier intervention: lithium-ion cells emit hydrogen gas during the early stages of thermal runaway, 16-26 minutes before flames (Energy Material Advances). A single venting cell produces over 1,000 ppm of hydrogen outside the battery pack — roughly 1,000x the indoor background level of ~1 ppm — easily detectable with existing sensor technology.
This is not theoretical. China mandates thermal runaway warning systems in EV battery packs (using the vehicle's onboard BMS). NFPA 855 (2026 edition) requires hydrogen detection for stationary energy storage systems — the shipping-container-scale battery banks at solar farms and data centers. Commercial products exist for this: Li-ion Tamer (now Honeywell) detects thermal runaway off-gassing for battery rooms, and H2Scan's HY-GUARD is designed specifically for battery room safety.
But this technology has not been applied to parking garages or residential battery storage. No US fire code requires gas detection in parking structures. No building code addresses thermal runaway detection in e-bike storage rooms. The same chemistry that NFPA considers dangerous enough to require hydrogen monitoring in a grid battery installation receives zero detection requirements when it's in a vehicle parked in a basement or a bike stored in an apartment.
This project is not anti-EV. EVs catch fire 20-60x less frequently than gasoline vehicles. The problem is not the technology — it's that our fire safety infrastructure hasn't caught up to the reality that lithium-ion batteries are now everywhere, in vehicles of every size.
Nowhere is this clearer than with e-bikes. NYC recorded 279 e-bike battery fires in 2024, with 18 deaths in 2023. FDNY officials consistently identify uncertified batteries in fire investigations — "Many times, I'd look at the battery and see there was no certification on it" (John Orlando, former FDNY Lithium-Ion Battery Task Force). No fire from a genuinely UL 2271/2849 certified battery has been documented in public records.
NYC is addressing the root cause through practical legislation: Local Law 39 (2023) requires UL certification for all e-bike batteries sold in the city, and battery exchange programs are replacing uncertified batteries with certified ones. This is evidence-based policy addressing the actual problem.
But many NYC buildings have responded with blanket bans on all e-bikes and lithium batteries in common areas — regardless of certification status. This creates a paradox: a UL-certified 500 Wh e-bike battery is banned from a building's bike room, while 119 NYC garages are hosting EV chargers (50,000-100,000 Wh batteries) with no evidence of fire suppression maintenance.
The argument for detection is not that it makes bad batteries safe — it doesn't, and uncertified batteries need to be removed from circulation. The argument is that certified batteries + hydrogen detection creates a safety profile that makes blanket bans unnecessary. An e-bike battery is 150x smaller than an EV battery. With early detection providing minutes of warning, a 500 Wh battery event in a monitored space is survivable and manageable. A 500 Wh battery event with zero warning while someone is sleeping is how people die. The technology to bridge that gap exists, is proven, and is already required in other contexts. It just hasn't been applied here yet.
Pankow Foundation. "Safe and Sustainable Parking Garage Live Loads in the Age of the Electric Vehicle." Report RGA-05-24, 2024. Link
Springer / Fire Technology. "Full-Scale Fire Testing to Assess the Risk of Battery Electric Vehicle Fires in Underground Car Parks." Vol. 61, pp. 4133-4163, 2025. Link
NFPA. "Parking Garages and EVs." July 2024. Link
EV FireSafe. "EV Battery Fire Data." Global incident database, updated continuously. Link
ICCT. "Clearing the Air: EVs Could Bring Lower Fire Risk." October 2024. Link
MDPI / Fire. "Risk Assessment of Toxic Gas Dispersion from Electric Vehicle Fires in Underground Apartment Parking Garages Using Numerical Analysis." Vol. 8, Issue 3, 2025. Link
Wen, Y.K. and Yeo, G.L. "Design Live Loads for Passenger Cars Parking Garages." ASCE Journal of Structural Engineering, Vol. 127, No. 3, 2001.
Gothamist. "Deadly Manhattan parking garage collapse tied to unsafe demolition, structural neglect, city report finds." April 28, 2025. Link
Fortune. "Exploding Mercedes-Benz EV prompts parking garage bans in South Korea." August 7, 2024. Link
NFSA. "Fire Protection for Parking Garages." April 2024. Link
SF Fire Department. "Sprinkler Protection Requirements for Parking Spaces Associated with Electric Vehicle Charging Stations." Information Sheet 429. Link
NYC Local Law 55 (2024). EV charging infrastructure requirements for commercial parking. Analysis
Energy Material Advances. "A Critical Review of Thermal Runaway Prediction and Early-Warning Methods for Lithium-Ion Batteries." Gas signals provide 16-26 minutes of advance warning. Link
Journal of Energy Storage. "Hydrogen gas diffusion behavior and detector installation optimization of lithium ion battery energy-storage cabin." H2 detector warned 145 seconds before thermal runaway; 1,493 ppm H2 measured outside pack. Link
NFPA 855, 2026 Edition. Standard for the Installation of Stationary Energy Storage Systems. Mandates combustible gas detection including hydrogen. Analysis
NFPA Journal. "Lithium-Ion Battery Fire Learnings from FDNY." August 2025. Link
FDNY Commissioner Robert S. Tucker. Statements on uncertified lithium-ion batteries. October 2024. Link
CPSC. Warning on Rad Power Bikes batteries (non-UL-certified). 2026. Link
NYC Local Law 39 (2023). UL certification requirements for e-bike batteries. Link
UK Office for Product Safety and Standards. "Fires in E-bikes and E-scooters 2024." 45% from aftermarket conversion kits, 20% from factory-built. Link
NYC DOT. E-Bike Trade-In Program. 2025. Link
Last updated: April 2026. Data snapshot reflects NYC Open Data as of query date. Source code and data on GitHub.