# Realtor.ca Property Listings Scraper (`parseforge/realtor-ca-scraper`) Actor

Scrapes property listings from a Realtor.ca map view URL. Returns each listing as a flat row with price, address, bedrooms, bathrooms, property type, and listing URL.

- **URL**: https://apify.com/parseforge/realtor-ca-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 listing scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)](https://apify.com/parseforge?fpr=vmoqkp)

### Realtor.ca Property Listings Scraper

**Scrape Realtor.ca property listings from any map view, up to your defined limit per run.** Every listing returns price, address, beds, baths, property type, MLS number, coordinates, first photo, listing agent and direct URL. No API key required. Export to CSV, JSON, Excel, or XML.

Realtor.ca is the official hub for Canadian residential and commercial listings, but browsing manually or stitching together MLS data is slow. This actor opens the public map view, reads the same listing search the site uses, and pages through the results into a clean dataset. You control the geographic area and the maximum number of listings, so you get exactly the slice of the market you need.

| Who uses it | What they scrape Realtor.ca for |
|---|---|
| Real estate investors | Monitor new listings and price changes in a target city or neighborhood. |
| Market analysts | Build a comparable-sales dataset for a specific Canadian region. |
| Property managers | Track rental listing volumes and asking rents across postal codes. |
| Data journalists | Collect listing counts and price distributions for housing-market stories. |

### What it does

This Actor collects property listings from a Realtor.ca map view URL and returns each one as a flat row with price, address, postal code, coordinates, bedrooms, bathrooms, property type, interior size, lot size, MLS number, first photo, listing agent name, phone and agency, and listing URL.

- 🗺️ **Map-driven scraping:** Paste any Realtor.ca map URL with your zoom, center, and filters already applied, and the actor scrapes exactly that view.
- 📏 **Item cap with paging:** Set a maximum number of listings; the actor pages through the search results until it reaches it or the search runs out.
- 🔁 **Repeatable runs:** Use the same start URL to pull fresh data daily or weekly, capturing new listings and price changes.

Results export to CSV, JSON, Excel, or XML, or straight from the API.

### What you can do with Realtor.ca data

**📈 Build a market comp set.**

An investor scrapes all detached homes listed under $800,000 in Calgary, exports to CSV, and calculates average price per square foot.

**📍 Track new listings by neighborhood.**

A real estate agent runs the actor daily on a zoomed-in map of Toronto’s Leslieville, collecting fresh listings before they appear in email alerts.

**📊 Feed a rental market dashboard.**

A data analyst scrapes rental-only listings across Vancouver every Monday, pipes the JSON into a dashboard, and tracks asking-rent trends by bedroom count.

**🔍 Monitor a specific builder or street.**

A homebuyer centers the map on a new subdivision, scrapes every listing, and watches for price drops or new phases released.

### Why choose this scraper

| | What you get |
|---|---|
| **No MLS board hopping** | Realtor.ca aggregates listings from boards across Canada, so one scrape covers the whole country. |
| **Clean, flat output** | Every listing becomes one row with a fixed set of columns, ready for spreadsheets or databases. |
| **Runs on Apify proxies** | Residential and datacenter proxies keep your scrapes reliable and your IP safe. |

### How it compares

This actor focuses on scraping the Realtor.ca map view with a simple URL input and an item cap. The alternatives below offer deeper listing details or different pricing models.

| Feature | ParseForge | Realtor.com \[$1.5💰] \[GET ALL AGENTS] \[NO 3K LIMIT] | Realtor.ca Canada ($1 per 1000 results) | Realtor CA $1💰 Capable Filters + Deep Search |
|---|---|---|---|---|
| Scrapes Realtor.ca (Canada) | Yes | Not listed | Yes | Yes |
| Map view URL input | Yes | Not listed | Not listed | Not listed |
| Agent contact details | Yes | Yes | Yes | Yes |
| Full property descriptions | Not listed | Not listed | Yes | Yes |
| Photo URLs | First photo | Yes | Yes | Yes |
| Building features and amenities | Not listed | Not listed | Not listed | Yes |

### Configure the run

Drive the Actor from a single Realtor.ca map view URL. Zoom in on a city or neighbourhood, apply your property type and transaction type filters on the site, copy the URL, and the actor scrapes that search. Very wide maps (whole provinces or the whole country) do not list properties on Realtor.ca, so zoom in first. The Input tab lists every parameter.

A first run with the defaults:

```json
{
 "startUrl": "https://www.realtor.ca/map#ZoomLevel=13&Center=43.653226%2C-79.383184&LatitudeMax=43.68&LongitudeMax=-79.33&LatitudeMin=43.62&LongitudeMin=-79.43&view=list&Sort=6-D&PropertyTypeGroupID=1&TransactionTypeId=2&PropertySearchTypeId=1&Currency=CAD",
 "proxyConfiguration": {
 "useApifyProxy": true
 }
}
```

A larger pull:

```json
{
 "startUrl": "https://www.realtor.ca/map#ZoomLevel=13&Center=43.653226%2C-79.383184&LatitudeMax=43.68&LongitudeMax=-79.33&LatitudeMin=43.62&LongitudeMin=-79.43&view=list&Sort=6-D&PropertyTypeGroupID=1&TransactionTypeId=2&PropertySearchTypeId=1&Currency=CAD",
 "proxyConfiguration": {
 "useApifyProxy": true
 },
 "maxItems": 200
}
```

### Free users

Free-plan runs return up to 10 results as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 results per run.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [Realtor.ca Property Listings Scraper](https://apify.com/parseforge/realtor-ca-scraper?fpr=vmoqkp).
3. Set your inputs and any filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent live access to Realtor.ca through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/realtor-ca-scraper"
```

Then prompt it in plain language to run the scraper and read back the results.

### Troubleshooting

**Why am I getting no results?**

Check that your Start URL is a valid Realtor.ca map view with listings visible. If the map is zoomed out too far or centered on an area with no listings, the actor will return zero items. Try zooming in on a city and running again.

**The actor stops before reaching my max items.**

The actor pages through the search results of your map URL. If that search contains fewer listings than your max items setting, it finishes early. Realtor.ca also exposes at most 600 listings per search, so a dense city-wide map stops at 600: zoom in and run once per neighbourhood to go past that.

**Some listings are missing compared to what I see on the site.**

The actor scrapes the search defined by the bounding box in your URL, not the pins drawn on screen. Copy the URL again after the map has settled on your target area so the bounds match what you see.

**I get blocked or see empty responses.**

Realtor.ca sits behind Cloudflare and challenges datacenter IPs. Keep the default Apify residential proxies; switching to datacenter proxies is the most common cause of empty runs.

**The URL I copied has filters but the actor ignores them.**

Ensure the URL you paste includes the full query string with parameters like PropertyTypeGroupID and TransactionTypeId. Copy the entire URL from the address bar after applying your filters.

### FAQ

| Question | Answer |
|---|---|
| What data does the scraper return for each listing? | Price, address, postal code, latitude and longitude, bedrooms, bathrooms, property type, interior and lot size, MLS number, first photo, listing agent name, phone and agency, and the direct URL to the listing page. |
| Can I scrape sold data or historical listings? | The actor scrapes whatever listings are currently visible on the Realtor.ca map view. If you apply a sold filter on the site and use that URL, it will collect those results. |
| How do I target a specific city or neighborhood? | Go to Realtor.ca, zoom and pan the map to your area of interest, apply any filters you want, then copy the URL from your browser and paste it into the Start URL field. |
| Does this scraper get the full listing description and photos? | It returns the first photo and the listing agent. The text description, full photo gallery and room-by-room details live on the detail page and are not included. |
| How many listings can I scrape in one run? | You set the maximum with the Maximum items field. The default is 100; raise it and the actor keeps paging through the search until it reaches your number or the search runs out. Realtor.ca caps a single search at 600 listings, so split large areas into several runs. |
| Do I need to log in to Realtor.ca? | No. The actor reads the public map view, so no Realtor.ca account or login is needed. |
| Can I filter by property type, price range, or transaction type? | Yes. Apply those filters directly on the Realtor.ca website. The URL will contain your filter parameters, and the actor scrapes the resulting view. |
| Is this legal to use? | The actor only accesses publicly available data. You are responsible for complying with Realtor.ca's terms of service and Canadian data protection laws for your use case. |
| What export formats are supported? | You can export your results in CSV, JSON, Excel, XML, and several other formats directly from the Apify dataset. |
| Can I schedule this scraper to run automatically? | Yes. Apify schedules let you run the actor hourly, daily, or weekly, so you always have fresh listing data. |

### Related actors

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

🆘 **Need help?** Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ **Disclaimer.** This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Canadian Real Estate Association. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.

# Actor input Schema

## `startUrl` (type: `string`):

A Realtor.ca map URL with the area and filters already applied. Open realtor.ca, zoom in on a city or neighbourhood, set your filters, then copy the URL from the address bar. The default covers downtown Toronto.

## `maxItems` (type: `integer`):

Maximum number of listings to collect. The actor pages through the search results until it reaches this number or runs out of listings.

## `proxyConfiguration` (type: `object`):

Realtor.ca sits behind Cloudflare and challenges datacenter IPs. Keep Apify RESIDENTIAL proxies (the default).

## Actor input object example

```json
{
  "startUrl": "https://www.realtor.ca/map#ZoomLevel=13&Center=43.653226%2C-79.383184&LatitudeMax=43.68&LongitudeMax=-79.33&LatitudeMin=43.62&LongitudeMin=-79.43&view=list&Sort=6-D&PropertyTypeGroupID=1&TransactionTypeId=2&PropertySearchTypeId=1&Currency=CAD",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrl": "https://www.realtor.ca/map#ZoomLevel=13&Center=43.653226%2C-79.383184&LatitudeMax=43.68&LongitudeMax=-79.33&LatitudeMin=43.62&LongitudeMin=-79.43&view=list&Sort=6-D&PropertyTypeGroupID=1&TransactionTypeId=2&PropertySearchTypeId=1&Currency=CAD",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/realtor-ca-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrl": "https://www.realtor.ca/map#ZoomLevel=13&Center=43.653226%2C-79.383184&LatitudeMax=43.68&LongitudeMax=-79.33&LatitudeMin=43.62&LongitudeMin=-79.43&view=list&Sort=6-D&PropertyTypeGroupID=1&TransactionTypeId=2&PropertySearchTypeId=1&Currency=CAD",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/realtor-ca-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrl": "https://www.realtor.ca/map#ZoomLevel=13&Center=43.653226%2C-79.383184&LatitudeMax=43.68&LongitudeMax=-79.33&LatitudeMin=43.62&LongitudeMin=-79.43&view=list&Sort=6-D&PropertyTypeGroupID=1&TransactionTypeId=2&PropertySearchTypeId=1&Currency=CAD",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call parseforge/realtor-ca-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/realtor-ca-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/4ALmcJ36lE1GzeZtO/builds/GsgqAfyTtiyDWgzsn/openapi.json
