This Apartments.com scraper exports public property reviews for recurring reputation monitoring. Provide direct property URLs and receive normalized, deduplicated Apartments.com data that is easy to compare across scheduled runs or use in an Apartments.com API workflow.
Why use it
Property teams need a dependable snapshot of the public renter feedback shown on known Apartments.com property pages. This Actor turns those public review records into a dataset with a stable review ID, property context, ratings, dates, and source URLs.
Use it to:
- Monitor new renter feedback for a portfolio of known properties.
- Build property-level review snapshots for reporting and dashboards.
- Deduplicate reviews between scheduled exports with
reviewId. - Join review text to a property URL and aggregate-rating context.
- Export public review data to JSON, CSV, Excel, or another workflow.
Who is it for?
Use this Actor when you already know the Apartments.com property pages that matter to your portfolio and want recurring public-review exports. It is suited to reputation teams, property managers, market researchers, and data teams that need review text with a clear property-level source.
Input settings
| Input | Type | Description |
|---|---|---|
startUrls |
array | Required direct public Apartments.com property URLs unless resumeCheckpoint is provided. Search URLs are not supported. |
resumeCheckpoint |
object | Optional schemaVersion 2 PENDING_WORK value copied from a partial prior run. It continues from the saved review position and IDs. |
maxItems |
integer | Global maximum number of review records across the original run and any resume. |
maxReviewsPerProperty |
integer | Maximum public review records saved for each property page. |
A URL is validated before collection. Use the canonical property detail page, not a city, category, or Apartments.com search page.
Resume a partial run without duplicate review charges
If a run ends with status: "partial", copy its entire PENDING_WORK key-value value into resumeCheckpoint for the next run and keep the same limits. The checkpoint contains remaining URLs, the next review position, stable review IDs already saved, and the cumulative count. The resumed run skips those IDs, so it does not save or charge an item event for a review already saved by the interrupted run. A completed resume clears its PENDING_WORK record. The normal one-time start event applies to each new Actor run.
{
"resumeCheckpoint": {
"schemaVersion": 2,
"remainingPropertyUrls": ["https://www.apartments.com/presidential-towers-chicago-il/dsd9v8j/"],
"currentPropertyUrl": "https://www.apartments.com/presidential-towers-chicago-il/dsd9v8j/",
"nextReviewIndex": 1,
"completedReviewIds": ["<64-character-review-id>"],
"savedTotal": 1
},
"maxItems": 10,
"maxReviewsPerProperty": 100
}
Output
Each default-dataset item represents one public property review.
{
"reviewId": "b5d9…",
"propertyName": "Example Property",
"propertyUrl": "https://www.apartments.com/example/",
"author": "Public reviewer",
"title": "Great location",
"body": "Public review text",
"rating": 4,
"datePublished": "2025-01-10",
"language": "en",
"aggregateRating": 4.2,
"aggregateReviewCount": 120,
"sourceUrl": "https://www.apartments.com/example/",
"scrapedAt": "2026-09-05T00:00:00.000Z"
}
Scheduling and comparison
Create an Apify task with the same property URLs and schedule it at the cadence your team needs. Compare reviewId values in each completed dataset to identify new public feedback without treating already-seen reviews as new records.
For portfolio reporting, preserve propertyUrl, sourceUrl, and scrapedAt alongside your own property identifiers. This keeps each review snapshot traceable to its requested public target and collection time.
API usage
Node.js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/apartments-scraper-api-scraper').call({
startUrls: [{ url: 'https://www.apartments.com/presidential-towers-chicago-il/dsd9v8j/' }],
maxItems: 10,
maxReviewsPerProperty: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("fetch_cat/apartments-scraper-api-scraper").call(run_input={
"startUrls": [{"url": "https://www.apartments.com/presidential-towers-chicago-il/dsd9v8j/"}],
"maxItems": 10,
"maxReviewsPerProperty": 10,
})
print(list(client.dataset(run["defaultDatasetId"]).iterate_items()))
cURL
curl "https://api.apify.com/v2/acts/fetch_cat~apartments-scraper-api-scraper/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"startUrls":[{"url":"https://www.apartments.com/presidential-towers-chicago-il/dsd9v8j/"}],"maxItems":10,"maxReviewsPerProperty":10}'
MCP and AI agents
Add the Actor to an MCP-enabled workflow using Apify MCP. Give your agent direct property URLs and the same input limits shown above. Review the resulting dataset before using review text in downstream decisions.
For Claude Code, add the scoped tool server:
claude mcp add --transport http apify https://mcp.apify.com?tools=fetch_cat/apartments-scraper-api-scraper
Equivalent JSON configuration:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=fetch_cat/apartments-scraper-api-scraper"
}
}
}
Example prompts:
- “Collect up to 10 public reviews for this Apartments.com property URL.”
- “Run the Apartments.com reviews tool for these known properties and summarize new review IDs.”
Limits
- Direct public Apartments.com property URLs are required.
- Search, discovery, and category URLs are not supported.
- The Actor does not access accounts, submit reviews, or claim exhaustive review history.
- A property page without public structured reviews can return no rows.
- A source block fails clearly instead of returning misleading empty data.
Support
For help, include the property URL (without private account data), run ID, and a short description of the unexpected result.