Canadian real estate, Realtor.ca
A Realtor.ca scraper for active listings, with the listing agent on every row
Pick Canadian cities, choose sale or rent and residential or commercial, and get one row per active listing: MLS® number, asking price, beds, baths, interior size, listing date, map coordinates, main photo, the listing link and the listing agent with brokerage and phone. $1.00 per 1,000 listings. No API key, no MLS® membership and no login.
- $1.00 per 1,000 listings
- 18 Canadian cities
- For sale or for rent
- No login or API key
Does Realtor.ca have an API?
Not a public one: CREA's REALTOR.ca DDF® is a managed feed for REALTORS®, broker owners and the technology providers who build their websites. The Realtor.ca API options page compares DDF®, board feeds and this Actor, with costs. More example code for the Realtor.ca Property Scraper is in the realtor-ca-data repository on GitHub.
Input
| Input | What you give | Notes |
|---|---|---|
locations | Cities, as "Toronto, ON" or just "Toronto" | One of the 18 cities below. Other place names are skipped and named in the run log |
limitPerLocation | Listings per city | Up to about 500 per city in one run |
transactionType | sale (default) or rent | For-sale or for-rent listings |
propertyType | residential (default) or commercial | Commercial works the same way |
The 18 cities it searches:
- Ontario: Toronto, Mississauga, Brampton, Vaughan, Markham, Oakville, Hamilton, Ottawa, London
- British Columbia: Vancouver, Surrey, Burnaby, Victoria
- Alberta: Calgary, Edmonton
- Quebec: Montreal
- Manitoba: Winnipeg
- Nova Scotia: Halifax
Write Montreal without the accent. Each city is searched as a fixed map area about 25 km across, around its centre. That can leave out a large city's outer edges and can overlap a neighbouring city on the list; a listing found by two cities in one run is saved once. If none of your locations is supported, the run stops before it starts searching and says so.
What each row holds
| Field | What it holds |
|---|---|
mlsNumber | The MLS® number. Use it as your key |
price, priceValue | Asking price as shown ("$949,900") and as a number |
bedrooms, bathrooms | As published; "2 + 1" means two bedrooms plus a den |
sizeInterior | Interior size as published |
propertyType, ownershipType | For example Single Family, Freehold, Condominium/Strata |
address, cityProvince, postalCode, province | Where the property is |
latitude, longitude | Map coordinates |
listedDateUTC | When the listing went up on REALTOR.ca, as .NET ticks (100-nanosecond steps since 1 January 0001, UTC). The realtor-ca-data scripts on GitHub turn it into a date |
daysOnRealtor | REALTOR.ca's own time-on-site label as a bare number: minutes or hours for a listing under a day old, days for about its first week, then empty. Use listedDateUTC for a listing's age |
photoUrl, listingUrl | The main photo and the REALTOR.ca listing page |
agents | The listing agent or agents: REALTOR.ca agent ID, name, brokerage and phone |
location | The city you searched, for grouping |
The main fields of a row (made-up values and a made-up agent):
{
"mlsNumber": "W1234567",
"price": "$949,900",
"priceValue": 949900,
"bedrooms": "2 + 1",
"bathrooms": "2",
"sizeInterior": "65 m2",
"propertyType": "Single Family",
"ownershipType": "Condominium/Strata",
"address": "100 EXAMPLE AVE W",
"cityProvince": "Toronto, Ontario M6P0D0",
"postalCode": "M6P0D0",
"province": "Ontario",
"latitude": 43.65,
"longitude": -79.46,
"daysOnRealtor": 3,
"listedDateUTC": "639266331000000000",
"photoUrl": "https://cdn.realtor.ca/listings/.../photo.jpg",
"listingUrl": "https://www.realtor.ca/real-estate/...",
"agents": [
{
"individualId": 1234567,
"name": "JANE DOE",
"brokerage": "EXAMPLE REALTY INC., BROKERAGE",
"phone": "416-555-0198"
}
],
"location": "Toronto, ON"
}What it costs
| Event | Price | Charged for |
|---|---|---|
| Listing saved | $0.001 | Each listing saved to your dataset |
| Run start | $0.002 | Once per run at the default 1 GB of memory (one event per GB) |
200 Toronto listings cost $0.20, plus $0.002 for the run start ($0.202 in all). All 18 cities at 100 listings each, in one run, is 1,800 listings: $1.80 plus the run start. Several other Realtor.ca Actors on the Apify Store also charge about $1 per 1,000 results (Store prices on 2026-10-15), so compare their inputs and run statistics too; if you need a city that isn't on the list above, another Actor may cover it.
What it doesn't do
- Active listings only. No sold prices, price history or past listings.
listedDateUTCsays when a listing went up. - 18 cities, not postal codes, provinces or neighbourhood names. To widen a Greater Toronto search, add the neighbouring cities on the list. Filter by
postalCodeafter the run. - About 500 listings per city per run, newest first. A big market such as Toronto has more active listings than that, so a run returns the most recent ones, not the whole market. In our test runs at 500 per city, the median listing had been on REALTOR.ca 4 to 12 days.
- No agent emails. REALTOR.ca doesn't publish them; you get the phone and brokerage it shows.
- Not a DDF® or MLS® feed. It reads public pages only and has no licence from, or link to, CREA.
Export Realtor.ca listings to Excel
When the run finishes, open its Output tab and export the dataset as Excel or CSV, or fetch https://api.apify.com/v2/datasets/<datasetId>/items?format=xlsx with your API token. Add &unwind=agents for one line per listing agent. To turn listedDateUTC into a date in Excel, use =(A2-621355968000000000)/864000000000+25569 and format the cell as a date.
What people use it for
- New-supply snapshots. Asking prices and sizes of what was just listed, by postal area, from
priceValue,sizeInteriorandpostalCode. - Rental comps. Set
transactionTypetorentand compare asking rents by bedrooms. - New-listing feeds. Results come newest first, so a daily scheduled run per city, with a limit above that city's daily volume and de-duplicated on
mlsNumber, picks up what's new. - Maps. Coordinates on every row go straight into a map or a radius query.
- Services for listing agents. Photographers, stagers and mortgage brokers see new listings in their area with the listing brokerage.
The listing agent's name and business phone are published on REALTOR.ca so clients can reach them. They are still personal information under Canada's privacy law, so use them for the purpose you collected them for, follow REALTOR.ca's terms, and check the anti-spam rules (CASL) before sending commercial emails or texts.
Use it from an AI assistant
The Realtor.ca Property Scraper works as a tool in ChatGPT, Claude, Cursor and VS Code through Apify's hosted MCP server. Add this URL as a custom connector and sign in with your Apify account; runs bill to that account. Then ask in plain English, for example "get 100 for-rent listings in Halifax and give me the median asking rent by number of bedrooms".
https://mcp.apify.com/?tools=fetch-actor-details,yugenox/realtor-ca-property-scraperclaude mcp add --transport http yugenox-realtor-ca-listings "https://mcp.apify.com/?tools=fetch-actor-details,yugenox/realtor-ca-property-scraper"The AI setup guide walks through each client; use this URL in place of the YouTube or Instagram one.
Run it from code
100 for-sale listings in each of Toronto and Ottawa: 200 listings, $0.20 plus the run start.
// Save as run.mjs, then: npm i apify-client && APIFY_TOKEN=... node run.mjs
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('yugenox/realtor-ca-property-scraper').call({
locations: [
"Toronto, ON",
"Ottawa, ON"
],
limitPerLocation: 100,
transactionType: "sale",
propertyType: "residential"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) console.log(item.mlsNumber, item.priceValue, item.cityProvince);import os
from apify_client import ApifyClient # pip install apify-client
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("yugenox/realtor-ca-property-scraper").call(run_input={
"locations": ["Toronto, ON", "Ottawa, ON"],
"limitPerLocation": 100,
"transactionType": "sale",
"propertyType": "residential",
})
if run is None:
raise RuntimeError("Run did not finish")
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item.get("mlsNumber"), item.get("priceValue"), item.get("cityProvince"))# Small jobs: runs the Actor and returns the rows in one call (up to 5 minutes).
curl -X POST "https://api.apify.com/v2/acts/yugenox~realtor-ca-property-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"locations":["Toronto, ON","Ottawa, ON"],"limitPerLocation":100,"transactionType":"sale","propertyType":"residential"}'Not affiliated with or endorsed by The Canadian Real Estate Association (CREA) or REALTOR.ca. MLS® and Multiple Listing Service® are trademarks owned by CREA, and REALTOR® is a trademark controlled by CREA.
Questions people ask
Does Realtor.ca have a public API?
No. REALTOR.ca DDF® is CREA's listing feed for REALTORS®, broker owners and the websites they work with, and it needs a REALTOR.ca sign-in. This Actor reads the public listing results instead, at $1.00 per 1,000 listings.
Which cities does it cover?
Toronto, Mississauga, Brampton, Vaughan, Markham, Oakville, Hamilton, Ottawa, London, Vancouver, Surrey, Burnaby, Victoria, Calgary, Edmonton, Montreal, Winnipeg, Halifax. Type them as "Toronto, ON" or just "Toronto", and write Montreal without the accent.
Can I search by postal code or neighbourhood?
Not with this Actor: it searches the 18 cities. Filter the rows by postalCode afterwards.
Can I get sold prices or price history?
No. It returns active listings only, newest first. You can schedule it and keep your own snapshots, but in a big city each run covers only the most recent listings, so it won't find every listing again each time.
Are agent emails included?
No. REALTOR.ca doesn't publish agent emails. Each listing carries the listing agent's name, brokerage and phone as shown on REALTOR.ca.
Is it legal to scrape REALTOR.ca?
The Actor collects only listing data that anyone can view on REALTOR.ca without an account. Collecting public data is generally legal, but you are responsible for how you use it: listing agents' names and business phones are personal data, so follow PIPEDA, GDPR or CCPA where they apply and REALTOR.ca's terms, and ask a lawyer if unsure.
Run it on your own data
Open the Realtor.ca Property Scraper on Apify, pick your cities and press Start. You pay per listing from your own Apify account, with no subscription to us.
Last updated 2026-10-15.