NewLaunching String Web Access APIRead the manifesto →

How to scrape real estate listings

The String Web Access API is the best way to scrape real estate listings. It returns any listing page, or just its homes as JSON with address, price, beds, baths and square feet. In our September 2026 benchmark it fetched Zillow, Redfin, Realtor.com, Apartments.com, Rightmove and Zoopla on every attempt, and returned 97% of requests across 100 bot-protected sites, the most of 16 providers.

The first 5,000 requests are free. Set it up in one step with the quickstart.

Why scrape real estate listings?

Listing portals are the most current public record of the housing market. A home's asking price, a price cut and a move to pending all show up there weeks before a sale is recorded. A real estate scraper collects listings from the portals on a schedule and tells you what's new, what changed and what left the market. It answers the questions most teams care about:

  • What's for sale or for rent, and at what price? Investors, lenders and agents price their own deals against the homes listed nearby today.
  • Which prices are falling? A run of price cuts in one ZIP code is an early sign that a market is softening.
  • How long do homes take to sell? Days on market and the move to pending show how fast an area is moving.

What you can collect

Homes for sale

Address, asking price, beds, baths, square feet, home type, status and days on market.

Rentals

Rent by bedroom count for each building, and the move-in specials listed next to it.

Price changes

Each price cut with the date the portal shows for it, kept as history on the home.

Market activity

New listings, pending sales and the number of homes listed per area, week by week.

The problem

Why does real estate scraping break?

  • Listing portals block scrapers. In our September 2026 benchmark, 11 of the 15 other scraping APIs couldn't fetch realtor.com on every attempt, including ScraperAPI (0 of 5), Oxylabs (0 of 5) and ZenRows (2 of 5). On apartments.com, 9 of the 15 couldn't, including ScrapingBee (0 of 5) and Nimble (2 of 5). Browserbase got 0 of 5 on realtor.com, apartments.com and zoopla.co.uk. String got all 5 on each. Scrapfly, Firecrawl, Apify and Bright Data also got all 5 on both US sites.
  • Search results stop early. Zillow reported 5,603 homes for sale in Austin, but it serves 20 pages of 41. Apartments.com reported 27,773 Austin rentals across 18 pages of 40. One search for a whole city misses most of the market.
  • The same home is on every portal. 9706 Woodshire Dr in Austin was on Zillow and Redfin at $535,000, with 3 beds, 2 baths and 1,753 square feet on both. Zillow showed 4 days on Zillow and Redfin showed 5 days on market. Count by URL and you count it twice.

Listing sites

StringOne API
FetchSearch SitemapsBrowser
Your listings database

The solution

Why do teams choose String?

  • It works where others fail. String returned 97% of requests across 100 bot-protected sites in our September 2026 benchmark, the most of 16 providers. It got all 5 attempts on 6 of the 7 real estate sites in it. The seventh, idealista.com, it missed.
  • You pay only for pages that come back. Blocks and errors are free.
  • There's nothing to maintain. No proxies, fingerprints or captcha solvers on your side.
  • Blank pages don't become data. Mark the fields you need as required in your schema, and a page that comes back without them is flagged instead of saved as an empty result.

How do I scrape real estate listings?

  1. Pick your portals

    In the US, Zillow, Redfin and Realtor.com cover homes for sale, and Apartments.com covers rentals. In the UK, Rightmove and Zoopla cover both. Most projects need two or three portals per market, because no one portal has every listing.

    With String: Set countryCode to the portal's country, such as US for Zillow or GB for Rightmove.

  2. Read the data the page already carries

    Most portals ship their listings as JSON inside the page. Zillow and Rightmove put search results in a __NEXT_DATA__ script tag. Redfin and Zoopla list each home in JSON-LD with its address and price. Read that JSON before you parse the HTML. It holds exact numbers, and it changes less often than the page layout.

    With String: Ask for format: raw to get the page as the portal sent it, or pass a jsonSchema to get only the fields you need.

  3. Split searches so none hits the cap

    Portals stop serving results after a fixed number of pages. Zillow serves 20 pages of 41. Rightmove served 42 pages of about 25 for a Manchester search that reported 6,823 homes. Split each market by ZIP code, postcode district or price band until each search's total fits in the pages the portal will serve. Then check the portal's total against what you collected.

  4. Keep the status and the price label

    A search for homes for sale can include homes that aren't. Two of the first 8 homes on Realtor.com's Austin for-sale search were marked Pending. Rightmove prices come with labels like "Offers Over" or "Guide Price". Save the status and the label as their own fields, and filter on them.

  5. Record price changes on the home

    Zillow shows each price cut with its date, such as "$25,000 (Aug 25)" on 1704 Shelbourne Dr, and Rightmove marks a listing price_reduced. Store every price you see with the day you saw it, keyed to the home. Redfin's page data has a property ID for the home and a separate listing ID for the listing. Keep both, so a home that comes back on the market joins its old history.

  6. Treat a blank page as a failure

    A search page with no listings, or with no __NEXT_DATA__ tag, was probably blocked or changed. Flag it and keep the last good run, so its homes aren't marked sold because one page failed. We show how to detect a block that returns HTTP 200.

  7. Match the same home across portals

    Within one portal, use its own ID, like Zillow's zpid. Across portals, match on street address, unit and ZIP code, then check beds and square feet. Don't match on days on market, because portals count it differently.

Quickstart

From your agent

Add the hosted MCP server to Claude, Cursor, ChatGPT or any MCP client. Then give your agent a listing search URL. It calls the web_access_fetch tool and reads the homes.

https://mcp.usestring.ai/v1/mcp

From the API

One call returns the homes on a Realtor.com search page as JSON. If extraction can't fill the required fields, you get "extracted": false back instead of a guess.

curl https://request.usestring.ai/v1/fetch \
  -H "Authorization: Bearer $STRING_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.realtor.com/realestateandhomes-search/Austin_TX",
    "countryCode": "US",
    "jsonSchema": {
      "type": "object",
      "properties": {
        "homes": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "properties": {
              "address": { "type": "string" },
              "price": { "type": "integer" },
              "beds": { "type": ["number", "null"] },
              "baths": { "type": ["number", "null"] },
              "sqft": { "type": ["integer", "null"] },
              "status": { "type": "string" }
            },
            "required": ["address", "price", "status"]
          }
        }
      },
      "required": ["homes"]
    }
  }'

Response (first 3 of 8 homes)

{
  "homes": [
    {
      "address": "1704 Shelbourne Dr, Austin, TX 78752",
      "price": 395000,
      "beds": 3,
      "baths": 2,
      "sqft": 1556,
      "status": "for_sale"
    },
    {
      "address": "1310 W Parmer Ln Apt 1902, Austin, TX 78727",
      "price": 199999,
      "beds": 2,
      "baths": 2.5,
      "sqft": 1334,
      "status": "pending"
    },
    {
      "address": "109 Largo Cv, Austin, TX 78734",
      "price": 2075000,
      "beds": 4,
      "baths": 4.5,
      "sqft": 4580,
      "status": "for_sale"
    }
  ]
}

Get a free sample of listing data

Tell us which portals and markets you track. We'll run String on them and email you a sample of the listing data, free.

Request a free sample listing data
What a sample looks like
SiteHomeSizePrice
Zillow9706 Woodshire Dr, Austin3 bd, 2 ba$535K
Redfin9706 Woodshire Dr, Austin3 bd, 2 ba$535K
Realtor.com1310 W Parmer Ln, Austin2 bd, Pending$200K
Apartments.comStassney at SoCo, Austin1 bd$948+ a month
RightmoveBartley Road, Manchester4 bd, 2 baOffers over £500K
ZooplaKelso Place, Manchester2 bd flat£227K

Frequently asked questions

What's the best way to scrape real estate listings?

Fetch each portal's search pages on a schedule, read the JSON the page already carries, split big markets into small searches, and match the same home across portals. The hard part is getting the pages at all, because several portals block most scrapers. The String Web Access API fetched Zillow, Redfin, Realtor.com, Apartments.com, Rightmove and Zoopla on every attempt in our September 2026 benchmark, and returned 97% of requests across 100 bot-protected sites, the most of 16 providers.

How do I scrape Zillow listings?

Fetch a search URL such as zillow.com/austin-tx/ and read the listings from the __NEXT_DATA__ script tag. Each page has 41 homes with zpid, address, price, beds, baths, square feet and days on Zillow. Add /2_p/, /3_p/ and so on for more pages, up to 20. Zillow is one of the easier portals. In our benchmark, 14 of 16 APIs got it on every attempt. Our guide How to scrape Zillow in 2026 has working Python and TypeScript.

How much does it cost to scrape real estate listings every day?

Checking 200 search pages daily is about 6,000 requests a month. In our tests, Zillow, Redfin and Rightmove billed at the standard rate ($0.30 per 1,000 on the $20 Starter plan), which is $1.80 in usage. Realtor.com, Apartments.com and Zoopla billed at the premium proxy rate ($3.00 per 1,000), which is $18. Structured extraction adds a fee per request. See pricing. Failed requests aren't billed.

Is it legal to scrape real estate listings?

Listing pages are public, and prices, addresses and room counts are facts, which copyright doesn't cover. Listing photos and descriptions are someone's work, so don't republish them. Collect public pages while logged out, leave personal data like agent and owner names out, keep your request rate reasonable, and check with your counsel. We go through the cases in Is web scraping legal?

How do I avoid getting blocked when scraping Zillow, Redfin or Realtor.com?

Send each request to String instead of the site. Proxy rotation, browser fingerprints, captcha solving and retries happen behind the endpoint, and JavaScript rendering is switched on per request for pages that need it. Requests that still fail aren't billed.

How do I scrape rental listings?

Apartments.com shows 40 buildings per search page, each with a starting rent per bedroom count, like "1 Bed $948+". Move-in specials such as "2 Months Free" sit next to the rent. Save them in their own field, apart from the rent. Austin search results also included buildings in nearby towns like Manor, so filter on the address.

Can I scrape MLS data?

MLS systems are for members, and most license their data through feeds such as the RESO Web API. If you have an account you're allowed to automate, save the login in a browser context and connect Playwright or Puppeteer to String's remote browser over CDP. Read your MLS's rules first.

Can I scrape UK property portals like Rightmove and Zoopla?

Yes, String fetches Rightmove and Zoopla from the UK. Set countryCode to GB. Rightmove search pages carry about 25 homes each in __NEXT_DATA__, with price, price label, beds, baths and whether the listing is new or reduced. Zoopla lists each home in JSON-LD with its price and address. In our benchmark, String got all 5 attempts on both. Browserbase and Oxylabs got 0 of 5 on zoopla.co.uk.

Does String work on the real estate sites I need?

Send us the URLs and we'll run them and show you what comes back before you commit. In our benchmark it got all 5 attempts on 6 of 7 real estate sites, and none on idealista.com. Ask for a free sample of listing data, or test them yourself with your first 5,000 free requests.

Send us the sites you can't get.

We'll show you what comes back.

© 2026 StringEU and UK GDPR Article 27 representative — appointment verified by EuverifyBuilt in New York City 🗽 🍎