# Zillow Lenders | Search | Detail Page(s) | Scraper (`memo23/zillow-lenders-scraper`) Actor

Extract mortgage lender data from Zillow including: lender names, NMLS IDs, contact info (phone, address, website), ratings & reviews, state licenses, specializations, and detailed bios. Get comprehensive lender profiles for market research and lead generation.

- **URL**: https://apify.com/memo23/zillow-lenders-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, Real estate, Automation
- **Stats:** 78 total users, 4 monthly users, 99.1% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $4.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Lenders Scraper

### How it works

This actor allows you to scrape mortgage lender profiles from Zillow.com and extract important details such as lender name, reviews, contact information, loan types, and other relevant data. The scraper is designed to help you gather comprehensive data on mortgage lenders, which can be useful for market research, contact building, or analyzing lender performance and offerings.

### Features

- **Multiple Search Queries:** Supports scraping based on multiple start URLs (just copy and paste the link/url from Zillow.com site), formatted as:
  - `https://www.zillow.com/lender-directory/?sort=Relevance&location=East%20Point%20GA&language=English`
  - `https://www.zillow.com/lender-directory/?sort=Relevance&location=East%20Point%20GA&name=us&language=English&page=1`
  - **NEW:** You can now also provide direct lender profile URLs, for example:
    - `https://www.zillow.com/lender-profile/Jonathan%20L%20Harris/`

### How to Use

1. **Set Up:** Ensure you have an Apify account and access to the Apify platform.
2. **Configure Proxy Settings:** (Optional) For enhanced reliability, configure proxy settings, as Zillow employs anti-scraping measures.
3. **Provide Start URLs:** Copy the link of the lender directory or lender profile from Zillow.com and paste it into the scraper. Make sure the URLs point to lender directory or lender profile pages.
4. **Run the Scraper:** Execute the scraper and obtain the extracted data in your preferred format, such as JSON, CSV, Excel, or others as supported by Apify.

### Input Data

Here's an example of how to set up a search for lenders or a direct lender profile:

```json
{
    "startUrls": [
        {
            "url": "https://www.zillow.com/lender-directory/?sort=Relevance&location=East%20Point%20GA&language=English"
        },
        {
            "url": "https://www.zillow.com/lender-profile/Jonathan%20L%20Harris/"
        },
        {
            "url": "https://www.zillow.com/lender-directory/?sort=Relevance&location=East%20Point%20GA&name=us&language=English&page=1"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
}
```

### Input Options

- **Start URLs** (`startUrls`): URLs of lender directory or lender profiles to start scraping from. This is an array of strings, where each string is a Zillow URL.
- **Max Concurrency** (`maxConcurrency`): Maximum number of pages that can be processed at the same time. Default is `50`.
- **Min Concurrency** (`minConcurrency`): Minimum number of pages that will be processed at the same time. Default is `1`.
- **Max Request Retries** (`maxRequestRetries`): Number of times the scraper will retry a failed request before giving up. Default is `100`.
- **Proxy Configuration** (`proxy`): Specifies proxy servers that will be used by the scraper to hide its origin, ensuring greater reliability and anonymity. For more details, see the [Proxy configuration](https://apify.com/apify/web-scraper#proxy-configuration).

### Output Structure

The output data typically includes:

```json
{
  "aboutMe": "Critical to the InTown Team is the commitment to treat every client with dignity, respect and value, as we, ourselves, would like to be treated. This requires clear and effective communication at all stages of the mortgage approval and closing process. Our single-minded goal is to bring each loan to a successful conclusion while consistently setting realistic, achievable client expectations along the way. As a Senior Mortgage Consultant, my ultimate goal is to create a lasting relationship with each client so that our team may continue providing excellent service and strategic mortgage planning for many years to come.\n\nShelter Mortgage specializes in the following Mortgage loans:\n\nHome Purchase Loans\n\nHome Refinance Loans\n\nPortfolio Loans for Non-Warrantable Condos, large tracts of land, self-employed borrowers.\n\nJumbo Loans\n\nHome Equity Loans\n\nFHA/VA Loans\n\nHARP Loans\n\nFirst Time Homebuyers\n\nInvestment Property\n\nAs a Mortgage Banker focused on the Atlanta Intown market, I specialize in servicing the following communities - Midtown, Morningside, Virginia Highlands, Buckhead, Decatur, and Grant Park. I am proud to offer unparalleled service in residential lending featuring in-house processing and in-house underwriting to all my clients.\n\nCall Me Today at 404-877-2727 for a Free Consultation or apply online at www.kimpounders.com. Or email me at Kim.Pounders@sheltermortgage.com\n\nKim Pounders",
  "address": {
      "address": "621 North Avenue N.E., Suite #C-50",
      "city": "Atlanta",
      "stateAbbreviation": "GA",
      "zipCode": "30308"
  },
  "cellPhone": {
      "areaCode": "404",
      "number": "2727",
      "prefix": "877"
  },
  "confirmedReviews": 0,
  "equalHousingLogo": "EqualHousingLender",
  "id": "ZUz7bavns6ju2x_39zrd",
  "imageId": "0613e94e6d303bc3b4bc593d6443f96e",
  "individualName": {
      "firstName": "Kim",
      "lastName": "Pounders"
  },
  "languagesSpoken": [],
  "nationallyRegistered": false,
  "nmlsId": 782208,
  "nmlsType": "Individual",
  "officePhone": {
      "areaCode": "404",
      "number": "2727",
      "prefix": "877"
  },
  "rating": 4.9523809523809526,
  "recentReviews": 0,
  "screenName": "Kim Pounders",
  "stateLicenses": {},
  "stateSponsorships": {
      "AL": [
          {
              "license": "60389",
              "sponsors": [
                  2289
              ]
          }
      ],
      "FL": [
          {
              "license": "LO62421",
              "sponsors": [
                  2289
              ]
          }
      ],
      "GA": [
          {
              "license": "43488",
              "sponsors": [
                  2289
              ]
          }
      ],
      "NC": [
          {
              "license": "I-186189",
              "sponsors": [
                  2289
              ]
          }
      ],
      "SC": [
          {
              "license": "MLO - 782208",
              "sponsors": [
                  2289
              ]
          }
      ],
      "TN": [
          {
              "license": "782208",
              "sponsors": [
                  2289
              ]
          }
      ]
  },
  "totalReviews": 147,
  "website": "http://www.kimpounders.com",
  "basicInfo": {
      "confirmedReviews": 0,
      "id": "ZUz7bavns6ju2x_39zrd",
      "imageId": "0613e94e6d303bc3b4bc593d6443f96e",
      "individualName": {
          "firstName": "Kim",
          "lastName": "Pounders"
      },
      "nmlsId": 782208,
      "nmlsType": "Individual",
      "rating": 4.9523809523809526,
      "recentReviews": 0,
      "screenName": "Kim Pounders",
      "totalReviews": 147
  }
}
```

### Output Fields Explanation

- `aboutMe`: Detailed biography and description of the lender, including their specializations, service areas, and contact information.
- `address`: Object containing the lender's business address details, including `address`, `city`, `stateAbbreviation`, and `zipCode`.
- `cellPhone`: Object containing the lender's cell phone number broken down into `areaCode`, `prefix`, and `number`.
- `confirmedReviews`: Number of confirmed reviews for the lender.
- `equalHousingLogo`: Equal housing logo identifier (e.g., "EqualHousingLender").
- `id`: Unique identifier for the lender in Zillow's system.
- `imageId`: Identifier for the lender's profile image.
- `individualName`: Object containing the lender's name with `firstName` and `lastName` fields.
- `languagesSpoken`: Array of languages spoken by the lender.
- `nationallyRegistered`: Boolean indicating if the lender is nationally registered.
- `nmlsId`: NMLS (Nationwide Multistate Licensing System) ID number for the lender.
- `nmlsType`: Type of NMLS registration (e.g., "Individual").
- `officePhone`: Object containing the lender's office phone number broken down into `areaCode`, `prefix`, and `number`.
- `rating`: Average rating score for the lender.
- `recentReviews`: Number of recent reviews received by the lender.
- `screenName`: Display name of the lender on Zillow.
- `stateLicenses`: Object containing state-specific license information.
- `stateSponsorships`: Object containing state-by-state licensing and sponsorship information, with each state containing an array of license numbers and sponsor IDs.
- `totalReviews`: Total number of reviews received by the lender.
- `website`: Lender's website URL.
- `basicInfo`: Object containing summarized basic information about the lender, including `confirmedReviews`, `id`, `imageId`, `individualName`, `nmlsId`, `nmlsType`, `rating`, `recentReviews`, `screenName`, and `totalReviews`.

### Explore More Scrapers

If you found this Zillow Lenders Scraper useful, be sure to check out our other powerful scrapers and actors at [memo23's Apify profile](https://apify.com/memo23). We offer a wide range of tools to enhance your web scraping and automation needs across various platforms and use cases.

👉 Especially our **[Zillow Agents Scraper — Cell, Email & 1.1M+ Database](https://apify.com/memo23/zillow-agents-leads-scraper-ppe)** — every US real-estate agent with a direct cell phone + email, served instantly from a 440,000+ database.

### Support

- For issues or feature requests, please use the [Issues](https://console.apify.com/actors/hhCtq6GLmE7c6TwQw/issues) section of this actor.
- If you need customization or have questions, feel free to contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional Services

- Request customization or whole dataset: <muhamed.didovic@gmail.com>
- If you need anything else scraped, or this actor customized, email: <muhamed.didovic@gmail.com>
- For API services of this scraper (no Apify fee, just usage fee for the API), contact: <muhamed.didovic@gmail.com>
- Email: muhamed.didovic@gmail.com

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/zillow-lenders-scraper`).

**Purpose:** Extract mortgage lender / loan-officer profiles from Zillow — name, NMLS id, ratings, reviews, phones, licenses and website — either from a pre-scraped instant database (by state/city) or by live-scraping Zillow lender-directory and lender-profile URLs.

**Minimal input:**

```json
{
  "dbState": "FL",
  "maxItems": 25
}
```

That runs Instant Database mode (set `dbState` alone). For live scraping instead, leave `dbState` empty and set `startUrls` to Zillow lender-directory or lender-profile URLs.

**Output:** one dataset row per lender — fields include aboutMe, address {address, city, stateAbbreviation, zipCode}, cellPhone {areaCode, prefix, number}, officePhone {...}, confirmedReviews, equalHousingLogo, id, imageId, individualName {firstName, lastName}, languagesSpoken, nationallyRegistered, nmlsId, nmlsType, rating, recentReviews, screenName, stateLicenses, stateSponsorships, totalReviews, website, and basicInfo.

**Behaviors an agent should know:**

- Two modes: Instant Database (`dbState`, optional `dbCity` / `dbCompany` / `dbHasEmail`) returns pre-collected records; Live Scraping uses `startUrls`. Setting `dbState` runs the database and ignores `startUrls`.
- Always set `maxItems` (default 10000) to bound rows and billing.
- `enrichEmails` is billed per email found — charged only when an email is returned. `rocketReach` spends one paid RocketReach lookup credit per match, capped by `rocketReachMaxLookups` (default 25).
- `lenderComparisonReport` adds one `rowType: lenderComparisonReport` row ranking all lenders in the run (needs ≥3 lenders, paid Apify plans only), billed once per report delivered.
- Public data only. Pay-per-event billing — see the Pricing tab on the actor page.

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Zillow Group, Inc. or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available Zillow lender-directory and lender-profile pages — no authenticated endpoints, paid features, or content behind the Zillow login wall. Lender names, phone numbers, and contact details are personal data; users are responsible for ensuring their use complies with Zillow's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

### SEO Keywords

zillow lenders scraper, scrape zillow lenders, zillow mortgage lenders scraper, zillow lender directory scraper, zillow lender profile scraper, zillow.com scraper, Apify zillow, mortgage lender data, loan officer scraper, NMLS lender data, mortgage broker leads, loan officer contact data, mortgage lead generation, real estate finance data, lender reviews scraper, mortgage industry data, NMLS id lookup, loan officer email finder, mortgage lender directory, us mortgage lenders data

# Actor input Schema

## `dbState` (type: `string`):

The US state to pull lenders for — e.g. FL, TX. Setting this alone delivers instant database results.

## `dbCity` (type: `string`):

Narrow the results to a single city (case-insensitive). Leave empty to return the whole state.

## `dbCompany` (type: `string`):

Only return lenders whose company name contains this text (case-insensitive).

## `dbHasEmail` (type: `boolean`):

Return only lenders that have an email address on file.

## `dbFullDetail` (type: `boolean`):

On by default: Instant Database returns the COMPLETE lender record — every field a live scrape produces (NMLS licenses, state sponsorships, about, reviews and more), not just the contact summary. Turn this OFF for a compact, flat contact list (name, company, NMLS id, email, phones, city) that's tidier to open as a CSV.

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

URLs to start with.

## `maxItems` (type: `integer`):

Maximum number of listings/items that will be scraped.

## `maxConcurrency` (type: `integer`):

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Billed per contact email found; only charged when an email is returned, never for misses.

## `rocketReach` (type: `boolean`):

If enabled, resolves each loan officer to a VERIFIED, deliverable personal email via the RocketReach API (matched by name + employer/location). This finds direct addresses that are not on Zillow or the lender's website. Each match spends one RocketReach lookup credit, so it is capped per run (see below). Adds a rocketReachEmails column and promotes the best address into email/emails.

## `rocketReachMaxLookups` (type: `integer`):

Hard cap on how many paid RocketReach lookups a single run may perform, to bound credit spend. Ignored unless RocketReach is enabled.

## `lenderComparisonReport` (type: `boolean`):

Adds a single `rowType: "lenderComparisonReport"` row comparing all lenders delivered in this run (works in both live-scrape and Instant Database mode). Needs at least 3 lenders. Billed once via the `lender-comparison-report` event; never charged when the report can't be built.

## Actor input object example

```json
{
  "dbHasEmail": false,
  "dbFullDetail": true,
  "startUrls": [
    "https://www.zillow.com/lender-directory/?sort=Relevance&location=East%20Point%20GA&name=us&language=English&page=1"
  ],
  "maxItems": 10000,
  "maxConcurrency": 50,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "enrichEmails": false,
  "rocketReach": false,
  "rocketReachMaxLookups": 25,
  "lenderComparisonReport": false
}
```

# 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 = {
    "startUrls": [
        "https://www.zillow.com/lender-directory/?sort=Relevance&location=East%20Point%20GA&name=us&language=English&page=1"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/zillow-lenders-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 = { "startUrls": ["https://www.zillow.com/lender-directory/?sort=Relevance&location=East%20Point%20GA&name=us&language=English&page=1"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/zillow-lenders-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 '{
  "startUrls": [
    "https://www.zillow.com/lender-directory/?sort=Relevance&location=East%20Point%20GA&name=us&language=English&page=1"
  ]
}' |
apify call memo23/zillow-lenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/zillow-lenders-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/8iShEkul7pQcyBO15/builds/WoOyQK8eKGuc2YBdB/openapi.json
