Realtor.ca MLS Scraper — Listings, Photos, Data & Agent Details avatar

Realtor.ca MLS Scraper — Listings, Photos, Data & Agent Details

Pricing

from $15.00 / 1,000 results

Go to Apify Store
Realtor.ca MLS Scraper — Listings, Photos, Data & Agent Details

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®

TheBomb®

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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

  1. Launch Chromium via Playwright (residential proxy when input provides one).
  2. Warm up www.realtor.ca/ so Akamai's bot sensor runs and sets cookies (_abck, bm_sz).
  3. Fetch api2.realtor.ca/Listing.svc/PropertySearch_Post from inside the page (page.evaluate(fetch(...))) with ReferenceNumber=<MLS> — inherits the page's cookies, fingerprint, and Origin header so Akamai accepts the call.
  4. GET api2.realtor.ca/Listing.svc/PropertyDetails?PropertyID=<id>&ReferenceNumber=<mls> the same way.
  5. Parse photos from Property.Photo[] (high/med/low-res URLs), videos from AlternateURL.VideoLink, Property.VirtualTourUrl, Property.VirtualTours[], Property.Videos[].
  6. Push record to dataset. If downloadMedia=true, fetch each photo/video URL via Playwright's APIRequestContext (Node side — CDN blocks CORS) and store in the default Key-Value Store.

Running locally

npm install
npx playwright install chromium
npm 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.