Realtor.ca Scraper — Canada Sale, Rent & Sold
Pricing
from $0.80 / 1,000 listings
Realtor.ca Scraper — Canada Sale, Rent & Sold
Scrape Realtor.ca listings across Canada for sale, rent, or sold. Each row includes price, beds, baths, MLS number, address, photos, and agent phone. JSON export for Python, Node.js, and MCP.
Pricing
from $0.80 / 1,000 listings
Rating
0.0
(0)
Developer
Andrej Kiva
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 days ago
Last modified
Categories
Share
Realtor.ca Scraper
Disclaimer: Unofficial tool — not affiliated with, sponsored by, or endorsed by the Canadian Real Estate Association (CREA), REALTOR.ca, or their affiliates. Data is read from publicly accessible listing search results and listing pages only. No login. You are responsible for complying with applicable law (including privacy law where a row includes an agent name or phone) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.
Search Canadian property listings and export price, beds, baths, MLS number, address, photos, and the listing agent’s public phone. This Realtor.ca scraper is an API alternative for market checks, rent comps, and sold-listing pulls. Run it from Python, Node.js, or MCP and save JSON.
| Canada listings | US listings |
|---|---|
| Realtor.ca Scraper ◄── you are here | Realtor.com Scraper |
When to use
- Pull for-sale, for-rent, or sold listings for a Canadian city
- Filter by price, beds, and baths before the rows hit your dataset
- Grab MLS number, brokerage, and the public agent phone from the search card
- Open listing details when you also need tax, maintenance, and year built
Use Realtor.com Scraper when the next step is US sold comps or a ZIP search.
Key features
- City name, map or city URL, or a latitude/longitude radius
- Sale, rent, and sold, with optional sold-within-days
- Price, beds, baths, property type, and keyword filters
- MLS number, address, photos, brokerage, and public agent phone
- Optional listing detail for tax, maintenance fee, and year built
- HTTP-first at 512 MB on Apify; Camoufox clears Cloudflare when curl alone is blocked
Input
| Field | Required | Description |
|---|---|---|
location | One of these | City or neighbourhood, such as Toronto or Vancouver, BC |
startUrls | One of these | City page, map link, or one listing URL |
latitude / longitude | One of these | Center point. Replaces location when both are set |
distanceKm | No | Radius for coordinates. Default 20 |
operation | No | buy, rent, or sold. Default buy |
propertyType | No | Residential, condo, vacant land, recreational, multi-family, agricultural, or parking |
sortBy | No | newest, oldest, lowPrice, or highPrice |
maxItems | No | Stop after this many rows. Default 20, maximum 1000. One area returns about 600 |
minPrice / maxPrice | No | CAD bounds. 0 means no bound |
minBeds / maxBeds | No | Bedroom bounds. 0 means any |
minBaths / maxBaths | No | Bathroom bounds. 0 means any |
keywords | No | Extra search words |
soldWithinDays | No | Used when operation is sold |
openHousesOnly | No | Keep open-house listings. Not applied to sold |
includeDetails | No | Add tax, maintenance, year built, and the longer description |
proxyConfiguration | No | Used after a direct request is blocked. Canada residential is the cloud path |
Input example
{"location": "Toronto","operation": "buy","minBeds": 2,"maxPrice": 900000,"maxItems": 20,"includeDetails": false}
Coordinate search:
{"latitude": 49.2827,"longitude": -123.1207,"distanceKm": 15,"operation": "rent","maxItems": 50}
Output
One dataset row per listing.
| Field | Description |
|---|---|
listingId | Public listing id |
mlsNumber | MLS number |
url | Listing URL |
operation | buy, rent, or sold |
price | Numeric price in CAD |
priceText | Price as shown on the card |
currency | CAD |
propertyType | Type on the card |
address | Street, city, and province |
city | City parsed from the address |
province | Province or territory |
postalCode | Postal code when the card has one |
latitude / longitude | Map point |
bedrooms / bathrooms | Counts from the card |
sizeInterior | Interior size text |
brokerage | Brokerage name |
agentName | Listing agent |
agentPhone | Public agent phone |
publicRemarks | Public description |
photoUrls | Up to 20 photo URLs |
photoCount | How many photo URLs were saved |
openHouse | True when the card lists an open house |
timeOnRealtor | How long the listing has been public |
maintenanceFee / taxAmount / yearBuilt | Filled when includeDetails is on |
scrapedAt | UTC timestamp |
Output example
{"listingId": "30362405","mlsNumber": "C13859784","url": "https://www.realtor.ca/real-estate/30362405/635-glenholme-avenue","operation": "buy","price": 995000,"currency": "CAD","city": "Toronto","province": "Ontario","bedrooms": "3 + 1","bathrooms": "2","brokerage": "Example Brokerage","agentName": "Ada Agent","agentPhone": "416-5550100"}
Use cases
- Compare asking prices and bedroom counts for one city before a trip
- Export rent listings around a job site from a coordinate radius
- Pull recent sold rows with
operationset tosoldandsoldWithinDays - Hand a shortlist to a CRM with MLS number, brokerage, and public phone
Integration examples
Replace YOUR_TOKEN with an Apify API token. The store id is crawloop/realtor-ca-scraper.
Node.js
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: "YOUR_TOKEN" });const run = await client.actor("crawloop/realtor-ca-scraper").call({location: "Toronto",operation: "buy",maxItems: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("crawloop/realtor-ca-scraper").call(run_input={"location": "Toronto","operation": "buy","maxItems": 20,})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(items)
cURL
curl "https://api.apify.com/v2/acts/crawloop~realtor-ca-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"location":"Toronto","operation":"buy","maxItems":20}'
MCP and AI assistants
Use this Actor from AI tools via Apify MCP.
Connect your Apify account, then call this Actor by its store id crawloop/realtor-ca-scraper.
Example prompts:
- "Run Realtor.ca Scraper for Toronto for-sale listings, max 20, and return price, beds, and MLS number as JSON"
- "Scrape Vancouver rentals within a 15 km radius of downtown and summarize median asking rent"
- "Chain Realtor.ca Scraper for Canadian listings, then Realtor.com Scraper for US sold comps in the same brief"
Suite next step
After a Canadian shortlist, run Realtor.com Scraper for US sold comps, ZIP searches, and listing monitors.
FAQ
Does this cover sold listings?
Yes. Set operation to sold. Add soldWithinDays when you only want recent closings. Sold coverage depends on what the public search returns for that area.
How many listings can one city return?
One search area stops around 600 rows, newest first when you sort by newest. Raise maxItems up to 1000 if you want the full window the search will return.
Do I get the agent phone without opening every listing?
The search card includes the public agent name and phone when the listing shows them. Turn on includeDetails for tax, maintenance fee, year built, and a longer description.
Is this a Realtor.ca API?
It is an API alternative. Send a city, a map link, or coordinates and download JSON. Call it from Python, Node.js, cURL, or an AI assistant over MCP. No login and no browser.
Which places can I search?
Any Canadian city the public search resolves, including Toronto, Vancouver, Calgary, and Montreal. Use Vancouver, BC when the place name is shared. A coordinate radius covers a job site or a neighbourhood the city page does not name.