# NYC Building Report: Violations, Permits & Compliance (`eriksharon10/nyc-building-report`) Actor

One NYC address in, one due-diligence report out: DOB/HPD violations, ECB penalties owed, complaints, permits, plus facade (FISP), boiler, elevator, LL97/LL84 safety violations and energy benchmarking, with risk flags and a 0-100 score.

- **URL**: https://apify.com/eriksharon10/nyc-building-report.md
- **Developed by:** [Erik Sharon](https://apify.com/eriksharon10) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 building reports

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

## NYC Building Report: Violations, Permits & Compliance

Type an NYC address and get one clean due-diligence report for the building: open DOB violations, ECB/OATH penalties still owed, HPD housing violations by class, DOB and HPD complaints, every DOB permit (old BIS and DOB NOW), lot facts from PLUTO, plain-English **risk flags** and a **0-100 risk score**.

New in 1.1: a **building-systems compliance** section: facade inspection (FISP / Local Law 11) status, every boiler's last inspection and defects, the elevator and escalator register, open DOB safety-program violations (elevators, boilers, facades, gas piping LL152, benchmarking LL84, energy grade LL33, retro-commissioning LL87, emissions LL97) and the latest LL84 energy benchmarking (ENERGY STAR score, site EUI, greenhouse gas emissions).

It replaces more than a dozen separate lookups across the BIS website, DOB NOW, HPD Online and NYC Open Data with one row per building.

### Who it is for

- **Contractors and expediters**: check a property before you bid. Open work-without-permit violations, vacate orders or unpaid ECB penalties change the job.
- **Real estate investors, brokers and lenders**: screen a list of addresses for problem buildings before you spend time on them.
- **Tenants and tenant organizers**: see open Class C (immediately hazardous) and rent-impairing HPD violations at a glance.
- **Property managers and insurers**: monitor a portfolio. Run it on a schedule and compare the counts.

### Input

| Field | What to enter |
|---|---|
| `addresses` | One per line: a street address with borough (`1520 Sedgwick Ave, Bronx`), a 10-digit BBL (`2028800017`) or a 7-digit BIN (`2009171`). |
| `historyYears` | How far back to count permits and HPD complaints (default 5). Open violations are always included, whatever their age. |
| `maxRecordsPerSection` | How many of the newest records to list in each section (default 25). Summary counts always cover everything. |
| `includeCompliance` | Facade, boiler, elevator, safety-program violations and energy benchmarking (default on). Turn off for a faster report. |
| `socrataAppToken` | Optional. Only needed for very large batches. |

```json
{
  "addresses": ["1520 Sedgwick Ave, Bronx", "97-30 57th Ave, Queens", "2028800017"],
  "historyYears": 5,
  "maxRecordsPerSection": 25
}
```

### Output (one item per address)

```json
{
  "address": "1520 SEDGWICK AVENUE, Bronx, NY, USA",
  "bbl": "2028800017",
  "bin": "2009171",
  "borough": "Bronx",
  "lot": { "yearBuilt": 1969, "floors": 18, "residentialUnits": 101, "buildingClass": "D3", "zoning": "R7-1" },
  "riskLevel": "high",
  "riskScore": 100,
  "flags": [
    "Unpaid ECB/OATH penalties: $3,962.00",
    "71 open HPD Class C (immediately hazardous) violation(s)",
    "Rent-impairing HPD violation(s) open",
    "Open DOB violation mentions a VACATE order",
    "63 HPD complaints in the last 12 months",
    "Facade (FISP cycle 10) is UNSAFE",
    "Boiler inspection found defects",
    "11 open DOB safety-program violation(s): Elevators 6, Retro-Commissioning - LL87 2, Facades 2, Benchmarking - LL84 1"
  ],
  "summary": {
    "openDobViolations": 11,
    "openHazardousDobViolations": 0,
    "openWorkWithoutPermitViolations": 0,
    "openEcbViolations": 0,
    "ecbBalanceDue": 3962.0,
    "openDobComplaints": 1,
    "openHpdViolations": 121,
    "openHpdViolationsByClass": { "A": 17, "B": 33, "C": 71, "I": 0 },
    "hpdComplaintsLast12Months": 63,
    "activePermits": 0,
    "permitsIssuedInWindow": 18,
    "lastPermitIssued": "2026-10-05"
  },
  "openDobViolations": [ { "number": "V072126CSR0501RF", "issued": "2026-07-21", "type": "C-CONSTRUCTION", "description": "PARTIAL VACATE ORDER: ..." } ],
  "openEcbViolations": [],
  "openHpdViolations": [ { "class": "C", "inspected": "2026-09-30", "apartment": "7F", "description": "..." } ],
  "recentHpdComplaints": [ ... ],
  "recentDobComplaints": [ ... ],
  "compliance": {
    "facade": { "cycle": "10", "status": "UNSAFE", "filed": "2026-07-17", "priorCycleStatus": "UNSAFE", "engineerBusiness": "FALCON ENGINEERING CO. LLC", "cycles": [ ... ] },
    "boilers": [ { "boilerId": "20000064671Y0001", "lastInspection": "2026-08-24", "defects": true, "pressure": "Low Pressure" } ],
    "elevators": { "activeDevices": 2, "byType": { "Elevator": 2 } },
    "openSafetyViolations": 11,
    "openSafetyViolationsByProgram": { "Elevators": 6, "Retro-Commissioning - LL87": 2, "Facades": 2, "Benchmarking - LL84": 1 },
    "openSafetyViolationList": [ ... ],
    "energy": { "reportYear": "2024", "primaryUse": "Multifamily Housing", "energyStarScore": 6, "siteEuiKbtuPerSqft": 138.0, "totalGhgMetricTons": 1048.81, "ghgIntensityKgPerSqft": 8.75 }
  },
  "recentPermits": [ { "system": "DOB NOW", "workType": "General Construction", "issued": "2026-10-05", "contractorBusiness": "...", "contractorLicense": "..." } ],
  "sources": { "dobViolations": "https://data.cityofnewyork.us/d/3h2n-5cm9", "...": "..." }
}
```

The **Overview** tab in the dataset shows one row per building with the risk level, flags and counts. Export to CSV, Excel or JSON, or call it from the API, Make, Zapier or n8n.

### How the risk score works

Points for each open hazardous DOB violation (15), work-without-permit violation (10), HPD Class C (6), Class B (2) and Class A (1) violation, other open DOB violations (2), open ECB violations (3), open DOB complaints (3), unpaid ECB penalties (1 per $1,000, up to 20) and HPD complaints in the last 12 months (1 each, up to 20). Compliance adds: UNSAFE facade (15), no facade report filed (5), facade repairs due / SWARMP (2), boiler defects (3), boilers with no inspection in 2 years (3), open safety-program violations (1.5 each, up to 15) and an open LL97 emissions violation (5). Capped at 100. Low below 12, medium 12-39, high 40 and up. It is a screening aid, not a legal opinion: read the records it lists.

### Pricing

Pay per result: you are charged only for buildings that were found. Addresses that cannot be matched are returned with an `error` and are free. A report takes about 8-15 seconds with compliance on.

### Data sources

All official, public NYC data, read through the NYC Open Data (Socrata) API and NYC Planning GeoSearch. No login, no scraping of city websites.

- DOB Violations (3h2n-5cm9), DOB ECB Violations (6bgk-3dad), DOB Complaints Received (eabe-havv)
- DOB Permit Issuance (ipu4-2q9a) and DOB NOW: Build Approved Permits (rbx6-tga4)
- HPD Housing Maintenance Code Violations (wvxf-dwi5) and Complaints and Problems (ygpa-z7cr)
- DOB NOW Safety: Facades Compliance Filings (xubg-57si), Boiler inspections (52dp-yji6), Elevator device register (e5aq-a4j2), DOB Safety Violations (855j-jady)
- LL84 Energy and Water Data Disclosure, 2023 to present (5zyy-y8am)
- MapPLUTO (64uk-42ks) and BUILDING footprints (5zhs-2jue) for lot facts and BBL/BIN matching

The city updates these datasets daily; a record can take a day or two to appear. Energy figures are the owner's self-reported LL84 benchmarking, not an official LL97 compliance determination. Privacy: the report never outputs owners', respondents', engineers' or boiler inspectors' personal names or phone numbers, only the business names and license numbers DOB publishes for licensed work.

### FAQ

**Can I run hundreds of addresses?** Yes. Put them all in `addresses`. For thousands, add a free NYC Open Data app token.

**Does it cover Local Law 11 / FISP, LL97 and boiler compliance?** Yes: see the `compliance` section. Facade status comes from the latest FISP cycle filing; LL97 shows up as open "GHG Emissions - LL97" safety violations plus the LL84 emissions numbers.

**Why is a count zero when BIS shows records?** Some very old records were never loaded into NYC Open Data. Each report links to the BIS property profile (`sources.bisProfile`) for a manual check.

**Something looks wrong?** Open an issue on the Issues tab with the address and what you expected; fixes usually ship within a day.

# Actor input Schema

## `addresses` (type: `array`):

One per line. A street address with borough ("1520 Sedgwick Ave, Bronx"), a 10-digit BBL ("2028800017") or a 7-digit BIN ("2009171"). One report per entry.

## `historyYears` (type: `integer`):

How far back to count permits and HPD complaints. Open violations are always included regardless of age.

## `maxRecordsPerSection` (type: `integer`):

Most recent records to include in each list (open violations, complaints, permits). Counts in the summary always cover everything.

## `includeCompliance` (type: `boolean`):

Facade (FISP), boilers, elevators, DOB safety-program violations (LL152, LL84, LL33, LL87, LL97) and LL84 energy benchmarking. Turn off for a faster report.

## `socrataAppToken` (type: `string`):

Only for very large batches: a free token from data.cityofnewyork.us raises the rate limit.

## Actor input object example

```json
{
  "addresses": [
    "1520 Sedgwick Ave, Bronx",
    "97-30 57th Ave, Queens"
  ],
  "historyYears": 5,
  "maxRecordsPerSection": 25,
  "includeCompliance": true
}
```

# Actor output Schema

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

One report per address: violations, ECB penalties, complaints, permits, risk flags and a 0-100 risk score.

# 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 = {
    "addresses": [
        "1520 Sedgwick Ave, Bronx",
        "97-30 57th Ave, Queens"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("eriksharon10/nyc-building-report").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 = { "addresses": [
        "1520 Sedgwick Ave, Bronx",
        "97-30 57th Ave, Queens",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("eriksharon10/nyc-building-report").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 '{
  "addresses": [
    "1520 Sedgwick Ave, Bronx",
    "97-30 57th Ave, Queens"
  ]
}' |
apify call eriksharon10/nyc-building-report --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,eriksharon10/nyc-building-report"
        }
    }
}
```

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/A7aqJo607m48gi6BT/builds/oFfFXrxuY29pkXHNw/openapi.json
