NYC Property Tax Abatements - BBL & Program Detail avatar

NYC Property Tax Abatements - BBL & Program Detail

Pricing

from $0.03 / 1,000 nyc property abatement records

Go to Apify Store
NYC Property Tax Abatements - BBL & Program Detail

NYC Property Tax Abatements - BBL & Program Detail

New York City property tax abatement detail (3.25M rows): BBL, condo, tax year, program (J51, 421G, ICAP, SOLAR, CONDO, COOP, MCI), application status, abated amounts and all 101 published columns. Filter by BBL, borough, year or program; aggregate counts and dollar sums; join PLUTO.

Pricing

from $0.03 / 1,000 nyc property abatement records

Rating

0.0

(0)

Developer

Wenhao Yang

Wenhao Yang

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

NYC Property Tax Abatements

New York City property tax abatement detail from the Department of Finance - every published abatement application record for a tax lot: the BBL, condo number, tax year, abatement program, application status, the abated amounts and the assessed-value inputs behind them.

Low cost

Abatement records: from $0.00005 per record, down to $0.00003 at Gold.

What you get

  • bbl, borough, boroughName, block, lot - the 10-digit Borough-Block-Lot key, derived from the source parcel id
  • condoId - condo billing number where the record belongs to a condo
  • taxYear, period - the tax year and the filing period code
  • program - the abatement program code: across the corpus J51, 421G, ICAP, SOLAR, CONDO, COOP, MCI, CERP, BBP, GCCA, ICIP, CONED, GRNRF. The newest snapshot carries 11 of these - no 421G and no ICIP records; those appear in older snapshots only.
  • programSubcode, applicationStatus - the program sub-code and the source application status
  • abatementAmount - the applied abatement in USD for that record
  • eligibleAbatement, installCost, netTaxes, assessedValue - the other money columns lifted out of the detail
  • tenant - the tenant named on commercial/lease records (published on 508 of the 133,509 newest-snapshot rows; a tenant search usually returns little)
  • extractDate - the snapshot date this record was published in
  • All 101 published detail columns are kept with their source names (yrbegdt, yrenddt, leasearea, no_years, bldgsqft, partpct, commpct, baseyrvalu, abt_pct1, remain_tax, mcicost, ...), so nothing in the source is dropped
  • In mode=profile also: plutoMatched, ownerName, plutoAddress, yearBuilt, residentialUnits, plutoAssessedTotal, plutoBuildingClass, plutoZip

Examples

The 50 largest abatements in the newest snapshot:

{ "mode": "rows", "maxResults": 50 }

One property by BBL:

{ "bbl": "4004200001" }

The newest snapshot that covers a tax year:

{ "taxYear": "2026", "maxResults": 200 }

J-51 records, biggest first:

{ "program": "J51", "maxResults": 200 }

Rows above a dollar threshold:

{ "taxYear": "2026", "minAbatement": 100000, "maxResults": 500 }

One historical snapshot by its extract date:

{ "extractDate": "2026-02-20", "maxResults": 200 }

Every snapshot ever published (see the warning below before using this):

{ "includeHistory": true, "maxResults": 200 }

One property's abatement history across every snapshot - a year-by-year curve, newest extract first:

{ "mode": "history", "bbl": "1009991001", "maxResults": 100 }

In mode=history each record appears once per snapshot it was published in, so the same case can show up in several extracts; every row is metered. Use mode=rows for a single snapshot.

Abatement dollars by program:

{ "mode": "aggregate", "groupBy": "program", "metric": "abatementAmount" }

Records by program:

{ "mode": "aggregate", "groupBy": "program" }

Abatement rows enriched with the PLUTO owner profile (owner, address, year built, residential units, building class) by exact BBL:

{ "mode": "profile", "taxYear": "2026", "maxResults": 100 }

Coverage and honest limits

  • 🔴 The city appends a snapshot to this dataset every cycle and never removes the old ones. At build time there are 23 snapshots (2020-06-26 through 2026-08-15), which is why the raw table holds 3,246,890 rows. The default scope is the newest snapshot alone: 133,509 records covering tax year 2027, on 119,259 distinct BBLs.
  • 🔴 includeHistory=true reads all 23 snapshots. The same tax record then appears once per snapshot, so record counts and dollar sums multiply - use it only to compare snapshots, never to measure how much abatement exists.
  • In the newest snapshot the applied-abatement column totals $1,577,253,604. By program: ICAP $686.2M (5,857 records) / COOP $518.1M (5,850) / CONDO $204.8M (64,842) / SOLAR $72.8M (27,525) / J51 $31.2M (27,825) / BBP $26.9M (876) / CERP $9.6M (339) / MCI $7.8M (222) / GCCA $3.0M (169) / CONED $16.8M (3) / GRNRF $5,600 (1).
  • One row is an abatement record, not a property and not a dollar owed to you. A single property can appear on several rows in the same tax year (one per application sequence / lease / sub-record). Use bbl plus taxYear plus program to see the set.
  • 🔴 This dataset covers property tax abatements only. Exemption-only programs (STAR, veterans, senior citizen, clergy and similar) are published separately by the city and are not in this corpus.
  • tccode is the abatement program, not a tax class - the source column name is misleading and we surface it as program.
  • applicationStatus is a source code (A, D, K, P, PR, ...) and is blank on 64,845 of the 133,509 newest-snapshot rows; blank means the source published no status, not that the abatement failed. A (approved) covers 67,868.
  • cyenddt is blank on every row of the newest snapshot (133,509), cybegdt on 133,089 of them (99.7%) and tcsubcode on 65,307 (49%); they are passed through unchanged.
  • period has a single value (2Q) across the newest snapshot, so the period filter and groupBy=period are no-ops at the default scope; use includeHistory to compare periods across snapshots.
  • Money fields are decimal strings in the output (as the source publishes them), so arithmetic in a consumer must parse them first.
  • In mode=history every row carries mode="history" and its own sourceUpdatedAt (the snapshot the row came from).
  • In mode=profile, PLUTO is joined on the exact 10-digit BBL. PLUTO lists tax lots, not every abatement record, so condo billing lots and special parcels can come back plutoMatched=false; the abatement row itself is still complete. Most rows do match (measured 43 of the first 50 and 160 of the first 200); the exceptions are condo/coop billing lots and special parcels that PLUTO does not list. Filter by borough or bbl for a specific property. PLUTO covers ~858,284 lots and is refreshed on its own schedule.
  • sourceUpdatedAt is the snapshot date the record came from. The dataset's own refresh stamp is not used because it moves even when the underlying extract does not.

Also available in this account: NYC Property Valuation & Assessment (tax-lot assessed and market values) and NYC HPD Violations (housing-code violations by building).