Realtor.ca MLS Scraper — Listings, Photos, Data & Agent Details
Pricing
from $15.00 / 1,000 results
Realtor.ca MLS Scraper — Listings, Photos, Data & Agent Details
Scrape full Realtor.ca listing data by MLS number — price, address, beds/baths, sqft, description, photos, videos, agent & brokerage details. Bypasses Akamai with warmed browser sessions.
Pricing
from $15.00 / 1,000 results
Rating
0.0
(0)
Developer
TheBomb®
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Realtor.ca MLS Scraper (Apify Actor)
Fetches full listing data, photos, and videos from realtor.ca by MLS number.
Input
{"mlsNumbers": ["10349545"],"downloadMedia": false,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] },"maxConcurrency": 1}
- mlsNumbers — array of MLS / Reference numbers.
- downloadMedia — when
true, photos/videos are downloaded into the default Key-Value Store; otherwise only URLs are returned. - proxyConfiguration — residential proxy required in practice. Datacenter IPs are blocked.
- maxConcurrency — keep low (1–2). Realtor.ca rate-limits aggressively.
Output (dataset, per MLS)
mlsNumber, listingId, url, address, price, propertyType,bedrooms, bathrooms, sqft, lotSize, yearBuilt, description,features, parking, taxes, building, land, agents, office, board,postedOn, lastUpdated,photos: [{ sequenceId, description, highRes, medRes, lowRes }],videos: [{ type, url }],raw: <full PropertyDetails payload>
If downloadMedia=true, also photoKeys[] and videoKeys[] with KVS keys.
How it works
- Launch Chromium via Playwright (residential proxy when input provides one).
- Warm up
www.realtor.ca/so Akamai's bot sensor runs and sets cookies (_abck,bm_sz). - Fetch
api2.realtor.ca/Listing.svc/PropertySearch_Postfrom inside the page (page.evaluate(fetch(...))) withReferenceNumber=<MLS>— inherits the page's cookies, fingerprint, and Origin header so Akamai accepts the call. - GET
api2.realtor.ca/Listing.svc/PropertyDetails?PropertyID=<id>&ReferenceNumber=<mls>the same way. - Parse photos from
Property.Photo[](high/med/low-res URLs), videos fromAlternateURL.VideoLink,Property.VirtualTourUrl,Property.VirtualTours[],Property.Videos[]. - Push record to dataset. If
downloadMedia=true, fetch each photo/video URL via Playwright'sAPIRequestContext(Node side — CDN blocks CORS) and store in the default Key-Value Store.
Running locally
npm installnpx playwright install chromiumnpm start
Set input via storage/key_value_stores/default/INPUT.json. Verified working from a residential home IP (MLS 10349545: 87 photos extracted + downloaded as 1248x832 JPEGs). On Apify, enable the residential proxy to bypass Akamai from datacenter IPs.
Notes / caveats
- Realtor.ca ToS restricts automated access. Use only where legally permitted (your own listings, licensed data partner, etc.).
- Without a residential proxy the API returns 403 / Access Denied.
- Videos on realtor.ca are usually Matterport / iGuide / YouTube URLs — they may not be downloadable binaries; the actor will record the URL regardless.