NYC Property Sales Scraper — Rolling Sales Records
Pricing
from $1.60 / 1,000 nyc property sale records
NYC Property Sales Scraper — Rolling Sales Records
Export NYC property sales records from the official rolling sales file. Filter by borough, ZIP, neighborhood, price and date. About USD 2 per 1,000 sales.
Pricing
from $1.60 / 1,000 nyc property sale records
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
NYC Property Sales Scraper exports New York City property sales records from the NYC Department of Finance rolling sales dataset and returns each sale's address, unit, ZIP code, borough, neighborhood, sale price, sale date, building class, units, square footage, year built, block and lot. It is built for comparable-sales research, appraisers, brokers, investors and data teams, and costs about USD 2.00 per 1,000 sales on the FREE tier (USD 0.002001 each) plus a USD 0.006251 start fee per run.
It reads the official NYC Open Data copy of the rolling sales file. It does not return active listings or owner names.
What are NYC rolling sales?
The rolling sales file is the Department of Finance's list of recorded property sales in the five boroughs over roughly the last 12 months, refreshed monthly. When checked on 2026-10-26 it covered sales dated 2025-10-01 to 2026-09-30, including 15,312 Manhattan sales above USD 0. This Actor filters that file and returns clean, typed records.
How do I get NYC property sales records for a neighborhood or ZIP code?
Pick a borough and add any filters. All text filters ignore case and match part of the value, except ZIP code, which is exact.
{"borough": "brooklyn","buildingClassCategory": "CONDO","minSalePrice": 500000,"maxSalePrice": 2000000,"saleDateFrom": "2026-06-01","sortBy": "newest","maxResults": 250}
| Input | Default | Notes |
|---|---|---|
borough | manhattan | manhattan, bronx, brooklyn, queens, staten-island or all |
neighborhood | empty | Part of the DOF neighborhood name, for example UPPER WEST SIDE |
addressContains | empty | Part of the street address, for example PARK AVENUE |
zipCode | empty | One exact five-digit ZIP code, for example 11201 |
buildingClassCategory | empty | Part of the DOF category, for example CONDO or ONE FAMILY |
saleDateFrom / saleDateTo | empty | Inclusive YYYY-MM-DD bounds |
minSalePrice / maxSalePrice | empty | Inclusive USD bounds |
includeZeroDollarSales | false | Include USD 0 transfers, which are usually not market sales. A minimum price overrides this |
sortBy | newest | newest, oldest, price-high or price-low |
maxResults | 100 | 1–10,000 records per run |
maxRequestRetries | 2 | 0–5 retries for rate limits, server errors and timeouts |
An empty input runs the default: the 100 newest Manhattan sales above USD 0. A date range that ends before it starts, or a minimum price above the maximum, is rejected before any request.
What data does NYC Property Sales Scraper return?
| Field | What it means |
|---|---|
saleId | Stable ID built from borough, block, lot, date, price and address, used for deduplication |
borough / boroughCode | Borough name and DOF code (1 Manhattan to 5 Staten Island) |
neighborhood / address / apartmentNumber / zipCode | Location as recorded by DOF |
salePrice / currency / saleDate | Recorded price in USD and sale date |
buildingClassCategory | For example 13 CONDOS - ELEVATOR APARTMENTS or 01 ONE FAMILY DWELLINGS |
buildingClassAtPresent / buildingClassAtTimeOfSale | Two-character building class codes such as R4 |
taxClassAtPresent / taxClassAtTimeOfSale | NYC property tax class |
block / lot / easement | Borough tax-lot identifiers |
residentialUnits / commercialUnits / totalUnits | Unit counts when recorded |
landSquareFeet / grossSquareFeet / yearBuilt | Size and age when recorded (often empty for condo units) |
sourceDataset / sourceUrl / fetchedAt | Dataset name, NYC Open Data page and UTC time |
Missing values are null, never guessed. The SUMMARY record gives the outcome (data, partial, empty, rejected or failed), records delivered, total matches, requests and warnings.
When should you use it, and when not?
Use it to:
- pull recent comparable sales for a building, street, ZIP code or neighborhood;
- track sale prices by building class or price band across a borough;
- load a clean year of NYC transactions into a spreadsheet, BI tool or model.
Do not use it for:
- homes currently for sale or rent: use StreetEasy Scraper;
- deeds, mortgages or owner names, which this file does not contain;
- sales older than the rolling 12 months, or radius searches around a point;
- New Jersey parcels: use NJ Property Tax Records.
How do I run it from code?
Call the Actor with the id muhammadafzal/nyc-property-sales-scraper.
JavaScript (apify-client):
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('muhammadafzal/nyc-property-sales-scraper').call({borough: 'queens',zipCode: '11101',maxResults: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map((i) => [i.saleDate, i.address, i.salePrice]));
Python (apify-client):
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("muhammadafzal/nyc-property-sales-scraper").call(run_input={"borough": "manhattan", "neighborhood": "UPPER WEST SIDE", "sortBy": "price-high", "maxResults": 25},)for item in client.dataset(run.default_dataset_id).iterate_items():print(item["saleDate"], item["address"], item["salePrice"], item["buildingClassCategory"])
Use it from an AI assistant
NYC Property Sales Scraper works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add https://mcp.apify.com/?tools=muhammadafzal/nyc-property-sales-scraper as a server, then ask, for example: "List the 20 most expensive condo sales in ZIP 10011 in the last six months, with price and sale date." The agent sees the input schema and the price per record before it runs.
What does the output look like?
The two newest Manhattan sales when checked on 2026-10-26:
[{"saleId": "1-441-1203-2026-09-30-1692000-425-east-13th-street-c-c","borough": "Manhattan","boroughCode": 1,"neighborhood": "EAST VILLAGE","buildingClassCategory": "13 CONDOS - ELEVATOR APARTMENTS","taxClassAtPresent": "2","block": "441","lot": 1203,"easement": null,"buildingClassAtPresent": "R4","address": "425 EAST 13TH STREET, C","apartmentNumber": "C","zipCode": "10009","residentialUnits": 1,"commercialUnits": null,"totalUnits": 1,"landSquareFeet": null,"grossSquareFeet": null,"yearBuilt": 2007,"taxClassAtTimeOfSale": 2,"buildingClassAtTimeOfSale": "R4","salePrice": 1692000,"currency": "USD","saleDate": "2026-09-30","sourceDataset": "NYC Citywide Rolling Calendar Sales","sourceUrl": "https://data.cityofnewyork.us/d/usep-8jbt","fetchedAt": "2026-10-26T14:35:00.000Z"},{"saleId": "1-41-1021-2026-09-30-1390000-50-pine-street-12n-12n","borough": "Manhattan","neighborhood": "FINANCIAL","address": "50 PINE STREET, 12N","zipCode": "10005","yearBuilt": 1902,"salePrice": 1390000,"saleDate": "2026-09-30"}]
The second item is truncated; every record carries the full field set.
How much do NYC property sales records cost? Pricing
You pay per sale record returned plus a start fee. Apify platform usage is included. A search with no match pays only the start fee.
| Event (USD) | FREE | BRONZE | SILVER | GOLD, PLATINUM, DIAMOND |
|---|---|---|---|---|
| NYC property sale record | 0.002001 | 0.00195 | 0.0019 | 0.0016 |
| Actor start, per started GB of allocated memory | 0.006251 | 0.006094 | 0.005938 | 0.005 |
The default memory is 256 MB, so each run has one start event.
- Default 100 sales, FREE tier: USD 0.006251 + 100 × 0.002001 = about USD 0.21.
- 10,000 sales, GOLD tier: USD 0.005 + 10,000 × 0.0016 = about USD 16.01.
The Actor checks your run's spending cap before each record and stops cleanly when the next one would exceed it. Note: the start status line and SUMMARY.estimatedResultCostUsd still use an older figure of USD 0.0005 per record; your actual charge follows the table above.
FAQ
Is this official NYC Department of Finance data?
Yes. It is the Department of Finance rolling sales file as published on NYC Open Data. The Actor only filters and normalizes it.
How far back do the sales go?
About 12 months. On 2026-10-26 the earliest sale date was 2025-10-01. For older years, use the Department of Finance's annual sales files.
Why are some prices USD 0?
USD 0 records are usually transfers between family members or entities, not market sales. They are excluded unless you enable includeZeroDollarSales.
Can I get every sale in all five boroughs?
Yes. Set borough to all and maxResults up to 10,000 per run; split by date range for more.
Does it include buyer or seller names?
No. The rolling sales file has no party names. Deed parties are in the city's ACRIS records, which this Actor does not read.
How often is the data updated?
The city refreshes the file monthly. Each run reads the current copy.
Related Actors
- StreetEasy Scraper — NYC Sale & Rental Listings: current NYC listings with asking prices.
- NJ Property Tax Records: New Jersey assessed values, taxes and last sale by block and lot.
- County Property Records API: owner, tax and appraisal records from supported counties.
- Chicago Building Violations Scraper: official Chicago code violations by address.
- UK Planning Applications Search: planning records from UK councils.
Legal and compliance note
The rolling sales file is public NYC Open Data. Follow the NYC Open Data terms of use when you store or share it. The output is not an appraisal or legal record. The Actor uses the city's public API without bypassing access controls and is not affiliated with the City of New York.
Last verified: 2026-10-26