Realtor.ca Property Listings Scraper avatar

Realtor.ca Property Listings Scraper

Pricing

Pay per event

Go to Apify Store
Realtor.ca Property Listings Scraper

Realtor.ca Property Listings Scraper

Extract Canadian Realtor.ca listings: prices, MLS IDs, addresses, photos, agents, brokerages, coordinates, and listing URLs.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Extract Canadian property listings from Realtor.ca search areas with prices, MLS numbers, addresses, photos, agents, and brokerage details.

What does Realtor.ca Property Listings Scraper do?

Realtor.ca Property Listings Scraper turns public Realtor.ca map searches into structured datasets.

It collects property records from Canadian search areas and saves them in a table that can be exported as JSON, CSV, Excel, XML, or used directly through the Apify API.

Use it to monitor Canadian real-estate inventory, price changes, agent leads, brokerage activity, and local housing market supply.

Who is it for?

  • ๐Ÿ˜๏ธ Real-estate investors tracking listings in target Canadian markets.
  • ๐Ÿข Brokerages monitoring competitor inventory and agents.
  • ๐Ÿ“Š Market analysts building housing dashboards.
  • ๐Ÿงฉ Proptech teams enriching internal property databases.
  • ๐Ÿ“ฌ Lead-generation teams collecting agent and brokerage contact context.

Why use this scraper?

Realtor.ca data is spread across interactive map pages.

This actor gives you repeatable extraction without manually opening each listing.

You can schedule it daily, compare datasets over time, and plug the results into your CRM or BI stack.

What data can it extract?

FieldDescription
propertyIdRealtor.ca property ID
mlsNumberMLS listing number when available
listingUrlPublic Realtor.ca listing page
priceDisplay price
priceUnformattedNumeric price
propertyTypeApartment, house, townhouse, land, etc.
addressTextFull listing address text
latitude, longitudeMap coordinates
bedrooms, bathroomsBedroom and bathroom counts
sizeInterior, lotSizeBuilding and lot sizes when available
photosListing image URLs
agentNamesListing agent names
brokerageNamesBrokerages attached to the listing
phonesAgent phone numbers from the search payload
sourceSearchSearch area that produced the record
scrapedAtExtraction timestamp

How much does it cost to scrape Realtor.ca listings?

The actor uses pay-per-event pricing.

You pay a small run-start fee plus a per-listing event for each saved property record.

The exact price is shown on the Apify Store pricing panel before you start a run.

Use a small maxItems value for a first test, then scale after confirming that the selected map area returns the data you need.

How to use Realtor.ca Property Listings Scraper

  1. Open the actor on Apify.
  2. Keep the default Toronto search area or add your own Canadian bounding box.
  3. Set maxItems to the number of listings you need.
  4. Optionally add price filters.
  5. Run the actor.
  6. Download the dataset or connect it to your workflow.

Input: search areas

The most reliable input is locations.

Each location needs:

  • name
  • latitudeMin
  • latitudeMax
  • longitudeMin
  • longitudeMax

Example:

{
"locations": [
{
"name": "Toronto, ON",
"latitudeMin": 43.55,
"latitudeMax": 43.9,
"longitudeMin": -79.75,
"longitudeMax": -79.1
}
],
"maxItems": 100
}

Input: start URLs

You can also pass Realtor.ca map URLs in startUrls if the URL contains map-bound parameters such as LatitudeMin, LatitudeMax, LongitudeMin, and LongitudeMax.

The actor extracts those bounds and uses them as search areas.

Input: filters

Available filters include:

  • maxItems
  • recordsPerPage
  • minPrice
  • maxPrice
  • transactionTypeId
  • propertyTypeGroupId
  • propertySearchTypeId
  • proxyCountryCode

Output example

{
"propertyId": "29974459",
"mlsNumber": "W13508020",
"listingUrl": "https://www.realtor.ca/real-estate/29974459/example",
"price": "$495,000",
"priceUnformatted": 495000,
"propertyType": "Apartment",
"addressText": "530 - 3100 KEELE STREET|Toronto, Ontario",
"bedrooms": "2",
"bathrooms": "2",
"agentNames": ["Example Agent"],
"brokerageNames": ["Example Brokerage"],
"sourceSearch": "Toronto, ON",
"scrapedAt": "2026-07-01T00:00:00.000Z"
}

Tips for best results

  • Start with one city or neighborhood bounding box.
  • Use maxItems 25-100 for initial tests.
  • Increase gradually for scheduled monitoring.
  • Keep the proxy country set to CA for Canadian listings.
  • Use smaller map boxes for neighborhood-level dashboards.

Common use cases

  • Track new listings in Toronto, Vancouver, Calgary, Ottawa, or Montreal.
  • Build a daily property inventory database.
  • Monitor price bands for investment criteria.
  • Collect agent and brokerage lead context.
  • Compare listing counts between neighborhoods.

Integrations

Use Apify integrations to move the dataset into:

  • Google Sheets for market watchlists.
  • Zapier or Make for lead workflows.
  • BigQuery or Snowflake for analytics.
  • Webhooks for daily alerts.
  • Custom APIs through the Apify client.

API usage with Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/realtor-ca-property-listings-scraper').call({
locations: [{
name: 'Toronto, ON',
latitudeMin: 43.55,
latitudeMax: 43.9,
longitudeMin: -79.75,
longitudeMax: -79.1,
}],
maxItems: 100,
});
console.log(run.defaultDatasetId);

API usage with Python

from apify_client import ApifyClient
client = ApifyClient('MY-APIFY-TOKEN')
run = client.actor('automation-lab/realtor-ca-property-listings-scraper').call(run_input={
'locations': [{
'name': 'Toronto, ON',
'latitudeMin': 43.55,
'latitudeMax': 43.9,
'longitudeMin': -79.75,
'longitudeMax': -79.1,
}],
'maxItems': 100,
})
print(run['defaultDatasetId'])

API usage with cURL

curl -X POST 'https://api.apify.com/v2/acts/automation-lab~realtor-ca-property-listings-scraper/runs?token=MY-APIFY-TOKEN' \
-H 'Content-Type: application/json' \
-d '{"locations":[{"name":"Toronto, ON","latitudeMin":43.55,"latitudeMax":43.9,"longitudeMin":-79.75,"longitudeMax":-79.1}],"maxItems":100}'

MCP integration

Use this actor from Claude through the Apify MCP server.

MCP URL:

https://mcp.apify.com/?tools=automation-lab/realtor-ca-property-listings-scraper

Add the actor to Claude Code:

$claude mcp add apify-realtor-ca "https://mcp.apify.com/?tools=automation-lab/realtor-ca-property-listings-scraper"

Example MCP JSON config:

{
"mcpServers": {
"apify-realtor-ca": {
"url": "https://mcp.apify.com/?tools=automation-lab/realtor-ca-property-listings-scraper"
}
}
}

Example prompts:

  • "Scrape 100 Realtor.ca listings in Toronto and summarize average price by property type."
  • "Run the Realtor.ca scraper for this bounding box and export the agent names."
  • "Compare today's listings with yesterday's Realtor.ca dataset."

Scheduling

Schedule the actor daily or weekly to build a historical property inventory.

Use a consistent bounding box and store each run's dataset ID.

Then compare MLS numbers across runs to detect new or removed listings.

Data quality notes

Realtor.ca fields vary by listing.

Some listings may not include every size, postal code, phone, or description field in the search payload.

The actor keeps optional fields as null or empty arrays instead of guessing.

Troubleshooting

If a run returns fewer listings than expected, increase the map area or remove price filters.

If a run fails with an anti-bot response, retry with proxyCountryCode set to CA and a smaller recordsPerPage value.

Legality

This actor extracts publicly available listing information.

You are responsible for using the data in accordance with Realtor.ca terms, applicable laws, privacy rules, and your own compliance requirements.

Avoid collecting or using personal data beyond what your workflow lawfully requires.

Other automation-lab actors that may fit real-estate workflows:

FAQ

Can I scrape any Canadian city?

Yes, if you provide a bounding box for the target area and Realtor.ca has public listings there.

Does it scrape listing detail pages?

The MVP saves fields available from the public search payload, including listing URLs for detail-page follow-up.

Can I monitor price changes?

Yes. Schedule repeat runs and compare mlsNumber, propertyId, and priceUnformatted over time.

Does it need proxies?

Yes. Realtor.ca uses Incapsula anti-bot controls, so the actor uses Apify Residential Proxy by default.

Why are some fields empty?

Realtor.ca does not expose every field for every listing in the search response. Empty values are preserved as null or empty arrays.