WFWorkflo All work

Build note · Sold Nearby

Prices for a place that publishes none

Sold Nearby shows what actually sold on a block. In the five boroughs that is a solved problem, because the city publishes every deed. Then I pointed it at Long Island and the data simply was not there.

August 2026 · Open the app

The premise is small enough to explain in a sentence: click a block, see what sold near it, with the price, the date, the square footage and what that works out to per foot. A seller asking "what is my house worth" is really asking "what did the neighbours get", and that number is public record.

For New York City it genuinely is. The Department of Finance publishes property sales through the city's open data portal, one row per transaction, with the address and the consideration on it. Fetch, filter by proximity, draw. That part took an afternoon.

01 The wall

Long Island should have been the same job with a different endpoint. Nassau and Suffolk are two of the densest residential markets in the state, so I expected the state portal to carry what the city portal carries.

It does not. New York State publishes no individual sale prices for those counties at all. Not behind a key, not in a slower format, not as a quarterly dump. The transactions happen, they are recorded at the county level, and they do not reach the open data I could reach. An agent on the North Shore can pull comps from the MLS because they pay for a seat. A homeowner cannot.

So the honest options were to tell every Long Island visitor that this half of the map does not work, or to find another route to the same number.

02 The assessment roll

What the state does publish, for every parcel, is the assessment roll: what each town's assessor thinks a property is worth for tax purposes. That is not a sale price, and treating it as one would be wrong in a way that matters when someone is deciding what to list at.

Some towns file a full market value, which is close to the question being asked. Many file an assessed value instead, which is a fraction of market value, and the fraction is different in every town and changes yearly. An assessed value of $180,000 might mean a $180,000 house or a $900,000 house depending entirely on which town line it sits inside.

03 The ratio nobody looks at

The unlock is a table almost nobody outside a tax grievance office reads. New York State publishes, per municipality per year, the Residential Assessment Ratio: the median ratio of assessment to actual sale price, measured from the sales the state can see.

The whole trick

The state cannot tell me what your neighbour's house sold for. But it does tell me, officially, that in your town assessments run at a known percentage of sale price. Divide one by the other and you have the state's own method for turning an assessment back into a market value, applied per parcel.

// residential assessment ratios, published per municipality per year
const url = RATIOS + '?' + new URLSearchParams({
  $select: 'swis_code,residential_assessment_ratio',
  $where:  'rate_year = 2025 AND residential_assessment_ratio > 0',
});

// an assessed value, divided by its town's own published ratio
const rar = ratioFor(r.swis);
if (rar) { r.price = r.av / (rar / 100); r.estimated = true; }

That estimated flag is not decoration. It follows the number all the way to the screen, where the row reads "from the assessment" instead of showing a price as though a deed backed it. A derived figure that looks identical to a recorded one is the part that would make this tool dishonest.

04 Two smaller traps

The ratio table and the parcel table disagree about villages

Parcels are keyed by SWIS code, a six-digit municipal identifier. A parcel inside a village gets the village's own code; a parcel outside one carries the town's code, which ends in 89 on the parcel layer but appears as 00 in the ratio table. Match them literally and every unincorporated parcel in both counties silently finds no ratio and shows no price.

function ratioFor(swis) {
  return ratios.bySwis.get(swis)
      || ratios.bySwis.get(swis.slice(0, 4) + '00')   // fall back to the town
      || 0;
}

Nassau is missing from the parcel geometry entirely

The state's polygon parcel layer, the one with property outlines in it, leaves Nassau County out. The centroid layer carries all of it. That is the difference between "this county does not work" and "this county draws as points instead of shapes", and I lost an evening to it before checking the second layer.

05 What it cost

Roughly a hundred lines, one extra dataset, and a fallback in a lookup. The result is that a homeowner in Massapequa gets an answer to the same question a homeowner in Queens gets, from public data, without an MLS seat.

The lesson I keep from it: when a dataset appears to be missing, it is worth one more hour to ask what the publisher does release and whether the number you want can be reconstructed from it. The state did not publish the answer, but it published its own method for deriving the answer, which is nearly as good and considerably better than a blank map.

06 What this does not do