# NYC ACRIS Deeds & Mortgages: Bulk Recordings with Parties (`jserle/nyc-acris-recordings-feed`) Actor

Bulk NYC property recordings from ACRIS on NYC Open Data: deeds, mortgages and 120+ other document types with recording date, amount and document id. Optional grantor/grantee and borrower/lender parties and block/lot joins. Filter by date, type, borough, amount or party name.

- **URL**: https://apify.com/jserle/nyc-acris-recordings-feed.md
- **Developed by:** [JS Tech Solutions](https://apify.com/jserle) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 recording records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## NYC ACRIS Deeds & Mortgages: Bulk Property Recordings with Parties

Pulls NYC property recordings in bulk from the Department of Finance's ACRIS datasets on NYC Open Data: deeds, mortgages and 120+ other document types, newest first, with recording date, document amount and document id. Add the parties (grantor and grantee, borrower and lender, with addresses) and the tax lots (borough, block, lot, BBL, street address) when you need them. Filter by date window, document type, borough, minimum amount or party name.

No login, no API key, no HTML scraping. Everything comes from the official Socrata API at data.cityofnewyork.us.

### Who uses this

- NYC real estate investors and wholesalers watching new deeds and mortgages by borough and amount.
- Title and lien researchers who need a document id, CRFN and block/lot to pull the instrument.
- Mortgage and refinance lead sellers who want new borrowers, their lenders and the property address.
- Anyone tired of the one-document-at-a-time ACRIS website.

### What one record looks like

Default input, first item of the run on 2026-08-23 (trimmed: `parties` and `properties` are `null` unless you switch the joins on; below they are shown as returned with both joins on).

```json
{
  "documentId": "2026073100231001",
  "crfn": "2026000216575",
  "docType": "MTGE",
  "docTypeDescription": "MORTGAGE",
  "docClass": "MORTGAGES & INSTRUMENTS",
  "recordedDate": "2026-07-31",
  "documentDate": "2026-07-30",
  "documentAmount": 1200000,
  "percentTransferred": 0,
  "recordedBorough": 1,
  "recordedBoroughName": "Manhattan",
  "goodThroughDate": "2026-07-31",
  "acrisDocumentUrl": "https://a836-acris.nyc.gov/DS/DocumentSearch/DocumentImageView?doc_id=2026073100231001",
  "parties": [
    { "partyType": "1", "role": "MORTGAGOR/BORROWER", "name": "301 EAST 87TH STREET OWNERS, INC.", "address1": "301 EAST 87TH STREET", "city": "NEW YORK", "state": "NY", "zip": "10128", "country": "US" },
    { "partyType": "2", "role": "MORTGAGEE/LENDER", "name": "EMPLOYERS REASSURANCE CORPORATION", "address1": "C/O PRINCIPAL REAL ESTATE INVESTORS, LLC", "address2": "711 HIGH STREET", "city": "DES MOINES", "state": "IA", "zip": "50392", "country": "US" }
  ],
  "properties": [
    { "borough": 1, "boroughName": "Manhattan", "block": 1550, "lot": 1, "bbl": "1015500001", "propertyType": "AP", "streetNumber": "301", "streetName": "EAST 87TH STREET", "unit": null }
  ],
  "propertyBoroughs": ["Manhattan"],
  "source": "https://data.cityofnewyork.us/resource/bnx9-e6tj.json",
  "attribution": "NYC Department of Finance (DOF) via NYC Open Data",
  "sourcePublishedAt": "2026-08-10T13:35:55.000Z",
  "fetchedAt": "2026-08-23T16:42:32.153Z"
}
```

Also on every record: `modifiedDate`, `reel` (year, number, page; zero for modern e-recorded documents), `sourceDataset`, `datasetPage`, and `raw` when `includeRaw` is on. Party `role` comes from the ACRIS document control code table, so a DEED's party 1 is GRANTOR/SELLER and a MTGE's party 1 is MORTGAGOR/BORROWER. `recordedBorough` is the recording office, not the property: in 2026 it reads Manhattan on 92% of recordings citywide. The property borough is in `properties` and `propertyBoroughs`.

### Input

| Field | Default | What it does |
| --- | --- | --- |
| `recordedFrom` | 30 days before the newest recording | ISO date. Documents recorded on or after. |
| `recordedTo` | newest recording in the dataset | ISO date. Documents recorded on or before. |
| `docTypes` | `["DEED", "MTGE"]` | ACRIS type codes. Others: SAT, ASST, AGMT, PAT, RPTT\&RET, DEED, TS, TL\&R, AL\&R. Empty list = all 126 types. |
| `borough` | any | 1 Manhattan, 2 Bronx, 3 Brooklyn, 4 Queens, 5 Staten Island. Uses the lots; switches `includeLegals` on. |
| `minAmount` | 0 | Minimum `documentAmount` in USD. Applied by the source. |
| `partyName` | none | Case-insensitive substring over every party name. Switches `includeParties` on. |
| `includeParties` | false | Attach `parties`. One request per 50 documents. |
| `includeLegals` | false | Attach `properties` (lots). One request per 50 documents. |
| `maxResults` | 100 | Records to deliver, newest first. Maximum 10,000. |
| `allowPartialResults` | false | Borough and party-name runs only. If the 10,000-document scan cap is reached with fewer matches than `maxResults`, deliver what was found (summary carries `stoppedByScanCap: true`) instead of failing. |
| `includeRaw` | false | Attach the untouched Socrata rows under `raw`. |

Example inputs:

- Queens deeds over $1M with buyer and seller: `{"docTypes":["DEED"],"minAmount":1000000,"borough":"4","includeParties":true}`
- Everything a lender recorded in July: `{"partyName":"deephaven","recordedFrom":"2026-07-01","recordedTo":"2026-07-31","docTypes":[]}`
- Daily feed of new mortgages with property address: `{"docTypes":["MTGE"],"includeLegals":true,"maxResults":2000}`

A run with the default input delivered 100 records in 8.4 seconds of platform wall time (4.3 seconds inside the Actor) with 5 requests to the source (2026-08-23, run id rfA3apA3ltppSfLLo).

### Pricing

$0.003 per delivered record; `maxResults` caps the charge. Joins and filters add requests, not charges. A run that fails delivers and charges nothing.

### Data source, refresh and terms

Source: NYC Department of Finance, ACRIS (Automated City Register Information System), published on NYC Open Data as four datasets: [Real Property Master](https://data.cityofnewyork.us/d/bnx9-e6tj) (17,065,090 documents on 2026-08-23), [Real Property Parties](https://data.cityofnewyork.us/d/636b-3b5g), [Real Property Legals](https://data.cityofnewyork.us/d/8h5j-fqxa) and [Document Control Codes](https://data.cityofnewyork.us/d/7isb-wh4c).

Refresh: NYC Open Data lists the update frequency as Monthly. On 2026-08-23 the master dataset had been updated on 2026-08-10 and its newest recording was 2026-07-31, so expect the newest available recording to run two to six weeks behind today. The default window follows the data, not the calendar: it is the last 30 days up to the newest recording, which held 10,046 deeds and mortgages on 2026-08-23.

Terms: NYC Open Data's [terms of use](https://opendata.cityofnewyork.us/overview/#termsofuse) state that "Public data sets made available on NYC Open Data are provided for informational purposes. The City does not warranty the completeness, accuracy, content, or fitness for any particular purpose or use of any public data set made available on NYC Open Data, nor are any such warranties to be implied or inferred with respect to the public data sets furnished therein." The terms carry no restriction on commercial use. The site's robots.txt allows the `/resource/` API with a crawl delay of 1 second, which this Actor honors on every request.

Not affiliated with or endorsed by the City of New York or the Department of Finance. Attribution carried on every record: "NYC Department of Finance (DOF) via NYC Open Data".

### Limitations

- ACRIS is the register for Manhattan, Bronx, Brooklyn and Queens. Most Staten Island deeds are recorded with the Richmond County Clerk instead, so Staten Island is thin here: 521 of 23,212 documents entered in July 2026 touched a Staten Island lot (Legals dataset, counted 2026-08-23).
- Many deeds record an amount of 0 (transfers between related parties, co-op and timeshare deeds, corrections). Use `minAmount` to skip them.
- Borough and party-name filters run after fetching. The Actor scans newest-first, joins only documents that can still match, and stops at 10,000 scanned documents. If that cap is reached before `maxResults` matches are found, the run fails with a message (nothing delivered, nothing charged) so you can narrow the window, the document types or `maxResults`; set `allowPartialResults` to accept the matches found so far instead.
- The party-name pre-filter relies on modern document ids starting with the date the document entered ACRIS. Documents reusing an older id (14 of 28,300 in July 2026) are joined directly, so they are not missed.
- No document images, no historical ownership chain, no assessed values. Those are different datasets and different Actors.

### How the run can fail (nothing is pushed or charged)

Bad input; the source not serving a newest recording date or its publication date; a renamed or missing column in any of the four datasets; a default run whose window reports zero deeds and mortgages; a scan that runs out of rows before the server-side count says it should; a client-side scan that reaches its 10,000-document cap short of `maxResults` (unless `allowPartialResults` is on); a charge allowance that cannot be read. A filtered run that matches nothing succeeds with zero records.

### FAQ

#### How do I search ACRIS by owner name in bulk?

Set `partyName` to part of the name. Every party on the document is matched, so a lender, a buyer or a seller all work. The parties are attached automatically.

#### Can I get NYC deed transfers by borough with sale price?

Yes: `docTypes: ["DEED"]`, `borough`, and `minAmount` to drop zero-amount transfers. `documentAmount` is the recorded consideration.

#### Does this return new mortgages in NYC with lender names?

Yes: `docTypes: ["MTGE"]` with `includeParties: true`. Party 2 is MORTGAGEE/LENDER.

#### How do I get the property address and block and lot for a recording?

Switch `includeLegals` on. Each lot carries borough, block, lot, the ten-digit BBL, property type code, street number, street name and unit.

#### Why is the newest record weeks old?

The Department of Finance refreshes the open-data copy about monthly. The Actor always reports `latestRecordedDate` in its run summary so you know what the window covered.

### Related datasets by the same author

- [NYC passport procurement](https://apify.com/jserle/nyc-passport-procurement)
- [New York nursing home bed census](https://apify.com/jserle/ny-nursing-home-bed-census)
- [E-Rate Form 470 RFP feed](https://apify.com/jserle/erate-form-470-rfp-feed)
- [SNF change of ownership tracker](https://apify.com/jserle/snf-change-of-ownership-tracker)

# Actor input Schema

## `recordedFrom` (type: `string`):

ISO date, for example 2026-07-01. Keeps documents recorded on or after this date. Blank means 30 days before the newest recording in the dataset. The dataset is updated about monthly and its newest recording runs a few weeks behind today.

## `recordedTo` (type: `string`):

ISO date, for example 2026-07-31. Keeps documents recorded on or before this date. Blank means the newest recording in the dataset.

## `docTypes` (type: `array`):

ACRIS document type codes. Default DEED and MTGE. Other frequent codes: SAT (satisfaction of mortgage), ASST (assignment of mortgage), AGMT (agreement), PAT (power of attorney), RPTT\&RET (transfer tax returns), DEED, TS (timeshare deed), TL\&R / AL\&R (lis pendens). An empty list means every document type. The full 126-code table is NYC Open Data dataset 7isb-wh4c.

## `borough` (type: `string`):

Keeps documents that touch at least one tax lot in this borough. Applied after fetching, using the Legals dataset, so the run scans newest-first until it has enough matches (at most 10,000 documents). Most Staten Island deeds are recorded with the Richmond County Clerk, not ACRIS, so expect few rows there (about 2% of documents).

## `minAmount` (type: `integer`):

Keeps documents whose recorded amount is at least this much. Applied by the source. Many deeds record 0 (transfers between related parties, co-op and timeshare deeds, corrections), so a minimum also removes those.

## `partyName` (type: `string`):

Case-insensitive substring matched against every party on the document (grantor, grantee, borrower, lender, and so on). Example: deephaven. Applied after fetching, using the Parties dataset, with a pre-filter so only documents that can match are joined. Minimum 3 characters.

## `includeParties` (type: `boolean`):

Attach a `parties` array with every party on the document: role (GRANTOR/SELLER, GRANTEE/BUYER, MORTGAGOR/BORROWER, MORTGAGEE/LENDER and so on, from the ACRIS code table), name and address. One extra request per 50 documents. Switched on automatically by the party-name filter.

## `includeLegals` (type: `boolean`):

Attach a `properties` array with every tax lot the document touches: borough, block, lot, ten-digit BBL, property type code, street address and unit. One extra request per 50 documents. Switched on automatically by the borough filter.

## `maxResults` (type: `integer`):

How many documents to deliver, newest first. You are charged per delivered record, so this is also your cost cap.

## `allowPartialResults` (type: `boolean`):

Only matters with a borough or party-name filter. Those filters run after fetching and the run scans at most 10,000 documents newest-first. If that cap is reached before maxResults matches are found, the run fails by default (nothing delivered, nothing charged) so you can narrow the window. Set this to true to deliver the matches found so far instead; the run summary then carries stoppedByScanCap: true.

## `includeRaw` (type: `boolean`):

Attach a `raw` object with the untouched Socrata rows (master, and parties / legals when joined) under their ACRIS column names. Useful for auditing the normalization; roughly doubles item size.

## Actor input object example

```json
{
  "docTypes": [
    "DEED",
    "MTGE"
  ],
  "borough": "any",
  "minAmount": 0,
  "includeParties": false,
  "includeLegals": false,
  "maxResults": 100,
  "allowPartialResults": false,
  "includeRaw": false
}
```

# Actor output Schema

## `results` (type: `string`):

One item per ACRIS document delivered by this run, newest first, with parties and lots attached when requested.

## `summary` (type: `string`):

Window used, newest recording in the source, server-side match count, rows fetched, malformed rows skipped, which filters ran server-side, delivered records, requests made, and whether the charge limit stopped the run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "docTypes": [
        "DEED",
        "MTGE"
    ],
    "borough": "any",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("jserle/nyc-acris-recordings-feed").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "docTypes": [
        "DEED",
        "MTGE",
    ],
    "borough": "any",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("jserle/nyc-acris-recordings-feed").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "docTypes": [
    "DEED",
    "MTGE"
  ],
  "borough": "any",
  "maxResults": 100
}' |
apify call jserle/nyc-acris-recordings-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jserle/nyc-acris-recordings-feed"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/T60AkL6RmBBZfIbrV/builds/9SfhyLbYr75FZQDpu/openapi.json
