The Mine Works
← All posts
tutorial July 11, 2026 · 4 min read

Realtor.com Scraper: Property and Agent Data Without the MLS Paywall

Scrape Realtor.com listings in Python — price, beds, baths, county, and the listing agent + brokerage office on every record. No login, no API key.

Try the scraper

The actor referenced in this article. Pay only for results delivered.

View the scraper →

Realtor.com’s listing data comes from its MLS partnerships, and Realtor.com does not offer a public API for developers to query that data directly. What access exists is gated behind data licensing deals that are expensive and typically capped in coverage — fine for a brokerage with a partnership, useless if you just need to pull a few hundred listings for a market study or a lead list.

The Realtor.com Scraper sidesteps the paywall by talking directly to Realtor.com’s own GraphQL search backend, the same one the site’s search page calls in the browser. It’s HTTP-only — no headless browser, no login, no API key. Give it a city or ZIP and it returns structured JSON for every for-sale or recently-sold property, with the listing agent and brokerage office attached to every record. $2 per 1,000 results ($0.002 each), nothing charged on failure.

What You Get

For each property the actor returns:

  • address, city, state, zip, county — full location detail including county, which Redfin and Zillow don’t consistently expose
  • price — current list price
  • lastSoldPrice, lastSoldDate — populated when soldMode is enabled
  • beds, baths, sqft, lotSqft — core specs
  • pricePerSqft, yearBuilt — valuation and age fields
  • propertyType, propertySubType — listing classification
  • status — for_sale, sold, etc.
  • hoaFee, listDate — HOA and listing date
  • latitude, longitude — coordinates for mapping
  • photoCount, photoUrl — image count and primary photo
  • agentName, officeName — the listing agent and their brokerage office, present on every record
  • propertyId, listingId, url — Realtor.com’s internal IDs and the listing URL

Every Record Includes the Listing Agent

Unlike a bare address-and-price feed, every property here carries agentName and officeName. That makes this actor the more direct route to a real-estate lead list — you don’t need a second enrichment step to find out who’s representing a listing.

import os
from apify_client import ApifyClient
from collections import Counter

apify = ApifyClient(os.environ["APIFY_TOKEN"])

run = apify.actor("themineworks/realtor-scraper").call(run_input={
    "location": "Austin, TX",
    "maxItems": 200,
    "soldMode": False,
    "minPrice": 400000,
    "minBeds": 3,
})

listings = list(apify.dataset(run["defaultDatasetId"]).iterate_items())

# Which brokerages have the most active listings in this metro?
offices = Counter(l["officeName"] for l in listings if l.get("officeName"))
for office, count in offices.most_common(10):
    print(f"{count:>3}  {office}")

Pull Recently-Sold Comps

run = apify.actor("themineworks/realtor-scraper").call(run_input={
    "location": "78704",
    "soldMode": True,
    "maxItems": 50,
})

sold = list(apify.dataset(run["defaultDatasetId"]).iterate_items())
for home in sold:
    print(f"{home['address']}: listed ${home.get('price')}, sold ${home.get('lastSoldPrice')} on {home.get('lastSoldDate')}")

Use in Claude, ChatGPT & Any MCP Agent

This actor is available as a hosted MCP server:

https://mcp.apify.com/?tools=themineworks/realtor-scraper
{
  "mcpServers": {
    "realtor-scraper": {
      "command": "npx",
      "args": ["-y", "@apify/mcp-client"],
      "env": {
        "APIFY_TOKEN": "your-token-here",
        "MCP_ACTOR_URL": "https://mcp.apify.com/?tools=themineworks/realtor-scraper"
      }
    }
  }
}

Connect it to Claude Desktop or any MCP-compatible client and ask it to pull the active listings in a ZIP, list the brokerages with the most inventory in a metro, or find recently-sold comps for a property — no script required for a quick lookup.

Use Cases

Real-estate lead generation. Pull a metro’s active listings, group by officeName, and you have a ranked list of the brokerages closing the most deals in that area — a direct target list for partnership or referral outreach.

Comparable sales and CMA. Switch to soldMode and pull recently-closed properties in a ZIP to ground a valuation in actual closed prices, not just list prices.

Investor deal sourcing. Filter by minPrice, maxPrice, and minBeds across a metro to surface candidates, then use county to route results into county-specific tax and zoning research.

Cross-portal enrichment. Run the same location against Redfin and Zillow scrapers alongside this one to catch listings that appear on one portal but not another — MLS syndication isn’t perfectly consistent across sites.

Pricing

$2 per 1,000 results ($0.002 per property). Pulling 300 active listings in a metro costs $0.60. A monthly sold-comp sweep of a 100-property ZIP costs $0.20/month.

Frequently Asked Questions

Do I need a Realtor.com account or API key?

No. The scraper requires no login, no cookies, and no API key — only an Apify account to run it.

How is this different from scraping the rendered Realtor.com site?

It calls Realtor.com’s own GraphQL search backend directly over HTTP, the same data source the site’s search page uses, rather than rendering pages in a browser. No unblocker subscription is needed.

Can I scrape recently-sold homes?

Yes. Set soldMode: true and the actor returns lastSoldPrice and lastSoldDate in place of active for-sale data.

How do I target a specific area?

Pass a ZIP code ("78704") to narrow to one area, or a city with state ("Austin, TX") for metro-wide results.

How does Realtor.com’s coverage compare to Zillow and Redfin?

Coverage and agent-detail depth vary by portal. See our comparison of Zillow vs Redfin vs Realtor.com, or read how to combine this actor with Redfin data for a full real-estate agent lead list workflow.

Related Actor

Explore the scraper referenced in this article — see inputs, outputs, and pricing, then run it on Apify.