Realtor.ca Scraper — Canadian MLS Listings
Pricing
from $0.79 / 1,000 listings
Realtor.ca Scraper — Canadian MLS Listings
Scrape realtor.ca for Canadian MLS property listings: prices, addresses, bedrooms, photos, lot size & more. For sale & for rent. No API key required.
Pricing
from $0.79 / 1,000 listings
Rating
0.0
(0)
Developer
Unfenced Group
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Realtor.ca Scraper

Extract Canadian property listings from realtor.ca (CREA MLS) at scale — for sale, for rent and recently sold. Search by city or paste a map URL, then filter by price, bedrooms, bathrooms, property type and more. Every record carries price, address, geo-coordinates, size, photos and listing-agent business contact. No API key required.
Why this scraper?
🎯 Built for Canadian real estate
A dedicated realtor.ca scraper, not a global tool with a country dropdown. Currency (CAD), province parsing and MLS fields are tuned for realtor.ca.
🗺️ Complete map coverage
Searches a whole city or region by recursively splitting the map into tiles, so dense urban areas are fully covered instead of being truncated at the API's per-query cap.
📄 Rich listing data
Price, full address, city, province, postal code, latitude/longitude, bedrooms, bathrooms, interior size (sqft and m²), lot size, year built, parking, annual property tax, maintenance fee, photos and description on every record.
🏢 Listing-agent contact
Agent name, position, phone, brokerage and brokerage phone where realtor.ca publishes them as professional listing contact — business information only.
🏷️ Sale, rent and sold
Switch between active for-sale, for-rent, and recently-sold listings, with an optional "sold within N days" filter.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
city | string | (empty) | City/area to search, e.g. Toronto, ON. Geocoded automatically. |
startUrls | array | [] | Realtor.ca map URLs. Bounding box is extracted automatically; overrides city. |
transactionType | string | "for-sale" | for-sale, for-rent or sold. |
propertyType | string | "all" | all, residential, commercial, recreational, agriculture, parking. |
propertySubType | string | "all" | all, house, condo, townhouse. |
buildingType | string | (any) | Specific building type (house, apartment, duplex, etc.). |
minPrice / maxPrice | integer | — | Price bounds in CAD. |
minBedrooms / maxBedrooms | integer | — | Bedroom bounds. |
minBathrooms / maxBathrooms | integer | — | Bathroom bounds. |
minSqft / maxSqft | integer | — | Interior size bounds (sqft). |
minMaintenanceFee / maxMaintenanceFee | integer | — | Monthly maintenance fee bounds (CAD). |
minPropertyTax / maxPropertyTax | integer | — | Annual property tax bounds (CAD). |
openHousesOnly | boolean | false | Only listings with a scheduled open house. |
keywords | string | (empty) | Words that must appear in the listing, space-separated. |
listedSince | string | (empty) | Only listings posted on/after this date (YYYY-MM-DD). |
soldWithinDays | integer | — | Sold listings only: limit to the last N days. |
fetchDetails | boolean | false | Visit each listing page for appliances, heating, cooling, flooring, basement, exterior finish, pool and full feature lists. Adds one request per listing and roughly doubles run time. |
maxItems | integer | 1000 | Maximum listings to return. 0 = unlimited. |
Output schema
Every field below is present on every record. Fields the source does not publish for a given listing are returned as null rather than omitted.
| Field | Type | Description |
|---|---|---|
id | string | Realtor.ca listing ID. |
mlsNumber | string | MLS number. |
url | string | Full listing URL (English). |
urlFr | string | Full listing URL (French). |
propertyType | string | Property type (e.g. Single Family, Multi-Family). |
buildingType | string | Building type (e.g. Apartment, House, Row-Townhouse). |
transactionType | string | For Sale, For Rent or Sold. |
status | string | Listing status. |
tags | array | Listing tags, when present. |
timeOnRealtor | string | Time on realtor.ca as displayed (e.g. 1 hour ago). |
price | number | Numeric price. |
priceFormatted | string | Price as displayed. |
currency | string | Always CAD. |
pricePerSqft | number | Price divided by interior square footage. |
address | string | Street address. |
city | string | City. |
province | string | Province. |
postalCode | string | Postal code. |
country | string | Always Canada. |
latitude | number | Latitude. |
longitude | number | Longitude. |
ownershipType | string | Ownership type (Freehold, Condominium/Strata, Leasehold, etc.). |
bedrooms | number | Total bedrooms (above + below ground). |
bedroomsAbove | number | Above-ground bedrooms. |
bedroomsBelow | number | Basement bedrooms (Canadian X + Y format). |
bathrooms | number | Bathrooms. |
storeys | number | Number of storeys. |
yearBuilt | number | Year built. |
sizeInterior | string | Interior size as published. |
sizeInteriorM2 | number | Interior size in square metres. |
sizeInteriorSqft | number | Interior size in square feet. |
sizeLot | string | Lot size as published. |
parking | array | Parking types. |
parkingType | string | Parking type summary. |
parkingSpaces | number | Number of parking spaces. |
amenitiesNearby | string | Nearby amenities (park, transit, schools, etc.). |
buildingAmenities | string | Building amenities (concierge, gym, etc.). |
annualTaxCAD | number | Annual property tax (CAD). |
taxToPrice | number | Annual tax divided by price. |
maintenanceFeeCAD | number | Monthly maintenance fee (CAD). |
description | string | Public listing remarks. |
photos | array | Photo URLs. |
photoCount | number | Number of photos. |
agents | array | Listing-agent business contact (name, position, phone with area code, website, brokerage, brokerage phone). |
openHouses | array | Scheduled open houses (start/end, comments). |
listedDate | string | Date listed (YYYY-MM-DD). |
source | string | Always realtor.ca. |
scrapedAt | string | ISO timestamp of scrape. |
contentHash | string | Stable hash for change detection. |
The fields below are only populated when fetchDetails is enabled, and only where realtor.ca publishes them.
| Field | Type | Description |
|---|---|---|
heatingType | string | Heating system type. |
heatingFuel | string | Heating fuel. |
cooling | string | Cooling system. |
flooring | string | Floor space type. |
flooringType | string | Flooring material. |
basementType | string | Basement type. |
basementFeatures | string | Basement features. |
exteriorFinish | string | Exterior finish. |
roofMaterial | string | Roof material. |
foundationType | string | Foundation type. |
poolType | string | Pool type. |
features | string | Property features. |
appliances | string | Included appliances. |
fireProtection | string | Fire protection. |
waterSource | string | Water source. |
sewer | string | Sewer type. |
utilities | string | Available utilities. |
landscapeFeatures | string | Landscape features. |
fenceType | string | Fence type. |
constructionStyle | string | Construction style. |
Example record
{"id": "27891234","mlsNumber": "W1234567","url": "https://www.realtor.ca/real-estate/27891234/55-bremner-blvd-toronto","propertyType": "Single Family","transactionType": "For Sale","price": 899000,"priceFormatted": "$899,000","currency": "CAD","address": "55 Bremner Blvd Unit 2801","city": "Toronto","province": "ON","postalCode": "M5J 0A6","country": "Canada","latitude": 43.6426,"longitude": -79.3871,"bedrooms": 3,"bathrooms": 2,"yearBuilt": 2018,"sizeInteriorSqft": 1100,"annualTaxCAD": 4200,"maintenanceFeeCAD": 780,"description": "Stunning 3-bed condo in downtown Toronto with lake views.","photos": ["https://pics.realtor.ca/hi/1.jpg", "https://pics.realtor.ca/hi/2.jpg"],"agents": [{ "name": "Jane Broker", "position": "Sales Representative", "phone": "416-555-0100", "brokerage": "Royal LePage", "brokeragePhone": "416-555-0199" }],"listedDate": "2026-06-20","source": "realtor.ca","scrapedAt": "2026-07-05T12:00:00.000Z","contentHash": "c46cc3faf743f6f1"}
Examples
Condos for sale in a city
{ "city": "Toronto, ON", "transactionType": "for-sale", "propertySubType": "condo", "maxItems": 500 }
Rentals within a price range
{ "city": "Vancouver, BC", "transactionType": "for-rent", "maxPrice": 3000, "minBedrooms": 2, "maxItems": 300 }
Recently sold, last 30 days
{ "city": "Ottawa, ON", "transactionType": "sold", "soldWithinDays": 30, "maxItems": 400 }
Specific map area from a browser URL
{ "startUrls": [{ "url": "https://www.realtor.ca/map#..." }], "transactionType": "for-sale" }
💰 Pricing
$0.89 per 1,000 results. You are billed only for successfully returned listings; failed retries are never charged.
| Results | Cost |
|---|---|
| 100 | ~$0.09 |
| 1,000 | ~$0.89 |
| 10,000 | ~$8.90 |
| 100,000 | ~$89.00 |
Subscription tiers lower the rate further, down to $0.69 per 1,000 at the highest tier. Use the Max items input to control spend exactly.
Performance
| Run size | Typical time |
|---|---|
| 100 results | 1–3 minutes |
| 1,000 results | 8–15 minutes |
| 10,000 results | 60–100 minutes |
Dense metros are split into more tiles, which adds requests; wide rural areas resolve faster. Enabling fetchDetails adds one page load per listing and roughly doubles these times.
Known limitations
- realtor.ca caps results per map query; the scraper works around this by tiling, but extremely dense downtown cores can still miss a small tail of listings.
sizeInteriorM2/sizeInteriorSqftdepend on the listing agent entering a size; many listings leave it blank.- Open-house data is only present when the listing has a scheduled open house, and never for sold listings.
- Agent details are professional listing contact only; no personal or non-listing PII is collected.
Technical details
- Source: realtor.ca — Canadian MLS (CREA)
- Coverage: nationwide, by city or map area
- Anti-bot: requests use Apify Residential proxy (Canada) with session warmup to clear Incapsula
- Retry: automatic retry with exponential backoff and a circuit breaker
Need a custom scraper?
Unfenced Group builds Apify actors for any website — for free.
If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.
Get in touch: www.unfencedgroup.nl