NYC Property Data — 5-borough PLUTO pull
Sample deliverable
What was asked
Give a real-estate operator a concrete, current picture of the highest-value tax lots in New York City, broken out by borough. No enrichment vendors, no scraping tricks — only legal, no-auth public data that anyone can verify.
What the system did
The pipeline hit the NYC Open Data PLUTO dataset (data.cityofnewyork.us Socrata API — Primary Land Use Tax Lot Output, ~860,000 NYC tax lots). It pulled 1,300 records across five boroughs:
- Manhattan: top 500 by total assessed value
- Brooklyn / Queens / Bronx / Staten Island: top 200 each
For every lot it normalized 20 PLUTO columns — BBL (Borough-Block-Lot), address, zipcode, building class, land use, owner, lot and building area, year built, floor count, residential + total units, assessed land, assessed total, primary zoning district, lot dimensions, and latitude/longitude.
All 1,300 rows were then ingested into Postgres as scraped_products rows under marketplace='nyc_pluto' — the raw 20-column JSON rides in the raw_json JSONB column, so any PLUTO field is queryable:
SELECT raw_json->>'address', (raw_json->>'assesstot')::bigint AS usd
FROM scraped_products
WHERE marketplace = 'nyc_pluto'
AND category = 'Manhattan'
AND raw_json->>'bldgclass' LIKE 'O%'
ORDER BY usd DESC
LIMIT 20;
Headline numbers
- 1,300 tax lots across 5 boroughs
- $142.8B total assessed value
- 214,757 residential units represented
- Manhattan outweighs every other borough combined — $92.5B across the top 500 MN lots vs $50.3B across the other four boroughs’ top 200 each
- Queens has the highest average top-lot assessment at $277.7M — skewed by a single $8.5B outlier (likely LaGuardia / JFK airport land)
What a pilot engagement gets on top of this
This sample stops at the raw data + a written summary. A real retainer adds:
- Target-list filtering — e.g. “ground-floor commercial lots in Downtown Brooklyn built before 1950, owned by LLCs, zoned C6-1, with at least 8 floors” — all expressible against
raw_json+ the typed columns. - Owner contact enrichment — resolving LLC owner names to mailing addresses + principal contacts via separate public-record sources.
- Monthly refresh — scheduled pulls against PLUTO + diff reports when lots change hands or assessments shift.
- Slide/PDF export — the REPORT.md can render to PDF or Google Slides for client-facing decks.
Caveats
- PLUTO is updated on a ~quarterly cadence by NYC DCP. The “generated on” timestamp reflects the pull date, not the assessment effective date.
assesstotis the NYC Department of Finance’s assessed value for tax purposes — it is not market value. On commercial lots it tends to sit 30–60% below market.- Rows with a
$0assesstot (tax-exempt lots, some government property) are excluded from this pull — the$order=assesstot DESCsort pushes them to the end.
| bbl | address | borough | zipcode | bldgclass | landuse | ownername | lotarea | bldgarea | yearbuilt | numfloors | unitsres | unitstotal | assessland | assesstot | zonedist1 | lotfront | lotdepth | latitude | longitude |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1002710036.00000000 | MN | 10002 | R7-2 | 40.7128861 | -73.989582 | ||||||||||||||
| 1021050450.00000000 | MN | 40.8281693 | -73.9338699 | ||||||||||||||||
| 1019000001.00000000 | MN | R8 | 40.8173739 | -73.9673591 | |||||||||||||||
| 1016600035.00000000 | MN | 10029 | R7A | 40.7940307 | -73.9412059 | ||||||||||||||
| 1001760015.00000000 | MN | 10013 | C6-2A | 40.7177972 | -74.0071063 | ||||||||||||||
| 1008170036.00000000 | MN | 10011 | C6-2M | 40.7371541 | -73.9935067 | ||||||||||||||
| 1005850019.00000000 | MN | 10014 | R6 | 40.7321351 | -74.0058106 | ||||||||||||||
| 1005950060.00000000 | MN | 10013 | C6-2A | 40.7253358 | -74.0096022 | ||||||||||||||
| 1006060066.00000000 | MN | 10011 | C1-6 | 40.7351226 | -73.9987964 | ||||||||||||||
| 1002830052.00000000 | MN | 10002 | C6-2 | 40.7140788 | -73.9921745 | ||||||||||||||
| 1005500015.00000000 | MN | 10003 | R6 | 40.7315229 | -73.9958552 | ||||||||||||||
| 1021560044.00000000 | MN | 10033 | R7-2 | 40.8512273 | -73.9295965 | ||||||||||||||
| 1006060079.00000000 | MN | 10011 | R6 | 40.7350376 | -73.9993277 | ||||||||||||||
| 1000110028.00000000 | MN | 10004 | C5-5 | 40.7042146 | -74.0121438 | ||||||||||||||
| 1008820041.00000000 | MN | 10016 | R8B | 40.7412643 | -73.9820684 | ||||||||||||||
| 1016010040.00000000 | MN | 10026 | R7-2 | 40.8020827 | -73.9471955 | ||||||||||||||
| 1008910053.00000000 | MN | 10016 | R8B | 40.7470881 | -73.9779533 | ||||||||||||||
| 1012770068.00000000 | MN | 10017 | C5-3 | 40.7537257 | -73.979969 | ||||||||||||||
| 1003410030.00000000 | MN | 10002 | R8 | 40.7159222 | -73.9853909 | ||||||||||||||
| 1015830024.00000000 | MN | 10128 | R8B | 40.7754346 | -73.9450679 |
- REPORT.md 4.1 KB
- properties_mn.csv 74.5 KB
- properties_bk.csv 23.2 KB
- properties_bx.csv 26.6 KB
- properties_qn.csv 21.7 KB
- properties_si.csv 29.5 KB
- summary_mn.json 1.4 KB
- summary_bk.json 1.4 KB
- summary_bx.json 1.4 KB
- summary_qn.json 1.4 KB
- summary_si.json 1.4 KB
Full write-up: https://pub-4cc0fb90bf0345f9a637159679086a33.r2.dev/samples/2026-04-20/nyc-property/REPORT.md