REALTOR.ca Scraper
Scrape MLS Listings and Prices from REALTOR.ca
Extract Canadian property listings, CAD prices, MLS numbers, beds, baths, square footage, and listing agent details from Canada's #1 real estate portal. REALTOR.ca is owned by CREA, pulls around 40M monthly visits, and sits behind Imperva, which greets bots and datacenter IPs with an 'Access Denied - Error 15' block page. Scrape.do handles it automatically.
Start scraping today with 1000 free credits. No Credit Card Required

40M Monthly Visits. Canada's #1 Real Estate Portal. One API.
REALTOR.ca is the #1 real estate portal in Canada by SimilarWeb category rank, pulling in around 40.1M monthly visits with 93.6% of traffic from Canada in 2026. Owned and operated by the Canadian Real Estate Association (CREA), it aggregates MLS Systems listings from real estate boards nationwide, and in 2025 it drew 633 million visits from 113 million unique visitors and captured roughly 61% of all Canadian real estate web traffic. Even well-funded foreign rivals like Zillow have failed to displace it.
For scrapers this is the dataset for Canadian residential and commercial real estate. With Scrape.do you can pull list prices in CAD down to the postal code (FSA), capture MLS numbers, beds, baths, and square footage, monitor new listings and price changes across Toronto, Vancouver, Montreal, and Calgary, and feed valuation models, comparable-sales tools, or lead-gen products with property type, lot size, and listing brokerage data through a single API call.

Imperva WAF. Access Denied - Error 15. Handled.
REALTOR.ca runs behind Imperva (Incapsula), and it does not hesitate to slam the door. Send a request that looks automated or comes from a datacenter IP and REALTOR.ca returns an HTTP 403 with a red 'Access Denied - Error 15' page stamped with your IP and an Incident ID instead of the listing HTML. Headless-browser fingerprints get blocked outright, so a naive render-mode scraper just collects error pages.
Scrape.do routes REALTOR.ca requests through residential IPs in super mode, rotates sessions automatically, and clears the Imperva check so you get the full property HTML back. In our recon, plain super mode returned the complete 239KB listing page while every render-mode attempt failed, so a single super-mode call is all it takes. No proxy lists, no CAPTCHA solvers, no maintenance.

How to Scrape REALTOR.ca
Select a Target

Send API Request
import requests
import urllib.parse
token = "<SDO-token>"
targetUrl = "https://www.realtor.ca/real-estate/29633490/69-home-avenue-champlain-613-vankleek-hill"
render = "false" # set to "true" to enable JavaScript rendering
super = "true" # set to "false" to disable residential proxies
encodedUrl = urllib.parse.quote(targetUrl)
url = f"https://api.scrape.do/?token={token}&url={encodedUrl}&render={render}&super={super}"
response = requests.get(url)
print(response.text)Get HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>69 HOME AVENUE, Champlain, Ontario K0B1R0 | REALTOR.ca</title>
<meta name="description" content="Single Family (freehold) house 2 bedrooms, 2 bathrooms, 69 home avenue champlain, ontario, for sale $395,000." />
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Product",
"name": "69 HOME AVENUE, Champlain, Ontario K0B1R0",
"sku": "29633490",
"category": "Single Family > House",
"offers": {
"@type": "Offer",
"priceCurrency": "CAD",
"price": "395000.00",
"businessFunction": "sell"
}
}
</script>
</head>
<body>
<div id="listingDetailsHeaderCon">
<div class="propertyCardPrice" id="listingPrice" data-value-cad="$395,000 ">
<div id="listingPriceValue">$395,000 </div>
</div>
<div class="propertyCardMLSNumber">MLS<sup>®</sup> Number:
<span id="MLNumberVal">X13023784</span>
</div>
<div class="propertyCardOfficeCon">
<div class="propertyCardOfficeName">ROYAL LEPAGE PERFORMANCE REALTY</div>
</div>
<div class="propertyHeaderCon">
<div class="listingIconCon" id="BedroomIcon">
<div class="listingIconNum">2</div>
<div class="listingIconText">Bedrooms</div>
</div>
<div class="listingIconCon" id="BathroomIcon">
<div class="listingIconNum">2</div>
<div class="listingIconText">Bathrooms</div>
</div>
<div class="listingIconCon" id="SquareFootageIcon">
<div class="listingIconNum">700 - 1100</div>
<div class="listingIconText">Square Feet</div>
</div>
</div>
</div>
<div class="propertyDetailsSectionContentSubCon" id="propertyDetailsSectionContentSubCon_SquareFootage">
<div class="propertyDetailsSectionContentLabel">Square Footage</div>
<div class="propertyDetailsSectionContentValue">700 - 1100 sqft</div>
</div>
<!-- ... remaining listing content ... -->
</body>
</html>
Scrape.do has been a game-changer with powerful scraping tools, but what truly sets them apart is their excellent customer support.

CTO
Average Response Time
No tickets connect with expert engineers.
Success rate
Proxies
Faster gateway than the closest competitor.
Reliable, Scalable,Unstoppable Web Scraping
Sounds great, but I have a few questions..
Yes. REALTOR.ca runs behind Imperva (Incapsula) and returns an HTTP 403 'Access Denied - Error 15' page to bots and datacenter IPs instead of the listing HTML. Scrape.do routes requests through residential IPs in super mode, clears the check, and returns the full page. In our recon, plain super mode returned the complete 239KB listing while every render-mode attempt got a 502, so success is highest with a single super=true call.
You can extract the list price in CAD, MLS number, number of bedrooms and bathrooms, square footage, property type (Single Family, condo, land, commercial), full address and postal code, listing brokerage and REALTOR name, property description, days on market, photos, and the JSON-LD Product block. Coverage spans every Canadian province and city, from Toronto and Vancouver condos to rural listings.
No, and it actually hurts. REALTOR.ca serves the full listing HTML server-side, so render mode is unnecessary, and Imperva blocks headless-browser fingerprints, which is why every render-mode request in our recon returned a 502. Use Scrape.do with super=true and render=false to pull the complete page reliably and at lower cost.


