# Zillow Property Manager Directory by City (`vexaloom-labs/zillow-property-manager-directory-by-city`) Actor

Search Zillow's property manager directory by city/state, or read specific profile URLs directly. Returns business name, contact details, ratings, reviews, rental listings, specialties, and service areas.

- **URL**: https://apify.com/vexaloom-labs/zillow-property-manager-directory-by-city.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Property Manager Directory by City

Zillow's professional directory lists property managers and property management companies by location, with a profile page for each one covering contact details, reviews, service areas, licenses, team members, and the homes they currently manage. This actor searches that directory by city, ZIP code or neighborhood, or reads specific directory and profile URLs you already have, and returns the profiles as structured records.

No login, cookie, API key or proxy configuration is needed.

### What this actor does

- Searches Zillow's professional directory with the Property Management specialty selected, for one or many locations.
- Paginates directory results (16 profiles per page) and stops cleanly at Zillow's 25-page cap.
- Accepts Zillow directory URLs and individual profile URLs, including legacy `property-manager-reviews` links, which are converted to the live directory path automatically.
- Filters by specialty, spoken language, and Zillow's Top Professional badge.
- Enriches every result from its profile page: business details, bio, social links, licenses, team roster, service areas, reviews with sub-ratings, and current rental and for-sale listings.
- Leaves a field out of a record whenever the source does not publish it.

### Modes

| Mode | What it reads |
|---|---|
| Search by city, ZIP or neighborhood | Builds a directory URL for each entry in `locations` and paginates it. |
| Scrape specific Zillow URLs | Reads the directory and profile URLs in `startUrls`. |

If you supply both locations and URLs, both are processed. Older saved tasks that send `location` instead of `locations` keep working: the old key is mapped automatically.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `location` | Search by location, or scrape specific URLs. |
| `locations` | string list | `Dallas, TX` (prefill) | City and state, ZIP code, or neighborhood. |
| `startUrls` | request list | `[]` | Directory or profile URLs. Legacy property-manager URLs are mapped to the live path. |
| `specialties` | multi-select | `property-management` | Zillow specialties to include. |
| `languages` | multi-select | `[]` | Only profiles that speak at least one selected language. |
| `isTopAgent` | boolean | `false` | Only profiles with Zillow's Top Professional badge. |
| `maxManagers` | integer | `50` | Maximum profiles to return (1–1000). |
| `endPage` | integer | `5` | Maximum directory pages per location or directory URL (1–25). |
| `maxReviews` | integer | `10` | Recent reviews per profile (0–10; Zillow exposes the 10 most recent). |

#### Example: search a city

```json
{
  "mode": "location",
  "locations": ["Dallas, TX"],
  "maxManagers": 50,
  "endPage": 3
}
```

#### Example: several ZIP codes with a language filter

```json
{
  "mode": "location",
  "locations": ["92104", "94103"],
  "languages": ["spanish", "farsi"],
  "maxManagers": 100
}
```

#### Example: read a directory page and a specific profile

```json
{
  "mode": "urls",
  "startUrls": [
    "https://www.zillow.com/professionals/real-estate-agent-reviews/austin-tx/?specialties=property-management",
    "https://www.zillow.com/profile/Ziprent"
  ],
  "maxReviews": 10
}
```

### Output per property manager

- `encodedZuid`, `name`, `screenName`, `profileUrl`, `photoUrl`, `inCanada` — identity
- `businessName`, `businessAddress`, `businessCity`, `businessState`, `businessZip` — business details
- `phone`, `email`, `website` — contact details when published
- `professionalTitle`, `description`, `yearsInIndustry`, `memberSince`, `profileTypes` — professional profile
- `facebookUrl`, `instagramUrl`, `linkedInUrl`, `tiktokUrl`, `youtubeUrl`, `twitterUrl` — social links
- `isTopAgent`, `reviewRating`, `reviewCount` — Zillow badge and rating summary
- `tags`, `directoryStats` — badges and directory card statistics (price range, sales)
- `specialties`, `languages` — services and spoken languages
- `serviceAreas`, `serviceAreasDetailed` — places served, with absolute Zillow URLs when available
- `licenses`, `otherLicenses` — license number, state, type, status, and expiration
- `teamName`, `teamMembers` — team roster with each member's rating and profile URL
- `recentReviews` — recent reviews with `text`, `rating`, `date`, `reviewerName`, `reviewerProfileUrl`, `subRatings`, `workDescription`, `response`, `responseAuthor`
- `forRentListings`, `forSaleListings` — managed properties with address, price, beds, baths, home type, photo, coordinates, status, and URL
- `location` — the directory search that surfaced the manager
- `scrapedAt` — ISO 8601 timestamp of the run

### Use cases

- Build a city-by-city list of property management companies for outreach.
- Compare ratings, review volume, and service areas before choosing a manager.
- Track which rental inventory a management company currently lists.
- Verify licenses and team members for vendor onboarding.
- Map coverage across ZIP codes and neighborhoods.

### Limitations

- Zillow serves at most 25 directory pages per location and filter combination, which is 400 profiles. To reach more, run separate searches by location, language, or specialty.
- A profile page exposes the 10 most recent reviews. `maxReviews` is capped at 10.
- Some profiles do not publish an email, website, or active listings; those fields are omitted rather than filled with placeholders.
- A directory search can include real estate agents and teams that also select Property Management as a specialty, not only dedicated management companies.

### FAQ

**Is this affiliated with Zillow?**
No. It reads Zillow's publicly visible professional directory and is not affiliated with or endorsed by Zillow Group.

**Do I need to log in, supply cookies, or configure a proxy?**
No. The actor uses a Chrome-compatible TLS fingerprint and public pages. It only switches to Apify Proxy automatically if Zillow blocks a direct request.

**Why do some results look like real estate agents?**
Zillow's directory includes any professional who selects Property Management as a specialty, including agents and teams that manage rentals. Use the profile's `specialties` and `businessName` to tell dedicated management companies apart.

**Can I use a legacy property-manager URL?**
Yes. `https://www.zillow.com/professionals/property-manager-reviews/{location}/` links are converted to the live directory path automatically.

**How do I cover more than 400 profiles in one city?**
Split the city by language, specialty, or ZIP code and run each search separately, then combine the datasets. Every profile carries `encodedZuid` and `profileUrl`, so duplicates are easy to remove.

**Does it work outside the United States?**
It works wherever Zillow's directory lists professionals. Canadian cities are included when Zillow has profiles for them; if a location has no results, the run reports it instead of returning fabricated rows.

# Actor input Schema

## `mode` (type: `string`):

What to scrape. Search by location uses the directory; Scrape specific URLs reads directory pages and profile pages you supply.

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

One location per line: city and state ("Dallas, TX"), ZIP code ("92104"), or a neighborhood ("Hyde Park, Austin, TX"). Each location is searched with the Property Management specialty filter.

## `startUrls` (type: `array`):

Zillow professionals directory pages or individual profile URLs. Legacy /professionals/property-manager-reviews/... URLs are converted to the live directory path automatically.

## `specialties` (type: `array`):

Zillow professional specialties to include. The actor is built for property managers, so Property Management is selected by default; add another specialty to widen the search.

## `languages` (type: `array`):

Only include profiles that speak at least one of these languages. Leave empty for all languages.

## `isTopAgent` (type: `boolean`):

Only include profiles Zillow has awarded its Top Professional badge.

## `maxManagers` (type: `integer`):

Maximum number of property manager profiles to return. Zillow serves at most 400 per location and filter combination (16 per page, 25 pages).

## `endPage` (type: `integer`):

Maximum directory pages to crawl per location or directory URL. Each page contains 16 profiles and Zillow clamps at page 25.

## `maxReviews` (type: `integer`):

Maximum recent reviews to include per profile. Zillow exposes the 10 most recent reviews on a profile page.

## Actor input object example

```json
{
  "mode": "location",
  "locations": [
    "Dallas, TX"
  ],
  "startUrls": [],
  "specialties": [
    "property-management"
  ],
  "languages": [],
  "isTopAgent": false,
  "maxManagers": 3,
  "endPage": 1,
  "maxReviews": 3
}
```

# Actor output Schema

## `propertyManagers` (type: `string`):

Dataset containing all scraped Zillow property manager profiles.

# 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 = {
    "mode": "location",
    "locations": [
        "Dallas, TX"
    ],
    "startUrls": [],
    "specialties": [
        "property-management"
    ],
    "languages": [],
    "isTopAgent": false,
    "maxManagers": 3,
    "endPage": 1,
    "maxReviews": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/zillow-property-manager-directory-by-city").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 = {
    "mode": "location",
    "locations": ["Dallas, TX"],
    "startUrls": [],
    "specialties": ["property-management"],
    "languages": [],
    "isTopAgent": False,
    "maxManagers": 3,
    "endPage": 1,
    "maxReviews": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/zillow-property-manager-directory-by-city").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 '{
  "mode": "location",
  "locations": [
    "Dallas, TX"
  ],
  "startUrls": [],
  "specialties": [
    "property-management"
  ],
  "languages": [],
  "isTopAgent": false,
  "maxManagers": 3,
  "endPage": 1,
  "maxReviews": 3
}' |
apify call vexaloom-labs/zillow-property-manager-directory-by-city --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/zillow-property-manager-directory-by-city"
        }
    }
}
```

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/eyYiB7tenqROBp349/builds/MSyYUD2WbJxFHNhod/openapi.json
