# LL97 Fine Estimator - NYC Buildings Over Their Carbon Cap (`that_red_bird/ll97-building-penalty-estimator`) Actor

Which NYC buildings owe the biggest Local Law 97 fines? Reads LL84 benchmarking data, applies the DOB emissions factors and limits, and ranks buildings by estimated fine for 2024-29 and 2030-34 at $268/tCO2e. An estimate, not legal advice.

- **URL**: https://apify.com/that_red_bird/ll97-building-penalty-estimator.md
- **Developed by:** [mohamed alaya](https://apify.com/that_red_bird) (community)
- **Categories:** Business, Lead generation, Other
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 building scoreds

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## LL97 Fine Estimator - NYC Buildings Over Their Carbon Cap

Ranks NYC buildings by their estimated Local Law 97 carbon fine for 2024-2029 and 2030-2034, using each building's own LL84 benchmarking energy data, the Department of Buildings emissions limits by property type, and the $268 per tonne CO2e penalty.
For retrofit contractors, ESCOs, energy consultants, lenders and brokers who want a sales or diligence list of buildings with the biggest exposure. **An estimate for screening, not legal or compliance advice.**

### Example inputs

**1. Default: top 50 buildings by estimated 2030-2034 fine**

```json
{}
```

**2. Manhattan offices and hotels over the cap by at least $100k a year**

```json
{ "boroughs": ["Manhattan"], "propertyTypes": ["Office", "Hotel"], "minFineUsd": 100000, "maxBuildings": 200 }
```

**3. Look up specific tax lots (also shows buildings with no fine)**

```json
{ "bbls": ["1008350041", "1013070001"], "sortBy": "fine2024" }
```

### Input guide

| Field | What it does |
|---|---|
| `reportYear` | LL84 year to read (2024 latest). Future years assume the same energy use. |
| `maxBuildings`, `sortBy` | How many to return and whether to rank on the 2024-29 or 2030-34 fine. |
| `onlyOverLimit`, `minFineUsd`, `minGfaSqft` | Filters. Covered buildings are over 25,000 sq ft. |
| `boroughs`, `propertyTypes`, `bbls` | Narrow the list; `bbls` overrides the over-the-cap filter. |
| `includeSuspectData` | Keep filings with implausible energy use (default off, they are usually unit errors). |
| `finePerTonneUsd` | Penalty rate, $268 in the rule. |

### Output

| Field | Meaning |
|---|---|
| `rank`, `propertyName`, `address`, `borough`, `bbl`, `parentProperty` | Which building |
| `primaryPropertyType`, `ruleCategories`, `gfaSqft` | LL84 uses mapped to the rule's property types |
| `emissionsTco2e2024`, `limitTco2e2024`, `fineUsd2024_2029` | Estimated annual emissions, cap and fine for 2024-2029 |
| `emissionsTco2e2030`, `limitTco2e2030`, `fineUsd2030_2034` | Same for 2030-2034 (electricity factor drops to 0.000145) |
| `ll84TotalGhgTco2e`, `siteEuiKbtuSqft`, `energyStarScore` | Cross-checks |
| `confidence`, `notes` | high / medium / low and why |

Sample row (trimmed): `{"rank":2,"propertyName":"Co-Op City","borough":"Bronx","gfaSqft":22042704,"emissionsTco2e2030":132327.6,"limitTco2e2030":67748.8,"fineUsd2030_2034":17307108,"confidence":"medium"}`

### Model and assumptions

- Emissions = LL84 energy use of the report year x LL97 coefficients: electricity 0.000288962 tCO2e/kWh (2024-29) and 0.000145 (2030-34); natural gas 0.00005311 per kBtu; fuel oil No. 2 0.00007421, No. 4 0.00007529; district steam 0.00004493 then 0.0000432; other fuels from 1 RCNY 103-14. Fuel oil No. 5/6 is billed at the No. 4 factor (the rule lists none).
- Limit = sum of floor area x the per-property-type emissions factor in 1 RCNY 103-14 (60 ESPM types, 2024-29 and 2030-34 tables, transcribed from the DOB rule PDF).
- Fine = max(0, emissions - limit) x $268, per year. Energy use is held constant through each period.
- Not modelled: RECs and offsets, time-of-use electricity option, good-faith / mitigated penalties, rent-regulated housing (35%+ units) which follows a prescriptive path with no fine, the 2024-25 option to use the older occupancy-group limits, deductions, and anything after 2034. Houses of worship are exempt and shown with a zero fine. Filings with energy use above 600 kBtu/sq ft (1,500 for labs and data centers) are treated as data errors and excluded by default.

### FAQ

**Source?** NYC Open Data, "NYC Building Energy and Water Data Disclosure for Local Law 84", DOB. Self-reported by owners, so errors exist.
**Why do some buildings have medium or low confidence?** A use type is mapped to the nearest rule category, or part of the floor area has no rule category.
**Is the real fine this number?** The real bill depends on the owner's actual filed emissions, the property types the owner's design professional selects, and deductions. Use this to rank and prioritise, not to quote.

### Limits

LL84 data lags a year. No energy data in LL84 for non-reporters (skipped). Estimates only.

### Price

`building-scored` $0.003 per building returned. Example: the default 50 buildings = $0.15; a 500-building list = $1.50.

# Actor input Schema

## `reportYear` (type: `string`):

Which year of NYC LL84 benchmarking data to read (calendar year of the energy use). Emissions are held constant for every future compliance year.

## `maxBuildings` (type: `integer`):

How many buildings to output after ranking. Each one is billed as one building-scored event.

## `sortBy` (type: `string`):

Rank buildings by estimated annual fine in the 2030-2034 period (the big one) or in 2024-2029.

## `onlyOverLimit` (type: `boolean`):

Skip buildings whose estimated emissions are under the limit in both periods. Turn off to see everything, including buildings with zero fine.

## `minFineUsd` (type: `integer`):

Skip buildings whose larger estimated annual fine (either period) is below this amount.

## `minGfaSqft` (type: `integer`):

Skip buildings smaller than this. LL97 covers buildings over 25,000 sq ft.

## `boroughs` (type: `array`):

Limit to these boroughs: Manhattan, Bronx, Brooklyn, Queens, Staten Island. Leave empty for all five. Borough comes from the first digit of the tax lot (BBL) number.

## `propertyTypes` (type: `array`):

Only buildings whose largest use contains one of these words, for example \["Office","Hotel"]. Leave empty for all types.

## `bbls` (type: `array`):

Look up only these 10-digit BBL numbers (borough, block, lot). Overrides the over-the-cap filter so you also see buildings with no fine.

## `finePerTonneUsd` (type: `integer`):

Penalty rate per tonne over the limit. The rule in force (1 RCNY 103-14) sets $268.

## `includeSuspectData` (type: `boolean`):

LL84 is self-reported and some filings have unit errors (energy use per sq ft far above any real building). They are excluded by default because they would top every ranking. Turn on to keep them, marked confidence low.

## Actor input object example

```json
{
  "reportYear": "2024",
  "maxBuildings": 50,
  "sortBy": "fine2030",
  "onlyOverLimit": true,
  "minFineUsd": 0,
  "minGfaSqft": 25000,
  "boroughs": [],
  "propertyTypes": [],
  "bbls": [],
  "finePerTonneUsd": 268,
  "includeSuspectData": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `downloadCsv` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `count` (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 = {
    "reportYear": "2024",
    "maxBuildings": 50,
    "sortBy": "fine2030",
    "onlyOverLimit": true,
    "minFineUsd": 0,
    "minGfaSqft": 25000,
    "boroughs": [],
    "propertyTypes": [],
    "bbls": [],
    "finePerTonneUsd": 268,
    "includeSuspectData": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("that_red_bird/ll97-building-penalty-estimator").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 = {
    "reportYear": "2024",
    "maxBuildings": 50,
    "sortBy": "fine2030",
    "onlyOverLimit": True,
    "minFineUsd": 0,
    "minGfaSqft": 25000,
    "boroughs": [],
    "propertyTypes": [],
    "bbls": [],
    "finePerTonneUsd": 268,
    "includeSuspectData": False,
}

# Run the Actor and wait for it to finish
run = client.actor("that_red_bird/ll97-building-penalty-estimator").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "reportYear": "2024",
  "maxBuildings": 50,
  "sortBy": "fine2030",
  "onlyOverLimit": true,
  "minFineUsd": 0,
  "minGfaSqft": 25000,
  "boroughs": [],
  "propertyTypes": [],
  "bbls": [],
  "finePerTonneUsd": 268,
  "includeSuspectData": false
}' |
apify call that_red_bird/ll97-building-penalty-estimator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,that_red_bird/ll97-building-penalty-estimator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fcEqVeBpSXobe0IZ7/builds/Q6booufjQdaJQ64DE/openapi.json
