Skip to content

How to Scrape Realtor.com Listings: Prices, History, Taxes and Risk Scores

Scrape Realtor.com listings for sale, for rent or recently sold by city, ZIP code or URL: price, beds, baths, square feet, sale and price history, tax records, schools and flood and wildfire risk. No-code steps, curl, Python, Node.js and MCP, plus a real run from 27 October 2026 and its exact cost.

Published
Reading time
7 min read
Pixel-art robot with an orange >_ on its terminal head pulls a listing card with a red house icon off two houses at night, in front of which a yard sign shows the red Realtor.com house logo, and drops it into a crate
In this article
  1. What data you can get from Realtor.com
  2. How to scrape Realtor.com without code
  3. How to scrape Realtor.com with the API
  4. With an AI agent (MCP)
  5. A real run: ten homes for sale in ZIP 89166
  6. What it costs
  7. What to watch out for
  8. Is it legal to scrape Realtor.com?
  9. Why Scrape.ly for Realtor.com
  10. FAQ
  11. Can you scrape Realtor.com for free?
  12. Does Realtor.com have an API?
  13. How do I scrape recently sold homes?
  14. Can I get more than 10,000 listings for a city?
  15. Does it include flood and wildfire risk?
  16. Can I scrape Realtor.com with Python?

To scrape Realtor.com, give a ready-made Actor a city, ZIP code, county or neighborhood, or paste Realtor.com search or property URLs, and it returns one row per home: price, beds, baths, square feet, lot size, listing and sale history, tax records, nearby schools, and flood, wildfire and noise risk. On Scrape.ly that's a preset and one click, or one API call, with no login and no browser.

This guide covers the fields you get, the no-code steps, the same job in curl, Python, Node.js and through an AI agent, a real run from 27 October 2026 (ten homes for sale in Las Vegas ZIP 89166), its log and exact cost, and how to get past Realtor.com's 10,000-result cap.

What data you can get from Realtor.com

The Realtor.com Scraper returns one row per property. With Full property details on (the default), a row holds:

Field What it holds
id, listingId, url, status Property and listing IDs, the page, and for_sale, for_rent or sold
listPrice, priceReducedAmount, lastSoldPrice, soldOn Asking price, the latest cut, and the previous sale
beds, baths, sqft, lotSqft, yearBuilt, garage, stories, type Property facts
address, coordinates Street, city, ZIP, county with FIPS code, and latitude and longitude
history, taxHistory, buildingPermitsHistory Listing and sale events, yearly tax and assessments, permits
nearbySchools Schools with ratings, distance and level
local Flood (with FEMA zone), wildfire and noise risk
photos, virtualTours, matterport Media
agents, advertisers, branding Listing agents, offices and brokerages
floorplans Floor plans for apartment communities, with Floor plans on

With details off, each row is a lighter summary (price, size, photos, flags and location) at a quarter of the price.

How to scrape Realtor.com without code

  1. Open the Realtor.com Scraper in the Scrape.ly Store.
  2. Pick the Homes for sale in ZIP 89166, 10 listings preset. It fills in this input:
json
{
  "search": "89166",
  "maxItems": 10,
  "includeDetails": true,
  "startUrls": []
}
  1. Type your own location, or paste Realtor.com URLs, and click Start. Our run took 6 seconds.
  2. Open the dataset and export it as JSON, CSV, Excel or HTML.

The input fields that matter most:

  • search: a city, ZIP, county or neighborhood; several on separate lines.
  • startUrls: search URLs (filters in the URL are applied), rental /apartments/... searches, /show-recently-sold searches or property pages.
  • mode: BUY, RENT or SOLD for the location search, with soldWithin for how far back sold homes go.
  • type, minPrice, maxPrice, minBed, minSqft, minLotSqft, minYearBuilt: property filters. In sold mode, price filters use the sold price.
  • daysOnMarket, keyword, tags, radius, includePending: listing filters, such as only listings that mention "solar" or have a pool.
  • includeDetails: full records (default) or faster summary rows.

Other presets show 3+ bed homes sold in Gilbert, apartments for rent with floor plans and homes with a pool in two areas.

How to scrape Realtor.com with the API

Create a token under Settings → API & Integrations in the dashboard and store it as SCRAPELY_TOKEN. Ten detailed listings took 3.5 seconds of scraping, so the synchronous endpoint fits for small pulls:

shell
curl -X POST "https://api.scrape.ly/v2/actors/roamandroof~realtor-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $SCRAPELY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"search": "Gilbert, AZ", "mode": "SOLD", "soldWithin": "3", "minBed": 3, "maxItems": 100}'

Add ?format=csv for a CSV. For thousands of listings, start the run asynchronously (POST /v2/actors/roamandroof~realtor-scraper/runs), poll /v2/actor-runs/RUN_ID?waitForFinish=60, then read /v2/actor-runs/RUN_ID/dataset/items?format=csv. The API docs cover each step.

In Python (pip install scrapely-client-python), this market check reads every home for sale in a ZIP code and reports price cuts and the gain since each home last sold:

python
import os

from scrapely_client import ScrapelyClient

client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")

run = client.actor("roamandroof/realtor-scraper").call(
    run_input={"search": "89166", "mode": "BUY", "maxItems": 700, "includeDetails": True}
)
homes = list(client.dataset(run.default_dataset_id).iterate_items())
cut = [h for h in homes if h.get("priceReducedAmount")]
print(f"{len(homes)} for sale, {len(cut)} with a price cut")
for h in homes:
    if h.get("lastSoldPrice"):
        gain = h["listPrice"] / h["lastSoldPrice"] - 1
        print(f"{h['listPrice']:>10,}  last sold {h['soldOn']}  {gain:+.0%}  {h['url']}")

In JavaScript or Node.js (npm install scrapely-client), screen listings for wildfire and flood risk before you look closer:

javascript
import { ScrapelyClient } from 'scrapely-client';

const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN, baseUrl: 'https://api.scrape.ly' });

const run = await client.actor('roamandroof/realtor-scraper').call({
  search: 'Las Vegas, NV',
  type: ['single-family-home'],
  minBed: 3,
  maxPrice: 700000,
  maxItems: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const h of items) {
  console.log(h.listPrice, h.local?.flood?.severity, h.local?.wildfire?.severity, h.url);
}

The Realtor.com API page shows the same Actor as a ready-made API, and the Python client docs cover paging through large datasets.

With an AI agent (MCP)

Scrape.ly runs a hosted MCP server at https://mcp.scrape.ly. In Cursor, add it to ~/.cursor/mcp.json:

json
{
  "mcpServers": {
    "scrapely": {
      "url": "https://mcp.scrape.ly",
      "headers": { "Authorization": "Bearer YOUR_TOKEN" }
    }
  }
}

In Claude Code, run claude mcp add --transport http scrapely https://mcp.scrape.ly, then /mcp to sign in with OAuth. Then ask: "Use scrapely to get 100 homes for sale in 89166 from Realtor.com and list the ones with a price cut, the size of the cut and how long they've been listed." The MCP docs list ChatGPT, VS Code, Windsurf and the other clients.

A real run: ten homes for sale in ZIP 89166

We ran the preset as-is on 27 October 2026. Realtor.com reported 663 matching listings; the run saved the first 10 with full details in 6 seconds. Addresses and agents are left out here:

Price Beds / baths Sq ft Built Listed Last sold Price cut Wildfire risk
$629,900 5 / 3 2,542 2010 2026-09-02 $380,000 (2019) $20,100 Minor
$650,000 4 / 3 2,404 2008 2026-10-19 $375,000 (2018) none Minor
$775,000 5 / 4.5 3,190 2019 2026-10-20 $506,616 (2019) none Moderate
$515,000 3 / 2 1,939 2019 2026-08-03 $520,000 (2023) $18,900 Minor
$3,450,000 5 / 3.5 4,419 2009 2026-05-09 $1,010,000 (2023) $300,000 Extreme
$381,000 3 / 2.5 1,531 new build 2026-09-24 none none Extreme
$380,000 3 / 2.5 1,649 2007 2026-10-15 $364,364 (Sep 2026) none Minor
Text
2026-10-27T17:17:32.651Z [scrapely.actor] INFO  Searching 89166 (BUY) from offset 0
2026-10-27T17:17:33.444Z [scrapely.actor] INFO  '89166': 663 matching listings
2026-10-27T17:17:35.514Z [scrapely.actor] INFO  Loaded 10 property details in 2.1s
2026-10-27T17:17:36.067Z [scrapely.actor] INFO  Requests: 11, response bytes: 320288
2026-10-27T17:17:36.069Z [scrapely.actor] INFO  Saved 10 properties in 3.5s.

What the ten rows show:

  • Sale history tells the story. One 5-bedroom bought for $380,000 in 2019 is listed at $629,900, a 66% gain. Another, bought for $520,000 in 2023, is now asking $515,000 after an $18,900 cut, below what its owner paid.
  • You can spot iBuyer flips. A 3-bedroom sold on 15 September 2026 for $364,364 was relisted a month later at $380,000 by Opendoor's brokerage, 4% higher. soldOn and branding together make that a one-line filter.
  • Price cuts are a field, not a guess. Three of the ten had priceReducedAmount set, from $18,900 to $300,000, the last on a 10-acre property listed since May.
  • Risk scores differ house by house. Flood risk was minimal everywhere, but wildfire risk ranged from Minor to Extreme in the same ZIP code, including on a new build. That's due-diligence data most listing exports don't have.
  • Fresh supply. Five of the ten carried the isNewListing flag, and annual property tax ran from $2,160 to $6,261 where it was recorded.

Eleven requests and 320 KB of responses for ten full records, on datacenter proxies with no browser, which is why the per-listing price stays low.

What it costs

The Actor charges per property saved, platform usage (compute and proxy) included. Prices checked on the Store page on 27 October 2026: $0.000108 per listing, plus $0.000429 for its full detail record when Full property details is on. That's $0.108 per 1,000 summary rows or $0.537 per 1,000 detailed ones.

Our run: 10 × ($0.000108 + $0.000429) = $0.00537 at list price ($0.004296 charged, because our plan has a Store discount).

At scale: all 663 detailed listings in that ZIP code cost about $0.36. A daily summary-only snapshot of 10,000 listings costs $1.08. The Free plan's $5 of monthly usage covers about 9,300 detailed listings, or 46,000 summary rows.

What to watch out for

  • 10,000 results per search. Realtor.com stops there, and deep pages repeat listings, which the Actor removes. Split big markets by ZIP code, price band or property type.
  • Empty fields are normal. Land has no beds, many listings have no virtual tour, rentals often have no tax history; our new build had no year built or last sale.
  • Sold-mode prices. In sold mode the price filter uses the sold price, and summary rows show the sold price in price with the asking price in listPrice.
  • US only. Realtor.com covers US listings.
  • Agents are personal data. Names, phone numbers and emails of agents and owners fall under privacy laws; keep them out of anything you publish.

The Actor reads public listing data that anyone can open without an account. Realtor.com's Terms of Service (read on 27 October 2026) say that, except with Move's express written permission, you shall not "access, collect, text mine or data mine, by automated means" the site's content, and they list "screen scraping" and "database scraping" among the prohibited practices. Whether and how those terms bind you depends on your jurisdiction, whether you have an account that accepted them, and your use.

Agent contacts and owner-linked addresses are personal data under the GDPR, the CCPA and similar laws. For market analysis you rarely need them; our GDPR and web scraping guide explains the basics. This is not legal advice; for a commercial project, ask a lawyer about your case.

Why Scrape.ly for Realtor.com

  • Full records in seconds. Sale and price history, tax records, permits, schools and climate risk from Realtor.com's own data feed, ten listings in about 2 seconds.
  • Pay for depth only when you need it. Summary rows at $0.108 per 1,000 for daily price tracking, full records for due diligence.
  • Every filter Realtor.com has. Price, size, lot, year, type, amenities, keywords, radius, days on market and sold windows, or a pasted filtered URL.
  • The rest of the market on one token. Redfin for Redfin Estimates and comps, Zillow for Zestimates, and the Zillow scrapers page to compare them; see real estate data scraping for the full picture.

FAQ

Can you scrape Realtor.com for free?

Yes. The Free plan includes $5 of usage credit every month with no credit card, which covers about 9,300 detailed listings at list price.

Does Realtor.com have an API?

Realtor.com doesn't offer a public listings API for developers. The Actor returns its listings as JSON through the Scrape.ly API, and the Realtor.com API page shows it as a ready product.

How do I scrape recently sold homes?

Set mode: "SOLD" and soldWithin (1 to 36 months), or paste a Realtor.com /show-recently-sold search URL.

Can I get more than 10,000 listings for a city?

Not from one search, because Realtor.com stops at 10,000. Run one search per ZIP code or price band in the same run; the Actor removes listings that appear twice.

Does it include flood and wildfire risk?

Yes. With full details on, local carries flood risk with the FEMA zone, wildfire risk and noise, as Realtor.com shows them.

Can I scrape Realtor.com with Python?

Yes. Install scrapely-client-python and call roamandroof/realtor-scraper, as in the market-check script above. The scraping runs in the cloud, so you don't manage proxies or Realtor.com's internal data feed.

  • realtor.com
  • real estate
  • property data
  • market research
  • python
  • api

About the author

Actor publisher on the Scrape.ly Store

Homes, stays, trips and cars: listings from 40+ property portals, the big travel and booking sites and the main car marketplaces. For agents, investors, travel analysts and dealers. A Scrapely studio.

//Keep reading\\

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes.

No credit card. No setup calls.