NYC Property Tax Abatements - BBL & Program Detail
Pricing
from $0.03 / 1,000 nyc property abatement records
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
Maintained by CommunityActor 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 idcondoId- condo billing number where the record belongs to a condotaxYear,period- the tax year and the filing period codeprogram- the abatement program code: across the corpusJ51,421G,ICAP,SOLAR,CONDO,COOP,MCI,CERP,BBP,GCCA,ICIP,CONED,GRNRF. The newest snapshot carries 11 of these - no421Gand noICIPrecords; those appear in older snapshots only.programSubcode,applicationStatus- the program sub-code and the source application statusabatementAmount- the applied abatement in USD for that recordeligibleAbatement,installCost,netTaxes,assessedValue- the other money columns lifted out of the detailtenant- 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=profilealso: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=truereads 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
bblplustaxYearplusprogramto 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.
tccodeis the abatement program, not a tax class - the source column name is misleading and we surface it asprogram.applicationStatusis 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.cyenddtis blank on every row of the newest snapshot (133,509),cybegdton 133,089 of them (99.7%) andtcsubcodeon 65,307 (49%); they are passed through unchanged.periodhas a single value (2Q) across the newest snapshot, so theperiodfilter andgroupBy=periodare no-ops at the default scope; useincludeHistoryto 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=historyevery row carriesmode="history"and its ownsourceUpdatedAt(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 backplutoMatched=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 byboroughorbblfor a specific property. PLUTO covers ~858,284 lots and is refreshed on its own schedule. sourceUpdatedAtis 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.
Related
Also available in this account: NYC Property Valuation & Assessment (tax-lot assessed and market values) and NYC HPD Violations (housing-code violations by building).