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

Scrape REALTOR.ca property listings and real estate agents across Canada: price, address, beds, baths, size, photos, listing agent and phone, plus REALTOR contact details, brokerage and social links.

- **URL**: https://apify.com/parsebird/realtor-ca-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.39 / 1,000 property listings

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Realtor.ca Scraper

**Realtor.ca Scraper** extracts property listings and real estate agents from [REALTOR.ca](https://www.realtor.ca), Canada's MLS®-powered real estate portal run by the Canadian Real Estate Association. Enter a city like "Toronto, ON" or paste a REALTOR.ca map URL and get the price, address, beds, baths, size, parking, photos, MLS® number and listing agent's phone for every home, or the phone, brokerage, website and social links of every REALTOR® in the area, as clean JSON, CSV or Excel.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search any Canadian city, neighbourhood or postal code area for homes for sale or rent, with price, bedroom, bathroom and property type filters, or pull REALTOR® contact lists, and go past REALTOR.ca's 600-result limit automatically.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/realtor-ca-scraper. Scrapes property listings and real estate agents (REALTORS) from REALTOR.ca (Canada). Call via ApifyClient: client.actor("parsebird/realtor-ca-scraper").call(run_input={"mode": "properties", "location": "Vancouver, BC", "transactionType": "buy", "priceMin": 500000, "priceMax": 1500000, "bedroomsMin": 3, "maxResults": 200}). Inputs: mode ("properties" or "agents", default "properties"), location (string, city and province like "Toronto, ON", neighbourhood or postal code area like "M5V"; default Toronto, ON when no startUrls), startUrls (array of strings: REALTOR.ca map URLs https://www.realtor.ca/map#..., listing URLs https://www.realtor.ca/real-estate/<id>/..., agent URLs https://www.realtor.ca/agent/<id>/..., REALTOR directory URLs https://www.realtor.ca/realtors/on/toronto; overrides location), maxResults (integer, default 200, 0 = all), transactionType ("buy" or "rent"), propertyType ("residential", "condo", "multi-family", "vacant-land", "recreational", "agriculture", "parking", "commercial"), priceMin / priceMax (integer CAD; monthly rent for rentals), bedroomsMin, bathroomsMin (integer 0-10), sortBy ("newest", "oldest", "price-low", "price-high"), proxyConfiguration (object, optional). Property output: listingId, mlsNumber, listingUrl, price, priceNumeric, priceType (sale/rent), address, addressHidden, city, province, postalCode, latitude, longitude, propertyType, buildingType, ownershipType, zoningType, businessType, bedrooms, bedroomsText, bathrooms, halfBathrooms, sizeInterior, floorArea, stories, landSize, landFrontage, parkingSpaces, parkingType, amenities, amenitiesNearby, description, coverPhoto, photos, virtualTourUrl, openHouses, agentName, agentPhone, agentOffice, agentOfficePhone, agentProfileUrl, agents[], timeOnMarket, listedDate, source. Agent output: individualId, name, firstName, lastName, position, phone, phones[], office, officeId, officeDesignation, officeType, corporationName, officeAddress, officePhone, officeWebsite, officeLogo, officeProfileUrl, photo, website, profileUrl, facebook, instagram, linkedin, twitter, youtube, hasListings, cccMember, source. Pricing: pay per result (listing or agent). Full API spec: https://apify.com/parsebird/realtor-ca-scraper/api. Get your token: https://console.apify.com/settings/integrations.
```

### What is Realtor.ca Scraper?

**Realtor.ca Scraper** turns REALTOR.ca into a structured dataset. Give it a location, set your filters, and it collects the matching **property listings** for sale or rent. Switch the mode to **real estate agents** and it collects REALTORS® in that area with their phone numbers, brokerages, websites and social profiles.

It works as a **REALTOR.ca API alternative**: no account, no API key and no browser needed. REALTOR.ca shows at most 600 results per search; the scraper splits big searches into smaller ones on its own, so you can collect every listing in a city.

### What can Realtor.ca Scraper do?

- 🏠 **Property listings.** Homes, condos, multi-family, vacant land, recreational, farms, parking and commercial properties, for sale or for rent.
- 🔎 **REALTOR.ca's own filters.** Price (or monthly rent), minimum bedrooms and bathrooms, property type and sort order are sent to REALTOR.ca's search, so you only collect matching rows.
- 🗺️ **Any area.** Cities ("Calgary, AB"), neighbourhoods, postal code areas ("M5V"), or a custom map area: zoom in on [REALTOR.ca's map](https://www.realtor.ca/map) and paste the URL.
- 🧑‍💼 **Real estate agents.** REALTORS® by city or from a REALTOR.ca directory page, with direct phone, brokerage, office address, website, photo and Facebook, Instagram, LinkedIn, X and YouTube links.
- 🔗 **Single listings and agents.** Paste listing URLs or agent profile URLs to collect exactly those.
- 📈 **No 600-result ceiling.** Large property searches are split by price, then by map area; large agent searches are split by name.
- 📅 **Scheduling and monitoring.** Run daily with [Apify Schedules](https://docs.apify.com/platform/schedules) and sort by newest to catch new listings.
- 🔌 **API and integrations.** Use the [Apify API](https://docs.apify.com/api/v2), or send results to Google Sheets, Zapier, Make, Slack or webhooks with [Apify integrations](https://docs.apify.com/platform/integrations). Export as JSON, CSV, Excel, XML or HTML.

### What data can you extract from REALTOR.ca?

**Property listings**

| Field | Description |
|-------|-------------|
| `listingId` / `mlsNumber` / `listingUrl` | REALTOR.ca listing ID, MLS® number and listing page |
| `price` / `priceNumeric` / `priceType` | Price as shown (rentals keep "/Monthly"), as a number, and `sale` or `rent` |
| `address` / `city` / `province` / `postalCode` | Street address with unit, city (Ontario and Quebec boards often add the neighbourhood, like "Toronto (Riverdale)"), province and postal code |
| `latitude` / `longitude` | Map position |
| `propertyType` / `buildingType` / `ownershipType` | "Single Family", "Vacant Land", "Retail"…; "House", "Apartment", "Row / Townhouse"…; "Freehold", "Condominium/Strata"… |
| `bedrooms` / `bedroomsText` / `bathrooms` / `halfBathrooms` | Bedroom total ("2 + 1" counts as 3) and the original text, bathrooms and half baths |
| `sizeInterior` / `floorArea` / `stories` | Interior size (sqft or m², as the board publishes it), floor area range, storeys |
| `landSize` / `landFrontage` / `zoningType` / `businessType` | Lot size and frontage, zoning, and business type for commercial listings |
| `parkingSpaces` / `parkingType` | Parking spaces and types, like "Underground, Garage" |
| `amenities` / `amenitiesNearby` | Building amenities and nearby amenities, as the board publishes them |
| `coverPhoto` / `photos` | Cover photo at full resolution (search results carry the cover photo) |
| `virtualTourUrl` / `openHouses` | Virtual tour link and upcoming open houses, when listed |
| `agentName` / `agentPhone` / `agentOffice` / `agentOfficePhone` / `agentProfileUrl` | Listing agent, phone, brokerage, brokerage phone and REALTOR.ca profile |
| `agents` | Every agent on the listing, with phone and brokerage |
| `timeOnMarket` / `listedDate` | "3 hours ago" as REALTOR.ca phrases it, and the listed date and time (UTC) |

**Real estate agents**

| Field | Description |
|-------|-------------|
| `individualId` / `name` / `position` / `profileUrl` | REALTOR.ca agent ID, name, role like "Salesperson" or "Broker", and profile page |
| `phone` / `phones` | Main phone and every published number with its type |
| `office` / `officeDesignation` / `officeAddress` / `officePhone` | Brokerage name, designation (like "Brokerage"), address and phone |
| `officeWebsite` / `officeLogo` / `officeProfileUrl` | Brokerage website, logo and REALTOR.ca office page |
| `photo` / `website` | Agent headshot and personal website, where published |
| `facebook` / `instagram` / `linkedin` / `twitter` / `youtube` | Social profiles, where published |

Fill rates depend on what each real estate board publishes. In our Toronto test, 72% of listings had building amenities, 78% an interior size and 97% a parking count; in Calgary, 55% of agents had a photo, 37% a personal website and about 1 in 5 a Facebook or Instagram link.

### How to scrape REALTOR.ca

1. Open [Realtor.ca Scraper](https://apify.com/parsebird/realtor-ca-scraper) on Apify Store and click **Try for free**.
2. Choose **Property listings** or **Real estate agents**.
3. Type a **Location**, like "Montreal, QC". Or paste REALTOR.ca URLs into **Start URLs**: a map URL after zooming into a neighbourhood, listing URLs, agent URLs or a REALTOR directory page like `https://www.realtor.ca/realtors/on/toronto`.
4. For properties, pick **For sale** or **For rent** and set price, bedroom, bathroom and property type filters.
5. Set **Max results**, or 0 for everything.
6. Click **Start**, then download the results as JSON, CSV, Excel, XML or HTML from the **Output** tab, or read them with the API.

### How much does it cost to scrape REALTOR.ca?

Realtor.ca Scraper uses **pay-per-event** pricing: you pay for each property listing or REALTOR® saved. Compute and proxy costs are included in the price.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| `result` (per listing or agent) | $0.00069 | $0.00059 | $0.00049 | $0.00039 |
| Per 1,000 results | **$0.69** | **$0.59** | **$0.49** | **$0.39** |

For example, 1,000 Toronto listings cost $0.69 on the Free plan. You can set a maximum cost per run in Apify Console, and the Actor stops when it's reached.

### Input

See the [Input tab](https://apify.com/parsebird/realtor-ca-scraper/input-schema) for the full form.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `properties` | `properties` or `agents` |
| `location` | string | `Toronto, ON` | City and province, neighbourhood, or postal code area. Used when there are no start URLs |
| `startUrls` | array | — | REALTOR.ca map, listing, agent or REALTOR directory URLs. Overrides `location` |
| `maxResults` | integer | `200` | Results per location or URL. `0` = everything available |
| `transactionType` | string | `buy` | `buy` or `rent` |
| `propertyType` | string | `residential` | `residential`, `condo`, `multi-family`, `vacant-land`, `recreational`, `agriculture`, `parking`, `commercial` |
| `priceMin` / `priceMax` | integer | — | Price in CAD; monthly rent for rentals |
| `bedroomsMin` / `bathroomsMin` | integer | — | Minimum bedrooms / bathrooms (0–10) |
| `sortBy` | string | `newest` | `newest`, `oldest`, `price-low`, `price-high` |
| `proxyConfiguration` | object | none | Not needed; see the FAQ |

**Homes in a city**

```json
{
    "mode": "properties",
    "location": "Toronto, ON",
    "maxResults": 100
}
```

**Filtered search for sale**

```json
{
    "mode": "properties",
    "location": "Vancouver, BC",
    "transactionType": "buy",
    "propertyType": "residential",
    "priceMin": 500000,
    "priceMax": 1500000,
    "bedroomsMin": 3,
    "bathroomsMin": 2,
    "maxResults": 200
}
```

**Rentals up to $2,500 a month**

```json
{
    "mode": "properties",
    "location": "Montreal, QC",
    "transactionType": "rent",
    "priceMax": 2500,
    "bedroomsMin": 2,
    "maxResults": 100
}
```

**Real estate agents**

```json
{
    "mode": "agents",
    "location": "Calgary, AB",
    "maxResults": 50
}
```

**Custom map area**

```json
{
    "mode": "properties",
    "startUrls": [
        "https://www.realtor.ca/map#ZoomLevel=13&LatitudeMax=43.7&LongitudeMax=-79.3&LatitudeMin=43.6&LongitudeMin=-79.5"
    ],
    "maxResults": 500
}
```

### Output example

**Property listing** (from a Toronto search; the second agent is left out)

```json
{
    "listingId": "30416755",
    "mlsNumber": "C14092020",
    "listingUrl": "https://www.realtor.ca/real-estate/30416755/b211-1680-victoria-park-avenue-toronto-victoria-village",
    "price": "$799,900",
    "priceNumeric": 799900,
    "priceType": "sale",
    "address": "B211 - 1680 VICTORIA PARK AVENUE",
    "addressHidden": false,
    "city": "Toronto (Victoria Village)",
    "province": "Ontario",
    "postalCode": "M1R0G8",
    "latitude": 43.7321374,
    "longitude": -79.306048,
    "propertyType": "Single Family",
    "buildingType": "Row / Townhouse",
    "ownershipType": "Condominium/Strata",
    "bedrooms": 3,
    "bedroomsText": "2 + 1",
    "bathrooms": 3,
    "halfBathrooms": 1,
    "sizeInterior": "111.4827 m2",
    "floorArea": "1200+ sqft",
    "stories": "2",
    "parkingSpaces": 1,
    "parkingType": "Underground, Garage",
    "amenities": "Storage - Locker",
    "coverPhoto": "https://cdn.realtor.ca/listings/TS639279557678500000/reb82/highres/0/c14092020_1.jpg",
    "photos": ["https://cdn.realtor.ca/listings/TS639279557678500000/reb82/highres/0/c14092020_1.jpg"],
    "openHouses": [],
    "agentName": "LORENA SCHIRRIPA",
    "agentPhone": "(647) 338-8106",
    "agentOffice": "NORDALE REALTY & ASSOCIATES INC.",
    "agentOfficePhone": "(416) 744-3311",
    "agentProfileUrl": "https://www.realtor.ca/agent/2194103/lorena-schirripa-3850-steeles-ave-west-2-woodbridge-ontario-l4l4y6",
    "agents": [
        {
            "individualId": "2194103",
            "name": "LORENA SCHIRRIPA",
            "position": "Salesperson",
            "phone": "(647) 338-8106",
            "office": "NORDALE REALTY & ASSOCIATES INC.",
            "officePhone": "(416) 744-3311",
            "profileUrl": "https://www.realtor.ca/agent/2194103/lorena-schirripa-3850-steeles-ave-west-2-woodbridge-ontario-l4l4y6"
        }
    ],
    "timeOnMarket": "1 hour ago",
    "listedDate": "2026-10-19T01:29:27Z",
    "source": {"type": "location", "value": "Toronto, ON", "resolvedLocation": "Toronto, ON, Canada"}
}
```

**Real estate agent** (from a Calgary search)

```json
{
    "individualId": "1446472",
    "name": "Max Fernandez",
    "firstName": "Max",
    "lastName": "Fernandez",
    "position": "Associate",
    "phone": "403-370-8776",
    "phones": [{"type": "Telephone", "number": "403-370-8776"}],
    "office": "Royal LePage Blue Sky",
    "officeId": "300215",
    "officeType": "Firm",
    "officeAddress": "5211 4th Street NE, Calgary, Alberta T2K6J5",
    "officePhone": "403-338-2200",
    "officeLogo": "https://cdn.realtor.ca/organizations/en-CA/TS639104751000000000/lowres/1484381.jpg",
    "officeProfileUrl": "https://www.realtor.ca/office/firm/300215/royal-lepage-blue-sky-5211-4th-street-ne-calgary-alberta-t2k6j5",
    "website": "https://maxfernandez.royallepage.ca/",
    "profileUrl": "https://www.realtor.ca/agent/1446472/max-fernandez-5211-4th-street-ne-calgary-alberta-t2k6j5",
    "instagram": "https://www.instagram.com/sweetpad4u",
    "hasListings": true,
    "source": {"type": "location", "value": "Calgary, AB", "resolvedLocation": "Calgary, AB, Canada"}
}
```

Empty fields are left out of these examples. A run's main results go to the default dataset. If your start URLs also bring in the other kind of record (for example an agent URL in a property run), those records go to a second dataset in the run's **Storage** tab, so each table keeps its own columns.

### Use the Realtor.ca Scraper API

Call the Actor from your own code with the [Apify API client](https://docs.apify.com/api/client/python). Find your token in [Apify Console → Settings → Integrations](https://console.apify.com/settings/integrations).

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("parsebird/realtor-ca-scraper").call(run_input={
    "mode": "properties",
    "location": "Ottawa, ON",
    "priceMax": 700000,
    "bedroomsMin": 3,
    "maxResults": 300,
})

for home in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(home["price"], home["address"], home["city"], home["agentName"], home["agentPhone"])
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('parsebird/realtor-ca-scraper').call({
    mode: 'agents',
    location: 'Halifax, NS',
    maxResults: 0,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((agent) => console.log(agent.name, agent.phone, agent.office, agent.website));
```

You can also start runs over plain HTTP from the [API tab](https://apify.com/parsebird/realtor-ca-scraper/api), or connect the Actor to AI agents through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

### Use cases

- **Market research.** Compare prices, sizes and property types across Canadian cities and neighbourhoods.
- **New listing alerts.** Schedule a daily run sorted by newest and push new listings to Slack or Google Sheets.
- **Rental analysis.** Track rents by bedroom count and area for investment decisions.
- **Lead generation.** Build lists of REALTORS® and brokerages by city, with phone numbers, websites and social links.
- **Real estate investing.** Find multi-family, vacant land or commercial properties in a price range.

### How it works

1. A location is matched to REALTOR.ca's own place search, which gives the city boundary used on its map. When a name matches several places, the log tells you which one was used.
2. Properties are loaded 200 at a time with your filters. REALTOR.ca returns at most 600 results per search, so larger searches are split into price bands, then into smaller map areas, until every part fits. In our test, a run with no limit collected all 10,967 listings REALTOR.ca reported for Toronto.
3. Agents are loaded 50 at a time. Larger agent searches are split by last name. In our test of Calgary (8,483 REALTORS®), a full run collected 8,464 of them (99.8%); a few agents whose very short last name is also a common part of other names can be missed.
4. Results that show up in more than one part of a split search are saved once.

### FAQ

**Do I need a REALTOR.ca account?**
No. The Actor reads public listings and REALTOR® profiles that anyone can see on REALTOR.ca.

**Which URLs can I use?**
Map URLs (`realtor.ca/map#...`, with the map area and filters you set on the site), listing URLs (`realtor.ca/real-estate/<id>/...`), agent profiles (`realtor.ca/agent/<id>/...`), REALTOR directory pages (`realtor.ca/realtors/on/toronto`) and REALTOR search result URLs. French URLs work too.

**Why do some listings have a price of $1 or no address?**
Some boards publish placeholder prices, and some sellers hide the address (`addressHidden` is then `true`). The Actor keeps what REALTOR.ca shows.

**Why is there only one photo per listing?**
REALTOR.ca's search results include the cover photo only. `coverPhoto` and `photos` hold it at full resolution.

**Why are descriptions empty?**
REALTOR.ca's search results usually leave the public remarks out, so `description` is filled only when they are included.

**How fast is it?**
REALTOR.ca limits how fast one visitor can search, so the Actor keeps a steady pace. In our tests, all 10,967 Toronto listings took under 1.5 minutes; a full agent list for a large city takes longer because agents come 50 at a time (Calgary's 8,483 REALTORS® took about 17 minutes).

**Do I need a proxy?**
No. The Actor connects directly and switches to [Apify Proxy](https://docs.apify.com/platform/proxy) on its own if REALTOR.ca starts refusing requests.

**Can I schedule runs or export to Google Sheets?**
Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) for recurring runs and [integrations](https://docs.apify.com/platform/integrations) for Google Sheets, Zapier, Make, Slack and webhooks.

**Something is missing or broken?**
Open an issue on the [Issues tab](https://apify.com/parsebird/realtor-ca-scraper/issues). Feedback and feature requests are welcome there too.

### Is it legal to scrape REALTOR.ca?

The Actor collects only public listings and REALTOR® profiles that REALTOR.ca shows to every visitor. It doesn't log in or access account data. Agent names, phone numbers and photos are personal information under Canadian privacy law (PIPEDA), and commercial messages are covered by Canada's Anti-Spam Legislation (CASL), so make sure you have a lawful basis to store and contact them. The MLS® and REALTOR® marks belong to CREA. Read more in Apify's blog post [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other real estate scrapers

| Actor | What it does |
|-------|--------------|
| [Realtor.com Scraper](https://apify.com/parsebird/realtor-scraper) | Scrape US homes for sale, rent and sold from Realtor.com |
| [OpenRent Scraper](https://apify.com/parsebird/openrent-scraper) | Scrape UK rental listings from OpenRent |
| [Funda.nl Scraper](https://apify.com/parsebird/funda-scraper) | Scrape Dutch property listings from Funda |
| [Sreality.cz Scraper](https://apify.com/parsebird/sreality-cz-scraper) | Scrape Czech property listings from Sreality.cz |
| [AutoTrader Canada Scraper](https://apify.com/parsebird/autotrader-ca-scraper) | Scrape Canadian car listings from AutoTrader.ca |

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/realtor-ca-scraper/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Scrape property listings or real estate agents (REALTORS®) for the location.

## `location` (type: `string`):

City and province, like 'Vancouver, BC'. Neighbourhoods and postal code areas (like 'M5V') work too. Ignored when start URLs are given. Empty with no start URLs = Toronto, ON.

## `startUrls` (type: `array`):

Optional. REALTOR.ca map URLs (realtor.ca/map#...) with your map area and filters, listing URLs (realtor.ca/real-estate/...), agent profile URLs (realtor.ca/agent/...), or REALTOR directory URLs (realtor.ca/realtors/on/toronto). Overrides Location.

## `maxResults` (type: `integer`):

Maximum listings or agents to save per location or URL. Set 0 to collect everything available.

## `transactionType` (type: `string`):

Listings for sale or for rent (property mode only).

## `propertyType` (type: `string`):

Kind of property, as in REALTOR.ca's own search (property mode only).

## `priceMin` (type: `integer`):

Minimum price. For rentals, the minimum monthly rent.

## `priceMax` (type: `integer`):

Maximum price. For rentals, the maximum monthly rent.

## `bedroomsMin` (type: `integer`):

Minimum number of bedrooms.

## `bathroomsMin` (type: `integer`):

Minimum number of bathrooms.

## `sortBy` (type: `string`):

Order of listings. Large searches are split into price bands, so the order applies within each band.

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

Optional. The scraper connects directly and switches to Apify Proxy on its own if REALTOR.ca starts refusing requests.

## Actor input object example

```json
{
  "mode": "properties",
  "location": "Toronto, ON",
  "maxResults": 50,
  "transactionType": "buy",
  "propertyType": "residential",
  "sortBy": "newest",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "mode": "properties",
    "location": "Toronto, ON",
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "mode": "properties",
    "location": "Toronto, ON",
    "maxResults": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "mode": "properties",
  "location": "Toronto, ON",
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parsebird/realtor-ca-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/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/WQHVwFo2X5owey8JY/builds/BYbY1h7cKtNAGtFFL/openapi.json
