RentCafe APIrentcafe.com ↗
Search RentCafe apartment listings by US city and state. Get rent ranges, bedroom counts, amenities, coordinates, and pagination metadata via one endpoint.
What is the RentCafe API?
The RentCafe API exposes one endpoint, search_apartments, that returns up to 25 rental property records per page for any US city and state pair. Each record includes rent range, per-bedroom-type starting rents, address with coordinates, amenity details, bedroom and bathroom counts, and pagination context fields like last_page, has_more, and total_rentals — giving you the full scope of a city's RentCafe inventory without manual browsing.
curl -X GET 'https://api.parse.bot/scraper/87ab5697-5f71-4407-9736-7ed40d42ce09/search_apartments?city=San+Francisco&state=CA' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace rentcafe-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: RentCafe apartment search — bounded, re-runnable."""
from parse_apis.rentcafe_com_api import RentCafe, LocationNotFound
client = RentCafe()
# Search apartments in San Francisco with a price ceiling; cap total items.
for apt in client.apartments.search(city="San Francisco", state="CA", max_price=3000, limit=5):
print(apt.name, apt.price_display, apt.beds_display)
for fp in apt.floorplan_bed_prices:
print(f" {fp.beds}: {fp.rent}")
# Drill into the first result of a different search to inspect details.
apt = client.apartments.search(city="Austin", state="TX", limit=1).first()
if apt is not None:
print(apt.name, apt.address_formatted)
print(f" Rent: {apt.min_rent}–{apt.max_rent}")
print(f" Rating: {apt.star_rating} ({apt.reviews_count} reviews)")
print(f" Amenities: {', '.join(apt.amenities)}")
print(f" Details: {apt.details_url}")
# Handle an invalid city/state gracefully.
try:
client.apartments.search(city="Notacity", state="ZZ", limit=1).first()
except LocationNotFound:
print("No listings found for that location.")
print("exercised: apartments.search / LocationNotFound")
Returns one page of apartment rental properties listed on RentCafe for a US city, in the site's default order. Each result is a property (building/community) record with its rent range, bedroom/bathroom range, per-bedroom-type starting rents, address and coordinates, amenities, availability label, ratings, and a link to the property's detail page. Pages hold 25 properties; pass `page` to move through them (omitted = first page). `total_rentals` is the site's own count of matching rentals, while `last_page` is the highest page the site lets you browse (observed at most 10 pages, i.e. the top 250 properties, for an unfiltered city search); `has_more` is true while page < last_page. A `page` beyond `last_page` returns an empty `results` array with `has_more` false, or the site's own error passed through. Optional `min_price` / `max_price` are forwarded to the site's monthly-rent filter and change both the result set and the per-property rent figures shown (rents outside the range are dropped from the property's display). A city/state combination the site has no search page for returns a stale_input (input_not_found) error. Fields `baths_display` and `area_display` can be null when the property does not publish them. One request per call.
| Param | Type | Description |
|---|---|---|
| cityrequired | string | US city name as written on the site, e.g. "San Francisco". Spaces and punctuation are normalized into the site's URL slug. |
| page | integer | 1-based page number of 25 properties each. Must not exceed `last_page` from a previous response. |
| staterequired | string | Two-letter US state code of the city, e.g. CA. Case-insensitive. |
| max_price | integer | Maximum monthly rent in USD. Omitted = no upper bound. |
| min_price | integer | Minimum monthly rent in USD. Omitted = no lower bound. |
{
"type": "object",
"fields": {
"city": "city as passed by the caller",
"page": "page number served",
"state": "upper-cased state code as passed by the caller",
"title": "the site's heading for this search, e.g. \"Apartments for Rent in San Francisco, CA\"",
"results": "array of property records",
"has_more": "true when a following page exists",
"last_page": "highest page number the site offers for this search",
"page_size": "properties per page (25)",
"total_rentals": "site-reported count of rentals matching the search (can exceed what last_page * page_size can reach)",
"results[].max_beds": "maximum bedrooms",
"results[].max_rent": "highest monthly rent in USD (integer) among displayed floorplans",
"results[].min_beds": "minimum bedrooms (0 = studio)",
"results[].min_rent": "lowest monthly rent in USD (integer) among displayed floorplans",
"results[].amenities": "array of amenity names",
"results[].details_url": "URL of the property's detail page on the site",
"results[].property_id": "RentCafe property identifier (string)",
"results[].star_rating": "average review rating 0-5 (0.0 when unrated)",
"results[].area_display": "square-footage range text, null when not published",
"results[].last_updated": "relative last-update label from the site, e.g. \"Today\"",
"results[].baths_display": "bathroom range text, null when not published",
"results[].card_amenities": "array of highlight labels shown on the listing card",
"results[].units_available": "availability label as shown on the card, e.g. \"3 Units available\"",
"results[].floorplan_bed_prices": "array of {beds, rent} starting-rent labels per bedroom type; rent may read \"Ask for pricing\""
},
"sample": {
"data": {
"city": "San Francisco",
"page": 1,
"state": "CA",
"title": "Apartments for Rent in San Francisco, CA",
"results": [
{
"city": "San Francisco",
"name": "The Cornelia Suites",
"phone": "+1 (555) 012-3456",
"state": "CA",
"address": "641 O Farrell Street",
"latitude": 37.7852,
"max_beds": 2,
"max_rent": 2125,
"min_beds": 0,
"min_rent": 1675,
"zip_code": "94109",
"amenities": [
"Dishwasher",
"Hardwood Floors",
"Fireplace"
],
"has_price": true,
"image_url": "https://cdngeneral.rentcafe.com/dmslivecafe/2/92441/Photo-04.jpg",
"longitude": -122.4155,
"details_url": "https://www.rentcafe.com/apartments/ca/san-francisco/the-cornelia-suites/default.aspx",
"has_3d_tour": false,
"photo_count": 37,
"property_id": "160561",
"star_rating": 3.5,
"area_display": "275 - 818 Sqft",
"beds_display": "Studio-2 Beds",
"company_name": "Landmark Realty",
"last_updated": "Today",
"baths_display": "1 Bath",
"price_display": "$1,675 - $2,125",
"reviews_count": 2,
"card_amenities": [
"Apply online",
"Pet friendly",
"In unit laundry"
],
"units_available": "Available",
"address_formatted": "641 O Farrell Street, San Francisco, CA 94109",
"has_online_leasing": true,
"specials_available": false,
"is_premium_featured": true,
"floorplan_bed_prices": [
{
"beds": "Studio",
"rent": "$1,675"
}
]
}
],
"has_more": true,
"last_page": 10,
"page_size": 25,
"total_rentals": 1373
},
"status": "success"
}
}About the RentCafe API
What the API Returns
The search_apartments endpoint accepts a required city string and two-letter state code, then returns a paginated list of apartment communities listed on RentCafe. The top-level response carries metadata: title (the site's heading for the search, e.g. "Apartments for Rent in San Francisco, CA"), total_rentals (the site-reported match count), last_page, has_more, and page_size (fixed at 25). Each entry in the results array is a full property record with fields including max_beds, rent range boundaries, per-bedroom-type starting rents, street address, geographic coordinates, and amenity tags.
Filtering and Pagination
Optional min_price and max_price integer parameters (monthly USD) narrow results to properties whose rent range falls within the specified bounds. Pagination is 1-based via the page parameter; you should not request a page number beyond last_page from a prior response. Note that total_rentals can exceed what last_page * page_size can reach — this reflects a cap the source places on browsable results rather than a data error.
Coverage and Scope
Coverage is limited to US cities that have listings on RentCafe. City names should be passed as they appear on the site (spaces and punctuation are normalized internally). The state code is case-insensitive and is returned upper-cased in the response. There is no sub-city filtering (neighborhood, ZIP code) in the current parameter set; filtering is by price range only.
The RentCafe API is a managed, monitored endpoint for rentcafe.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when rentcafe.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official rentcafe.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a city-level rent index by collecting
total_rentalsand rent range fields across multiple US metros. - Track per-bedroom-type starting rents over time for affordability research or rental market dashboards.
- Aggregate property coordinates from results to plot apartment density maps for a given city.
- Filter listings with
min_priceandmax_priceto surface inventory within a specific budget tier. - Feed property records including amenity tags into a recommendation engine for apartment seekers.
- Monitor
total_rentalschanges week-over-week to detect shifts in rental supply in a target city.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does RentCafe have an official developer API?+
What does a single `search_apartments` result record include?+
results array covers a full property community: rent range (min and max), per-bedroom-type starting rents, max_beds, bathroom range, street address, geographic coordinates, and amenity tags. The top-level response also returns total_rentals, last_page, has_more, and the page's title string.Why does `total_rentals` sometimes exceed what all pages contain?+
last_page reflects that cap. total_rentals is the raw count the site reports for the query and can be higher than last_page * 25. Treat total_rentals as a market-size signal rather than a precise count of retrievable records.Can I filter results by neighborhood, ZIP code, or property type?+
min_price, max_price). Sub-city geographic filters and property-type filters are not exposed. You can fork this API on Parse and revise it to add those parameters if the underlying data supports them for your target cities.