NYC Property Valuation - Assessment & 5-Year Value Trail
Pricing
from $0.06 / 1,000 nyc property records
NYC Property Valuation - Assessment & 5-Year Value Trail
New York City property assessment records (public open data, 11.7M rows, 2023-2027): every parcel's owner and address, its value through five assessment stages, and the year-over-year movement in market and assessed value.
Pricing
from $0.06 / 1,000 nyc property records
Rating
0.0
(0)
Developer
Wenhao Yang
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Every property in New York City, its owner, its classification and its full five-year value trail - all on one exact parcel id.
The New York City Department of Finance assesses roughly 1.17 million parcels every year and publishes the result as an open dataset. That dataset is a five-year stack: 11.7 million records covering the 2023 through 2027 rolls (the rolls are published ahead of the year they cover), about 2.34 million records each. A parcel is one row per roll, and its identity - the PARID, which is the borough-block-lot number the city uses everywhere - is exact, so the same property lines up across all five years without a name match.
That is what makes the movement real rather than inferred: a market value stepping up, an assessment holding while the market rises, a tax class changing.
Low cost
From $0.0001 per record, down to $0.00006 at Gold Pay-per-event: you are charged per record delivered, and nothing for the query.
What you get
| Block | Fields |
|---|---|
| Identity | PARID, borough (code and name), block, lot, easement, section/volume, roll section, assessment period |
| Owner & address | owner, house number (low and high), street name, ZIP, borough-block-lot (bbl joined for you), zoning, community board |
| Classification | building class, building and lot dimensions, corner flag, land area, number of buildings, year built and its two alterations, co-op and unit counts, condo number and suffixes |
| Values | five assessment stages, each with eleven figures - see below |
| Protest & appeal | protest 1 / 2 / prior, attorney group 1 / 2 / prior, appointment date and the appointed lot |
| Floor area | eleven areas by building use: gross, hotel, office, residential, retail, loft, factory, warehouse, storage, garage, other |
| Derived | composed address, borough name, BBL, and on a parcel trail the year-over-year market and assessed movement |
Five assessment stages, on every record
This is the part a plain "property value" dataset does not have. Each record carries the value at every stage of the assessment process:
| Stage | Prefix | What it records |
|---|---|---|
| Prior year | py | last year's roll, as the baseline |
| Tentative | ten | the roll as first published |
| Current base | cbn | the current base assessment |
| Final | fin | the finalized assessment |
| Current | cur | the roll in force |
Each stage carries eleven figures: market land, market total, assessed land, assessed total, assessed-with-exemption total, transitional land, transitional total, transitional-with-exemption total, taxable total, taxable-with-exemption total, and the tax class for that stage. So a record shows not just what a property is worth but how its assessment moved from the prior year through to final - the assessment pipeline itself, not a snapshot of it.
The five-year value trail
Ask for one parcel and you get every roll it appears on, oldest first, with the movement between consecutive rolls computed on the city's own parcel id:
{ "mode": "parcel", "parid": "1000010010" }
2023 GOVERNORS ISLAND CORPORATION market 327,275,0002024 GOVERNORS ISLAND CORPORATION market 337,093,000 +9,818,000 +3.0%2025 GOVERNORS ISLAND CORPORATION market 347,205,990 +10,112,990 +3.0%2026 GOVERNORS ISLAND CORPORATION market 357,622,000 +10,416,010 +3.0%2027 GOVERNORS ISLAND CORPORATION market 355,619,560 -2,002,440 -0.6%
An area's movement without shipping a parcel
mode=trend returns one row per roll year for whatever scope you filter to - parcel count, summed market value and summed taxable value - so you get a borough's five-year series without pulling a single parcel:
{ "mode": "trend", "boro": "3" }
2023 354,754 parcels market 455,535,516,2852024 356,996 parcels market 489,980,424,388 +7.6%2025 359,033 parcels market 492,928,832,164 +0.6%2026 361,145 parcels market 520,387,566,126 +5.6%2027 362,745 parcels market 555,310,479,782 +6.7%
Owners
The owner is on every record, and it is the same field a title or lien search keys on - so ownerName finds every parcel a given owner holds across the five boroughs, and mode=parcel then follows any one of them through the years.
Modes
rows(default) - parcels matching your filters, from the newest roll.parcel- one parcel's full five-year trail with the movement computed between rolls. Takesparid.trend- per-roll-year totals for a scope: parcel count and summed market and taxable value, one row per year.aggregate- one count row per group, rolled up by borough, building class, ZIP, tax class, roll section or year.
Inputs
Filter by year (2023-2027, defaults to the newest), period, boro (1-5), parid, ownerName, address, zipCode, bldgClass, zoning, rollSection, block, lot, and value bounds minMarketValue / maxMarketValue / minTaxableValue / maxTaxableValue.
A filter that belongs to another mode is rejected outright rather than silently ignored - so a query you narrowed never comes back unnarrowed.
Example inputs
Every parcel owned by a given owner
{ "mode": "rows", "ownerName": "GOVERNORS ISLAND", "maxResults": 500 }
One parcel's five-year value trail
{ "mode": "parcel", "parid": "1000010010" }
Brooklyn's five-year movement
{ "mode": "trend", "boro": "3" }
Manhattan parcels valued over $10M
{ "mode": "rows", "boro": "1", "minMarketValue": 10000000,"maxResults": 500 }
How many parcels by building class
{ "mode": "aggregate", "groupBy": "bldgClass", "boro": "4" }
Notes on the data
paridalone is not unique within a year - the roll is per assessment period. Each parcel appears once forperiod1 and once forperiod3, and the two rows are not duplicates: about 80% of the columns match, but thecurrentBaseandfinalvalue groups are zero at period 1 and carry the real figures at period 3 - the assessment simply is not final yet. The default path pins period 3, the finalized roll (measured on the 2025 roll: 1,169,614 rows against 1,169,614 distinct PARIDs, so the key is exact there). Setperiodexplicitly to 1 if you want the earlier, still-moving figures.- The rolls publish ahead of the year they cover, so the newest roll year is the coming year rather than the last one.
yeardefaults to whichever is newest, never to a hardcoded year. - A value of 0 is meaningful and common - it is how the city records a parcel that is fully exempt at that stage. It is returned as
0, not blanked. maxResultsis capped at one page of 20,000 records. A larger request is served one page - the run logs a warning saying it was capped, so a short result is never mistaken for the whole set. Narrow the filters to page through a larger scope.- The first query of a run can be slow and the rest fast. This dataset's value differs enormously warm and cold: a query pinned to a year and period measured ~15s cold and ~0.6s warm. That is the source's own cache, not the actor; the default path is built around it.
- Within one pinned roll and period, PARID is exact - one row per parcel, verified at 1,169,614 rows against 1,169,614 PARIDs on the 2025 finalized roll. The extra rows in a raw count come from the assessment periods, not from parcels appearing twice.
Output
One JSON record per parcel row, and the same key set whichever mode produced it - so the output loads into a table or a dataframe without a schema union step. Aggregate and trend records carry their group key, count and dimension in the same shape as a parcel record.
Pay-per-event - you are charged per record delivered, never for the query itself. The run stops cleanly if you set a spend limit on your Apify account.