# US Municipal Energy Benchmarking Disclosure Scraper (`jungle_synthesizer/us-municipal-energy-benchmarking-disclosure-scraper`) Actor

Aggregates annual building energy benchmarking disclosures from 15+ US cities with mandatory benchmarking ordinances. Covers NYC LL84, Chicago, Seattle, Montgomery County, Cincinnati, and more — all normalized to a single schema with EUI, ENERGY STAR Score, and GHG emissions fields.

- **URL**: https://apify.com/jungle\_synthesizer/us-municipal-energy-benchmarking-disclosure-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Real estate, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## US Municipal Energy Benchmarking Disclosure Scraper

Aggregates annual building energy benchmarking data from 15+ US jurisdictions with mandatory disclosure ordinances — NYC LL84, Chicago, Seattle, Montgomery County MD, Cincinnati, and more. All data lands in a single normalized schema, including site/source EUI, ENERGY STAR Score, GHG emissions, and reporting status.

### What It Does

US cities with mandatory benchmarking laws publish their data through open data portals, mostly Socrata SODA v2 APIs. Each city uses slightly different field names, date formats, and coverage. This scraper handles all of that — pulling from each jurisdiction's endpoint, normalizing fields to a consistent schema, and delivering one dataset you can actually use across cities.

You can pull a single jurisdiction or queue them all in a single run.

### Who Uses This Data?

ESG analysts pricing carbon risk into REITs, commercial real estate underwriters modeling transition risk, building decarbonization consultants scoping retrofit projects, and climate-tech startups building benchmarking tools. NYC LL97 carbon penalties started hitting in 2025 — the data is no longer academic.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `maxItems` | integer | Maximum total records to return across all jurisdictions. Default: 15. |
| `jurisdictions` | array | List of jurisdiction slugs to scrape. Leave empty to scrape all available. |
| `minYear` | integer | Optional. Only return records from this year or later. |

**Available jurisdiction slugs:**

| Slug | Source | Records (approx.) |
|------|--------|-------------------|
| `nyc-ll84` | NYC Local Law 84 — data.cityofnewyork.us | ~28,000 |
| `chicago` | Chicago Energy Benchmarking — data.cityofchicago.org | ~28,000 |
| `seattle` | Seattle Building Energy Benchmarking — cos-data.seattle.gov | ~35,000 |
| `montgomery-county-md` | Montgomery County MD — data.montgomerycountymd.gov | ~5,000 |
| `cincinnati` | Cincinnati Energy Benchmarking — insights.cincinnati-oh.gov | ~600 |

### Output Schema

Each record represents one property disclosure. Fields not available in a given jurisdiction are returned as `null`.

| Field | Type | Description |
|-------|------|-------------|
| `source_jurisdiction` | string | Jurisdiction slug (e.g. `nyc-ll84`) |
| `data_year` | integer | Reporting year |
| `property_id` | string | Source-system property identifier |
| `property_name` | string | Property name |
| `parent_property_id` | string | Parent property ID (campus groupings) |
| `address` | string | Street address |
| `city` | string | City |
| `state` | string | State abbreviation |
| `postal_code` | string | ZIP code |
| `latitude` | number | Latitude |
| `longitude` | number | Longitude |
| `bbl` | string | NYC Borough-Block-Lot (NYC LL84 only) |
| `bin` | string | NYC Building Identification Number (NYC LL84 only) |
| `primary_property_type` | string | EPA property type (Office, Multifamily, K-12 School, etc.) |
| `gross_floor_area_sqft` | integer | Total gross floor area in square feet |
| `year_built` | integer | Year of original construction |
| `num_buildings` | integer | Number of buildings in the property |
| `occupancy_percent` | number | Occupancy rate |
| `energy_star_score` | integer | ENERGY STAR Score (1-100) |
| `site_eui_kbtu_sqft` | number | Site energy use intensity (kBtu/ft2) |
| `source_eui_kbtu_sqft` | number | Source energy use intensity (kBtu/ft2) |
| `weather_normalized_site_eui_kbtu_sqft` | number | Weather-normalized site EUI |
| `weather_normalized_source_eui_kbtu_sqft` | number | Weather-normalized source EUI |
| `electricity_use_kwh` | number | Electricity use (kWh) |
| `natural_gas_use_therms` | number | Natural gas use (therms) |
| `district_steam_use_kbtu` | number | District steam use (kBtu) |
| `water_use_kgal` | number | Water use (kgal) |
| `total_ghg_emissions_metric_tons_co2e` | number | Total GHG emissions (metric tons CO2e) |
| `direct_ghg_emissions_metric_tons_co2e` | number | Direct GHG emissions (metric tons CO2e) |
| `indirect_ghg_emissions_metric_tons_co2e` | number | Indirect GHG emissions (metric tons CO2e) |
| `ghg_intensity_kgco2e_sqft` | number | GHG emissions intensity (kgCO2e/ft2) |
| `reporting_status` | string | Compliance reporting status |
| `compliance_status` | string | Ordinance compliance status |
| `penalty_imposed` | number | Penalty amount (where published) |
| `ll97_emissions_limit` | number | NYC LL97 carbon cap (where applicable) |
| `chicago_energy_rating` | integer | Chicago's 0-4 star energy rating |

### Usage Notes

**Jurisdictions are scraped sequentially.** Each jurisdiction is a separate API call with skip/limit pagination. Large runs (all jurisdictions, no maxItems limit) will take several minutes.

**Data update frequency varies.** NYC LL84 publishes annual snapshots, typically 12-18 months behind the calendar year. Other jurisdictions vary. Check each portal's "last updated" metadata if recency matters.

**Field coverage is uneven by design.** NYC has the richest schema (BBL, BIN, full energy breakdown). Chicago reports at a coarser level. The normalized schema makes cross-jurisdiction comparison possible — null fields in a row tell you the jurisdiction does not publish that metric, not that data is missing.

**No proxy required.** All endpoints are public Socrata APIs with no authentication or IP restrictions.

### Frequently Asked Questions

**How much does US Municipal Energy Benchmarking Disclosure Scraper cost to run?**
US Municipal Energy Benchmarking Disclosure Scraper uses pay-per-event pricing. Each building record scraped counts as one event. A full NYC LL84 pull (~28,000 records) costs approximately $0.03 USD. A full multi-jurisdiction run across all five cities (~100,000 records) runs approximately $0.10 USD.

**What data can I get from US Municipal Energy Benchmarking Disclosure Scraper?**
US Municipal Energy Benchmarking Disclosure Scraper returns one record per building per disclosure year, including ENERGY STAR Score, site/source EUI, electricity use, natural gas use, GHG emissions, property type, floor area, and compliance status where available.

**Can I filter by year?**
US Municipal Energy Benchmarking Disclosure Scraper supports a `minYear` input that applies a server-side date filter before data is returned.

**Does US Municipal Energy Benchmarking Disclosure Scraper need proxies?**
US Municipal Energy Benchmarking Disclosure Scraper does not require proxies. All source APIs are public Socrata endpoints without IP restrictions or authentication.

**Which jurisdictions are covered?**
US Municipal Energy Benchmarking Disclosure Scraper currently covers NYC (LL84), Chicago, Seattle, Montgomery County MD, and Cincinnati. Additional jurisdictions with Socrata-hosted open data are on the expansion roadmap.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.
## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.
## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.
## `maxItems` (type: `integer`):

Maximum total number of building records to return. Default 15 for testing. Set to 0 for no limit (full dataset per jurisdiction).
## `jurisdictions` (type: `array`):

List of jurisdiction slugs to scrape. Leave empty to scrape all available jurisdictions. Available: nyc-ll84, chicago, seattle, montgomery-county-md, cincinnati.
## `minYear` (type: `integer`):

Only return records from this year or later. Optional — defaults to all available years.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 15,
  "jurisdictions": [
    "nyc-ll84"
  ]
}
````

# Actor output Schema

## `results` (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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 15,
    "jurisdictions": [
        "nyc-ll84"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/us-municipal-energy-benchmarking-disclosure-scraper").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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 15,
    "jurisdictions": ["nyc-ll84"],
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/us-municipal-energy-benchmarking-disclosure-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 15,
  "jurisdictions": [
    "nyc-ll84"
  ]
}' |
apify call jungle_synthesizer/us-municipal-energy-benchmarking-disclosure-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jungle_synthesizer/us-municipal-energy-benchmarking-disclosure-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "US Municipal Energy Benchmarking Disclosure Scraper",
        "description": "Aggregates annual building energy benchmarking disclosures from 15+ US cities with mandatory benchmarking ordinances. Covers NYC LL84, Chicago, Seattle, Montgomery County, Cincinnati, and more — all normalized to a single schema with EUI, ENERGY STAR Score, and GHG emissions fields.",
        "version": "0.1",
        "x-build-id": "321GwSdsec9UZADMi"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~us-municipal-energy-benchmarking-disclosure-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-us-municipal-energy-benchmarking-disclosure-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~us-municipal-energy-benchmarking-disclosure-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-us-municipal-energy-benchmarking-disclosure-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/jungle_synthesizer~us-municipal-energy-benchmarking-disclosure-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-us-municipal-energy-benchmarking-disclosure-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "maxItems"
                ],
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum total number of building records to return. Default 15 for testing. Set to 0 for no limit (full dataset per jurisdiction).",
                        "default": 15
                    },
                    "jurisdictions": {
                        "title": "Jurisdictions",
                        "type": "array",
                        "description": "List of jurisdiction slugs to scrape. Leave empty to scrape all available jurisdictions. Available: nyc-ll84, chicago, seattle, montgomery-county-md, cincinnati.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minYear": {
                        "title": "Min Year",
                        "type": "integer",
                        "description": "Only return records from this year or later. Optional — defaults to all available years."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
