Realtor.com Scraper API - Listings, Prices & Agents avatar

Realtor.com Scraper API - Listings, Prices & Agents

Pricing

Pay per event

Go to Apify Store
Realtor.com Scraper API - Listings, Prices & Agents

Realtor.com Scraper API - Listings, Prices & Agents

To Realtor.com a place is a city, ZIP, county, neighborhood or URL, all resolved by one lookup. Listings: address, price, beds, baths, sqft, lot size, type, year built, status, days on market, agent, broker, photos, coordinates. US only. $0.68 per 1,000, flat on every plan.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Realtor.com Scraper API

A place, to Realtor.com, can be Austin, TX, a ZIP like 78704, a county like Travis County, TX, a neighborhood like Zilker, Austin, TX, or a state code. The site resolves all of those through one lookup, and so does this actor. You can also paste Realtor.com URLs.

The listings behind them come back as structured JSON: address, price, beds, baths, square footage, lot size, property type, year built, listing status, days on market, the agent and broker, photo URLs and coordinates. The actor talks to the same JSON gateway the website uses, so there's no browser and no HTML parsing. 200 listings is a single request.

$0.68 per 1,000 listings ($0.00068 each), plus $0.001 per run start. United States only.

What you get

One row per listing, 65 fields. Real row from a live run, with the agent's email blanked out:

{
"propertyId": "7740839238",
"listingId": "2999908768",
"url": "https://www.realtor.com/realestateandhomes-detail/8110-Ranch-Road-2222-Apt-39_Austin_TX_78730_M77408-39238",
"address": "8110 Ranch Road 2222 Apt 39",
"addressWithheld": false,
"city": "Austin", "stateCode": "TX", "postalCode": "78730", "county": "Travis",
"latitude": 30.380225, "longitude": -97.807343,
"price": 450000, "pricePerSqft": 329, "estimatedValue": 515800, "hoaFee": 480,
"beds": 2, "baths": 3, "bathsFull": 2, "bathsHalf": 1,
"sqft": 1367, "lotSqft": 7453, "yearBuilt": 2012, "stories": 2, "garage": 2,
"propertyType": "condos", "propertySubType": "condo",
"listingStatus": "for_sale", "mlsStatus": "Active",
"listDate": "2026-08-20T19:41:02Z", "daysOnMarket": 0, "isNewListing": true,
"lastSoldDate": "2022-12-28",
"agentName": "Luis Saenz", "agentEmail": null,
"brokerName": "Tre", "brokerPhone": "5127227527",
"photoCount": 2,
"primaryPhoto": "http://ap.rdcpix.com/609784c4632dde244797c2db5e28a3b0l-m2566966558s.jpg",
"features": ["central_air", "hardwood_floors", "gated_community", "balcony", "greenbelt"]
}

Full field list: propertyId, listingId, url, address, addressWithheld, city, stateCode, state, postalCode, county, countyFips, latitude, longitude, price, priceMin, priceMax, pricePerSqft, priceReducedAmount, lastPriceChangeAmount, lastPriceChangeDate, lastSoldPrice, lastSoldDate, estimatedValue, hoaFee, beds, baths, bathsFull, bathsHalf, sqft, lotSqft, yearBuilt, propertyType, propertySubType, stories, garage, buildingName, listingStatus, mlsStatus, listDate, daysOnMarket, lastUpdateDate, isNewListing, isPending, isContingent, isForeclosure, isPriceReduced, isNewConstruction, agentName, agentEmail, agentMlsId, brokerName, brokerEmail, brokerPhone, mlsSourceId, mlsSourceType, photoCount, primaryPhoto, photos, virtualTourUrl, hasMatterport, openHouses, features, searchLocation, resolvedLocation, position, scrapedAt.

Turn on Include full property details and each row also carries descriptionText, taxHistory, priceHistory, schools, neighborhoods, propertyDetails and valueEstimates. That's one extra request per listing, so the run is slower. It adds fields, not rows, so the bill doesn't move.

Input

FieldWhat it does
locationOne or more places. City, ST, a 5-digit ZIP, a county, a neighborhood or a state code.
startUrlsRealtor.com search or property URLs. Filters written into the URL (price-, beds-, type-, show-recently-sold) are honoured.
listingStatusfor_sale, for_rent, sold, off_market, ready_to_build.
propertyTypessingle_family, condos, townhomes, condo_townhome_rowhome_coop, multi_family, mobile, land, farm.
maxItemsHard cap on rows. You pay per row returned.
sortBynewest, oldest, price_low, price_high, sold_date, most_photos.
maxPhotosHow many photo URLs to keep per listing, 0 to 50.
Filtersprice, beds, baths, sqft, lot size, year built, listed or sold within N days, open house, new construction, foreclosure, keywords.
{
"location": ["Austin, TX"],
"listingStatus": "for_sale",
"priceMin": 300000,
"priceMax": 700000,
"bedsMin": 3,
"maxItems": 200
}

Numbers from real runs

On the day we measured it, Austin, TX had about 7,300 active for-sale listings and about 126,000 recently sold. Both pools are reachable. Both counts move every day, so treat them as a sense of scale rather than a number to check against.

200 listings per request is the API's hard ceiling. Ask for 201 and it's rejected outright.

248 listings in 13.6 seconds (Austin, TX, for sale). A 5-row run finished in 2.3 seconds.

Duplicates are removed across pages, so asking for 250 can return 248. You're only charged for the rows you actually get.

No proxy is used. Realtor.com's JSON gateway answers plain datacenter addresses, so proxy cost is zero. You can still point the actor at your own proxy if you want a specific exit.

What it doesn't do

It can't page deeper than 10,000 results in a single search. That's the API's limit, not a choice. A search matching more than that writes an uncharged RESULT_CAP diagnostic telling you so. Split the area by ZIP, or add filters, to get the rest.

lastSoldPrice is empty in non-disclosure states. Sale prices aren't public record in Texas and a few other states. Measured on 20 sold listings per city: Miami 20/20 populated, Los Angeles 20/20, Phoenix 20/20, Chicago 20/20, Austin 0/20. lastSoldDate is present everywhere. No scraper can return a price the MLS doesn't publish.

agentEmail and brokerEmail are usually empty. Realtor.com rarely exposes them. This is a listings scraper, not an agent-contact scraper.

Some listings withhold the street address. Realtor.com sends the literal text "Address Not Available" for those. The actor returns address: null and addressWithheld: true rather than passing that string off as an address. Everything else on the row is still real.

United States only, and Realtor.com only. Realtor.ca is a different company in a different country and none of its listings are here. Nothing logs in, and nothing behind an account is touched.

Billing

$0.00068 per listing returned, plus $0.001 each time a run starts. Flat rate, same on the free plan as on any paid plan, no tiers to climb and no minimum.

You're charged only for listings actually returned. Failed runs, blocked runs, empty searches and every diagnostic row carry no per-listing fee, so a run that returns nothing costs $0.001.

FAQ

How do I scrape a city? Set location to Austin, TX and run it. maxItems decides how many rows you want.

Can I scrape by ZIP code? Yes. Put the 5-digit ZIP in location, for example 78704. County and neighborhood work too.

Can I get recently sold homes? Set listingStatus to sold, optionally with soldWithinDays, and sort by sold_date. Read the non-disclosure caveat above before you rely on the sale price.

Can I get rentals? Yes, listingStatus: "for_rent".

Why did my property-type filter return nothing? Realtor.com's value is condos, plural. condo matches zero listings without raising an error, so the actor validates the value and warns you rather than handing back an empty result.

Do I need a proxy? No. None is used by default and none is needed.

What happens if the search returns nothing? One diagnostic row explaining why, with no per-listing fee. The run still pays the $0.001 start fee.

Is this the official Realtor.com API? No. Independent scraper, not affiliated with or endorsed by Move, Inc. or the National Association of REALTORS®.

Realtor.com's robots.txt opens with a notice that scraping is unauthorized without written permission from Move Sales, Inc., and its Terms of Service say the same. robots.txt doesn't list the JSON gateway this actor uses, and it explicitly disallows deep pagination of the HTML search pages (/realestateandhomes-search/*/*/pg-). Listing data on Realtor.com comes from MLS feeds and is usually subject to IDX attribution and redistribution rules set by the individual MLS.

You're responsible for how you use the output. Check your own obligations, including MLS attribution and privacy law where agent details are involved, before republishing anything this returns.