Realtor.ca Canada Home Listings & Agent Contacts Scraper
Pricing
from $17.00 / 1,000 results
Realtor.ca Canada Home Listings & Agent Contacts Scraper
Scrape Canadian real-estate listings by city or area: MLS number, price, full address, beds, baths, property type, size, geo-coordinates, description, photos and the listing agent name, phone and brokerage. Filter by price and bedrooms. Export to JSON, CSV or Excel.
Pricing
from $17.00 / 1,000 results
Rating
5.0
(1)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Realtor.ca Canada Home Listings & Agent Contacts Scraper
Here is one real result, with every field the actor returns (the description is trimmed to its first sentences for readability; the live record contains the full text):
{"imageUrl": "https://cdn.realtor.ca/listings/TS639219515015200000/reb14/highres/8/40854188_1.jpg","mlsNumber": "40854188","listingId": "30134743","listingUrl": "https://www.realtor.ca/real-estate/30134743/2908-highway-7-unit-703-concord","transactionType": "For Sale","price": 564900,"priceFormatted": "$564,900","currency": "CAD","addressText": "2908 HIGHWAY 7 Unit# 703, Concord, Ontario L4K0K5","street": "2908 HIGHWAY 7 Unit# 703","city": "Concord","province": "Ontario","postalCode": "L4K0K5","latitude": 43.79648866,"longitude": -79.52113208,"propertyType": "Single Family","buildingType": "Apartment","bedrooms": "2","bathrooms": "2","storiesTotal": "1","sizeInterior": "811.0000","squareFootage": "811 sqft","ownershipType": "Condominium","parkingType": "Underground, Covered","parkingSpaces": "1","description": "Welcome to this well-designed 2-bedroom, 2-bathroom condo in the highly sought-after NordCondos at Expo City. This unit features a functional split-bedroom layout, offering privacy with each bedroom having access to its own full bathroom.","propertyTax": "$2,888.80","maintenanceFee": "$693.40 Monthly","maintenanceFeeType": "Heat","yearBuilt": null,"heatingType": "Forced air, Natural gas","coolingType": "Central air conditioning","basementType": "None","exteriorFinish": "Concrete","flooringType": null,"appliances": ["Dishwasher, Dryer, Microwave, Refrigerator, Stove, Washer, Window Coverings"],"amenitiesNearby": ["Hospital, Park, Public Transit, Schools"],"viewType": null,"communityFeatures": ["Community Centre"],"landSize": "Unknown","daysOnRealtor": "51 min ago","listingDate": "2026-08-10T13:38:21.513Z","agentName": "Ivaylo Stoyanov","agentPhone": "647-559-5141","agentPosition": "Salesperson","agentUrl": "https://www.realtor.ca/agent/2089306/ivaylo-stoyanov-130-king-street-west-unit-1900r-toronto-ontario-m5x1e3","agent2Name": "David Robbio","agent2Phone": "647-699-3096","brokerageName": "REAL BROKER ONTARIO LTD BROKERAGE 1800R","brokeragePhone": null,"brokerageAddress": "130 King Street West Unit 1900R, Toronto, Ontario M5X1E3","brokerageLogo": "https://cdn.realtor.ca/organizations/en-CA/TS638911995600000000/lowres/1455714.jpg","brokerageWebsite": "https://www.cornerstone.inc/","photoCount": 1,"photos": ["https://cdn.realtor.ca/listings/TS639219515015200000/reb14/highres/8/40854188_1.jpg"],"query": "Toronto, Ontario","source": "Realtor.ca","observedAt": "2026-08-10T14:30:00.335Z","error": null}
The most complete Realtor.ca scraper available. It returns every listing field Realtor.ca exposes, including listing agent and co-agent names and phones, brokerage details, tax and maintenance fees, building specs and the full photo gallery, plus an optional paid add-on that finds a public business contact email for leads.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor searches Realtor.ca for each Canadian city or area you pass, applies the optional transaction type, price and bedroom filters, paginates through the matching listings, and writes one normalized record per listing to the run's dataset. When withDetails is on (the default), each listing is enriched with its full text description, tax and fee details, building specs, agent and brokerage contacts and the photo gallery. Coordinates are captured for mapping, and prices are returned both as a number and a formatted string in CAD.
An optional paid add-on (enrichContacts) attempts to find a public business contact email and name for listings that do not already carry one. It is off by default and billed per attempt, plus an extra charge only when an email is found.
Quickstart
Open the actor, paste this into the input, and press Run. It returns 10 homes for sale in Toronto with full details.
{"searchQueries": ["Toronto, Ontario"],"maxListings": 10,"withDetails": true,"transactionType": "For Sale"}
Add more cities to searchQueries to cover them in one run. Use transactionType, priceMin, priceMax and beds to narrow the results. All fields are optional.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
searchQueries | string[] | no | ["Toronto, Ontario"] | One or more Canadian cities, neighbourhoods or areas to search, for example Vancouver, BC, Calgary. One run covers every area in the list. |
maxListings | integer | no | 10 | Maximum number of listings to collect across all areas. |
withDetails | boolean | no | true | Also fetch each listing's full description, specs and contacts. Turn off for faster listing-level results. |
transactionType | enum | no | For Sale | Return homes For Sale, For Rent, or Both. |
priceMin | integer | no | (any) | Only listings priced at or above this amount in CAD. |
priceMax | integer | no | (any) | Only listings priced at or below this amount in CAD. |
beds | integer | no | (any) | Only listings with at least this many bedrooms (0 to 20). |
enrichContacts | boolean | no | false | Paid add-on. For each result without an email, attempt to find a public business contact email and name. Billed per attempt, plus an extra charge only when an email is found. |
enrichContactsMax | integer | no | 50 | Cap how many results the add-on tries to enrich. Free Apify accounts are capped at 3. |
Filters combine with logical AND and are applied to every area in the search.
Output reference
One dataset item per listing. Types: string, integer, number, string[], or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
imageUrl | string | Primary listing photo URL. |
mlsNumber | string | MLS number of the listing. |
listingId | string | Realtor.ca listing ID (unique per listing). |
listingUrl | string | Canonical listing URL on realtor.ca. |
transactionType | string | For Sale or For Rent. |
price | integer | Price as a number in CAD. |
priceFormatted | string | Price as a formatted string, for example $564,900. |
currency | string | Currency of price fields. CAD. |
addressText | string | Full address as one line. |
street | string | Street portion of the address. |
city | string | City. |
province | string | Province. |
postalCode | string | Postal code. |
latitude | number | Latitude, or null. |
longitude | number | Longitude, or null. |
propertyType | string | High-level property type, for example Single Family. |
buildingType | string | Building type, for example Apartment, House. |
bedrooms | string | Number of bedrooms (as reported). |
bathrooms | string | Number of bathrooms (as reported). |
storiesTotal | string | Number of stories, or null. |
sizeInterior | string | Raw interior size value. |
squareFootage | string | Interior size with unit, for example 811 sqft. |
ownershipType | string | Ownership type, for example Condominium, Freehold. |
parkingType | string | Parking type description. |
parkingSpaces | string | Number of parking spaces. |
description | string | Full listing description (when withDetails is on). |
propertyTax | string | Annual property tax, or null. |
maintenanceFee | string | Maintenance/condo fee, or null. |
maintenanceFeeType | string | What the maintenance fee covers, or null. |
yearBuilt | string | Year built, or null. |
heatingType | string | Heating type, or null. |
coolingType | string | Cooling type, or null. |
basementType | string | Basement type, or null. |
exteriorFinish | string | Exterior finish, or null. |
flooringType | string | Flooring type, or null. |
appliances | string[] | Included appliances. Empty array when none. |
amenitiesNearby | string[] | Nearby amenities. Empty array when none. |
viewType | string | View type, or null. |
communityFeatures | string[] | Community features. Empty array when none. |
landSize | string | Land size, or Unknown. |
daysOnRealtor | string | How long the listing has been on Realtor.ca. |
listingDate | string | Listing date (ISO 8601), or null. |
agentName | string | Listing agent name. |
agentPhone | string | Listing agent phone. |
agentPosition | string | Listing agent role, for example Salesperson. |
agentUrl | string | Listing agent profile URL on realtor.ca. |
agent2Name | string | Co-listing agent name, or null. |
agent2Phone | string | Co-listing agent phone, or null. |
brokerageName | string | Brokerage name. |
brokeragePhone | string | Brokerage phone, or null. |
brokerageAddress | string | Brokerage address. |
brokerageLogo | string | Brokerage logo URL, or null. |
brokerageWebsite | string | Brokerage website, or null. |
photoCount | integer | Number of photos in the gallery. |
photos | string[] | Photo gallery as CDN URLs. |
query | string | The searchQueries value that found this listing. |
source | string | Data source label. Always Realtor.ca. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
error | string | null on success. On a failed run, a single item with a populated error field is written instead. |
enrichedEmail | string | Add-on: found public business email, or null. Present only when enrichContacts is on. |
enrichedContactName | string | Add-on: found contact person's name, or null. |
enrichedJobTitle | string | Add-on: found contact job title, or null. |
enrichedEmailStatus | string | Add-on: verification status of the found email. |
enrichedSource | string | Add-on: source the email was found on. |
enrichedConfidence | number | Add-on: confidence score for the found email. |
Example output record
Real record from a live run (input {"searchQueries": ["Toronto, Ontario"], "maxListings": 10, "withDetails": true, "transactionType": "For Sale"}). The description is trimmed to its opening for readability; the live record contains the full text:
{"mlsNumber": "40854188","listingId": "30134743","listingUrl": "https://www.realtor.ca/real-estate/30134743/2908-highway-7-unit-703-concord","transactionType": "For Sale","price": 564900,"priceFormatted": "$564,900","currency": "CAD","addressText": "2908 HIGHWAY 7 Unit# 703, Concord, Ontario L4K0K5","city": "Concord","province": "Ontario","postalCode": "L4K0K5","latitude": 43.79648866,"longitude": -79.52113208,"buildingType": "Apartment","bedrooms": "2","bathrooms": "2","squareFootage": "811 sqft","ownershipType": "Condominium","propertyTax": "$2,888.80","maintenanceFee": "$693.40 Monthly","agentName": "Ivaylo Stoyanov","agentPhone": "647-559-5141","agent2Name": "David Robbio","agent2Phone": "647-699-3096","brokerageName": "REAL BROKER ONTARIO LTD BROKERAGE 1800R","brokerageAddress": "130 King Street West Unit 1900R, Toronto, Ontario M5X1E3","photoCount": 1,"photos": ["https://cdn.realtor.ca/listings/TS639219515015200000/reb14/highres/8/40854188_1.jpg"],"query": "Toronto, Ontario","source": "Realtor.ca","observedAt": "2026-08-10T14:30:00.335Z","error": null}
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~realtor-ca-listings-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"searchQueries":["Toronto, Ontario"],"maxListings":25,"transactionType":"For Sale"}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~realtor-ca-listings-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"searchQueries":["Vancouver, BC"],"transactionType":"For Rent","priceMax":3500,"beds":2}'
Apify CLI:
apify call scrapers_lat/realtor-ca-listings-scraper \--input '{"searchQueries":["Calgary"],"maxListings":50,"withDetails":true}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=500&limit=500"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. You are charged per listing record returned (
resultevent). See the pricing tab for the current per-result price. - Contact enrichment add-on. When
enrichContactsis on, the add-on is billed per attempt, plus an extra charge only when an email is found. It is off by default. - No charge on failure. If a run errors, the actor writes a single item with a populated
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 listings per run, and the enrichment add-on is capped at 3 attempts. Upgrade for higher limits.
FAQ and troubleshooting
A run returned 0 records. Why?
The area name may not have matched, or the filters were too tight. Use a clear City, Province string (for example Toronto, Ontario) and loosen the price or bedroom filters. Zero-result runs are not charged.
How do I get agent and brokerage contacts?
They come with each listing when withDetails is on (the default): agentName, agentPhone, agent2Name, brokerageName, brokerageAddress and more.
What does the contact enrichment add-on do?
For listings without an email, it attempts to find a public business contact email and name. Turn it on with enrichContacts and cap it with enrichContactsMax. You are billed per attempt, plus an extra charge only when an email is found.
Why are some fields null?
Not every listing reports year built, cooling type, view or a co-agent. Missing source values are returned as null, never invented.
Can I search multiple cities at once?
Yes. Add every city or area to searchQueries; one run covers the whole list, and each record carries the query that found it.
Is this an official Realtor.ca tool? No. This actor is independent and has no affiliation with Realtor.ca or CREA. It reads only data that is publicly available on realtor.ca.
Related scrapers
- QuintoAndar Brazil Real Estate Scraper: Brazil real-estate listings for rent and sale.
- Adondevivir Peru Real Estate Scraper: Peru property listings for sale and rent.
- Domain Australia Real Estate Scraper: Australian residential real-estate listings.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with Realtor.ca or CREA. Accesses only publicly available listing data.
