Realtor.ca Property Scraper — Canada · Market KPIs
Pricing
from $3.00 / 1,000 listing extracteds
Realtor.ca Property Scraper — Canada · Market KPIs
Scrape Realtor.ca listings nationwide — sale + rent, by city/province, postal code, coordinates, polygon, or URL. Built-in market KPIs (CAD), property lookup with agents, history, mortgage links. Independent tool — not affiliated with Realtor.ca or CREA.
Pricing
from $3.00 / 1,000 listing extracteds
Rating
0.0
(0)
Developer
SIÁN OÜ
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
🇨🇦 Realtor.ca Property Scraper — Canadian MLS Listings + Market KPIs 🚀
🎉 NEW: The only Canadian Realtor.ca scraper on Apify with tiered pay-per-event pricing — FREE $0.030 → flat $0.003 at GOLD
Built for Canadian real estate investors, brokerages, market analysts, lead-gen teams, PropTech builders, and investment underwriters who need reliable Realtor.ca MLS data at scale.
📋 Overview
Pull every Realtor.ca listing in your target Canadian market and ship clean, normalized rows straight into your dataset — no proxies, no headless browsers, no broken scrapes. This actor wraps the full Realtor.ca surface (sale + rent, every province, every postal code) and gives you a single-property lookup mode with agents, history, and mortgage deep links — so you can underwrite a Canadian deal in minutes, not days.
Why Canadian investors, brokerages, and PropTech teams choose us:
- ✅ Nationwide Canadian coverage — all 10 provinces + 3 territories, sale and rent in one feed, filtered client-side via the
listingTypeflag. Toronto, Vancouver, Montréal, Calgary, Ottawa, Edmonton — every market, one actor. - ⚡ 6 search modes — location (city + province), Canadian postal code (
A1A 1A1), coordinates + radius (km), polygon, Realtor.ca URL, plus single-property lookup by ID / address / URL. Most community scrapers ship 1–2. - 🎯 Property lookup with full detail block — agents (name, phone, email, brokerage), property history, open house schedule, mortgage calculator deep links, building features (basement, exterior finish, appliances, fire protection, amenities), land features (frontage, depth, sewer).
- 💰 Tiered Idealista-style curve — FREE $0.030 → flat $0.003 at GOLD. Beats every Canadian community-scraper rate ($5–15 / 1,000 results) at scale, and we charge per-listing, not per-page.
- 💎 Canadian quirks normalized —
"5 + 1"bedrooms split into above-grade + basement totals; metricm²sizes converted to imperial sqft (1 m² = 10.7639 sqft); postal codes normalized toA1A 1A1; CAD-formatted tax strings parsed to integers. - ✨ NEW: HTML market report per run — median list price (CAD), $/sqft distribution, top cities, top provinces, sale/rent split, per-query totals — saved automatically to the key-value store, no extra cost.
✨ Features
- 🏙️ Search by Location —
"City, Province"(e.g."Toronto, ON","Vancouver, BC","Montréal, QC") - 📮 Search by Postal Code — Canadian
A1A 1A1format, with or without space (normalized internally) - 📍 Search by Coordinates — Lat/lon + radius in kilometres for tight neighbourhood targeting
- 🗺️ Polygon Search — Custom multi-point lat/lon boundaries for irregular markets (ski-resort zones, waterfronts, neighbourhood-level)
- 🔗 URL Search — Paste a Realtor.ca search URL; we mirror what you see in the browser
- 🆔 Single-Property Lookup — Direct fetch by Realtor.ca property ID, full address, or URL — returns the rich detail block
- 🏷 Sale + Rent Filter — One feed, one
listingTypeflag (sale/rent/both) - 👥 Agents Data — Name, phone, email, brokerage on every lookup row
- 📜 Property History — Past list dates, price changes, status transitions
- 💵 Mortgage Deep Links — Pre-filled mortgage calculator URLs for downstream lead-gen workflows
- 📊 Market KPIs in CAD — Median list price, $/sqft, beds / baths / sqft distributions, top cities, top provinces, property-type and transaction-type breakdowns
- 📑 HTML Market Report — Auto-generated, saved to the run's key-value store at
report.html - 📦 Bulk Inputs (PAID) — Multiple cities, postal codes, URLs, property IDs, or addresses in one run
- 🔁 Auto-Pagination — Drains every search query (50/page) up to your
maxResultscap - 🧹 Smart Deduplication — Same property never pushed twice across paginated pages
🎬 Quick Start
Pick a search mode, hand us a Canadian location (or postal code, coordinates, polygon, URL, property ID), choose your listingType, and run. Listings stream straight into the Apify dataset; the HTML market report saves to the run's key-value store at report.html.
curl -X POST https://api.apify.com/v2/acts/sian.agency~realtor-ca-property-scraper/runs?token=[YOUR_TOKEN] \-H 'Content-Type: application/json' \-d '{"searchMode": "location", "location": "Toronto, ON", "listingType": "sale", "maxResults": 100}'
🚀 Getting Started (3 Simple Steps)
Step 1: Pick a search mode
Choose one of: location, postalCode, coordinates, polygon, url, or lookup. For most workflows, location is the simplest entry point ("Toronto, ON", "Vancouver, BC").
Step 2: Set your filters
Set listingType to sale, rent, or both (default). Set maxResults to cap the run (FREE tier always tops out at 25 listings; PAID has no ceiling).
Step 3: Hit run
The first 25 listings are free (no credit card). Watch the dataset fill in real time. Download as JSON / CSV / Excel / RSS / JSONL / XML directly from the Apify UI.
That's it! In under 5 minutes, you'll have:
- A clean, normalized dataset of Realtor.ca listings with 40+ fields
- Median list price (CAD), $/sqft, and distribution KPIs computed
- An HTML market report you can share with clients or your team
📥 Input Configuration
| Field | Type | Required | Description |
|---|---|---|---|
searchMode | string | Yes | One of: location, postalCode, coordinates, polygon, url, lookup |
listingType | string | No | both (default), sale, or rent. Client-side filter on Realtor.ca's mixed feed |
maxResults | integer | No | 1–1,000, default 50. FREE tier is always capped at 25 per run |
location | string | Conditional | "City, Province" (e.g. "Toronto, ON") — used when searchMode=location |
locations | array | PAID | Bulk locations array — PAID tier only |
postalCode | string | Conditional | Canadian postal code A1A 1A1 (space optional) — used when searchMode=postalCode |
postalCodes | array | PAID | Bulk postal codes |
latitude / longitude | number | Conditional | Centre point for coordinates mode |
radius | number | Optional | Search radius in kilometres (coordinates mode) |
polygon | string | Conditional | "lon lat,lon lat,..." (≥3 points, space-separated pairs, comma-separated points) |
url | string | Conditional | A Realtor.ca search URL — used when searchMode=url |
urls | array | PAID | Bulk Realtor.ca search URLs |
lookupBy | string | Conditional | propertyId, address, or url — used when searchMode=lookup |
propertyId | string | Conditional | Realtor.ca numeric property ID |
address | string | Conditional | Full Canadian address |
propertyIds / addresses | array | PAID | Bulk lookup inputs |
Example — Toronto for-sale listings:
{"searchMode": "location","location": "Toronto, ON","listingType": "sale","maxResults": 100}
Example — Vancouver rentals only:
{"searchMode": "location","location": "Vancouver, BC","listingType": "rent","maxResults": 50}
Example — Canadian postal code lookup:
{"searchMode": "postalCode","postalCode": "M5V 2H1","listingType": "both"}
Example — Polygon-bounded neighbourhood scan (downtown Toronto):
{"searchMode": "polygon","polygon": "-79.395 43.660,-79.380 43.660,-79.380 43.650,-79.395 43.650","listingType": "sale","maxResults": 200}
Example — Single-property full details:
{"searchMode": "lookup","lookupBy": "propertyId","propertyId": "29768213"}
📤 Output
Results are saved to the Apify dataset with 40+ fields per listing including:
| Field | Type | Description |
|---|---|---|
propertyId | string | Realtor.ca numeric ID |
mlsNumber | string | Canadian MLS reference number |
transactionType | string | "For sale", "For rent", or null |
status | string | Active / sold / pending |
propertyType | string | Single Family, Condo Apartment, Multi-family, etc. |
ownershipType | string | Freehold, Condominium, Leasehold |
address.line | string | Street line (e.g. "44 WALLACE STREET") |
address.locality | string | City + province + postal (e.g. "Vaughan (West Woodbridge), Ontario L4L2P3") |
address.full | string | Combined display string |
address.postalCode | string | Normalized to A1A 1A1 |
address.province | string | Two-letter (ON, BC, QC, AB, ...) |
latitude / longitude | number | Geo coordinates (coerced from upstream strings) |
listPriceCad | number | Parsed from priceUnformatted (CAD integer) |
priceDisplay | string | CAD-formatted string (e.g. "$1,495,000") |
pricePerSqft | number | Computed CAD per sqft |
taxAmount | integer | Annual property tax in CAD (parsed from "$5,349" string) |
specs.beds | integer | Total bedrooms |
specs.bedsAboveGrade | integer | Above-grade bedrooms (parsed from "5 + 1") |
specs.bedsBelowGrade | integer | Basement bedrooms (parsed from "5 + 1") |
specs.bathrooms | integer | Total bathrooms |
specs.halfBaths | integer | Half / powder rooms |
specs.sizeInterior | object | { value, unit, sqftDerived } — handles "232.2557 m2" or "2500 sqft" |
building | object | Constructed date, amenities, appliances, basement type, exterior finish, fire protection, cooling, age |
land | object | Total size, frontage, depth, sewer type |
tags | array | Realtor.ca display tags ("New", "Open House", "17 min ago") |
photoUrl | string | Primary photo URL |
photoUrls | array | All listing photo URLs |
photoCount | integer | Total photo count |
description | string | Public remarks / listing description |
agents | array | (lookup only) [{ name, phone, email, brokerage }, ...] |
history | array | (lookup only) Past list dates + price changes |
openHouse | object | (lookup only) Open house schedule |
mortgageLinks | object | (lookup only) Pre-filled mortgage calculator URLs |
Example row (truncated):
{"propertyId": "29768213","mlsNumber": "N8123456","transactionType": "For sale","propertyType": "Single Family","ownershipType": "Freehold","address": {"line": "44 WALLACE STREET","locality": "Vaughan (West Woodbridge), Ontario L4L2P3","postalCode": "L4L 2P3","province": "ON"},"latitude": 43.7889,"longitude": -79.5996,"listPriceCad": 1495000,"priceDisplay": "$1,495,000","pricePerSqft": 598,"taxAmount": 5349,"specs": {"beds": 6,"bedsAboveGrade": 5,"bedsBelowGrade": 1,"bathrooms": 4,"sizeInterior": { "value": 232.2557, "unit": "m2", "sqftDerived": 2500 }},"tags": ["New", "Open House"],"photoCount": 32}
An HTML market report is also saved to report.html in the run's key-value store — median list price (CAD), $/sqft distribution, top cities, top provinces, sale/rent split, per-query totals, and property-type breakdowns.
💼 Use Cases & Examples
1. Canadian real-estate investor underwriting
A residential investor sizing up a Toronto or Vancouver acquisition.
Input: City + province (e.g. "Toronto, ON") with listingType=sale and maxResults=500
Output: Every active for-sale listing with list price (CAD), $/sqft, beds (above + below grade), annual tax amount, agent contacts, full building features
Use: Build comp sets, score deals against neighbourhood medians, defend offers to lenders with real per-listing data — not aggregator averages.
2. Comparative Market Analysis (CMA) for brokerages
A Toronto/Montréal brokerage shipping CMA decks to vendor clients.
Input: Postal code or polygon around the subject property Output: Median list price, $/sqft distribution, sale/rent split, top property types, plus the auto-generated HTML market report Use: Ship CMA reports to clients in minutes instead of hours. Drop the HTML report straight into a vendor pitch — it's pre-formatted and shareable.
3. Lead-gen prospecting from province-targeted searches
A Canadian real-estate SaaS or referral business building outreach lists.
Input: City + province + listingType=sale, plus lookup mode for each top result to pull agent data
Output: Full listings + agents (name, phone, email, brokerage) per property
Use: Build buyer/seller outreach lists or agent-poaching pipelines for Toronto, Vancouver, Montréal, Calgary, Ottawa, Edmonton — wherever Realtor.ca has coverage.
4. PropTech inventory + price monitoring
A Canadian housing dashboard or price-trend product running weekly snapshots.
Input: Polygon or city, scheduled weekly via Apify's built-in cron Output: Deltas in inventory count, median list price, $/sqft week-over-week Use: Feed Canadian housing dashboards, price-trend product features, investor newsletters, or real-time alerting for inventory spikes / price drops.
5. Investment-property due diligence
An out-of-town buyer or institutional acquirer running deal-by-deal due diligence.
Input: Property ID, full address, or Realtor.ca URL via lookup mode
Output: Full detail block — agents, property history, open house schedule, mortgage calculator deep links, building features (basement, exterior finish, appliances, fire protection, amenities), land features (frontage, depth, sewer)
Use: Skip the manual Realtor.ca click-through. Pull every public data point on a property into your DD spreadsheet or CRM in one API call.
6. Rental market sizing for STR / LTR operators
A long-term or short-term rental operator entering a new Canadian market.
Input: City + province with listingType=rent
Output: Active rental inventory, rent distribution, beds / baths / sqft breakdowns, top neighbourhoods
Use: Compute total addressable rental supply, identify undersupplied bedroom counts, set competitive rent benchmarks before signing a lease or buying a multi-family.
🔗 Integration Examples
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('sian.agency/realtor-ca-property-scraper').call({searchMode: 'location',location: 'Toronto, ON',listingType: 'sale',maxResults: 200});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0].listPriceCad, items[0].pricePerSqft, items[0].address.full);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('sian.agency/realtor-ca-property-scraper').call(run_input={'searchMode': 'location','location': 'Vancouver, BC','listingType': 'sale','maxResults': 100,})for item in client.dataset(run['defaultDatasetId']).iterate_items():print(item['address']['full'], item.get('listPriceCad'), item.get('pricePerSqft'))
cURL
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~realtor-ca-property-scraper/runs?token=YOUR_TOKEN' \-H 'Content-Type: application/json' \-d '{"searchMode": "location", "location": "Montréal, QC", "listingType": "sale", "maxResults": 150}'
Automation Workflows (N8N / Zapier / Make)
- Trigger: Weekly schedule (Mondays 06:00 ET) or webhook from your CRM
- HTTP Request: Call the actor with your saved polygon or city list
- Process: Read the dataset, compute deltas vs. the previous run
- Action: Push new listings / price-drop alerts to Slack, email, a Notion database, or your investor portal
📊 Performance & Pricing
FREE Tier (Try It Now)
- 25 listings per run — full feature access, identical data quality
- All 6 search modes available
- No credit card required
- Perfect for testing a Canadian market before you commit
PAID Tier (Production Ready)
- Unlimited listings per run
- Bulk inputs (multiple cities, postal codes, URLs, property IDs in one run)
- Volume-tiered pricing — the more you scrape, the cheaper each listing becomes
- Pay-per-event: only charged for listings successfully extracted
Headline pricing — ListingExtracted event:
| Tier | Price / listing |
|---|---|
| FREE | $0.030 |
| BRONZE ($20 spend) | $0.005 |
| SILVER ($100 spend) | $0.004 |
| GOLD ($500 spend) | $0.003 |
| PLATINUM ($2,000 spend) | $0.003 |
| DIAMOND ($5,000 spend) | $0.003 |
Plus apify-actor-start at a flat $0.005 per run (charged once after input validation passes).
💰 Best price on the market at scale — Canadian community scrapers charge $5–15 per 1,000 results with no volume curve. At GOLD floor ($0.003 × 1,000 = $3.00), we beat every alternative on the headline event and ship full single-property lookup data on the same row price.
🔗 View live pricing on the actor page
❓ Frequently Asked Questions
Q: How many listings can I process? A: FREE tier: 25 per run. PAID tier: unlimited. The tier curve drops the per-listing price at $20, $100, $500, $2,000, and $5,000 of lifetime spend on the actor.
Q: Sale + rent — how is the split handled?
A: Realtor.ca returns sale and rent listings in one mixed feed. We apply a client-side filter via the listingType input (sale / rent / both). The filter runs after the upstream response so you can pull both sides in one run if you want a full inventory snapshot.
Q: Does this scrape sold-price data? A: No. Realtor.ca hides sold price and sold date on the consumer-facing website. This scraper only exposes what Realtor.ca makes publicly visible, so sold price/date is not returned. For sold data, you need an MLS board membership or the agent-side MLS feed.
Q: How do I search by Canadian postal code?
A: Set searchMode=postalCode and pass any Canadian postal in A1A 1A1 format. The space is optional — "M5V 2H1" and "M5V2H1" are both accepted, and we normalize to the spaced format internally. Do NOT pass US 5-digit ZIP codes; they will return zero results.
Q: What's the difference between coordinates and polygon mode?
A: coordinates mode uses a circle: centre point (lat/lon) + radius in km. polygon mode uses an arbitrary closed shape: at least 3 lat/lon points. Use coordinates for "everything within 5 km of downtown"; use polygon for irregular shapes like a riverfront strip, a ski-resort zone, or a custom neighbourhood boundary.
Q: What does single-property lookup return that search modes don't?
A: The lookup mode hits Realtor.ca's full detail endpoint and returns agents (name, phone, email, brokerage), property history (past list dates + price changes), open house schedule, mortgage calculator deep links, full building features (basement, exterior finish, appliances, fire protection, amenities), and land features (frontage, depth, sewer). Search modes give you the listing summary; lookup gives you the full DD packet.
Q: How are "5 + 1" bedrooms handled?
A: Realtor.ca uses CA-specific strings like "5 + 1" (5 above-grade + 1 in the basement). We parse these into three numeric fields: specs.beds (total = 6), specs.bedsAboveGrade (5), and specs.bedsBelowGrade (1). You can sort, filter, and aggregate without any string-parsing on your side.
Q: What about metric vs imperial sizes?
A: Realtor.ca returns Quebec listings in m² and other provinces in sqft. The specs.sizeInterior object has { value, unit, sqftDerived } — sqftDerived is always normalized to imperial sqft (1 m² = 10.7639 sqft) so you can run cross-province KPIs without unit conversion.
Q: What output formats are available? A: JSON, CSV, Excel, RSS, JSONL, and XML — export directly from the Apify dataset UI or via the API.
Q: Is this legal? A: Yes — we only extract publicly available Realtor.ca data. See our legal section below.
Q: How long does processing take?
A: ~1–2 seconds per listing in search modes (50 per page, auto-paginated). Single-property lookup mode is ~2 seconds per ID. A 200-listing Toronto run completes in 3–5 minutes.
🐞 Troubleshooting
The dataset is empty after a successful run.
- Check that
searchModematches the input field you provided (e.g.locationmode needslocation;postalCodemode needspostalCode;lookupmode needslookupBy+ the matching ID/address/URL). - On FREE tier, only 25 results return per run — if your search has fewer than 25 matches, that's the full set.
- If
listingType=saleand the market is rentals-heavy (e.g. downtown Montréal condo blocks), trylistingType=bothto see the unfiltered feed.
Postal code search returns 0 results.
- Ensure you're using the Canadian
A1A 1A1format (one letter, one digit, one letter, optional space, one digit, one letter, one digit). Not a US 5-digit ZIP. - The space is optional —
"M5V2H1"and"M5V 2H1"both work; we normalize internally. - Some Quebec rural postal codes have very low Realtor.ca coverage; try a coarser search via
coordinatesorlocationmode.
Polygon mode returns 0 results.
- Polygons need at least 3 distinct points.
- Format is
"lon lat,lon lat,..."— longitude first, latitude second, space-separated within a pair, comma-separated between pairs. This is the opposite order from most "lat,lng" conventions, so double-check before debugging further. - Polygons should be roughly closed (we don't require an explicit closing point; Realtor.ca closes implicitly).
Bedrooms field looks weird or is missing.
- Realtor.ca strings like
"5 + 1"mean 5 above-grade + 1 in the basement. Don't read the raw upstream string — read our parsed fields:specs.beds(total),specs.bedsAboveGrade,specs.bedsBelowGrade. - For commercial listings, beds is often
null; checkpropertyTypefirst.
Size is shown in m² instead of sqft.
- Quebec listings come from Realtor.ca in metric. Use
specs.sizeInterior.sqftDerived— it's always normalized to imperial sqft regardless of the upstream unit (1 m² = 10.7639 sqft). - The original value and unit are preserved in
specs.sizeInterior.valueandspecs.sizeInterior.unitif you need them.
⚖️ Is it legal to scrape data?
Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.
However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by Canadian regulations such as PIPEDA (Personal Information Protection and Electronic Documents Act) and provincial equivalents (Quebec's Law 25, British Columbia's PIPA, Alberta's PIPA). You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.
You can also read Apify's blog post on the legality of web scraping.
⚠️ Trademark Disclaimer
Realtor.ca® and REALTOR® are registered trademarks of The Canadian Real Estate Association (CREA). This Apify Actor is an independent third-party scraping tool. It is not affiliated with, endorsed by, sponsored by, or connected to Realtor.ca, CREA, or any of their subsidiaries. The Realtor.ca® name appears in this listing under nominative fair use, solely to identify the public platform whose publicly available listing data this tool helps you collect.
This tool does not provide access to Realtor.ca's internal systems, private APIs, member-only MLS feeds, partner data, or proprietary services. Users are responsible for ensuring their use complies with Realtor.ca's Terms of Service, CREA's policies, and all applicable Canadian federal and provincial laws (including PIPEDA, Quebec's Law 25, BC PIPA, and Alberta PIPA).
🤝 Support
Join our active support community
- For issues or questions, open an issue in the actor's repository
- Check the SIÁN Agency Store for more automation tools
- 📧 apify@sian-agency.online
Built by SIÁN Agency | More Tools