# Realtor.ca \[Only $1] Scraper: Listings + Agent Database (Phone) (`memo23/realtor-canada-search-cheerio-ppe`) Actor

\[Only $1/1k]  Realtor.ca scraper with an instant agent database — pull 44,000+ Canadian agents by Province/City/Brokerage (phone + brokerage + website, uncapped, no scraping needed), or live-scrape listings (sale/sold/rental) across Canada. Pure API. JSON/CSV

- **URL**: https://apify.com/memo23/realtor-canada-search-cheerio-ppe.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Real estate, AI, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 listing records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Realtor.ca Scraper — Listings + Agent Database (Phone)

Pull Canadian real-estate agent contacts **instantly** from a pre-collected database of **44,000+ Realtor.ca agents across all 13 provinces & territories** — phone, brokerage, website, areas served — or live-scrape listings anywhere in Canada. No CREA token juggling, no blocking, no per-search cap.

> This is the only Realtor.ca scraper on Apify that ships an instant **agent** database. Every other Realtor.ca actor is a property/listings scraper — this one hands you the agents directly.

### ⚡ Instant Realtor.ca Agent Database — 44,000+ agents, all of Canada

The fastest way to get Realtor.ca agent contacts: skip scraping entirely and pull straight from our continuously-growing database of **44,663 agents** — instant, uncapped, and nothing to get blocked.

**How to use it:** in the **⚡ Instant Database Mode** section of the input, set a **Province** (2-letter code, e.g. `ON`, `BC`, `AB`) — optionally narrow by **City** or **Brokerage**, or filter to only agents with a **phone**, **email** or **website** on file — and run. Leave the live-scraping Start URLs empty. You're billed only per agent delivered.

**Each database agent includes:** name, phone, brokerage (name + address), position (Salesperson / Broker), personal website, areas served, board, photo, and the Realtor.ca profile URL.

**Coverage:** 44,663 agents — **99.6% with a phone number**, **55% with a personal website**, **100% with a brokerage**. A postal-code-level sweep (down to the FSA — the first 3 characters of a Canadian postal code) across all 1,657 FSAs in the country. Realtor.ca hides agent emails behind a contact form, so email is available via optional enrichment (see Pricing). Top provinces: Ontario (19,742), Quebec (7,483), British Columbia (6,682), Alberta (5,407), plus every other province and territory down to Nunavut.

**Need a whole province as a clean CSV, or pushed to your CRM via API?** Reach out via the Support section below.

### Why Use This Scraper?

- ✅ **The only Realtor.ca agent database** — 44,000+ agents with phone, instantly, no scraping needed
- ✅ **All 13 provinces & territories** covered, filterable by province / city / brokerage
- ✅ **99.6% phone coverage** — phone is the strongest single lead-gen field
- ✅ **Beats the CREA anti-bot wall** — built-in token handshake, no external unblocker
- ✅ **Live-scrape listings too** — search any Realtor.ca map/search URL for property data
- ✅ **Optional email enrichment** — for the ~55% of agents with a website, plus name-based discovery
- ✅ **Pure API** — no headless browser; JSON or CSV out

### Overview

This actor serves two audiences from one tool: **lead-gen teams and brokerages** who want Canadian agent contacts without scraping, and **analysts and proptech teams** who want Realtor.ca listing data.

Instant Database runs (set a Province) emit a flat agent row per agent, served from our store — no requests to Realtor.ca. Live-scrape runs (a Realtor.ca map/search URL) return property listings, and every listing's agent is harvested into the database as a byproduct.

### Supported Inputs

#### Instant Database filters (no URL needed)

| Field | Example | Notes |
|---|---|---|
| `dbProvince` | `ON` | 2-letter province code — triggers Instant Database mode |
| `dbCity` | `Toronto` | optional city narrow |
| `dbBrokerage` | `RE/MAX` | optional brokerage-name substring |
| `dbHasPhone` | `true` | only agents with a phone (99.6% do) |
| `dbHasEmail` | `true` | only agents with an enriched email |
| `dbHasWebsite` | `true` | only agents with a personal website |
| `instantDatabase` | `true` | force Instant Database mode |

Provinces: `ON` `QC` `BC` `AB` `MB` `SK` `NS` `NB` `NL` `PE` `YT` `NT` `NU`

#### Live-scrape URL

| URL type | Example |
|---|---|
| Realtor.ca map / search | `https://www.realtor.ca/map#ZoomLevel=11&Center=43.65,-79.38&...&TransactionTypeId=2` |

#### Unsupported inputs

- ❌ Realtor.ca content behind a login (saved searches, messaging)
- ❌ Direct agent emails (Realtor.ca exposes only a contact form — use enrichment instead)

### Use Cases

| Audience | Use case |
|---|---|
| **Lead-gen teams / brokerages** | Pull thousands of Canadian agent phone contacts instantly by province or city |
| **Recruiters** | Build brokerage rosters filtered by province, city, or brokerage name |
| **Proptech / CRM** | Seed a Canadian agent directory with phone + brokerage + website |
| **Market analysts** | Live-scrape Realtor.ca listings for pricing and inventory data |
| **Marketing agencies** | Deliver client-ready Canadian real-estate agent lists without writing scrapers |

### How It Works

![How the Realtor.ca Agents Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-realtor-ca.png)

1. **Choose a mode** — Instant Database (province/city/brokerage filters) for agent contacts, or live scrape (a Realtor.ca map/search URL) for listings
2. **Instant Database path** — the actor queries our pre-collected store and returns matching agents in seconds; no requests to Realtor.ca at all
3. **Live-scrape path** — the actor performs the CREA device-token handshake (beating the Incapsula anti-bot wall), calls Realtor.ca's own PropertySearch API, and paginates the results
4. **Agent harvesting** — every listing carries its agent inline, harvested into the database (deduped by CREA IndividualID)
5. **Output** — one row per agent or listing, JSON or CSV

### Input Configuration

#### Input fields

| Field | Type | Default | Notes |
|---|---|---|---|
| `dbProvince` | string | — | Instant Database: 2-letter province code |
| `dbCity` | string | — | Instant Database: city, optional |
| `dbBrokerage` | string | — | Instant Database: brokerage-name contains, optional |
| `dbHasPhone` / `dbHasEmail` / `dbHasWebsite` | boolean | `false` | Instant Database filters |
| `instantDatabase` | boolean | `false` | Force Instant Database mode |
| `startUrls` | array | — | Realtor.ca map/search URLs (live scrape) |
| `includeListingDetails` | boolean | `false` | Fetch full detail per listing on a live scrape |
| `enrichEmails` | boolean | `false` | Opt-in email enrichment (billed separately, see Pricing) |
| `maxItems` | integer | 100 | Cap on delivered rows |
| `maxConcurrency` / `minConcurrency` / `maxRequestRetries` | integer | 10 / 1 / 3 | Live-scrape throughput |
| `proxy` | object | Residential | Proxy configuration (live scrape only) |

#### Common scenarios

**1. Instant Database — every agent in a province**

```json
{ "dbProvince": "BC", "maxItems": 1000 }
````

**2. Instant Database — narrow by city and brokerage**

```json
{ "dbProvince": "ON", "dbCity": "Toronto", "dbBrokerage": "RE/MAX", "maxItems": 200 }
```

**3. Live-scrape listings**

```json
{
  "startUrls": [{ "url": "https://www.realtor.ca/map#ZoomLevel=11&Center=45.50,-73.57&LatitudeMax=45.80&LongitudeMax=-73.27&LatitudeMin=45.20&LongitudeMin=-73.87&TransactionTypeId=2&PropertySearchTypeId=0&Currency=CAD" }],
  "includeListingDetails": false,
  "maxItems": 200
}
```

### Pricing

This actor uses Apify's pay-per-event pricing — you're billed only for what's delivered:

| Event | Price | Charged when |
|---|---|---|
| **Agent record** | $2.00 / 1k | Per agent delivered — Instant Database or live scrape |
| **Listing record** | $1.00 / 1k | Per property listing delivered on a live scrape |
| **Email enrichment** | $0.02 / email | Per email found via `enrichEmails` — never charged on a miss |
| Actor start | Apify platform rate | Standard per-GB run-start charge |

Instant Database queries report the total number of matching agents alongside the delivered rows, so you can see how many match your filters before raising `maxItems`.

### Output Overview

- **Database agent** (Instant Database mode) — a flat agent row: name, phone, brokerage, website, position, areas, photo, profile URL.
- **Live-scraped listing** — a Realtor.ca property listing with its embedded agent.

Free-tier users receive the first 2 Instant Database records in full as proof of data quality; every record after that has its phone/email masked with an upgrade prompt. Paying users always receive full contact info.

### Output Samples

**Instant Database agent:**

```jsonc
{
  "agent_id": "1970829",
  "name": "MELISSA JOAN PERRY",
  "first_name": "MELISSA JOAN",
  "last_name": "PERRY",
  "position": "Salesperson",
  "phone": "416-494-7653",
  "website": "http://www.facebook.com/melissaperryhomes",
  "has_website": true,
  "brokerage_name": "RE/MAX HALLMARK REALTY LTD.",
  "brokerage_address": "685 SHEPPARD AVE E #401 | TORONTO, Ontario M2K1B6",
  "province": "ON",
  "city": "Toronto",
  "profile_url": "https://www.realtor.ca/agent/1970829/melissa-joan-perry-..."
}
```

### Key Output Fields

| Group | Fields |
|---|---|
| **Identity** | agent\_id, name, first\_name, last\_name, position, profile\_url, photo\_url |
| **Contact** | phone, phone\_area, phone\_number, website, has\_website, email (enriched) |
| **Brokerage** | brokerage\_name, brokerage\_id, brokerage\_address, brokerage\_phone, board |
| **Location** | province, city, areas\_served, languages |

### FAQ

#### What's the difference between Instant Database mode and live scraping?

Instant Database mode (`dbProvince`/`dbCity`/`dbBrokerage`) serves agents straight from our pre-collected store — no requests to Realtor.ca, results in seconds. Live scraping (`startUrls`) hits Realtor.ca directly for current listings.

#### Do I get agent email addresses?

Not directly — Realtor.ca deliberately hides agent emails behind a contact form (the API returns only a relay contact-id, never an `@` address). Enable `enrichEmails` to discover an email for agents who list a personal website (~55%) or via name-based lookup. Enrichment is opt-in and billed only on success.

#### Do I need a URL for Instant Database mode?

No — just set a Province (and optionally city/brokerage) and leave `startUrls` empty.

#### Which provinces are covered?

All 13 — every province and territory. Ontario, BC, Quebec and Alberta are the deepest; the territories (YT/NT/NU) are naturally sparse.

#### How does it get past Realtor.ca's anti-bot protection?

The actor performs Realtor.ca's own CREA device-token handshake (challenge → solve → token), which authenticates against their Incapsula-protected API — no third-party unblocker needed.

#### Can I scrape private or login-gated content?

No. The actor only accesses publicly available Realtor.ca data.

#### JSON or CSV?

Both — export from your Apify dataset in whichever format you need.

### Support

Found a bug or want a field added? Open an issue on the actor's **Issues** tab and we'll take a look.

### Additional Services

Need a custom Canadian real-estate feed (full-province CSV, scheduled monitoring, a webhook/Sheets/DB push, or a tailored schema)? Reach out — custom scraping and data-pipeline work is available.

### Explore More Scrapers

- [Realtor.com Scraper](https://apify.com/memo23/realtor-search-cheerio) — 200,000+ US agent instant database
- [Redfin Scraper](https://apify.com/memo23/apify-redfin-cheerio-ppe) — US agent instant database (email & phone)
- [Zillow Agents & Leads Scraper](https://apify.com/memo23/zillow-agents-leads-scraper-ppe) — 373,000+ US agent database
- [Realtor.ca Scraper (rental)](https://apify.com/memo23/realtor-canada-search-cheerio) — Canadian listings, flat monthly pricing

See the [full memo23 actor catalog →](https://apify.com/memo23)

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by The Canadian Real Estate Association (CREA), Realtor.ca, or any of their subsidiaries. All trademarks mentioned — including REALTOR® and Realtor.ca — are the property of their respective owners.

The scraper accesses only publicly available Realtor.ca pages and pre-collected public agent-directory data — no authenticated endpoints, paid features, or content behind a login wall. Users are responsible for ensuring their use complies with Realtor.ca's Terms of Use, applicable data-protection law (PIPEDA, GDPR, CCPA, etc.), and any contractual obligations of their own organization.

### SEO Keywords

realtor.ca scraper, realtor.ca api, realtor.ca agent scraper, canadian real estate agent database, realtor.ca agent phone numbers, canada real estate leads, real estate agent contacts canada, realtor.ca listings scraper, canadian mls scraper, ontario real estate agents, bc real estate agents, real estate lead generation canada, brokerage roster scraper, realtor.ca bulk export, canada property data, realtor.ca json csv export

# Actor input Schema

## `dbProvince` (type: `string`):

Return agents in this province. E.g. ON, BC, AB, QC. This triggers Instant Database mode.

## `dbCity` (type: `string`):

Narrow the database results to a city (case-insensitive substring), e.g. Toronto, Vancouver.

## `dbBrokerage` (type: `string`):

Narrow the database results to a brokerage name substring, e.g. RE/MAX, Royal LePage, Sutton.

## `dbHasPhone` (type: `boolean`):

Return only database agents that have a phone number on file (nearly all do).

## `dbHasEmail` (type: `boolean`):

Return only database agents that have an enriched email on file.

## `dbHasWebsite` (type: `boolean`):

Return only database agents that have a personal website on file.

## `instantDatabase` (type: `boolean`):

Force Instant Database mode. Auto-enabled when you set a Province / City / Brokerage above.

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

Realtor.ca map/search URLs to live-scrape. Leave empty to use Instant Database mode above.

## `includeListingDetails` (type: `boolean`):

Whether to include detailed information about each listing.

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

Maximum number of Listings/Items to scrape per crawl. If not defined, all items will be scraped.

## `maxConcurrency` (type: `integer`):

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort.

## `proxy` (type: `object`):

Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.

## Actor input object example

```json
{
  "dbHasPhone": false,
  "dbHasEmail": false,
  "dbHasWebsite": false,
  "instantDatabase": false,
  "startUrls": [
    {
      "url": "https://www.realtor.ca/map#ZoomLevel=4&Center=54.920828%2C-99.316406&LatitudeMax=69.85098&LongitudeMax=-15.46875&LatitudeMin=31.30671&LongitudeMin=176.83594&Sort=6-D&PropertyTypeGroupID=1&TransactionTypeId=3&PropertySearchTypeId=0&BuildingTypeId=17&Currency=CAD"
    }
  ],
  "includeListingDetails": false,
  "maxItems": 100,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "enrichEmails": false,
  "proxy": {
    "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 = {
    "startUrls": [
        {
            "url": "https://www.realtor.ca/map#ZoomLevel=4&Center=54.920828%2C-99.316406&LatitudeMax=69.85098&LongitudeMax=-15.46875&LatitudeMin=31.30671&LongitudeMin=176.83594&Sort=6-D&PropertyTypeGroupID=1&TransactionTypeId=3&PropertySearchTypeId=0&BuildingTypeId=17&Currency=CAD"
        }
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/realtor-canada-search-cheerio-ppe").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 = {
    "startUrls": [{ "url": "https://www.realtor.ca/map#ZoomLevel=4&Center=54.920828%2C-99.316406&LatitudeMax=69.85098&LongitudeMax=-15.46875&LatitudeMin=31.30671&LongitudeMin=176.83594&Sort=6-D&PropertyTypeGroupID=1&TransactionTypeId=3&PropertySearchTypeId=0&BuildingTypeId=17&Currency=CAD" }],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/realtor-canada-search-cheerio-ppe").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.realtor.ca/map#ZoomLevel=4&Center=54.920828%2C-99.316406&LatitudeMax=69.85098&LongitudeMax=-15.46875&LatitudeMin=31.30671&LongitudeMin=176.83594&Sort=6-D&PropertyTypeGroupID=1&TransactionTypeId=3&PropertySearchTypeId=0&BuildingTypeId=17&Currency=CAD"
    }
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/realtor-canada-search-cheerio-ppe --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/realtor-canada-search-cheerio-ppe",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Realtor.ca [Only $1] Scraper: Listings + Agent Database (Phone)",
        "description": "[Only $1/1k]  Realtor.ca scraper with an instant agent database — pull 44,000+ Canadian agents by Province/City/Brokerage (phone + brokerage + website, uncapped, no scraping needed), or live-scrape listings (sale/sold/rental) across Canada. Pure API. JSON/CSV",
        "version": "0.0",
        "x-build-id": "VKrbyJgE9mNq2ysEi"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~realtor-canada-search-cheerio-ppe/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-realtor-canada-search-cheerio-ppe",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~realtor-canada-search-cheerio-ppe/runs": {
            "post": {
                "operationId": "runs-sync-memo23-realtor-canada-search-cheerio-ppe",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~realtor-canada-search-cheerio-ppe/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-realtor-canada-search-cheerio-ppe",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "dbProvince": {
                        "title": "Province (2-letter code, e.g. ON, BC, AB)",
                        "type": "string",
                        "description": "Return agents in this province. E.g. ON, BC, AB, QC. This triggers Instant Database mode."
                    },
                    "dbCity": {
                        "title": "City (optional)",
                        "type": "string",
                        "description": "Narrow the database results to a city (case-insensitive substring), e.g. Toronto, Vancouver."
                    },
                    "dbBrokerage": {
                        "title": "Brokerage contains (optional)",
                        "type": "string",
                        "description": "Narrow the database results to a brokerage name substring, e.g. RE/MAX, Royal LePage, Sutton."
                    },
                    "dbHasPhone": {
                        "title": "Only agents with a phone",
                        "type": "boolean",
                        "description": "Return only database agents that have a phone number on file (nearly all do).",
                        "default": false
                    },
                    "dbHasEmail": {
                        "title": "Only agents with an email",
                        "type": "boolean",
                        "description": "Return only database agents that have an enriched email on file.",
                        "default": false
                    },
                    "dbHasWebsite": {
                        "title": "Only agents with a website",
                        "type": "boolean",
                        "description": "Return only database agents that have a personal website on file.",
                        "default": false
                    },
                    "instantDatabase": {
                        "title": "Use Instant Database (no scraping)",
                        "type": "boolean",
                        "description": "Force Instant Database mode. Auto-enabled when you set a Province / City / Brokerage above.",
                        "default": false
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Realtor.ca map/search URLs to live-scrape. Leave empty to use Instant Database mode above.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "includeListingDetails": {
                        "title": "Include Listing Details",
                        "type": "boolean",
                        "description": "Whether to include detailed information about each listing.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max Listings/Items to scrape per crawl",
                        "type": "integer",
                        "description": "Maximum number of Listings/Items to scrape per crawl. If not defined, all items will be scraped.",
                        "default": 100
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "type": "integer",
                        "description": "Maximum number of pages that can be processed at the same time.",
                        "default": 10
                    },
                    "minConcurrency": {
                        "title": "Min Concurrency",
                        "type": "integer",
                        "description": "Minimum number of pages that will be processed at the same time.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max Request Retries",
                        "type": "integer",
                        "description": "Number of times the crawler will retry a failed request before giving up.",
                        "default": 100
                    },
                    "enrichEmails": {
                        "title": "Enrich with contact emails (experimental)",
                        "type": "boolean",
                        "description": "If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort.",
                        "default": false
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
