Apartments.com Reviews Scraper

Export public Apartments.com property reviews for recurring reputation monitoring.

Data fields

FieldTypeDescription
reviewIdstringValue exported as reviewId.
propertyNamestringValue exported as propertyName.
propertyUrlstringValue exported as propertyUrl.
authorstring | nullValue exported as author.
titlestring | nullValue exported as title.
bodystringValue exported as body.
ratingnumber | nullValue exported as rating.
datePublishedstring | nullValue exported as datePublished.

Input preview

startUrlsProperty URLs
resumeCheckpointResume checkpoint
maxItemsMaximum reviews
maxReviewsPerPropertyReviews per property

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

Ready-to-run examples

Open a saved Apify example, adjust the input, and run the actor in your own Apify account.

View all examples

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

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.

Common questions

Questions and answers reused from the canonical actor README.

Why did my URL fail?

Use a direct public Apartments.com property page, not a search or category page.

Are all fields always present?

No. Optional public values such as author, title, rating, date, language, and aggregate values can be absent when the target page does not supply them.

How are duplicates handled?

reviewId is derived from the target property and public review content. A review is saved once per run, making scheduled snapshot comparison straightforward.

Can I schedule reputation monitoring?

Yes. Save a task with your property URLs, schedule it in Apify, and compare the next dataset with the previous one.

Can I run Apartments.com Reviews Scraper through an API, schedule, or MCP client?

Yes. The same JSON input works through Apify API clients, cURL, scheduled tasks, and the MCP tool link above.