# Apartments.com API — live US rental listings scraper: search apartments for rent by city, ZIP, neighbourhood or map box and get each building's rent range per bed count, amenities, address, coordinates, photos and leasing phone, plus property lookup by listing id — no API key, no login

> Rental buildings in a place. Give a `location` ('Austin, TX', '78704', 'Downtown Chicago'), or a `bounding_box`, or `latitude`+`longitude`+`radius_miles`. Each row is a BUILDING with one entry per bed count in `floor_plans` — that is how apartments.com publishes rent, and flattening it would lose the price signal. `total_units` is the source's own count of available UNITS in the box, which is a different measure from the number of buildings returned.
> ReefAPI engine `apartments` · 3 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/apartments/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/apartments/v1/search — 2 credits
Rental buildings in a place. Give a `location` ('Austin, TX', '78704', 'Downtown Chicago'), or a `bounding_box`, or `latitude`+`longitude`+`radius_miles`. Each row is a BUILDING with one entry per bed count in `floor_plans` — that is how apartments.com publishes rent, and flattening it would lose the price signal. `total_units` is the source's own count of available UNITS in the box, which is a different measure from the number of buildings returned.

**Parameters:**
- `location` (string, optional) — Where to search: a US city and state ('Austin, TX'), a ZIP code ('78704'), a neighbourhood ('Downtown Chicago') or a street address. Resolved to a map box before the search runs. Pass `bounding_box` or `latitude`+`longitude` instead if you already have coordinates.
- `bounding_box` (string, optional) — An explicit map box as 'south,west,north,east' (or an object with lower_right / upper_left). Skips the location lookup entirely.
- `latitude` (number, optional) — Centre latitude. Used with `longitude` and `radius_miles`.
- `longitude` (number, optional) — Centre longitude. Used with `latitude` and `radius_miles`.
- `radius_miles` (number, optional, default 5) — Half-height of the box drawn around `latitude`/`longitude`, in miles.
- `limit` (integer, optional, default 40) — How many buildings to return. The source serves 40 per page, so a larger limit costs one upstream page per 40.
- `page` (integer, optional, default 1) — Which page of results to start from.
- `sort` (enum, optional, default "default") — Result order. This is applied BY THE SOURCE — the page echoes it back — unlike the filters below, which this API applies to the rows. [one of: default, rent_low_to_high, rent_high_to_low, newest, recently_updated, distance, 3d_tour, video]
- `min_rent` (integer, optional) — Keep buildings whose rent range reaches this monthly rent in USD. Applied by this API to the returned rows. A building that publishes no rent ('Call for Rent') cannot be confirmed to match, so it is left out whenever a rent filter is set.
- `max_rent` (integer, optional) — Keep buildings whose cheapest published rent is at or below this. Applied by this API to the returned rows. Buildings with no published rent are left out.
- `min_beds` (integer, optional) — Keep buildings offering at least this many bedrooms (0 = studio). Applied by this API.
- `max_beds` (integer, optional) — Keep buildings offering at most this many bedrooms. Applied by this API.
- `pets` (boolean, optional, default false) — Keep only buildings whose amenity list mentions pets. The full pet policy is not published on this surface.
- `amenities` (array, optional) — Keep buildings whose amenity list contains all of these (case-insensitive substring match). Applied by this API to the short list the source publishes.
- `has_3d_tour` (boolean, optional, default false) — Keep only buildings with a 3D tour.
- `has_video` (boolean, optional, default false) — Keep only buildings with a video.
- `specials_only` (boolean, optional, default false) — Keep only buildings advertising a move-in special (free months, discounts).

**Returns:** results[]{property_id, url, name, address, street, city, state, postal_code, floor_plans[]{beds, beds_label, rent_from, rent_to, rent_display, price_is_from}, rent_min, rent_max, beds_min, beds_max, amenities[], pet_policy_summary, specials[], phone, image, image_count, has_video, has_3d_tour}, total_units, new_unit_count, location{…}, bounding_box, page, limit, filters_applied_by

**Example request body:**
```json
{
  "location": "Austin, TX",
  "limit": 40
}
```

### POST https://api.reefapi.com/apartments/v1/property/detail — 1 credit
One building by its listing key or apartments.com URL: name, street address, city, state, coordinates, renter rating, the published rent range and bed range, the neighbourhood label and the main photo. The full floor-plan table, fee schedule and pet policy are NOT served on the open surface — see the API notes.

**Parameters:**
- `property_id` (string, required) — The building's apartments.com listing key (7 characters, e.g. 'pdh91xs') or its full apartments.com URL.

**Returns:** property{property_id, name, url, street, city, state, latitude, longitude, rating, rent_display, rent_min, rent_max, beds_display, beds_min, beds_max, image, neighborhood}

**Example request body:**
```json
{
  "property_id": "pdh91xs"
}
```

### POST https://api.reefapi.com/apartments/v1/locations — 1 credit
Turn a typed place name into the ids, coordinates and map box that `search` takes — and the number of units each place currently has. Cities, ZIP codes, neighbourhoods, counties and street addresses all come back, each tagged with its type.

**Parameters:**
- `query` (string, required) — What the renter typed: a city, a ZIP code, a neighbourhood or a street address.
- `limit` (integer, optional, default 15) — How many suggestions to return.

**Returns:** locations[]{location_id, display, type, city, state, postal_code, county, market, latitude, longitude, bounding_box, available_unit_count}

**Example request body:**
```json
{
  "query": "austin"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=apartments
- Human docs page: https://reefapi.com/docs/apartments
- Overview page: https://reefapi.com/apartments-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
