# Seniorly Scraper (`crawlerbros/seniorly-scraper`) Actor

Scrape senior-living communities from Seniorly - assisted living, independent living, memory care, skilled nursing and more across the US. Search any city with score, price and care-type filters, or enrich specific communities with full description, phone, amenities and all reviews.

- **URL**: https://apify.com/crawlerbros/seniorly-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Lead generation, Real estate, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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

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

## Seniorly Scraper

Scrape senior-living communities from [Seniorly](https://www.seniorly.com) — assisted living, independent living, memory care, skilled nursing facilities, board and care homes, continuing care retirement communities and active adult (55+) communities across the United States. Search any city with score, starting-price, verified-badge and care-type filters, or enrich specific communities with their full description, phone number, exact address, amenities list and every review. No login, no cookies, no paid proxy required.

### What this actor does

- **Two modes:** `search` (by city + care category) and `communityDetails` (by community URL)
- **US-wide coverage** — all 50 states + DC, any city Seniorly lists
- **7 care categories** — assisted living, independent living, memory care, skilled nursing, board and care homes, CCRCs, active adult
- **Rich filters** — care type, minimum score, max starting price, verified-only, name keyword
- **Optional deep enrichment** — turn on `includeDetails` to pull full descriptions, phone numbers, exact street address, GPS coordinates, full amenities list and every review for each search result
- **Empty fields are omitted** — every record only contains data that was actually found

### Output per community

**Search mode** (list view):

- `communityId`, `name`, `sourceUrl`
- `address` (as published by Seniorly)
- `careTypes[]` (e.g. `Assisted Living`, `Memory Care`)
- `imageUrl`
- `score` (Seniorly's 0-10 community score)
- `fromPriceMonthly` (starting price in USD/month)
- `verified`
- `careCategory`, `searchState`, `searchCity`

**With `includeDetails: true`, or `communityDetails` mode** (adds):

- `telephone`, `priceRangeText`, `description`
- `images[]`
- `latitude`, `longitude`
- `streetAddress`, `city`, `state`, `postalCode`, `country`
- `reviewAggregateRating` (0-5 scale, averaged from written reviews), `reviewAggregateCount`
- `reviews[]` — every published review (`text`, `author`, `rating`, `ratingScale`, `datePublished`)
- `amenities[]` — full deduplicated amenities list

Every record also carries `recordType` and `scrapedAt`.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `communityDetails` |
| `careCategory` | string | `assisted-living` | Care category page to search (mode=search) |
| `state` | string | `texas` | US state (mode=search) |
| `city` | string | `Dallas` | City within the state (mode=search); any spelling/casing accepted |
| `careType` | string | `any` | Filter to a specific care type within the results |
| `minScore` | number | – | Drop communities scored below this (0-10 scale, decimals allowed e.g. `9.5`) |
| `maxPrice` | int | – | Drop communities whose starting price is above this ($/month) |
| `verifiedOnly` | bool | `false` | Only keep Seniorly-verified communities |
| `keyword` | string | – | Keep only communities whose name contains this text |
| `includeDetails` | bool | `false` | Fetch each result's full detail page (description, phone, amenities, all reviews) |
| `communityUrls` | array | – | Community URLs (mode=communityDetails) |
| `maxItems` | int | `20` | Hard cap on emitted records (1–300) |

#### Example: highly-rated, verified memory care in Dallas, TX with full details

```json
{
  "mode": "search",
  "careCategory": "assisted-living",
  "state": "texas",
  "city": "Dallas",
  "careType": "Memory Care",
  "minScore": 9,
  "verifiedOnly": true,
  "includeDetails": true,
  "maxItems": 10
}
```

#### Example: fetch full details for specific communities

```json
{
  "mode": "communityDetails",
  "communityUrls": [
    "https://www.seniorly.com/assisted-living/texas/dallas/belmont-village-turtle-creek"
  ]
}
```

### Use cases

- **Family caregiving decisions** — compare scored, reviewed senior-living options in a target city before touring
- **Market research** — track community counts, pricing and care-type mix by metro area
- **Lead generation** — build outreach lists of senior-living providers with phone numbers and starting prices
- **Amenity comparison** — pull the full amenities list for shortlisted communities side by side

### Notes

- Seniorly paginates city results in blocks of ~20 communities. This actor follows that pagination automatically (up to `maxItems`), so larger metro areas (which can span 3-5+ pages) are covered in a single run — no need to page through manually.
- `score` (0-10) is Seniorly's own composite community score shown on search-result cards. `reviewAggregateRating` (0-5, available with `includeDetails`) is a separate average computed only from the written reviews on the community's own page — the two metrics can differ.
- If a city/category combination has no Seniorly page, the run finishes cleanly with a status message instead of erroring.
- The `city` field also accepts a 5-digit ZIP code instead of a city name (e.g. `78701`) — Seniorly resolves ZIPs to a "nearby communities" page the same way it resolves city names.

### Limitations

- Some communities publish a government license number, licensed bed capacity, and per-room-type pricing on their Seniorly page. That data is embedded in an internal, versioned client-hydration payload (not the public Schema.org structured data) and isn't a stable, reliably-parseable format — it's intentionally not extracted here to avoid shipping a field that breaks silently on Seniorly's next front-end deploy. Everything published in Seniorly's public `LocalBusiness` structured data (phone, address, coordinates, description, reviews, aggregate rating) and its server-rendered amenities list *is* extracted in full.

### FAQ

**Does this require login or cookies?**
No. All data comes from Seniorly's public, server-rendered pages.

**Why do some communities have no `telephone` or `amenities`?**
Those fields only exist on the community's own detail page. Run with `includeDetails: true` (or use `communityDetails` mode) to fetch them.

**Can I search outside the United States?**
No — Seniorly only covers US senior-living communities.

**Are all fields always present?**
No — only fields with real data are included. A community without a published starting price, for example, simply omits `fromPriceMonthly`.

# Actor input Schema

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

What to fetch.

## `careCategory` (type: `string`):

Which senior-care category page to search.

## `state` (type: `string`):

US state to search in.

## `city` (type: `string`):

City name within the chosen state, e.g. `Dallas`, `Austin`, `Houston`. Any spelling/casing accepted; normalized to Seniorly's URL slug automatically.

## `careType` (type: `string`):

Restrict results to communities offering this specific care type. `Any` keeps every community returned by the chosen category.

## `minScore` (type: `number`):

Drop communities scored below this. Seniorly scores are one-decimal floats (e.g. 9.9), so fractional values are accepted. Communities without a published score always pass through.

## `maxPrice` (type: `integer`):

Drop communities whose starting monthly price is above this. Communities without a published price always pass through.

## `verifiedOnly` (type: `boolean`):

Only keep communities carrying Seniorly's "Verified" badge.

## `keyword` (type: `string`):

Keep only communities whose name contains this text (case-insensitive).

## `includeDetails` (type: `boolean`):

Fetch each community's detail page for full description, phone number, exact address, coordinates, amenities and every review (not just the score/price summary). Adds one extra request per result.

## `communityUrls` (type: `array`):

Full Seniorly community URLs, e.g. `https://www.seniorly.com/assisted-living/texas/dallas/belmont-village-turtle-creek`.

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

Hard cap on emitted records. Seniorly paginates city results in blocks of ~20 communities (larger metro areas span several pages); this actor follows pagination automatically up to this limit.

## Actor input object example

```json
{
  "mode": "search",
  "careCategory": "assisted-living",
  "state": "texas",
  "city": "Dallas",
  "careType": "any",
  "verifiedOnly": false,
  "includeDetails": false,
  "communityUrls": [],
  "maxItems": 20
}
```

# Actor output Schema

## `communities` (type: `string`):

Dataset containing all scraped Seniorly communities.

# 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": "search",
    "careCategory": "assisted-living",
    "state": "texas",
    "city": "Dallas",
    "careType": "any",
    "verifiedOnly": false,
    "includeDetails": false,
    "communityUrls": [],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/seniorly-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 = {
    "mode": "search",
    "careCategory": "assisted-living",
    "state": "texas",
    "city": "Dallas",
    "careType": "any",
    "verifiedOnly": False,
    "includeDetails": False,
    "communityUrls": [],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/seniorly-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 '{
  "mode": "search",
  "careCategory": "assisted-living",
  "state": "texas",
  "city": "Dallas",
  "careType": "any",
  "verifiedOnly": false,
  "includeDetails": false,
  "communityUrls": [],
  "maxItems": 20
}' |
apify call crawlerbros/seniorly-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/seniorly-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/i2hg6FPFj9kM8fd7E/builds/V7gnpB9vMk65nZKMe/openapi.json
