NYC Property Sales Scraper — Rolling Sales Records avatar

NYC Property Sales Scraper — Rolling Sales Records

Pricing

from $1.60 / 1,000 nyc property sale records

Go to Apify Store
NYC Property Sales Scraper — Rolling Sales 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

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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
}
InputDefaultNotes
boroughmanhattanmanhattan, bronx, brooklyn, queens, staten-island or all
neighborhoodemptyPart of the DOF neighborhood name, for example UPPER WEST SIDE
addressContainsemptyPart of the street address, for example PARK AVENUE
zipCodeemptyOne exact five-digit ZIP code, for example 11201
buildingClassCategoryemptyPart of the DOF category, for example CONDO or ONE FAMILY
saleDateFrom / saleDateToemptyInclusive YYYY-MM-DD bounds
minSalePrice / maxSalePriceemptyInclusive USD bounds
includeZeroDollarSalesfalseInclude USD 0 transfers, which are usually not market sales. A minimum price overrides this
sortBynewestnewest, oldest, price-high or price-low
maxResults1001–10,000 records per run
maxRequestRetries20–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?

FieldWhat it means
saleIdStable ID built from borough, block, lot, date, price and address, used for deduplication
borough / boroughCodeBorough name and DOF code (1 Manhattan to 5 Staten Island)
neighborhood / address / apartmentNumber / zipCodeLocation as recorded by DOF
salePrice / currency / saleDateRecorded price in USD and sale date
buildingClassCategoryFor example 13 CONDOS - ELEVATOR APARTMENTS or 01 ONE FAMILY DWELLINGS
buildingClassAtPresent / buildingClassAtTimeOfSaleTwo-character building class codes such as R4
taxClassAtPresent / taxClassAtTimeOfSaleNYC property tax class
block / lot / easementBorough tax-lot identifiers
residentialUnits / commercialUnits / totalUnitsUnit counts when recorded
landSquareFeet / grossSquareFeet / yearBuiltSize and age when recorded (often empty for condo units)
sourceDataset / sourceUrl / fetchedAtDataset 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 os
from apify_client import ApifyClient
client = 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)FREEBRONZESILVERGOLD, PLATINUM, DIAMOND
NYC property sale record0.0020010.001950.00190.0016
Actor start, per started GB of allocated memory0.0062510.0060940.0059380.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.

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