The fastest way to start scraping Apartments.com at scale. Structured JSON for rental search and full property detail — including every individual rentable unit with its own rent, beds, baths, square footage and availability date, not just a property\u2019s advertised range. Anti-bot bypass built in. No Apartments.com account.
No credit card required · PAYG credits never expire
# Search 1-bed rentals in Kansas City
import scrapebadger
client = scrapebadger.ScrapeBadger("sb_live_...")
results = client.apartments.search(
location="kansas-city-mo",
beds=1
){
"property_id": 12345678,
"street_line": "1200 Barton Hills Dr",
"city": "Austin", "state": "TX",
"price": 675000,
"beds": 3, "baths": 2, "sqft": 1620,
"days_on_market": 6
}Structured JSON responses with normalized data models. No HTML parsing. No proxy management. No Apartments.com API key.
/v1/apartments/search/v1/apartments/property?url=/v1/apartments/properties/{slug}/{id}All fields are normalized from Apartments.com’s server-rendered pages — no browser, no HTML for you to parse. Floor plans and their units come pre-parsed and nested, plus a flattened units array across the whole property. Availability is returned verbatim (“Now”, “Sep 3”): the site renders no year, so it is deliberately not converted to a date.
property_idstringapartments.com listing keynamestringProperty nameaddress_linestringFull address as renderedcity / state / postal_codestringSplit address componentslatitude / longitudefloatGeo coordinatesphonestringLeasing phone numberrent_range_textstringAdvertised range, e.g. $1,288 - $5,412beds_textstringAdvertised bed range, e.g. 1 - 3 bdamenitiesarrayAmenity labels, deduplicatedoffice_hoursarrayLeasing-office hoursphotosarrayGallery image URLsfloor_plansarrayModels with price range, beds/baths, sqft and their unitsunitsarrayEvery unit across every floor plan, flattenedtotal_units_availableintegerCount of individually-listed unitsunit_numberstringUnit label, e.g. 8625-2231rentintegerThe advertised monthly rent — use this onemax_term_rentintegerRaw data-maxrent (~2x advertised, an upper bound across lease terms)bedsfloatBedrooms — 0.0 for a studiobathsfloatBathroomssqftintegerSquare footageavailable_textstringAvailability verbatim — "Now", "Sep 3"model_namestringFloor plan this unit belongs toapply_now_urlstringDirect application link when offeredphoto_countintegerPhotos attached to the unitBoth countries are served from apartments.com behind a US residential proxy. There is no separate market or currency parameter to manage.
No proxy setup. No session management. No anti-bot configuration.
Call any Apartments.com endpoint with your API key — a location slug to search, or a property URL for full unit-level detail. REST or SDK.
ScrapeBadger routes the request through a residential proxy with Chrome impersonation, detects blocks, and falls back to a real browser when needed.
Receive normalized JSON with floor plans, per-unit rent and availability, amenities and photo links — ready to store, analyse, or pipe into your application.
Scraping Apartments.com gives you real rental-market signals — asking rent per unit, unit mix by beds and square footage, and how availability moves across a market.
Pull unit-level rents across a market to build true comparables — the actual asking rent per unit, per floor plan, not just a property’s advertised range.
Track which units come on and off the market and when they become available to spot absorption rates and seasonal turnover.
Assemble unit mixes by beds, baths and square footage across a portfolio or submarket to benchmark rent per square foot.
Power search and alerting in a rental app with live listings, amenities, photos and per-unit availability dates.
Collect structured rental data — unit specs, amenities, descriptions and photos — for pricing, classification and recommendation models.
Feed newly-available units and price changes into CRM and lead-gen tooling, filtered by bedroom count and rent band.
You only pay for successful responses — failed requests are always free. PAYG credits never expire; volume subscription tiers reduce per-credit cost further.
| Endpoint | Credits / request | PAYG | Subscription |
|---|---|---|---|
Search Listings /search | 5 credits | — | — |
Property Detail /property?url= | 5 credits | — | — |
Property by slug + id /properties/{slug}/{id} | 5 credits | — | — |
See the full plan comparison on the pricing page — subscription tiers step down per-credit cost beyond the cheapest column shown above.
ScrapeBadger's Apartments.com Scraper API handles everything Apartments.com throws at automated requests — so your pipeline keeps running.
Most rental data stops at "$1,288 – $5,412". This returns every individual rentable unit with its own rent, beds, baths, square footage and availability date — the granularity rent comps actually need.
apartments.com sits behind Akamai Bot Manager. ScrapeBadger handles fingerprinting, exit rotation and block detection automatically — no proxies or CAPTCHAs on your end.
The whole page is server-rendered, so responses come back in roughly two seconds with no browser in the path — far faster and cheaper than a headless-browser approach.
Normalized typed JSON — no HTML to parse and no fragile CSS selectors that break when apartments.com restyles its unit grid.
Credits are deducted only for successful responses. A blocked request returns 422 and costs nothing.
Official typed SDKs for Python and Node.js/TypeScript, plus a CLI and hosted MCP server. Or call the REST API directly from any language.
Get started in minutes with Python, Node.js, or plain HTTP requests.
The scrapebadger Python library wraps the Apartments.com API with typed methods. Install with pip install scrapebadger, then start scraping Apartments.com in a few lines of code.
from scrapebadger import ScrapeBadger
client = ScrapeBadger("sb_live_...")
# Search 1-bed rentals in Kansas City under $1,500
results = client.apartments.search(
location="Austin, TX",
price_max=700000,
)
# Get the full detail for the first few results
for home in results.results[:3]:
detail = client.apartments.property(property_id=home.property_id)
print(unit.unit_number, unit.rent, unit.available_text)import ScrapeBadger from 'scrapebadger'
const client = new ScrapeBadger({
apiKey: 'sb_live_...'
})
// Pull every rentable unit with its own rent and availability
const { property } = await client.apartments.property({
propertyId: '12345678',
})
prop.units.forEach((u) => console.log(u.unit_number, u.rent, u.available_text))
for (const event of property.priceHistory) {
console.log(event.date, event.event, event.price)
}Common questions about scraping Apartments.com with the API — Python, Node.js, or REST.
No. You only need a ScrapeBadger API key. There is no apartments.com developer programme and no upstream credentials are involved.
Use rent. It is the advertised monthly price the site shows a renter. max_term_rent is apartments.com’s raw data-maxrent attribute, which measures roughly twice the advertised rent and appears to be an upper bound across lease terms — we expose it unparsed for completeness, but it is not the rent.
It is the segment right after the domain in apartments.com’s own URLs — kansas-city-mo, new-york-ny, austin-tx — or a ZIP code such as 64108.
Some properties advertise floor plans rather than individual units. Those return valid plan-level beds, baths, rent and square footage with units_available of 0. That is the site’s own layout, not missing data.
It is returned verbatim as text — "Now", "Sep 3". apartments.com renders no year, so converting it to a timestamp would mean guessing the rollover. We leave it as text deliberately.
Up to 40 property cards per page, with pages 1 to 28. The response includes the site’s own total so you know how deep the result set goes.
Per-request credit costs are listed above. For higher monthly volume, subscription tiers reduce the per-credit rate substantially. All Apartments.com endpoints — search and property detail with unit-level pricing — are included on every plan.
1,000 free credits. No credit card. Get your API key in under a minute.
PAYG credits never expire · Pay only for successful requests · US coverage