# New York DOCCS Inmate Lookup Scraper (`acquistion-automation/new-york-doccs-inmate-scraper`) Actor

Scrapes New York State DOCCS inmate records by DIN or name search. Returns each inmate as a flat row with custody status, facility, parole eligibility, and sentence details.

- **URL**: https://apify.com/acquistion-automation/new-york-doccs-inmate-scraper.md
- **Developed by:** [Acquisition Automation Co.](https://apify.com/acquistion-automation) (community)
- **Categories:** News, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $19.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![Acquisition Automation Co. Search less. Close more.](https://api.apify.com/v2/key-value-stores/AOdPHdOpeDpzEPS5f/records/banner.jpg)

## 🗽 New York DOCCS Inmate Lookup Scraper

> **Search the New York State inmate lookup by name or DIN and get the full custody record as a flat row.** 31 fields per person: custody status, facility, offences and classes, aggregate sentence, county of commitment, every release and parole date the state publishes. No API key, no registration.

New York's Department of Corrections and Community Supervision runs a public lookup at `nysdoccslookup.doccs.ny.gov`. It answers one search at a time, spreads the record across several screens, and has no export. Anyone who checks more than a handful of names, a reporter on a beat, a reentry caseworker, a researcher, ends up retyping the same fields into a spreadsheet. This Actor drives that search and writes every matching record into a dataset.

| Who uses it | What they use the lookup for |
|---|---|
| 📰 Journalists and newsrooms | Following custody status, facility moves and parole hearing dates across a list of names |
| ⚖️ Legal and reentry teams | Tracking release and parole dates for the people on their caseload |
| 📊 Criminal justice researchers | Building datasets on sentence length, offence class and county of commitment |
| 🔎 Diligence researchers | Checking public criminal custody records against a named individual |

### 📋 What it does

> 💡 **Why it matters:** the state publishes six different dates per record, and they do not mean the same thing. Having them as separate columns is what makes a release calendar possible.

- 🔎 **Two ways in.** Search by last name, with optional first name, middle initial and date of birth, or go straight to a DIN.
- 🏛 **Custody status and facility** on every row, for example `IN CUSTODY` at `CAYUGA`.
- ⚖️ **Every offence and its class**, as parallel lists, so a three count sentence keeps all three.
- 📅 **The full date set.** Earliest and latest release, conditional release, parole eligibility, maximum expiration, post release supervision expiry, parole hearing and board discharge.
- 🆔 **Aliases and prior DINs**, which is how the same person is matched across commitments.
- 📦 **One row per record**, the same 31 fields every run, exportable as CSV, Excel, JSON or XML.

### 📊 Output

Every record is one flat row. `null` means the state publishes no value for that field on that record, and `NONE` is what the site itself shows where a date does not apply.

| Field | Type | Description |
|---|---|---|
| 🆔 `din` | string | Department Identification Number, the state's key for a commitment, for example `22R1495` |
| 👤 `name` | string | Name as recorded, surname first |
| 🎂 `dateOfBirth` | string | Date of birth as `MM/DD/YYYY` |
| 📅 `age` | string | Age as the site states it, for example `31 years old` |
| 🧾 `race` | string | Race as recorded by the department |
| 🏛 `custodyStatus` | string | Current status, for example `IN CUSTODY` |
| 🏢 `housingFacility` | string | Facility holding the person, for example `CAYUGA` |
| ⚖️ `crime` | array | Offences of conviction, one entry each |
| 🔤 `crimeClass` | array | Offence class letters, in the same order as `crime` |
| ⏳ `aggregateMinSentence` | string | Aggregate minimum, as `Years, Months, Days` |
| ⌛ `aggregateMaxSentence` | string | Aggregate maximum, as `Years, Months, Days` |
| 📝 `admissionType` | string | How the person entered custody, for example `NEW COMMITMENT` |
| 📍 `countyOfCommitment` | string | County the commitment came from |
| 📥 `dateReceived` | string | Date received into custody |
| 🚪 `earliestReleaseDate` | string | Earliest release date the department publishes |
| 🏷 `earliestReleaseType` | string | Which date type that earliest date is, for example `MAXIMUM EXPIRATION DATE` |
| 🚪 `latestReleaseDate` | string | Latest release date, where one is published |
| 🏷 `latestReleaseType` | string | Which date type the latest date is |
| 📆 `conditionalReleaseDate` | string | Conditional release date, or `NONE` |
| 🗓 `paroleEligibilityDate` | string | Parole eligibility date, where one applies |
| ⏹ `maximumExpirationDate` | string | Maximum expiration of the sentence |
| 🔚 `postReleaseSupervisionMaxExpirationDate` | string | Maximum expiration of post release supervision |
| 🧑‍⚖️ `paroleHearingDate` | string | Next parole hearing, usually as `MM/YYYY` |
| 📋 `paroleHearingType` | string | Type of that hearing, for example `RELEASE CONDITIONS` |
| ✅ `paroleBoardDischargeDate` | string | Parole board discharge date, where one is published |
| 🔁 `otherNames` | array | Other names on the record |
| 🔢 `otherDins` | array | Other DINs linked to the same person |
| 🔗 `url` | string | The DOCCS lookup entry point. The site has no per record permalink |
| 🌐 `source` | string | Always `nysdoccslookup.doccs.ny.gov` |
| 🕒 `scrapedAt` | string | ISO timestamp of collection |
| ⚠️ `error` | string | `null` on a normal row |

#### Example rows

```json
{
  "din": "22R1495",
  "name": "SMITH, AARON",
  "dateOfBirth": "09/09/1995",
  "age": "31 years old",
  "race": "BLACK",
  "custodyStatus": "IN CUSTODY",
  "housingFacility": "CAYUGA",
  "crime": [
    "ATT CRIM POSS WEAP 2ND"
  ],
  "crimeClass": [
    "D"
  ],
  "aggregateMinSentence": "0 Years, 0 Months, 0 Days",
  "aggregateMaxSentence": "5 Years, 0 Months, 0 Days",
  "admissionType": "NEW COMMITMENT",
  "countyOfCommitment": "BRONX",
  "dateReceived": "07/05/2022",
  "earliestReleaseDate": "05/05/2027",
  "earliestReleaseType": "MAXIMUM EXPIRATION DATE",
  "latestReleaseDate": null,
  "latestReleaseType": null,
  "conditionalReleaseDate": "NONE",
  "paroleEligibilityDate": null,
  "maximumExpirationDate": "05/05/2027",
  "postReleaseSupervisionMaxExpirationDate": null,
  "paroleHearingDate": "06/2026",
  "paroleHearingType": "RELEASE CONDITIONS",
  "paroleBoardDischargeDate": null,
  "otherNames": [
    "SMITH, AARON"
  ],
  "otherDins": [
    "22R1495"
  ],
  "url": "https://nysdoccslookup.doccs.ny.gov/",
  "source": "nysdoccslookup.doccs.ny.gov",
  "scrapedAt": "2026-09-14T16:27:50.382Z",
  "error": null
}
```

```json
{
  "din": "26B1928",
  "name": "SMITH, AARON",
  "dateOfBirth": "01/09/1993",
  "age": "33 years old",
  "race": "BLACK",
  "custodyStatus": "IN CUSTODY",
  "housingFacility": "UPSTATE",
  "crime": [
    "ASSAULT 2ND",
    "ASSAULT 2ND",
    "MANSLAUGHTER 1ST"
  ],
  "crimeClass": [
    "D",
    "D",
    "B"
  ],
  "aggregateMinSentence": "0 Years, 0 Months, 0 Days",
  "aggregateMaxSentence": "17 Years, 0 Months, 0 Days",
  "admissionType": "NEW COMMITMENT",
  "countyOfCommitment": "BRONX",
  "dateReceived": "06/18/2026",
  "earliestReleaseDate": "01/27/2037",
  "earliestReleaseType": "CONDITIONAL RELEASE DATE",
  "latestReleaseDate": null,
  "latestReleaseType": null,
  "conditionalReleaseDate": "01/27/2037",
  "paroleEligibilityDate": null,
  "maximumExpirationDate": "07/03/2039",
  "postReleaseSupervisionMaxExpirationDate": null,
  "paroleHearingDate": "11/2036",
  "paroleHearingType": "RELEASE CONDITIONS",
  "paroleBoardDischargeDate": null,
  "otherNames": [
    "SMITH, AARON"
  ],
  "otherDins": [
    "26B1928"
  ],
  "url": "https://nysdoccslookup.doccs.ny.gov/",
  "source": "nysdoccslookup.doccs.ny.gov",
  "scrapedAt": "2026-09-14T16:27:50.754Z",
  "error": null
}
```

### ✨ Why choose this Actor

| | What you get |
|---|---|
| **The official record** | Rows come from the department's own lookup, not from a commercial records aggregator. |
| **31 fields, already separated** | Six kinds of release date as six columns, offences and classes as matched lists. |
| **Bulk instead of one at a time** | The site answers one search per screen. Here you set a limit and walk away. |
| **No credentials** | The lookup is public. No API key, no account. |
| **You pay per row** | A search that matches nobody costs nothing. |

### 🚀 How to use it

1. [Create a free Apify account](https://console.apify.com/sign-up). New accounts start with $5 of credit.
2. Open the Actor and select **Try for free**.
3. Enter a `lastName`, and narrow with `firstName`, `middleInitial`, `dobMonth` and `dobYear` if you have them. Or put a known DIN in `din` on its own.
4. Set `maxItems` to cap the run.
5. Select **Start**, then export from the **Dataset** tab as CSV, Excel, JSON or XML.

A name search:

```json
{
  "lastName": "Smith",
  "maxItems": 10
}
```

A narrowed search:

```json
{
  "lastName": "Smith",
  "firstName": "Aaron",
  "dobYear": "1995",
  "maxItems": 25
}
```

A direct lookup:

```json
{
  "din": "22R1495",
  "maxItems": 1
}
```

### ⚙️ Input

| Field | Required | Description |
|---|---|---|
| `lastName` | No | Last name to search. Required when no `din` is given |
| `firstName` | No | First name, to narrow a common surname |
| `middleInitial` | No | Single letter |
| `din` | No | Department Identification Number, for example `23A1234`. Used on its own, it goes straight to one record |
| `dobMonth` | No | Birth month, 1 to 12 |
| `dobYear` | No | Four digit birth year |
| `maxItems` | No | Maximum records to collect in a run |

### 💰 Pricing

Pay per result. No subscription, and no Apify platform usage on top.

| Apify plan | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Per record row | $0.021 | $0.0203 | $0.0197 | $0.019 | $0.019 | $0.019 |

| Rows collected | Cost on the Free plan |
|---|---|
| 100 | $2.10 |
| 1,000 | $21.00 |
| 10,000 | $210.00 |

**Free plan runs** return up to 10 rows as a preview. Any paid Apify plan lifts that cap.

### 🔌 Integrate with any app

The dataset is available through the Apify API as soon as the run finishes. Use `run-sync-get-dataset-items` for a one-shot call, webhooks to trigger what happens next, or the Make, Zapier, Airbyte and LangChain integrations listed on the Actor page.

### 🤖 Use with an AI agent

Give an agent live access to the lookup over the Model Context Protocol:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=acquistion-automation/new-york-doccs-inmate-scraper"
```

Then ask it in plain language to check a DIN and read the record back.

### ❓ Frequently asked questions

**Can I search by DIN alone?**
Yes. Put the DIN in `din` and leave the name fields empty. A DIN identifies one commitment, so the run returns that record.

**Why did one name return several records?**
The lookup matches on surname. A common name returns many people, and one person can hold several DINs across commitments. Use `firstName`, `dobYear` and `otherDins` to resolve them.

**Does `url` link to the individual record?**
No. DOCCS serves results from a session rather than a permanent address, so `url` is the lookup entry point and `din` is what identifies the record.

**Why are some dates `null` or `NONE`?**
Not every date applies to every sentence. `NONE` is what the department's own page shows. `null` means the field was absent from that record.

**Does it cover people released in the past?**
The lookup covers people currently in custody and under community supervision, as the department defines it. Coverage is the department's, not this Actor's.

**Can I use this to screen employees or tenants?**
No. This is a public record lookup, not a consumer report, and it is not produced by a consumer reporting agency. Do not use it for employment, housing, credit or insurance decisions. Those uses are governed by the Fair Credit Reporting Act and equivalent state law.

### 🔗 More from Acquisition Automation Co.

- [SAM.gov Contract Opportunities Scraper](https://apify.com/acquistion-automation/sam-gov-contracts-scraper)
- [USCG PSIX Vessel Registry Scraper](https://apify.com/acquistion-automation/uscg-psix-vessel-incidents-scraper)
- [IRS Exempt Organizations Scraper](https://apify.com/acquistion-automation/irs-eo-master-file-scraper)
- [PublicSurplus Scraper](https://apify.com/acquistion-automation/publicsurplus-scraper)
- [404 Media Articles Scraper](https://apify.com/acquistion-automation/404media-articles-scraper)

### About Acquisition Automation Co.

We build automation for people buying businesses. The repetitive part of an acquisition search, checking listings, pulling public records, tracking owners and assets, is work a machine should do, so the buyer's time goes into judging deals instead of collecting them.

We add new Actors regularly. If there is a source you need and do not see here, tell us.

### 🆘 Support

Open an issue in the **Issues** tab of this Actor with your run ID, the input you used, and what you expected to get back.

### ⚠️ Disclaimer

This Actor is independent and is not affiliated with, endorsed by, or sponsored by the New York State Department of Corrections and Community Supervision or any government agency. It collects only publicly available data, and that data concerns identifiable individuals. It is not a consumer report and must not be used for employment, housing, credit, insurance or any other decision covered by the Fair Credit Reporting Act. Records can be incomplete or out of date; verify with the department before acting on one. You are responsible for using this data in compliance with the source's terms of service and applicable law, including data protection law.

# Actor input Schema

## `maxItems` (type: `integer`):

How many inmates to collect per run.

## `lastName` (type: `string`):

Required if no DIN is provided.

## `firstName` (type: `string`):

First name (optional).

## `middleInitial` (type: `string`):

Single letter (optional).

## `din` (type: `string`):

Department Identification Number (e.g. 23A1234).

## `dobMonth` (type: `string`):

1-12 (optional).

## `dobYear` (type: `string`):

4-digit year (optional).

## Actor input object example

```json
{
  "maxItems": 10,
  "lastName": "Smith"
}
```

# Actor output Schema

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

Scraped New York DOCCS Inmate Lookup Scraper - Records & Status records

# 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 = {
    "maxItems": 10,
    "lastName": "Smith"
};

// Run the Actor and wait for it to finish
const run = await client.actor("acquistion-automation/new-york-doccs-inmate-scraper").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 = {
    "maxItems": 10,
    "lastName": "Smith",
}

# Run the Actor and wait for it to finish
run = client.actor("acquistion-automation/new-york-doccs-inmate-scraper").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 '{
  "maxItems": 10,
  "lastName": "Smith"
}' |
apify call acquistion-automation/new-york-doccs-inmate-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,acquistion-automation/new-york-doccs-inmate-scraper"
        }
    }
}
```

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/a0hewglholITeIwPq/builds/hMmNldXcFY8PZXMjE/openapi.json
