Apartments.com Scraper - US Rental Listings avatar

Apartments.com Scraper - US Rental Listings

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Apartments.com Scraper - US Rental Listings

Apartments.com Scraper - US Rental Listings

Extract US rental listings from Apartments.com with rents, addresses, contact details, and optional floorplan, unit, and review rows. Pay per delivered row plus a run start fee.

Pricing

from $2.20 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

6

Total users

1

Monthly active users

5 hours ago

Last modified

Security

Limited permissions

Share

Apartments.com Scraper

Extract US rental listings from Apartments.com as structured rows for rental research, comparison tables, and export.

  • Property names, rents, addresses, available contact information, and listing URLs.
  • Optional floorplan, available unit, and review rows linked to their parent listing.
  • Optional photos, fees, amenities, scores, and tour information where available.
  • Search by location or supply Apartments.com URLs.
  • Pay for delivered rows: $3.00 per 1,000 rows on the Free plan, plus a start fee.

What does Apartments.com Scraper do?

Apartments.com Scraper collects current rental information from apartments.com for US locations. Use it to compare advertised rents, review available inventory, or update a property research spreadsheet. It returns one entity per row, not a complete building's inventory inside one row.

  • Location search: enter a city and state in location.
  • URL input: use startUrls for search pages, individual listings, or sitemaps. These take priority over location.
  • Child rows: includeUnits adds floorplans and available units; includeReviews adds reviews. Both are off by default. Each child row costs the same as a listing row and uses the same row allowance.
  • Additional information: fees, photos, scores, features, maps, rent calendars, submarket information, and tours are optional. Enabling includeFees, includeTours, or includeRentCalendar also enables available floorplan and unit rows.

What data can you extract from Apartments.com?

The tables show commonly useful fields. Availability varies by listing. Every row has rowType, id, listingUrl, source, and scrapedAt. Child rows carry parent identity and location information; use parentId to join them to listings.

Listing rows

FieldDescriptionExample
rowTypeEntity represented by this rowlisting
idStable row identifierexample1
propertyNameAdvertised property nameExample Apartments
listingUrlApartments.com listing linkhttps://www.apartments.com/example-apartments-austin-tx/example1/
addressStructured address{"street":"123 Example Street","locality":"Austin","region":"TX"}
geoLatitude and longitude when available{"lat":30.27,"lng":-97.74}
priceLower advertised rent1500
priceHighUpper advertised rent2400
bedRangeBedroom summary1–2 Beds
phonesAvailable listing phone numbers[{"value":"+1 555 0100","type":"office"}]
managementCompanyManagement company when suppliedExample Property Management
amenitiesAdvertised amenities["Pool","Fitness Center"]
unitCountTotal units in the building, not available inventory180
availableUnitCountNumber of available units reported8
leadAbsencesReasons contact fields are missing{"person":"本站无"}

The reason 本站无 means the field is not provided; 闸门锁 means contact requires a form or restricted access; 未验证 means unconfirmed. The Actor does not extract recipient emails or individual agent names. Management-company and property-website fields can be populated when supplied.

Floorplan rows

FieldDescriptionExample
rowTypeFloorplan entityfloorplan
parentIdParent listing identifierexample1
modelNameFloorplan namePlan A
bedsBedroom count; zero means studio1
sqftFloor area in square feet750

Unit rows

FieldDescriptionExample
rowTypeAvailable unit entityunit
unitNumberAdvertised unit number101
floorplanIdRelated floorplan identifier when availableexample1:floorplan:plan-a
priceAdvertised rent for this unit1550
availabilityDateAvailability date supplied by the listing2026-11-01

Review rows

FieldDescriptionExample
rowTypeReview entityreview
reviewIdReview identifier when suppliedreview-example-1
ratingReview rating4
textReview textExample review text.
submissionDateReview submission date2026-10-01

How to scrape Apartments.com

  1. Open Apartments.com Scraper in Apify Console.
  2. Enter location, or paste Apartments.com links into startUrls.
  3. Set maxItems to 5 for a small first run.
  4. Click Start and wait for completion.
  5. Open the dataset and download the rows, or read them through the API.

Empty input starts an example run for Austin, TX, requesting at most 3 rows from the form's sample settings. Normal start and row charges apply. Filling a target field selects the corresponding input automatically; there is no mode field to configure.

Enter one city and state, such as Austin, TX. propertyType accepts apartments, houses, condos, townhomes, and all, but house, condo, and townhome filters are not applied in normal runs; those requests can return all rental types. Check RUN_SUMMARY for propertyTypeFilter set to not_applied; do not assume those results are filtered.

URL input

Supply one or more search, listing, or sitemap URLs in startUrls, as strings or objects containing url. Apartments.com subdomains are accepted. When URLs are supplied, location is only a summary label. With sitemap inputs, sitemapSince limits entries by their reported modification date, not the date a rental became available.

What to fill in

FieldWhat to enterDefault
locationOne US city and stateSample: Austin, TX
startUrlsApartments.com search, listing, or sitemap URLsEmpty
maxItemsMaximum rows per location or URL; 1–20070; example 3
propertyTypeRental type; see filtering limitation aboveapartments
includeUnitsAdd separate floorplan and available unit rowsfalse
includeReviewsAdd separate review rowsfalse
includeFeesAdd fee details and available floorplan/unit rowsfalse
includeToursAdd tour information and available floorplan/unit rowsfalse
includeRentCalendarAdd rent-calendar details to available unit rowsfalse
rentCalendarMaxUnitsUnits per listing to request calendars for; 1–103
includePhotosRequest photos and additional listing informationfalse
includeWalkscoreRequest walking, transit, and cycling scoresfalse
includeFeaturesRequest property and unit featuresfalse
includePropertyMapRequest property-map informationfalse
includeSubmarketRequest submarket informationfalse
fieldsOutput field names; empty or ["*"] keeps available fieldsEmpty
scrapeDetailsEnable the detail-failure threshold; basic detail fields are already requestedfalse
maxDetailFailRatioFailure ratio allowed after at least two detail attempts when scrapeDetails is true0.5
requestDelayMillisPause between listing requests; 0–10000 milliseconds500
deepCoverageRequest broader coverage of large areas, without guaranteeing completenessfalse
optionMaskAdvanced numeric search filter; leave empty unless you know the valueEmpty
geogAdvanced geographic search object; otherwise use locationEmpty
commuteCoordinates, travel minutes, and transportation method for approximate area filteringEmpty
sitemapSinceEarliest sitemap modification date, YYYY-MM-DDEmpty
sortSource sort value, such as price or ratingSource order
maxPagesOptional page limit; does not increase the normal search's row allowance1
blockImagesLeave at its default for normal runstrue
rowLayoutKeep rows; nested output is not available through this Actorrows

Location example:

{
"location": "Austin, TX",
"maxItems": 5,
"includeUnits": true
}

URL example:

{
"startUrls": [{"url": "https://www.apartments.com/austin-tx/"}],
"maxItems": 5
}

maxItems is the canonical row limit; maxResults, limit, and max_results are accepted aliases. Close field-name misspellings can be corrected; other unknown fields are ignored with a note. An invalid propertyType is ignored, leaving the default. Numeric limits can be adjusted to their allowed range.

Invalid target input stops before any rows are charged. For example: INVALID_INPUT: startUrls: use an apartments.com URL, e.g. https://www.apartments.com/austin-tx/. The start fee can still apply. The INPUT_REPORT record in the default key-value store shows fields filled, normalized, corrected, or ignored. fields can activate optional data requests as well as select output columns; required row identifiers remain included.

Output example

Illustrative listing row, with placeholder property and contact details:

{
"rowType": "listing",
"id": "example1",
"listingId": "example1",
"propertyName": "Example Apartments",
"listingUrl": "https://www.apartments.com/example-apartments-austin-tx/example1/",
"price": 1500,
"priceHigh": 2400,
"city": "Austin",
"state": "TX",
"address": {"street": "123 Example Street", "locality": "Austin", "region": "TX", "country": "US"},
"phones": [{"value": "+1 555 0100", "type": "office"}],
"unitCount": 180,
"source": "apartments.com",
"scrapedAt": "2026-10-24T00:00:00Z"
}

You can export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. Optional fields may be empty or absent; they are not guaranteed on every row.

Why use this Apartments.com scraper?

  • Row-based charges: apart from the start fee, charges apply to delivered rows, not pages attempted.
  • Separate entities: compare properties, floorplans, units, and reviews without counting a building as one unit.
  • Partial results: rows already written remain in the dataset after a stop or timeout. Returned partial results carry warnings in RUN_SUMMARY; unfinished data is not guaranteed to be delivered.
  • Useful error information: input errors identify the field; collection failures are recorded in ERROR_SUMMARY.
  • Missing data stays missing: unavailable contact details are not invented.
  • Multiple URLs: process several supported URLs in one run with a row limit for each.
  • No proxy setup: you do not need to set up proxies.

How much does it cost to scrape Apartments.com?

The Actor uses pay-per-event pricing. The start event costs $0.005 per allocated GB, with a minimum of one event. At the default 512 MB, the start fee is $0.005. Platform usage is included in these prices.

Apify planStart fee at 512 MBPrice per rowPrice per 1,000 rows
Free$0.005$0.0030$3.00
Starter$0.005$0.0030$3.00
Scale$0.005$0.0026$2.60
Business$0.005$0.0022$2.20
Platinum$0.005$0.0020$2.00
Diamond$0.005$0.0016$1.60

maxItems applies to each location or Start URL, defaults to 70, and accepts up to 200. All row types share that allowance: five rows with units enabled does not mean five properties plus free child rows. Larger limits do not guarantee that more matching rentals exist.

Free Apify plan runs are capped at 200 rows, and this Actor allows 10 runs for free-plan users. The whole run also stops at Maximum cost per run, set through maxTotalChargeUsd in the API.

Example: five delivered rows on the Free plan at 512 MB cost $0.005 + 5 × $0.003 = $0.020. A listing, two floorplans, and two units are five billed rows.

What happens when the run timeout is too short

When automatic resume is available and results need longer than the chosen timeout, the run can pause rather than fail. It shows ABORTED with the message: “Queued on the collection backend; this run will resume automatically when results are ready (about N s).”

When results are ready, the same run resumes, delivers rows to the same dataset, and finishes as SUCCEEDED if collection succeeds. The delivery message is “Resumed: delivering N rows.” Already delivered rows are skipped, not delivered or charged again. This automatic pause can happen at most 3 times per run. Keep the default timeout of 3600 seconds to reduce interruptions.

The synchronous endpoints run-sync and run-sync-get-dataset-items wait at most 300 seconds and can return an empty dataset during a pause. For longer runs, start asynchronously, then read the dataset after SUCCEEDED, or use an ACTOR.RUN.SUCCEEDED webhook. A genuine collection failure is different from this temporary pause.

Use with AI agents and the API

Apify MCP server

Connect Claude, ChatGPT, Cursor, VS Code, or another compatible remote MCP client:

https://mcp.apify.com?tools=lentic_clockss/apartments-com-rental-scraper

Sign in with Apify through OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; the agent can read rows with get-dataset-items.

Clients without remote MCP support can use npx @apify/actors-mcp-server --tools lentic_clockss/apartments-com-rental-scraper with APIFY_TOKEN set.

Example prompt: “Find five rental listing rows in Austin, TX. Keep unit and review options off, and return property names, rents, and listing URLs.”

Apify API

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/apartments-com-rental-scraper").call(
run_input={"location": "Austin, TX", "maxItems": 5}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/apartments-com-rental-scraper')
.call({ location: 'Austin, TX', maxItems: 5 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

For asynchronous HTTP calls, send the input as JSON to POST https://api.apify.com/v2/acts/lentic_clockss~apartments-com-rental-scraper/runs with an Authorization: Bearer <YOUR_APIFY_TOKEN> header. After successful completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json. Check the run status before treating an empty response as a search with no matches.

Integrations

Use Apify's Integrations tab to connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable, or your own webhook. Use Apify Schedules for recurring runs.

FAQ

This Actor collects publicly available listing information. You are responsible for complying with Apartments.com terms and applicable data-protection law. Processing personal data requires a lawful basis; public visibility alone does not provide one.

Why did my run end as ABORTED?

An automatic-resume message can indicate a temporary pause, not failure. Wait for the same run to resume. A manually aborted run is different; check its status message rather than assuming every abort resumes.

How many results can I get?

Request 1–200 rows per location or URL with maxItems. Actual output depends on available data, optional child rows, your cost limit, and plan limits. The free-plan limit is 200 rows per run.

Why are some fields empty?

Listings do not all publish the same details. Optional data may be unavailable or fail to load. Missing email addresses and individual contact names are expected, not proof that a listing is invalid.

Can I request only houses, condos, or townhomes?

Those propertyType values are accepted, but their filters are not applied in normal runs. If RUN_SUMMARY reports propertyTypeFilter: "not_applied", the results cover all rental types in the area.

Why did my free-plan run stop after 10 runs?

The Actor applies a 10-run allowance to free-plan users. Reaching it produces a status message. It is separate from the row limit and does not mean the location has no listings.

What happens when listing details fail?

Some incomplete listings are excluded; others can include detailError. With scrapeDetails enabled, exceeding maxDetailFailRatio after at least two detail attempts can fail the run. Check the run summary and error record.

Can I schedule daily searches?

Yes. Save your input in an Apify Schedule. Each scheduled execution is a new run with the same start and row pricing; it is not a free update to an earlier dataset.

Limitations

  • Intended for US rental listings on Apartments.com, not property sales or other listing sites.
  • No guarantee of every property or available unit in a city, even with deepCoverage enabled.
  • Child rows share the listing allowance. Small limits may leave no room for reviews or units.
  • Attribute lists, such as photos and amenities, are capped at 50 entries.
  • Property-type filtering and optional enrichments may be unavailable. Review warnings before comparing results.
  • Commute filtering is approximate: it uses an enclosing area, and listings without coordinates can remain.
  • Nested child output is not available; keep rowLayout at rows.

More real estate and property data scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Report problems or request another field through the Issues tab of this Actor's page. Include the run ID and the input you used.