# New York Nursing Home Bed Availability (NYSDOH) Scraper (`jserle/ny-nursing-home-bed-census`) Actor

New York nursing home bed availability from the NYSDOH weekly bed census: beds free and capacity by type (residential, ventilator, behavioral, TBI, pediatric, dialysis) for every NY nursing home. Current snapshot or weekly history to 2009. Filter by county, region or bed type. $0.004/record.

- **URL**: https://apify.com/jserle/ny-nursing-home-bed-census.md
- **Developed by:** [Jonathan Serle](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

$4.00 / 1,000 facility census 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/platform/actors/running/actors-in-store#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

## New York Nursing Home Bed Availability (NYSDOH) Scraper

Pulls nursing home bed availability for every nursing home in New York State from the NYS Department of Health weekly bed census into clean JSON records: how many beds each facility is licensed for and how many are free right now, by bed type (residential, ventilator, behavioral intervention, TBI, neurodegenerative, pediatric, dialysis, adult day health care). Filter by county, region, facility name, bed type and minimum beds free.

This is capacity data, not quality data. It answers "which nursing homes in Erie County have a ventilator bed open this week", not "who has four stars". Two modes, one schema:

- **Current** - each facility's most recent filing. About 592 facilities, refreshed weekly.
- **History** - every weekly filing back to 8 April 2009. About 441,000 facility weeks, for occupancy trends and seasonality.

### Who uses this data

- **Senior placement services, geriatric care managers and elder-law firms** shortlisting facilities that can actually take a client this week, by county and by bed type.
- **Hospital and SNF discharge planners** working a live discharge: filter to ventilator, behavioral intervention or TBI beds with at least N free, in one region.
- **Managed long-term care plans and ACOs** monitoring network capacity across their footprint.
- **Nursing home operators, brokers, lenders and developers** using the history mode to read occupancy trends by county before siting, buying or repositioning a facility.
- **Researchers and journalists** studying bed supply, specialty capacity, or closures over fifteen years of weekly filings.

### What you get

One dataset item per facility per census date, newest first. Both modes emit the same fields, so current and history pipe into one table. A real item, from `{"bedType": "ventilator", "minBedsAvailable": 1}`, with unreported bed types trimmed for length:

```json
{
  "mode": "current",
  "facilityId": "1233",
  "facilityName": "Independence Care Center for Nursing and Rehabilitation",
  "certificationNumber": "7000385N",
  "streetAddress": "666 Kappock Street",
  "city": "Bronx",
  "state": "NY",
  "zip": "10463",
  "county": "Bronx",
  "region": "Metropolitan Area Regional Office - New York City",
  "phone": "718-549-1203",
  "latitude": 40.88051,
  "longitude": -73.91877,
  "censusDate": "2026-08-12",
  "censusWeeksAgo": 1,
  "facilityStatus": null,
  "specialCircumstances": null,
  "residentialBedsAvailable": 29,
  "residentialBedCapacity": 200,
  "maxBedsAvailable": 29,
  "reportedBedTypes": ["residential", "ventilator"],
  "beds": {
    "residential": { "capacity": 200, "available": 29 },
    "ventilator": { "capacity": 10, "available": 6 },
    "pediatric": { "capacity": null, "available": null }
  },
  "sourceDataset": "izta-vnpq",
  "sourceDatasetTitle": "Nursing Home Weekly Bed Census: Last Submission",
  "source": "https://health.data.ny.gov/resource/izta-vnpq.json",
  "datasetPage": "https://health.data.ny.gov/d/izta-vnpq",
  "attribution": "New York State Department of Health",
  "sourcePublishedAt": "2026-08-19T17:29:57.000Z",
  "fetchedAt": "2026-08-23T11:36:02.150Z"
}
```

`beds` always carries all eleven categories, so the CSV export has stable columns. `null` means the facility filed nothing for that category; `0` means it filed a zero. `censusWeeksAgo` is how stale the filing is, and is populated in `current` mode only. `facilityStatus` (OPEN/CLOSED) and `specialCircumstances` (the facility's own free-text note, e.g. `11 Beds closed for construction`) come from the history dataset and are `null` in `current`.

**There is deliberately no total across bed types.** Specialty beds sit inside the certified residential bed count: on the 2026-08-12 census, 471 of 473 facilities had their specialty categories summing to no more than the residential total, and the two exceptions are facilities double-reporting the same beds under two specialty labels. Adding categories would therefore inflate a facility's capacity. `maxBedsAvailable` is the largest single category free, and `residentialBedsAvailable` is the number a placement desk usually means.

Dates are ISO 8601. Census dates are plain calendar dates, not an invented midnight in some timezone. Records are deduplicated on facility plus census date.

### Input

Everything is optional. Run it with no input and you get the 100 most recently filed facility censuses.

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `mode` | enum | `current` | `current` (latest filing per facility) or `history` (weekly since 2009). |
| `facilityName` | string | - | Case-insensitive substring on the facility name, e.g. `elderwood`. |
| `county` | string | - | Case-insensitive substring on the county. NYC boroughs use county names: `New York`, `Kings`, `Queens`, `Bronx`, `Richmond`. |
| `region` | string | - | Case-insensitive substring on the NYSDOH area office, e.g. `Rochester`, `Long Island`. |
| `bedType` | enum | `any` | One of `residential`, `ventilator`, `behavioralIntervention`, `traumaticBrainInjury`, `neurodegenerative`, `pediatric`, `pediatricVentilator`, `scatterVentilator`, `adultDayHealthCare`, `dialysisStation`, `dialysisDen`. |
| `minBedsAvailable` | integer | `0` | Minimum beds free. Applies to `bedType` when one is chosen, otherwise to the facility's largest single free bed type. |
| `censusDateFrom` | ISO date | - | Censuses filed on or after this date. Mainly for `history`. |
| `censusDateTo` | ISO date | - | Censuses filed on or before this date. |
| `maxResults` | integer | `100` | 1 to 50000. This is your cost cap: you pay per delivered record. |
| `includeRaw` | boolean | `false` | Attach a `raw` array with the source rows under their NYSDOH column names. |

The seven NYSDOH regions are Capital District, Central New York, Metropolitan Area - Long Island, Metropolitan Area - New Rochelle, Metropolitan Area - New York City, Western - Buffalo, and Western - Rochester.

#### Example inputs

**Nursing homes with open beds in one county this week** (placement, discharge planning):

```json
{
  "county": "Erie",
  "minBedsAvailable": 5,
  "maxResults": 200
}
```

**Ventilator beds available anywhere in New York City** (specialty discharge):

```json
{
  "region": "New York City",
  "bedType": "ventilator",
  "minBedsAvailable": 1,
  "maxResults": 100
}
```

**Fifteen years of weekly occupancy for one facility** (operator or lender trend analysis):

```json
{
  "mode": "history",
  "facilityName": "Independence Care Center",
  "censusDateFrom": "2011-01-01",
  "maxResults": 1000
}
```

### Pricing

**$0.004 per record; you pay only for records delivered.** One charge per dataset item, nothing else. Set `maxResults` and you have set your bill: 100 records is $0.40. Filters are applied before delivery, so a narrow search costs less than a broad one, and a search that matches nothing is free.

### Data source, refresh and licence

Records come from two Socrata (SODA) datasets published by the **New York State Department of Health** on health.data.ny.gov:

- Current: [Nursing Home Weekly Bed Census: Last Submission](https://health.data.ny.gov/d/izta-vnpq) (`izta-vnpq`)
- History: [Nursing Home Weekly Bed Census: Beginning 2009](https://health.data.ny.gov/d/uhyy-xp9s) (`uhyy-xp9s`)

**Refresh:** NYSDOH requires facilities to file weekly, and publishes both datasets on a **monthly posting frequency** (its own metadata: Data Frequency weekly, Posting Frequency monthly). Each run reports the dataset's `sourcePublishedAt` so you can see exactly how fresh the copy you were served is. Run the Actor on a schedule and you track the state's own refresh; there is no faster public feed.

**Licence:** Both datasets carry the license **"Public Domain"** and the attribution **"New York State Department of Health"** in their own Socrata metadata (read 2026-08-23).

The Department's [Data Use Policy Statement](https://www.health.ny.gov/about/data_use.htm) (revised February 2013) grants permission to reproduce its published materials "so long as the Department of Health is noted as the source, and the data \[sic] the web page was accessed, along with the date of publication of the material cited, is noted." Every record therefore carries `attribution`, `source`, `fetchedAt` (the date accessed) and `sourcePublishedAt` (the dataset's own publication timestamp), so a downstream citation has everything it needs.

The same policy requires this statement, reproduced verbatim:

> "The New York State Department of Health makes no representation, warranty or guarantee relating to the data or analyses derived from these data."

This Actor is **not affiliated with or endorsed by the New York State Department of Health**. Bed and occupancy figures are self-reported by facilities and are not audited by NYSDOH, which the Department states in the datasets' own limitations note.

The Actor reads the public SODA endpoints with a descriptive User-Agent (`jserle-apify-actor/ny-nursing-home-bed-census`), sends requests one at a time with the 1-second `Crawl-delay` from the host's robots.txt (which allows `/resource/*`), and caches nothing between runs. A default run makes three requests.

### Limitations

- **Self-reported and unaudited.** NYSDOH's own disclaimer: "Information is self-reported and is not audited by the NYSDOH." Treat a bed count as the facility's claim, not a verified vacancy.
- **Weekly, not real time.** The current dataset is each facility's *last* filing, which is not always last week. `censusWeeksAgo` tells you how stale each row is; some facilities are several weeks behind.
- **Not every facility files every week.** The 2026-08-12 census covers 473 facilities out of the 592 in the current snapshot. Absence from a week is a missing filing, not a closure.
- **Three categories have no capacity/available split.** NYSDOH publishes a single figure for pediatric ventilator beds, dialysis station beds and dialysis station dens. The state's own current dataset reports that one figure as both capacity and available (verified: zero rows where they differ), and this Actor does the same in both modes so the two agree.
- **Capacity data only.** No inspection results, staffing, deficiencies, or star ratings. For those, see CMS Care Compare or the related CMS Actors below.
- **New York State only**, and nursing homes only. Assisted living, adult care facilities and home care are separate NYSDOH datasets.
- **`facilityStatus` is the facility's current status**, as published on the history rows, not its status on the census date. It is `null` in `current` mode because that dataset does not carry it.
- **A filter that matches nothing returns zero records and succeeds.** That is a valid, free answer. A run only fails when the source itself is broken, and then it exits non-zero having pushed nothing and charged nothing. It fails if a dataset stops publishing any column the normalizer reads, reports an implausibly small row count, returns no rows at all to an *unfiltered* query, publishes a bed-type code this Actor does not map (which would leave those beds missing from a record you paid for), or stops carrying the publication date every record cites.

### FAQ

#### How do I find nursing homes with available beds near me in New York?

Set `county` (NYC boroughs use their county names: `New York`, `Kings`, `Queens`, `Bronx`, `Richmond`) and `minBedsAvailable`. Every record carries the street address, phone, latitude and longitude, so you can sort by distance downstream.

#### Does it show ventilator, TBI or behavioral beds specifically?

Yes. Set `bedType` to one of the eleven NYSDOH categories and `minBedsAvailable` applies to that category alone. The `beds` object on every record carries capacity and available for all eleven.

#### How often is the New York nursing home bed census updated?

Facilities file weekly; NYSDOH posts the datasets monthly. `sourcePublishedAt` on every record tells you the publication timestamp of the copy you received, and `censusWeeksAgo` tells you how old each facility's filing is.

#### Can I get nursing home occupancy history in New York?

Yes. `mode: "history"` returns every weekly filing since 8 April 2009, about 441,000 facility weeks, filterable by facility, county, region and date range.

#### Is the bed count verified?

No. NYSDOH states the figures are self-reported and not audited. Treat a vacancy as the facility's claim and call to confirm.

#### Does it cover assisted living or adult care facilities?

No. Nursing homes only. Assisted living, adult care facilities and home care are separate NYSDOH datasets.

### Related datasets

Other datasets by the same author, all pay-per-record with source, refresh cadence and licence stated on each listing:

**Nursing home and long-term care data**

- [Nursing Home Deficiency Citations (CMS) Scraper](https://apify.com/jserle/nursing-home-deficiency-citations)
- [Nursing Home Fines & Civil Money Penalties (CMS) Scraper](https://apify.com/jserle/nursing-home-penalties-fines)
- [Nursing Home Directory & Ownership (CMS Form 671) Scraper](https://apify.com/jserle/ltc-facility-characteristics)
- [Nursing Home Daily Nurse Staffing (CMS PBJ) Scraper](https://apify.com/jserle/cms-nursing-home-staffing-daily)
- [Nursing Home Change of Ownership (CMS SNF CHOW) Scraper](https://apify.com/jserle/snf-change-of-ownership-tracker)

**Medicare provider enrollment data**

- [Medicare Revoked Providers List (CMS Revocations) Scraper](https://apify.com/jserle/medicare-revoked-providers)
- [Medicare Opt-Out Providers List (CMS Affidavits) Scraper](https://apify.com/jserle/medicare-opt-out-physicians)
- [Medicare Revalidation Due Date List (CMS) Scraper](https://apify.com/jserle/medicare-revalidation-due-leads)

**Public procurement and RFP feeds**

- [E-Rate Form 470 RFP Scraper (USAC School & Library Bids)](https://apify.com/jserle/erate-form-470-rfp-feed)
- [NYC PASSPort Procurement Scraper (RFPs, Bids & Contracts)](https://apify.com/jserle/nyc-passport-procurement)

**Developer and AI test data**

- [Synthetic Invoice OCR Ground Truth Dataset Generator](https://apify.com/jserle/ocr-ground-truth-document-factory)

# Actor input Schema

## `mode` (type: `string`):

Current is each facility's most recent weekly filing (about 592 facilities). History is every weekly filing back to April 2009 (about 441,000 facility weeks).

## `facilityName` (type: `string`):

Case-insensitive substring matched against the facility name. Example: elderwood

## `county` (type: `string`):

Case-insensitive substring matched against the county. Examples: Kings, Erie, Westchester. New York City boroughs use their county names: New York (Manhattan), Kings (Brooklyn), Queens, Bronx, Richmond (Staten Island).

## `region` (type: `string`):

Case-insensitive substring matched against the NYSDOH area office. The seven are: Capital District Regional Office, Central New York Regional Office, Metropolitan Area Regional Office - Long Island, Metropolitan Area Regional Office - New Rochelle, Metropolitan Area Regional Office - New York City, Western Regional Office - Buffalo, Western Regional Office - Rochester.

## `bedType` (type: `string`):

Keep only facilities that operate this bed type, and apply the minimum-beds threshold to it. The full bed table is still delivered on every record.

## `minBedsAvailable` (type: `integer`):

Keep only facilities reporting at least this many beds free. With a bed type selected the threshold applies to that type; otherwise it applies to the largest single bed type the facility reports free. Bed types are never summed, because specialty beds sit inside the certified residential bed count.

## `censusDateFrom` (type: `string`):

ISO date, for example 2026-01-01. Keeps censuses filed on or after this date. Mainly for history mode; the earliest census is 2009-04-08.

## `censusDateTo` (type: `string`):

ISO date, for example 2026-06-30. Keeps censuses filed on or before this date.

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

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

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

Attach a `raw` array with the Socrata rows this record was built from, under their NYSDOH column names. Useful for auditing the normalization; roughly doubles item size.

## Actor input object example

```json
{
  "mode": "current",
  "bedType": "any",
  "minBedsAvailable": 0,
  "maxResults": 100,
  "includeRaw": false
}
```

# Actor output Schema

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

One item per facility census delivered by this run, with beds available by bed type.

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

Dataset read, publication date, row counts, which filters ran server-side, delivered records, 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 = {
    "mode": "current",
    "bedType": "any",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("jserle/ny-nursing-home-bed-census").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 = {
    "mode": "current",
    "bedType": "any",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("jserle/ny-nursing-home-bed-census").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 '{
  "mode": "current",
  "bedType": "any",
  "maxResults": 100
}' |
apify call jserle/ny-nursing-home-bed-census --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jserle/ny-nursing-home-bed-census"
        }
    }
}

```

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/RHYu9MQO5TrOLLaYm/builds/4kImBlD0ReH9Mh6ml/openapi.json
