# Zillow Rentals Scraper - Apartments, Units & Rent Prices (`benthepythondev/zillow-rentals-scraper`) Actor

Scrape Zillow rental listings by city, ZIP code or search URL. Get rent ranges, floor plans, available units, leasing phone, move-in specials and pet policy as JSON, CSV or Excel.

- **URL**: https://apify.com/benthepythondev/zillow-rentals-scraper.md
- **Developed by:** [Ben](https://apify.com/benthepythondev) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.25 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🏢 Zillow Rentals Scraper - Apartments, Units & Rent Prices

Pull rental listings from Zillow by city, ZIP code or search URL. Each row is one apartment building or one home for rent, with its rent range, floor plans, individual units, leasing phone and move-in specials. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

### 🔎 What is the Zillow Rentals Scraper?

It is an Apify Actor that reads Zillow's rental search for the places you name and then opens each listing page for the details. You get the same data a renter sees on Zillow, as structured rows instead of web pages.

A search for "Austin, TX" returns apartment communities such as Edison Austin with 12 floor plans, every available unit and the leasing office phone. A search limited to houses returns single homes with the listed rent, Zillow's rent estimate and the rent history.

No browser is started and no third-party unblocker is used, so runs are quick. In our tests 10 listings with full details took about 7 seconds, and 300 listings across Chicago and Houston took about 100 seconds.

#### What data does it extract?

- **Listing identity:** `listingId`, `listingType` (building or home), `name`, `url`
- **Location:** `address`, `street`, `city`, `state`, `zip`, `neighborhood`, `county`, `latitude`, `longitude`
- **Rent:** `rentMin` and `rentMax` (advertised monthly price), `baseRentMin` and `baseRentMax` (before required monthly fees), `unitTypes` with the starting rent per bedroom count
- **Size:** `bedsMin`, `bedsMax`, `baths`, `sqft`
- **Availability:** `unitsAvailable`, `totalUnits`, `availableFrom`
- **Floor plans and units:** `floorPlans[]` with name, beds, baths, sqft, rent range, lease term and a `units[]` list (unit number, rent, sqft, available date)
- **Contact:** `phone`, `leasingContact`, and for single homes `agentName` and `brokerName` when Zillow lists them
- **Offers and rules:** `moveInSpecials`, `petPolicy` (fees and limits per pet type), `allowedPets`, `fees`, `leaseTerm`
- **Extras:** `amenities`, `description`, `walkScore`, `transitScore`, `bikeScore`, `yearBuilt`, `daysOnZillow`, `rentZestimate`, `priceHistory`, `photoCount`, `imageUrl`, `has3DTour`

`detailsLoaded` tells you whether the listing page was read. If it is `false`, the row holds the search data only.

### ⬇️ Input

| Field | Type | What it does |
|---|---|---|
| `locations` | array | Cities ("Austin, TX"), ZIP codes ("78704") or full Zillow rental search URLs |
| `maxResults` | integer | Maximum listings to save across all locations |
| `minRent`, `maxRent` | integer | Monthly rent range in dollars |
| `minBeds`, `minBaths` | integer | Minimum bedrooms and bathrooms |
| `propertyType` | string | `any`, `apartments`, `houses` or `townhomes` |
| `includeDetails` | boolean | Open each listing for floor plans, units, phone, specials and pet policy. On by default |

Filters apply to cities and ZIP codes. A pasted Zillow URL keeps the filters it already contains, which is handy when you have set up a search on zillow.com by hand.

#### Example input

```json
{
  "locations": ["Austin, TX", "78704"],
  "maxResults": 100,
  "maxRent": 2500,
  "minBeds": 2,
  "propertyType": "apartments",
  "includeDetails": true
}
```

### ⬆️ Output

One row per listing. This is a real row, shortened:

```json
{
  "listingId": "2750798958",
  "listingType": "building",
  "name": "Edison Austin",
  "url": "https://www.zillow.com/apartments/austin-tx/edison-austin/CkBPsG/",
  "address": "4711 E Riverside Dr, Austin, TX 78741",
  "city": "Austin",
  "state": "TX",
  "zip": "78741",
  "neighborhood": "Pleasant Valley",
  "latitude": 30.230991,
  "longitude": -97.71912,
  "propertyType": "BUILDING",
  "rentMin": 1541,
  "rentMax": 3141,
  "baseRentMin": 1295,
  "baseRentMax": 2895,
  "bedsMin": 0,
  "bedsMax": 2,
  "unitsAvailable": 12,
  "totalUnits": 354,
  "unitTypes": [{"beds": 0, "rentFrom": 1541}, {"beds": 1, "rentFrom": 1841}, {"beds": 2, "rentFrom": 2741}],
  "phone": "(512) 807-0820",
  "floorPlans": [
    {
      "name": "E2", "beds": 0, "baths": 1, "sqft": 509,
      "rentMin": 1541, "rentMax": 1541, "baseRentMin": 1295, "baseRentMax": 1395,
      "availableFrom": "now", "leaseTerm": "6 Months",
      "units": [{"unit": "Unit 2315", "rent": 1541, "baseRent": 1295, "sqft": 509, "availableFrom": "now"}]
    }
  ],
  "moveInSpecials": ["Austin's Largest Award-Winning Floor Plans - Luxury Living with Breathtaking Skyline Views!"],
  "petPolicy": [{"type": "cats", "allowed": true, "monthlyFee": 50, "oneTimeFee": 500, "maxNumber": 5}],
  "amenities": ["Garbage Disposal", "Dishwasher", "Microwave", "Refrigerator"],
  "walkScore": 48,
  "transitScore": 55,
  "bikeScore": 57,
  "has3DTour": true,
  "detailsLoaded": true,
  "scrapedAt": "2026-10-02T13:30:51+00:00"
}
```

A home for rent has the same core fields plus `baths`, `sqft`, `yearBuilt`, `daysOnZillow`, `rentZestimate`, `allowedPets`, `fees` and `priceHistory` (for example `{"date": "2026-09-29", "event": "Listed for rent", "price": 2095}`).

### 💰 How much does it cost?

You pay per listing saved, plus a tiny start fee per run.

| Apify plan | Price per 1,000 listings |
|---|---|
| Free | $5.00 |
| Starter | $4.75 |
| Scale | $4.50 |
| Business and above | $4.25 |

A run that saves 100 listings costs $0.50 on the Free plan. Set **Maximum cost per run** in the run options and the Actor stops at that amount. Floor plans, units and contact details are included in the listing price.

### 💡 Use cases

- 🏘️ **Rental comps:** pull asking rents and unit mixes for a neighborhood before pricing your own units.
- 📈 **Market tracking:** schedule a weekly run for the same ZIP codes and compare `rentMin`, `unitsAvailable` and `moveInSpecials` over time.
- 📞 **Leasing office outreach:** build a list of communities with phone numbers, unit counts and current specials.
- 🧮 **Investment screening:** compare listed rent with `rentZestimate` and rent history on single-family rentals.

### ❓ FAQ

**How many listings can I get per search?** Zillow serves about 820 listings per search (20 pages). For a large city, pass several ZIP codes or narrow rent ranges as separate locations and the Actor merges them without duplicates.

**Why is `phone` empty on some rows?** Apartment communities almost always publish a leasing phone. Many single homes do not, and Zillow routes those contacts through its own form, so the field stays empty.

**What is the difference between `rentMin` and `baseRentMin`?** Zillow now shows a total monthly price that includes required fees. `rentMin` is that advertised total. `baseRentMin` is the rent before those fees, when the listing reports it.

**Can I paste a Zillow search URL?** Yes. Set up any rental search on zillow.com, copy the address bar and use it as a location. The URL's own filters are kept and the input filters are ignored for that entry.

**Does it cover homes for sale?** No. This Actor reads rentals only. For homes for sale and sold homes use the [Zillow Search Scraper](https://apify.com/benthepythondev/zillow-scraper).

**How fresh is the data?** Every run reads Zillow live. Nothing is cached between runs.

**What happens if Zillow blocks a request?** The Actor switches to another connection route and retries. If a listing page still cannot be read, the row is saved with the search data and `detailsLoaded: false`, so one bad page never costs you the whole run.

**Can I run it on a schedule?** Yes. Create an Apify schedule with the same input, then compare datasets or send each run to Google Sheets, a webhook or your database through Apify integrations.

**Is it legal to scrape Zillow rentals?** The Actor collects listing information that Zillow shows publicly to any visitor and does not log in or bypass a paywall. You are responsible for how you use the data. Phone numbers and agent names are business contact details, but privacy and marketing rules such as GDPR, CCPA and CAN-SPAM still apply to outreach, and Zillow's terms of use apply to you as well. If in doubt, ask a lawyer.

**Something is missing or broken?** Open an issue on the Actor's Issues tab with the run ID. Issues are answered within one business day.

### 🧩 Need this as a managed feed?

If you would rather receive a weekly rent and availability file for your markets than run the Actor yourself, request a quote at <https://benthepythondev00.github.io/custom.html>.

### 🔗 You might also like

- [Zillow Search Scraper](https://apify.com/benthepythondev/zillow-scraper)
- [Zillow Detail Scraper](https://apify.com/benthepythondev/zillow-detail-scraper)
- [Apartments.com Rent & Availability Monitor](https://apify.com/benthepythondev/apartments-com-rent-monitor)
- [Zumper Rental Scraper & Price Change Monitor](https://apify.com/benthepythondev/zumper-rental-scraper)
- [HotPads Rental Scraper](https://apify.com/benthepythondev/hotpads-rental-scraper)
- [Rent.com Scraper](https://apify.com/benthepythondev/rent-com-scraper)
- [PadMapper Rental Scraper](https://apify.com/benthepythondev/padmapper-rental-scraper)
- [Craigslist Real Estate Scraper](https://apify.com/benthepythondev/craigslist-real-estate-scraper)

**Keywords:** zillow rentals scraper, zillow rental listings, zillow apartments scraper, zillow rent prices, zillow api alternative, rental listings data, apartment floor plans data, rent comps, rental market data, apartment availability, leasing office phone numbers, property management leads, multifamily data, rent price tracking, zillow csv export, real estate data api, rental property scraper, houses for rent data

# Actor input Schema

## `locations` (type: `array`):

City and state ("Austin, TX"), 5-digit ZIP codes ("78704"), or full Zillow rental search URLs. The filters below apply to cities and ZIP codes; a pasted URL keeps its own filters.

## `maxResults` (type: `integer`):

Maximum number of rental listings to save across all locations. Each listing is one charged result. Zillow serves about 820 listings per search, so split a large city by ZIP code to get more.

## `minRent` (type: `integer`):

Only listings with a unit at or above this monthly rent.

## `maxRent` (type: `integer`):

Only listings with a unit at or below this monthly rent.

## `minBeds` (type: `integer`):

Only listings with at least this many bedrooms. Leave empty for any, including studios.

## `minBaths` (type: `integer`):

Only listings with at least this many bathrooms.

## `propertyType` (type: `string`):

Zillow home type to include.

## `includeDetails` (type: `boolean`):

Open every listing page to add floor plans, units, leasing phone, move-in specials, pet policy, amenities and rent history. Turn off for a faster run with search data only.

## Actor input object example

```json
{
  "locations": [
    "Austin, TX"
  ],
  "maxResults": 10,
  "propertyType": "any",
  "includeDetails": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Austin, TX"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/zillow-rentals-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": ["Austin, TX"],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/zillow-rentals-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Austin, TX"
  ],
  "maxResults": 10
}' |
apify call benthepythondev/zillow-rentals-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,benthepythondev/zillow-rentals-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Rjp5UiIzCpAb5EEGG/builds/0Spbbo5gz1caotSpy/openapi.json
