Appearance
Apartments.com Scraper API
Turn apartments.com into structured rental data. Send a city and a state, get back normalized apartment listings - rent, beds, amenities, specials, leasing-office phone - or point at one property URL and get the full detail record with floor plans, units, fees and neighborhood scores. No proxy pool, headless browser farm or parser maintenance on your side: apartments.com is behind an active anti-bot layer, and ScrapeIt renders every request in a hardened remote browser through rotating residential proxies.
It ships as three products, all sharing the same field model:
| Product | Type | Product code | What it does |
|---|---|---|---|
| Apartments.com Listing API | Scraper API (synchronous) | apartments_com_listing | Search a city/neighborhood and get back normalized listing cards. |
| Apartments.com Property API | Scraper API (synchronous) | apartments_com_property | Give one property URL, get the full property detail. |
| Apartments.com Scraper | No-code (Scrapers without code) | apartments_com | Run a search in the dashboard and download JSON, CSV or XML result files. |
The two APIs return their data flat (every field is snake_case, same convention as the Web Scraping API). The field groups below organize the reference and drive the no-code output shape (see Output formats).
What people build with it
| Use case | What you pull |
|---|---|
| Rental market research | Rent ranges per bedroom class, unit availability and specials across a city or ZIP. |
| Competitive pricing | Daily rent and concession tracking for a set of competing properties. |
| Lead generation | Leasing-office phone, website and management company per property. |
| Real-estate data products | A rental dataset with geography, amenities, floor plans, fees and walk/transit scores. |
| Investment & underwriting | Year built, unit counts, floor-plan mix and asking rents for a submarket. |
Two ways to run it: the API (integrate into your own pipeline) or the no-code scraper (fill a form in the dashboard, download a file). Both produce the same fields.
Apartments.com Listing API
GET https://api.scrapeit.io/api/v1/scrape/apartments/listing
x-api-key: YOUR_SCRAPEIT_API_KEYcity and state are required and build the geography; everything else narrows the result set the same way the site's own filters do. One request returns one results page - up to 40 cards.
Basic parameters
| Parameter | Type | Example | Description |
|---|---|---|---|
city | string | Miami | Required. Target city, e.g. Miami. |
state | string | FL | Required. Two-letter US state code, e.g. FL. |
neighborhood | string | Brickell | Optional neighborhood within the city, e.g. Brickell. |
min_price | number | 1500 | Minimum monthly rent in USD. |
max_price | number | 3000 | Maximum monthly rent in USD. |
min_bedrooms | number | 1 | Minimum bedrooms (0 = studio). |
max_bedrooms | number | 2 | Maximum bedrooms (0 = studio). |
min_bathrooms | number | 1 | Minimum bathrooms. |
property_type | string | apartments | apartments (default), houses, condos or townhomes. |
limit | number | 20 | Max listings to return, 1–40. Defaults to 40. |
include_detail | boolean | true | Also scrape each card's Property page and nest it under detail. Billed as one extra unit per card. |
Any parameter not listed on this page is rejected with 400 VALIDATION_ERROR instead of being silently ignored.
Advanced filters ("More filters")
These mirror the site's All Filters panel and sit behind More filters in the run form.
| Parameter | Type | Example | Description |
|---|---|---|---|
amenities | string[] | pool,in-unit-washer-dryer | Amenity slugs, e.g. pet-friendly, pool, in-unit-washer-dryer. |
space | string | entire_place | entire_place or room_for_rent. |
home_styles | string[] | new_construction | duplex, new_construction, fewer_than_50_units. |
housing_type | string | student | Specialty housing, e.g. student, senior, military, corporate. |
short_term | boolean | true | Short-term / furnished rentals only. |
income_restricted | boolean | true | Income-restricted / affordable housing only. |
pet_policy | string | dog | dog, cat, dog_and_cat or none. |
include_html | boolean | true | Also return the fetched page HTML in html. Paid add-on: +4 credits per request. |
Example request
Search Miami, FL for 1-bedroom rentals between $1,500 and $3,000:
bash
curl -G "https://api.scrapeit.io/api/v1/scrape/apartments/listing" \
-H "x-api-key: YOUR_SCRAPEIT_API_KEY" \
--data-urlencode "city=Miami" \
--data-urlencode "state=FL" \
--data-urlencode "min_price=1500" \
--data-urlencode "max_price=3000" \
--data-urlencode "min_bedrooms=1" \
--data-urlencode "limit=20"js
const params = new URLSearchParams({
city: 'Miami',
state: 'FL',
min_price: '1500',
max_price: '3000',
min_bedrooms: '1',
limit: '20',
});
const response = await fetch(`https://api.scrapeit.io/api/v1/scrape/apartments/listing?${params}`, {
headers: { 'x-api-key': process.env.SCRAPEIT_API_KEY ?? 'YOUR_SCRAPEIT_API_KEY' },
});
const { data } = await response.json();
console.log(data.result_count, data.items[0].name);python
import os
import requests
response = requests.get(
"https://api.scrapeit.io/api/v1/scrape/apartments/listing",
params={
"city": "Miami",
"state": "FL",
"min_price": 1500,
"max_price": 3000,
"min_bedrooms": 1,
"limit": 20,
},
headers={"x-api-key": os.environ.get("SCRAPEIT_API_KEY", "YOUR_SCRAPEIT_API_KEY")},
)
data = response.json()["data"]
print(data["result_count"], data["items"][0]["name"])Listing response
The envelope carries the resolved geography, pagination and the normalized cards. Every card is flat snake_case; the comments show which group each field belongs to.
json
{
"data": {
"search_url": "https://www.apartments.com/miami-fl/1-bedrooms-1500-to-3000/",
"geography": {
"display": "Miami, FL",
"city": "Miami",
"state": "FL",
"county": "Miami-Dade",
"latitude": 25.7743,
"longitude": -80.1937
},
"total_units": 1284,
"total_results": 650,
"market_snapshot": {
"label": "Average 1-Bedroom Rent",
"average_rent": 2311,
"year_over_year_change_percent": -1.2
},
"current_page": 1,
"total_pages": 33,
"next_page_url": "https://www.apartments.com/miami-fl/1-bedrooms-1500-to-3000/2/",
"prev_page_url": null,
"result_count": 20,
"items": [
{
"listing_id": "qnn7y2y",
"name": "The Skylar",
"url": "https://www.apartments.com/the-skylar-miami-fl/qnn7y2y/",
"street_address": "1444 NW 14th Ave",
"address": "1444 NW 14th Ave, Miami, FL 33125",
"city": "Miami",
"state": "FL",
"zip": "33125",
"country_code": "US",
"rent_summary": [
{ "beds_label": "Studio", "price": "$2,050+", "price_min": 2050 },
{ "beds_label": "1 Bed", "price": "$2,311+", "price_min": 2311 }
],
"rent_min": 2050,
"rent_max": 3400,
"beds_label": "Studio - 2 Beds",
"monthly_fees_note": "required monthly fees of $76 - $130",
"required_monthly_fees_min": 76,
"required_monthly_fees_max": 130,
"lease_term": "12 Month Lease",
"has_total_monthly_price": true,
"property_management": "Greystar",
"phone": "(786) 373-2228",
"amenities": ["Pool", "Fitness Center", "In-Unit Washer & Dryer"],
"specials": ["1 Month Free"],
"image_url": "https://images1.apartments.com/i2/…/the-skylar.jpg",
"image_count": 34,
"has_video": true,
"has_3d_tour": false,
"is_featured": true,
"is_for_rent_by_owner": false
}
]
}
}Fields by group:
- Identity -
listing_id,name,url. - Location -
street_address,address,city,state,zip,country_code. - Pricing -
rent_summaryandbase_rent_summary(rent grouped by bedroom class),rent_min,rent_max,beds_label,monthly_fees_notewith the parsedrequired_monthly_fees_min/required_monthly_fees_maxit includes,lease_term(the lease the price is quoted for, e.g.12 Month Lease),has_total_monthly_price. - Contact -
property_management,logo_url,phone. - Features -
amenities,specials. - Media -
image_url,image_count,has_video,has_3d_tour. - Flags -
is_featuredandis_for_rent_by_owner(truewhen the card carries the "For Rent By Owner" badge - listed directly by the owner, not a management company). - Detail - the full Property object, present only when
include_detail=trueand the card's page was served. A card whose property page was refused by the site comes back withoutdetail. The Listing API answers synchronously, so when the property pages do not fit its reply time the remaining cards come back withoutdetail. For full detail on every card, use the no-code scraper, which runs detail jobs in the background.
Pagination is reported by current_page, total_pages and next_page_url. total_units is the rental count the site states for the market ("16,096 Rentals"), total_results the number of properties the search pages through ("Showing 40 of 700 Results"). market_snapshot carries the market's average rent and its year-over-year change in percent (negative when rents fell); it is null when the page shows no snapshot.
Empty results and blocked pages
- A search the site answers with 0 rentals (strict filters, a small town) returns
200withresult_count: 0andtotal_units: 0. It is billed as one listing request, like any other reached target. - A page that comes back without cards and without that zero count is a refusal by the site's anti-bot layer, not an empty search. ScrapeIt re-renders it once; if the second pass is refused too, the request fails with
502 TARGET_BLOCKED.
Apartments.com Property API
GET https://api.scrapeit.io/api/v1/scrape/apartments/property
x-api-key: YOUR_SCRAPEIT_API_KEY| Parameter | Type | Example | Description |
|---|---|---|---|
url | string | https://www.apartments.com/the-skylar-miami-fl/qnn7y2y/ | Required. Absolute apartments.com property URL. |
include_html | boolean | true | Also return the fetched page HTML in html. Paid add-on: +4 credits per request. |
The leasing-office contact block (address, phone, hours, website) is always part of the record.
bash
curl -G "https://api.scrapeit.io/api/v1/scrape/apartments/property" \
-H "x-api-key: YOUR_SCRAPEIT_API_KEY" \
--data-urlencode "url=https://www.apartments.com/the-skylar-miami-fl/qnn7y2y/"Property response fields
The Property API returns the full detail record. Fields are flat snake_case; here they are listed by group.
- Identity -
listing_id,name,url,canonical_url. - Location -
address,street_address,city,state,zip,neighborhood,latitude,longitude. - Pricing -
rent_label,rent_min,rent_max,beds_label,baths_label,square_feet_label. - Overview -
description,rating,review_count,year_built,units_count,stories,pets_allowed,move_in_special. - Contact (leasing office) -
listed_by(owner/property_manager/broker),property_management,property_management_logo_url,phone,website_url,leasing_office_address,office_hours(per weekday range),languages. - Media -
photo_count,video_count,virtual_tour_count,images. - Amenities -
community_amenities,apartment_features,unique_features. - Floor plans -
floor_plans: an array of models, each withmodel_name,beds,baths,square_feet,rent_min/rent_max,rent_label, availability and aunitsarray (unit_number,price,square_feet,available_date, …). - Fees -
fees: rows ofname,amount,category(e.g.Required Fees,Pets,Parking). - Neighborhood -
schools,transportation,points_of_interest(each a nearby place withname,category,distance,commute) andscores(walk_score,transit_score,bike_score,sound_score). - FAQs -
faqs:question/answerpairs.
Example (trimmed):
json
{
"data": {
"listing_id": "qnn7y2y",
"name": "The Skylar",
"url": "https://www.apartments.com/the-skylar-miami-fl/qnn7y2y/",
"address": "1444 NW 14th Ave, Miami, FL 33125",
"city": "Miami",
"state": "FL",
"zip": "33125",
"neighborhood": "Health District",
"latitude": 25.7873,
"longitude": -80.2148,
"rent_label": "$2,050 – $3,400",
"rent_min": 2050,
"rent_max": 3400,
"beds_label": "Studio - 2 bd",
"baths_label": "1 - 2 ba",
"square_feet_label": "500 - 1,120 sq ft",
"rating": 4.5,
"review_count": 62,
"year_built": 2021,
"pets_allowed": true,
"listed_by": "property_manager",
"property_management": "Greystar",
"phone": "(786) 373-2228",
"website_url": "https://www.theskylarmiami.com",
"leasing_office_address": "1444 NW 14th Ave, Miami, FL 33125",
"office_hours": [
{ "days": "Monday - Friday", "hours": "9am - 6pm" },
{ "days": "Saturday", "hours": "10am - 5pm" }
],
"languages": "English, Spanish",
"community_amenities": ["Pool", "Fitness Center", "Rooftop Deck"],
"apartment_features": ["In-Unit Washer & Dryer", "Stainless Steel Appliances"],
"floor_plans": [
{
"model_name": "A2",
"beds": 1,
"baths": 1,
"square_feet": 620,
"rent_min": 2311,
"rent_max": 2456,
"rent_label": "$2,311 – $2,456",
"is_available": true,
"units": [
{
"unit_number": "0512",
"price": "$2,311",
"price_value": 2311,
"square_feet": 620,
"availability_status": "Available Now"
}
]
}
],
"fees": [{ "name": "Cat Rent", "amount": "$25 / mo", "category": "Pets" }],
"scores": { "walk_score": 88, "transit_score": 64, "bike_score": 72, "sound_score": null },
"faqs": [
{
"question": "Does The Skylar have any specials?",
"answer": "Yes - 1 month free on select units."
}
]
}
}Rentals: contact goes through the site
apartments.com is a rentals marketplace, so the contact block is the leasing office, not an individual owner or agent. There is no owner/agent email in the data - inquiries on apartments.com go through the property's on-site Message / Request Tour form. Use phone, website_url and office_hours to reach the office; listed_by tells you whether it is an owner, property_manager or broker.
Apartments.com Scraper (no-code)
The no-code product runs the same search from the dashboard's Scrapers without code section - no API key or code required. You fill in the same basic and advanced filters, the job scrapes every results page (optionally each property), and you download the aggregated result files.
Up to 5 pages without include_detail run right away and answer with the finished job. A larger job, or any job with include_detail, is queued and runs in the background: the response is the queued job, and the dashboard follows it until the files are ready. A job started over HTTP with an API key (POST /api/v1/scrapers/apartments/jobs) runs under that key, queued or not: its pages count in the key's usage.
In a no-code job limit caps the whole export, not each results page: limit: 30 writes the first 30 listings of the search, in the site's order. A listing repeated on a later page is written once, and the job stops when apartments.com serves a page it already served. The output formats must name at least one of json, csv and xml (json only when omitted).
Output formats: JSON, CSV, XML
Each finished job produces three downloadable files from the very same records. The field groups decide the shape:
- JSON - grouped and nested: each record's fields sit under their group object (
location,pricing,contact, …), with identity fields at the top level. Best for APIs and code. - CSV - one flat row per record, columns prefixed by group (
contact_phone,location_city,pricing_rent_min). Nested values render readably in a single cell (arrays join with|), so the spreadsheet never explodes into hundreds of columns. Top-level fields (listing_id,name,url) stay unprefixed. - XML - grouped elements, one
<listing>per record under a<listings>root, mirroring the JSON grouping.
With include_detail, the property record travels in every format: nested under detail and grouped like the Property API in JSON and XML, and spread into detail_-prefixed columns in CSV (detail_location_latitude, detail_contact_website_url, detail_floor_plans). Cards without detail leave those cells empty.
The same Miami card in each format:
json
{
"listing_id": "qnn7y2y",
"name": "The Skylar",
"url": "https://www.apartments.com/the-skylar-miami-fl/qnn7y2y/",
"location": { "city": "Miami", "state": "FL", "zip": "33125", "country_code": "US" },
"pricing": { "rent_min": 2050, "rent_max": 3400, "beds_label": "Studio - 2 Beds" },
"contact": { "property_management": "Greystar", "phone": "(786) 373-2228" },
"media": { "image_count": 34, "has_video": true, "has_3d_tour": false },
"features": {
"amenities": ["Pool", "Fitness Center", "In-Unit Washer & Dryer"],
"specials": ["1 Month Free"]
},
"flags": { "is_featured": true, "is_for_rent_by_owner": false }
}text
listing_id,name,url,location_city,location_state,pricing_rent_min,pricing_rent_max,contact_property_management,contact_phone,features_amenities,flags_is_for_rent_by_owner
qnn7y2y,The Skylar,https://www.apartments.com/the-skylar-miami-fl/qnn7y2y/,Miami,FL,2050,3400,Greystar,(786) 373-2228,Pool | Fitness Center | In-Unit Washer & Dryer,falsexml
<?xml version="1.0" encoding="UTF-8"?>
<listings>
<listing>
<listing_id>qnn7y2y</listing_id>
<name>The Skylar</name>
<url>https://www.apartments.com/the-skylar-miami-fl/qnn7y2y/</url>
<location>
<city>Miami</city>
<state>FL</state>
<zip>33125</zip>
</location>
<contact>
<property_management>Greystar</property_management>
<phone>(786) 373-2228</phone>
</contact>
</listing>
</listings>Billing
- Price per unit: 50 credits, flat - proxy and browser rendering are included (request cost).
- Listing - one unit per search request. With
include_detail=true, each property page fetched adds one extra unit. - Property - one unit per property.
- No-code scraper - billed per result page (and per property, when detail is included), the same way the Website Crawler bills per page. The "credits/page" figure in the dashboard is the Listing API price of one page; per-property detail comes on top. The job reports every credit it was charged.
Frequently asked questions
How do I scrape apartments.com rental listings?
Call GET /api/v1/scrape/apartments/listing with a city and a two-letter state code and your API key in the x-api-key header. ScrapeIt renders the search in a hardened remote browser behind rotating proxies and returns up to 40 normalized listing cards per page with rent, beds, amenities, specials, phone and media counts. No scraping code, proxy pool or browser farm is needed on your side.
What data can I extract from an apartments.com property page?
The Property API returns the full detail record for one property URL: rent range, beds, baths and square feet, description, rating and review count, year built, floor plans with individual units and availability dates, fees, community amenities and apartment features, photos and virtual tours, schools, transportation and points of interest, walk/transit/bike scores, and the leasing office contact block with phone, website and office hours.
Can I export apartments.com data to CSV, JSON or XML?
Yes. The no-code Apartments.com Scraper runs the same search from the dashboard and produces three downloadable files from the same records: grouped JSON, a flat CSV with group-prefixed columns that opens cleanly in Excel or Google Sheets, and grouped XML. Files are downloaded through short-lived tokens from the Files section.
Does the Apartments.com Scraper return owner or agent e-mail addresses?
No. Apartments.com is a rentals marketplace where enquiries go through the property page contact form, so no owner or agent e-mail exists in the source data. ScrapeIt returns the leasing-office contact instead: phone, website, office hours and a listed_by field marking the listing as owner, property_manager or broker.
How much does scraping apartments.com cost in credits?
One listing search page costs one unit, and one property page costs one unit. With include_detail=true each property page fetched behind a listing adds one extra unit.
Related pages
- Zillow Scraper API - the same shape for for-sale, for-rent and sold homes.
- Web Scraping API - the general single-URL scraper and its proxy/rendering options.
- Website Crawler - crawl a whole site instead of a structured search.
- Batch Scraping API - run many property URLs through one asynchronous job.
- Files & artifacts - download the no-code JSON/CSV/XML result files.
- Billing & credits - credit prices and plans.
- Errors - stable error codes returned when a target blocks or a parameter is invalid.
- Managed Apartments.com scraping - ScrapeIt builds, runs and monitors the scraper for you and delivers ready-to-use data.