# A Place For Mom Scraper (`crawlerbros/aplaceformom-scraper`) Actor

Scrape senior-living communities from A Place For Mom - assisted living, independent living, memory care, nursing homes and more across the US. Search any city with rating, review-count and care-type filters, or enrich specific communities with full description, phone, pricing and all reviews.

- **URL**: https://apify.com/crawlerbros/aplaceformom-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Lead generation, Real estate
- **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

## A Place For Mom Scraper

Scrape senior-living communities from [A Place For Mom](https://www.aplaceformom.com) — assisted living, independent living, memory care, nursing homes, residential care homes, home care and senior apartments across the United States. Search any city with rating, review-count, keyword and care-type filters, or enrich specific communities with their full description, phone number, price range, exact address 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 A Place For Mom lists
- **7 care categories** — assisted living, independent living, Alzheimer's/memory care, nursing homes, residential care homes, home care, senior apartments
- **Rich filters** — care type, minimum rating, minimum review count, name keyword
- **Sortable** — order results by A Place For Mom's own "recommended" ranking, best rated, most reviews, or name (A-Z)
- **Optional deep enrichment** — turn on `includeDetails` to pull full descriptions, phone numbers, price range, exact street address, GPS coordinates, every review and the community's published FAQ 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`
- `careTypes[]` (e.g. `Memory Care`, `Residential Care`)
- `imageUrl`
- `city`, `state`, `country`
- `rating` (0-10 scale), `ratingScale`, `ratingScaleMin`, `reviewCount`
- `sampleReviewText`, `sampleReviewAuthor`, `sampleReviewRating`, `sampleReviewDate`
- `careCategory`, `searchState`, `searchCity`

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

- `telephone`, `description`, `priceRange`
- `latitude`, `longitude`
- `streetAddress`, `postalCode`
- `reviews[]` — every published review (`text`, `author`, `rating`, `ratingScale`, `ratingScaleMin`, `datePublished`)
- `faqs[]` — the community's published Q\&A (`question`, `answer`) — room types offered, review-score methodology, contact info, etc.
- `providerName`, `providerUrl`

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 |
| `minRating` | int | – | Drop communities rated below this (0-10 scale) |
| `minReviewCount` | int | – | Drop communities with fewer reviews |
| `keyword` | string | – | Keep only communities whose name contains this text |
| `sortBy` | string | `recommended` | Order results before `maxItems` is applied: `recommended`, `bestRated`, `mostReviews`, `nameAsc` |
| `includeDetails` | bool | `false` | Fetch each result's full detail page (description, phone, price range, all reviews, FAQs) |
| `communityUrls` | array | – | Community or home-care agency URLs (mode=communityDetails) |
| `maxItems` | int | `25` | Hard cap on emitted records (1–200; mode=search is always capped at 25 by the source site regardless of this value) |

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

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

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

```json
{
  "mode": "communityDetails",
  "communityUrls": [
    "https://www.aplaceformom.com/community/avalon-memory-care-royal-circle-102501"
  ]
}
```

### Use cases

- **Family caregiving decisions** — compare rated, reviewed senior-living options in a target city before touring
- **Market research** — track community counts, care-type mix and ratings by metro area
- **Lead generation** — build outreach lists of senior-living providers with phone numbers and pricing tier
- **Review monitoring** — pull every published review for a specific community over time

### Notes

- A Place For Mom returns up to 25 communities per city/care-category combination (its own "nearby" result set) — this is a real ceiling of the source site, not an artificial limit. To cover a larger metro area, run additional searches for neighboring city names or a different `careCategory`.
- Ratings are on a 0–10 scale at the community level; individual review ratings inside `reviews[]` are on their own 0–5 scale (`ratingScale` on each review clarifies this).
- If a city/category combination has no A Place For Mom page, the run finishes cleanly with a status message instead of erroring.
- `careCategory: home-care` lists home-care *agencies* rather than physical communities — A Place For Mom hosts these under its own `/agency/` URL path, but every output field is populated the same way as community listings.

### FAQ

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

**Why do some communities have no `priceRange` or `telephone`?**
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 — A Place For Mom only covers US senior-living communities.

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

# 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 A Place For Mom'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.

## `minRating` (type: `integer`):

Drop communities rated below this (A Place For Mom rates on a 0-10 scale). Communities without a published rating always pass through.

## `minReviewCount` (type: `integer`):

Drop communities with fewer reviews than this.

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

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

## `sortBy` (type: `string`):

Order matched communities before applying `maxItems`. Mirrors A Place For Mom's own "Sort By" dropdown (rating/review-count sort is applied here since the site itself does it client-side after the page loads).

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

Fetch each community's detail page for full description, phone number, price range, exact street address, coordinates and all reviews (not just one sample). Adds one extra request per result.

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

Full A Place For Mom community or home-care agency URLs, e.g. `https://www.aplaceformom.com/community/avalon-memory-care-royal-circle-102501` or `https://www.aplaceformom.com/agency/carestaf-of-dallas-134568`.

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

Hard cap on emitted records. A Place For Mom returns at most 25 communities per city/category search, so mode=search is always capped at 25 regardless of this value; mode=communityDetails can fetch up to 200 URLs per run.

## Actor input object example

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

# Actor output Schema

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

Dataset containing all scraped A Place For Mom 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",
    "sortBy": "recommended",
    "includeDetails": false,
    "communityUrls": [],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/aplaceformom-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",
    "sortBy": "recommended",
    "includeDetails": False,
    "communityUrls": [],
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/aplaceformom-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",
  "sortBy": "recommended",
  "includeDetails": false,
  "communityUrls": [],
  "maxItems": 25
}' |
apify call crawlerbros/aplaceformom-scraper --silent --output-dataset

```

## MCP server setup

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