# Zillow Daily Mortgage Rate & Lender Quote Scraper (`vexaloom-labs/zillow-daily-mortgage-rate-and-lender-quote`) Actor

Pull Zillow's national mortgage rates, APR, and daily rate trend by loan type, with optional individual lender quotes per state.

- **URL**: https://apify.com/vexaloom-labs/zillow-daily-mortgage-rate-and-lender-quote.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** Real estate, Automation, Lead generation
- **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 Mortgage Rates & Lender Directory Scraper

Pull Zillow's mortgage rates for nine loan products, nationally or by state, for purchase or refinance. Compare today with yesterday, last week, and three months ago; add up to 4,000 days of rate history, payment estimates, Zillow Home Loans points and fees, and an optional Zillow lender directory with names, logos, ratings, and reviews.

No login, API key, or proxy setup is needed.

### What this actor does

- **Nine products:** 30-, 20-, 15-, and 10-year fixed, 5/1 and 7/1 ARM, FHA 30-year, VA 30-year, and jumbo 30-year
- **National and state rates:** choose one state, many states, or national; purchase, refinance, or both
- **Rate context:** current rate and APR, yesterday / last week / three months ago, and Zillow's payment estimate
- **History:** daily, weekly, or monthly series with a requested window from 30 to 4,000 days
- **Zillow Home Loans samples:** rate, APR, points, fees, monthly payment, and price date for matching products
- **Lender directory:** names, logos, ratings, review counts, NMLS IDs, profile URLs, and optional full profiles
- **Omit-empty:** a value Zillow does not publish is left out of the record rather than filled with a placeholder

### Output per rate record

Rate records use `recordType: "aggregate"`.

- `recordType` — always `aggregate`
- `loanType` — `30yr-fixed`, `20yr-fixed`, `15yr-fixed`, `10yr-fixed`, `5/1-arm`, `7/1-arm`, `fha`, `va`, or `jumbo`
- `productType` — `CONFORMING`, `FHA`, `VA`, or `NON_CONFORMING`
- `scope` — `national` or `state`
- `state` — two-letter state code for state rows
- `program` — Zillow program name, e.g. `Fixed30Year`, `ARM5`
- `termYears` — term or initial fixed period in years
- `rateType` — `fixed` or `arm`
- `loanPurpose` — `purchase` or `refinance`
- `currentRate`, `currentApr` — current rate and APR in percent from Zillow's mortgage-rate API (an index; Zillow Home Loans' advertised rates are in `rateSamples` and can differ)
- `rateDate` — source date for the current rate
- `rateComparison` — `yesterday`, `lastWeek`, and `threeMonthsAgo`, each with `rate`, `apr`, and a date (`threeMonthsAgo` is dated today − 90 days)
- `paymentEstimate` — `monthlyPayment`, `loanAmount`, `downPayment`, and `loanToValue` used by Zillow
- `assumptions` — `creditScoreBucket`, `loanToValueBucket`, and `loanAmountBucket` used for the query
- `rateTrend` — array of `{date, rate, apr}` when history is enabled
- `rateSamples` — Zillow Home Loans products matching the record's term and loan type, each with `productName`, `termYears`, `loanType`, `productType`, `rate`, `apr`, `pointsPaid`, `pointsPaidDollar`, `monthlyPayment`, `datePriced`, and FHA/VA mortgage-insurance fields where published
- `source` — `zillow_mortgage_api`
- `scrapedAt` — when the run started

### Output per lender

Lender records use `recordType: "lenderProfile"`.

- `recordType` — always `lenderProfile`
- `lenderName` — company or individual name
- `companyName`, `individualName` — when Zillow publishes them
- `nmlsId`, `nmlsType` — NMLS identifier and registration type
- `rating`, `totalReviews`, `confirmedReviews`, `recentReviews` — Zillow rating and review counts
- `screenName` — Zillow profile slug
- `profileUrl` — absolute Zillow lender profile URL
- `logoUrl` — absolute Zillow lender logo URL
- `address` — `street`, `city`, `state`, `zipCode`
- `website`, `officePhone`, `cellPhone` — published contact details
- `title`, `languagesSpoken`, `stateLicenses`, `aboutMe` — profile enrichment
- `scrapedAt` — when the run started

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `loanPrograms` | array | all nine | Products to request: `30yr-fixed`, `20yr-fixed`, `15yr-fixed`, `10yr-fixed`, `5/1-arm`, `7/1-arm`, `fha-30yr`, `va-30yr`, `jumbo-30yr` |
| `loanPurpose` | string | `purchase` | `purchase`, `refinance`, or `both` |
| `states` | array | `["national"]` | `national` plus any states. State coverage is widest for 30- and 15-year products |
| `creditScore` | string | `veryHigh` | `veryHigh` (740+), `high` (680–739), or `low` (below 680) |
| `loanAmount` | string | `conforming` | `conforming`, `jumbo`, `smallConforming`, `superConforming`, or `micro`. Jumbo 30-year always uses the jumbo bucket |
| `includeRateHistory` | boolean | `false` | Add `rateTrend` to each rate record |
| `historyDays` | string | `90` | `30`, `90`, `365`, `1095`, or `4000` |
| `historyAggregation` | string | `daily` | `daily`, `weekly`, or `monthly` |
| `includeHomeLoanRates` | boolean | `true` | Attach Zillow Home Loans samples with points and fees |
| `includeLenderDirectory` | boolean | `false` | Return lender directory records |
| `lenderLocations` | array | `[]` | Cities, states, or ZIP codes, e.g. `Austin, TX` or `90210` |
| `maxLenders` | integer | `10` | Maximum lender records (1–200) |
| `includeLenderProfiles` | boolean | `false` | Fetch full profiles for up to 50 lenders |

### Example: today's national 30-year fixed rate

```json
{
  "loanPrograms": ["30yr-fixed"],
  "loanPurpose": "purchase",
  "states": ["national"],
  "includeRateHistory": false,
  "includeHomeLoanRates": true
}
```

### Example: purchase and refinance rates in three states

```json
{
  "loanPrograms": ["30yr-fixed", "15yr-fixed", "fha-30yr", "va-30yr"],
  "loanPurpose": "both",
  "states": ["CA", "TX", "NY"],
  "creditScore": "high",
  "loanAmount": "conforming",
  "includeRateHistory": true,
  "historyDays": "365",
  "historyAggregation": "weekly"
}
```

### Example: all products with a 4,000-day history

```json
{
  "loanPrograms": ["30yr-fixed", "20yr-fixed", "15yr-fixed", "10yr-fixed", "5/1-arm", "7/1-arm", "fha-30yr", "va-30yr", "jumbo-30yr"],
  "loanPurpose": "purchase",
  "states": ["national"],
  "includeRateHistory": true,
  "historyDays": "4000",
  "historyAggregation": "monthly"
}
```

### Example: lender directory with full profiles

```json
{
  "loanPrograms": ["30yr-fixed"],
  "states": ["national"],
  "includeLenderDirectory": true,
  "lenderLocations": ["Austin, TX", "CA", "90210"],
  "maxLenders": 25,
  "includeLenderProfiles": true
}
```

### Use cases

- **Rate monitoring:** schedule a daily national or state snapshot and track movement over weeks
- **Mortgage comparison sites:** show rate, APR, payment estimate, and points in one feed
- **Market research:** study state-level purchase and refinance spreads across products
- **Lender research:** build a directory of licensed lenders with ratings, NMLS IDs, and profiles
- **Financial content:** pair current rates with long-run history for charts and explainers

### FAQ

**Does this actor return per-lender quote rates?**

No. Zillow's per-lender quote endpoint can return quotes from a residential client, but its submission endpoint is bot-protected and rejects requests from the Apify platform (direct HTTP, TLS-impersonated HTTP, datacenter proxy, residential proxy, and a real browser all returned the same block). This actor returns Zillow Home Loans' own product rates with points and fees, plus the lender directory. It does not invent or proxy third-party quote rates.

**What do the rate assumptions mean?**

`creditScore`, `loanAmount`, and the fixed loan-to-value bucket for each product determine the query. FHA and VA use a 95%+ loan-to-value assumption. Jumbo uses a jumbo loan amount. Zillow's public refinance table uses different credit and LTV buckets, so its displayed rates can differ from this actor's defaults; the `assumptions` field on every record shows exactly what was used.

**Why are some states or products missing?**

Zillow's own coverage varies. The 30-year and 15-year fixed products have the widest state coverage; other products are more complete nationally. A combination Zillow does not publish is omitted, not filled with a placeholder.

**How far back does history go?**

You can request up to 4,000 days. Zillow's history starts in November 2015. A 4,000-day daily request returns 4,001 points from 2015-11-08; monthly returns 132 points from 2015-11-01. Early points can have a rate without an APR; those APR values are omitted. A 90-day window is daily; longer windows are weekly or monthly depending on the interval you choose.

**What are the Zillow Home Loans samples?**

They are Zillow Home Loans' published product rates, not third-party lender quotes. Each sample includes rate, APR, points, the dollar cost of points, monthly payment, and the price date.

**Are points the same as fees?**

No. Points are an upfront cost shown by Zillow Home Loans. They are not a complete closing-cost or lender-fee table.

**Do I need a proxy or a Zillow login?**

No. The actor runs without cookies, logins, or proxy setup and returns public data.

**How fresh is the data?**

Each run reads the values Zillow is publishing at that moment. `rateDate` and `datePriced` show the source date for the rate and the sample.

**Is this affiliated with Zillow?**

No. This is an independent third-party actor that reads Zillow's publicly published mortgage data.

### Limitations

- No third-party lender quote rates: Zillow's quote submission is blocked from the Apify platform on direct HTTP, TLS-impersonated HTTP, datacenter proxy, five residential sessions, and a real Chromium session. Lender directory records and Zillow Home Loans samples are the available substitutes. The underlying quote API works only from a residential client outside the platform.
- Early history points can have a rate without an APR; the actor keeps the rate and omits the missing APR.
- No city-level rates: Zillow's city pages resolve to state-level rate data.
- State coverage for 20-year, 10-year, ARM, FHA, VA, and jumbo products is partial; national data is more complete. FHA/VA/jumbo coverage also varies with the credit-score bucket (more states publish data at 680–739 than at 740+).
- Zillow Home Loans samples are national; state records reuse them. State pages vary points (for example, 30-year conforming points were 1.558 in Texas vs 1.908 in California on 2026-10-21). New York has no state ZHL sheet and redirects to the legacy app; its records use the national samples.
- Points are not a complete closing-fee breakdown.

# Actor input Schema

## `loanPrograms` (type: `array`):

Which Zillow rate products to request. Leave empty to include all nine.

## `loanPurpose` (type: `string`):

Return purchase rates, refinance rates, or both.

## `states` (type: `array`):

National plus any states. State-level coverage is widest for 30-year and 15-year products.

## `creditScore` (type: `string`):

Credit-score assumption used for the rate query.

## `loanAmount` (type: `string`):

Loan-size assumption. Jumbo 30-year always uses the jumbo bucket.

## `includeRateHistory` (type: `boolean`):

Add a daily, weekly, or monthly rate history to each rate record.

## `historyDays` (type: `string`):

How far back to fetch history. Zillow's maximum is 4000 days.

## `historyAggregation` (type: `string`):

Sampling interval for the rate history.

## `includeHomeLoanRates` (type: `boolean`):

Attach Zillow Home Loans sample rates with points, fees, and monthly payment.

## `includeLenderDirectory` (type: `boolean`):

Also return Zillow mortgage lender directory records with names, logos, ratings, and reviews.

## `lenderLocations` (type: `array`):

Cities, states, or ZIP codes for the lender directory, e.g. Austin, TX or 90210. Used only when the directory is enabled.

## `maxLenders` (type: `integer`):

Maximum lender records to return when the directory is enabled (1–200).

## `includeLenderProfiles` (type: `boolean`):

Fetch full profiles for up to 50 lenders: address, phone, website, licenses, and biography.

## Actor input object example

```json
{
  "loanPrograms": [
    "30yr-fixed"
  ],
  "loanPurpose": "purchase",
  "states": [
    "national"
  ],
  "creditScore": "veryHigh",
  "loanAmount": "conforming",
  "includeRateHistory": false,
  "historyDays": "90",
  "historyAggregation": "daily",
  "includeHomeLoanRates": true,
  "includeLenderDirectory": false,
  "lenderLocations": [],
  "maxLenders": 5,
  "includeLenderProfiles": false
}
```

# Actor output Schema

## `rates` (type: `string`):

Dataset of rate records with current rates, comparisons, history, payment estimates, and Zillow Home Loans samples.

## `lenders` (type: `string`):

Dataset of lender records with names, logos, ratings, review counts, NMLS IDs, and profile URLs.

# 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 = {
    "loanPrograms": [
        "30yr-fixed"
    ],
    "loanPurpose": "purchase",
    "states": [
        "national"
    ],
    "creditScore": "veryHigh",
    "loanAmount": "conforming",
    "includeRateHistory": false,
    "historyDays": "90",
    "historyAggregation": "daily",
    "includeHomeLoanRates": true,
    "includeLenderDirectory": false,
    "lenderLocations": [],
    "maxLenders": 5,
    "includeLenderProfiles": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/zillow-daily-mortgage-rate-and-lender-quote").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 = {
    "loanPrograms": ["30yr-fixed"],
    "loanPurpose": "purchase",
    "states": ["national"],
    "creditScore": "veryHigh",
    "loanAmount": "conforming",
    "includeRateHistory": False,
    "historyDays": "90",
    "historyAggregation": "daily",
    "includeHomeLoanRates": True,
    "includeLenderDirectory": False,
    "lenderLocations": [],
    "maxLenders": 5,
    "includeLenderProfiles": False,
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/zillow-daily-mortgage-rate-and-lender-quote").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 '{
  "loanPrograms": [
    "30yr-fixed"
  ],
  "loanPurpose": "purchase",
  "states": [
    "national"
  ],
  "creditScore": "veryHigh",
  "loanAmount": "conforming",
  "includeRateHistory": false,
  "historyDays": "90",
  "historyAggregation": "daily",
  "includeHomeLoanRates": true,
  "includeLenderDirectory": false,
  "lenderLocations": [],
  "maxLenders": 5,
  "includeLenderProfiles": false
}' |
apify call vexaloom-labs/zillow-daily-mortgage-rate-and-lender-quote --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/zillow-daily-mortgage-rate-and-lender-quote"
        }
    }
}
```

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/QsAgLESqqB6QJMbMv/builds/9cX9po19xSFNYJ0pb/openapi.json
