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.
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:
Address, asking price, beds, baths, square feet, home type, status and days on market.
Rent by bedroom count for each building, and the move-in specials listed next to it.
Each price cut with the date the portal shows for it, kept as history on the home.
New listings, pending sales and the number of homes listed per area, week by week.
The problem
Listing sites
The solution
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.
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.
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.
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.
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.
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.
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.
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
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"
}
]
}
Tell us which portals and markets you track. We'll run String on them and email you a sample of the listing data, free.
| Site | Home | Size | Price |
|---|---|---|---|
| Zillow | 9706 Woodshire Dr, Austin | 3 bd, 2 ba | $535K |
| Redfin | 9706 Woodshire Dr, Austin | 3 bd, 2 ba | $535K |
| Realtor.com | 1310 W Parmer Ln, Austin | 2 bd, Pending | $200K |
| Apartments.com | Stassney at SoCo, Austin | 1 bd | $948+ a month |
| Rightmove | Bartley Road, Manchester | 4 bd, 2 ba | Offers over £500K |
| Zoopla | Kelso Place, Manchester | 2 bd flat | £227K |
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.
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.
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.
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?
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.
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.
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.
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.
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.