Apartments.com Scraper - US Rental Listings
Pricing
from $2.20 / 1,000 results
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
Maintained by CommunityActor stats
1
Bookmarked
6
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Security
Limited permissionsShare
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
startUrlsfor search pages, individual listings, or sitemaps. These take priority overlocation. - Child rows:
includeUnitsadds floorplans and available units;includeReviewsadds 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, orincludeRentCalendaralso 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
| Field | Description | Example |
|---|---|---|
rowType | Entity represented by this row | listing |
id | Stable row identifier | example1 |
propertyName | Advertised property name | Example Apartments |
listingUrl | Apartments.com listing link | https://www.apartments.com/example-apartments-austin-tx/example1/ |
address | Structured address | {"street":"123 Example Street","locality":"Austin","region":"TX"} |
geo | Latitude and longitude when available | {"lat":30.27,"lng":-97.74} |
price | Lower advertised rent | 1500 |
priceHigh | Upper advertised rent | 2400 |
bedRange | Bedroom summary | 1–2 Beds |
phones | Available listing phone numbers | [{"value":"+1 555 0100","type":"office"}] |
managementCompany | Management company when supplied | Example Property Management |
amenities | Advertised amenities | ["Pool","Fitness Center"] |
unitCount | Total units in the building, not available inventory | 180 |
availableUnitCount | Number of available units reported | 8 |
leadAbsences | Reasons 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
| Field | Description | Example |
|---|---|---|
rowType | Floorplan entity | floorplan |
parentId | Parent listing identifier | example1 |
modelName | Floorplan name | Plan A |
beds | Bedroom count; zero means studio | 1 |
sqft | Floor area in square feet | 750 |
Unit rows
| Field | Description | Example |
|---|---|---|
rowType | Available unit entity | unit |
unitNumber | Advertised unit number | 101 |
floorplanId | Related floorplan identifier when available | example1:floorplan:plan-a |
price | Advertised rent for this unit | 1550 |
availabilityDate | Availability date supplied by the listing | 2026-11-01 |
Review rows
| Field | Description | Example |
|---|---|---|
rowType | Review entity | review |
reviewId | Review identifier when supplied | review-example-1 |
rating | Review rating | 4 |
text | Review text | Example review text. |
submissionDate | Review submission date | 2026-10-01 |
How to scrape Apartments.com
- Open Apartments.com Scraper in Apify Console.
- Enter
location, or paste Apartments.com links intostartUrls. - Set
maxItemsto5for a small first run. - Click Start and wait for completion.
- 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.
Location search
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
| Field | What to enter | Default |
|---|---|---|
location | One US city and state | Sample: Austin, TX |
startUrls | Apartments.com search, listing, or sitemap URLs | Empty |
maxItems | Maximum rows per location or URL; 1–200 | 70; example 3 |
propertyType | Rental type; see filtering limitation above | apartments |
includeUnits | Add separate floorplan and available unit rows | false |
includeReviews | Add separate review rows | false |
includeFees | Add fee details and available floorplan/unit rows | false |
includeTours | Add tour information and available floorplan/unit rows | false |
includeRentCalendar | Add rent-calendar details to available unit rows | false |
rentCalendarMaxUnits | Units per listing to request calendars for; 1–10 | 3 |
includePhotos | Request photos and additional listing information | false |
includeWalkscore | Request walking, transit, and cycling scores | false |
includeFeatures | Request property and unit features | false |
includePropertyMap | Request property-map information | false |
includeSubmarket | Request submarket information | false |
fields | Output field names; empty or ["*"] keeps available fields | Empty |
scrapeDetails | Enable the detail-failure threshold; basic detail fields are already requested | false |
maxDetailFailRatio | Failure ratio allowed after at least two detail attempts when scrapeDetails is true | 0.5 |
requestDelayMillis | Pause between listing requests; 0–10000 milliseconds | 500 |
deepCoverage | Request broader coverage of large areas, without guaranteeing completeness | false |
optionMask | Advanced numeric search filter; leave empty unless you know the value | Empty |
geog | Advanced geographic search object; otherwise use location | Empty |
commute | Coordinates, travel minutes, and transportation method for approximate area filtering | Empty |
sitemapSince | Earliest sitemap modification date, YYYY-MM-DD | Empty |
sort | Source sort value, such as price or rating | Source order |
maxPages | Optional page limit; does not increase the normal search's row allowance | 1 |
blockImages | Leave at its default for normal runs | true |
rowLayout | Keep rows; nested output is not available through this Actor | rows |
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 plan | Start fee at 512 MB | Price per row | Price 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 ApifyClientclient = 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
Is it legal to scrape Apartments.com?
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
deepCoverageenabled. - 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
rowLayoutatrows.
Related scrapers
More real estate and property data scrapers from the same publisher:
- Zumper Scraper
- Booli Scraper
- Craigslist Scraper
- PropertyGuru Scraper
- OpenSooq Scraper
- Dot Property Scraper
- FINN.no Scraper
- Immobiliare.it Scraper
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.