# Realtor.ca Phone Number Scraper (`neuro-scraper/realtor-ca-phone-number-scraper`) Actor

Realtor.ca Phone Number Scraper SD - Realtor.ca Phone Number Scraper is a lead generation tool that extracts leads with public phone numbers, account names and profile URLs from Realtor.ca results by keyword, location and country - Realtor.ca phone number extractor.

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

## Pricing

from $2.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

### Realtor.ca Phone Number Scraper

**Realtor.ca Phone Number Scraper** turns a keyword into a contact sheet of phone numbers published on Realtor.ca. Give it search terms and it returns the accounts that publish a way to reach them, with the account name, handle and profile URL beside each contact.

It reads only what Realtor.ca and Google already show a signed-out visitor. No login, no cookies, no private or partner API, no browser and no JavaScript rendering.

**Read this before your first run.** Realtor.ca indexes listing and map pages far more than agent profiles, so most rows carry an agent email without a resolvable profile URL.

***

### What the Realtor.ca Phone Number Scraper does

The Realtor.ca Phone Number Scraper searches Google with a contact dork rather than a plain keyword: `site:realtor.ca real estate agent whatsapp "+44"`. That asks for the pages which already publish a phone number, instead of every page matching a word.

Each result block yields the account and the phone number together, in one request. Google no longer prints the target URL on most layouts, so the handle comes from what it does print: the "Realtor.ca - handle" site label, the breadcrumb, or a `Name (@handle)` title.

Every row is written to the dataset the moment it is found and logged as it is written, so a run is readable while it is still going.

Phone numbers are validated by libphonenumber against the real numbering plan of the country you searched, so order numbers, dates and follower counts cannot reach the dataset. Each number is returned in E.164 form and in the national format its country uses.

***

### Input reference for the Realtor.ca Phone Number Scraper

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | array | `real estate agent, realtor` | Search terms - a niche, job title or industry. |
| `location` | string | `""` | Added to every query, e.g. `New York`. |
| `countries` | array | US, UK, India | Which countries' numbers to look for. Name, ISO code or dial code. Each one multiplies the searches. |
| `maxEmails` | integer 1-10000 | `20` | Stop once this many unique contacts are found. |
| `expandQueries` | boolean | `true` | Search each keyword in several phrasings. |
| `queryModifiers` | array | per platform | Extra words combined with each keyword. |
| `maxPagesPerQuery` | integer 1-50 | `30` | Google result pages per query. |
| `maxConcurrency` | integer 1-20 | `5` | Queries run in parallel. |
| `countryCode` | string | `""` | Two-letter country for the search proxy. |

### Output

Every row the Realtor.ca Phone Number Scraper writes:

| Field | Meaning |
|---|---|
| `network` | Platform name |
| `keyword` | The keyword that found this row |
| `query` | The exact Google query used |
| `phone` | The number in E.164 form, e.g. `+447590574946` |
| `phoneNational` | The same number as its country writes it |
| `phoneCountry` | ISO country the number belongs to |
| `accountName` | Account label as the platform shows it |
| `fullName` | Display name where published |
| `username` | Handle |
| `profileUrl` | Canonical profile URL |
| `url` | The page the result pointed at |
| `description` | The result snippet, cleaned |
| `foundAt` | ISO 8601 UTC timestamp |

```json
{
  "network": "Realtor.ca",
  "keyword": "real estate agent",
  "accountName": "examplestudio",
  "fullName": "Example Studio",
  "username": "examplestudio",
  "profileUrl": "https://www.realtor.ca/agent/examplestudio",
  "phone": "+447590574946",
  "phoneNational": "07590 574946",
  "phoneCountry": "GB"
}
```

### How to use the Realtor.ca Phone Number Scraper

1. Put your search terms in **Keywords** - the niche, job title or industry you sell to.
2. Add a **Location** if the list should be local.
3. Pick the **Countries** whose numbers you want. Every number is validated against that country's numbering plan.
4. Set **Max results** to cap the run, then start it.
5. Export the dataset as CSV, JSON or Excel, or pull it through the Apify API.

### Use cases

**Lead generation.** Build a list of Realtor.ca accounts in one niche that publish a phone number, with the handle and profile URL for context before you write.

**Recruiting.** Find people describing themselves with a role keyword and reach them on the contact they chose to publish.

**Agency prospecting.** Search a niche and a city, and get a prospect sheet with the account and the contact side by side.

**CRM enrichment.** Feed `profileUrl` and `phone` straight into your CRM; the `keyword` and `query` columns record where each row came from.

### Limitations, stated plainly

- Only contacts already published in public Realtor.ca pages indexed by Google. Nothing hidden from a signed-out visitor is reachable, and none is guessed from a name.
- Realtor.ca indexes listing and map pages far more than agent profiles, so most rows carry an agent email without a resolvable profile URL.
- Coverage depends on what Google has indexed, so a narrow niche returns fewer rows than a broad one. Raising **Max pages per query** and adding keywords helps.
- The free Apify plan caps a run at 20 results.
- A number written without its country code can only be validated against the country you searched, so search the countries you actually sell to.

### Pricing

Pay per result: you are charged for each row written to the dataset, and nothing for a run that finds nothing. Platform and proxy costs are included in that price.

### Realtor.ca Phone Number Scraper vs manual research

Done by hand, one qualified contact takes two to four minutes: find the account, open it, read
the page, copy the phone number, paste it into a sheet.

The Realtor.ca Phone Number Scraper does the same work continuously, with no tab switching and
no transcription errors. A hundred records is minutes rather than an afternoon.

It also captures what manual research usually skips. The account name, the profile URL and the
exact keyword that surfaced the row all land in the same record.

That context turns a raw list into a prioritised one. The Realtor.ca Phone Number Scraper lets
you sort and filter before a single message is written.

### Using the Realtor.ca Phone Number Scraper in a workflow

Most teams run the Realtor.ca Phone Number Scraper on a schedule and treat the dataset as a
feed rather than a one-off export.

Point a webhook at your own endpoint and each finished run pushes its rows straight into your
CRM, with no manual download step.

The stable output schema matters here. Because every row from the Realtor.ca Phone Number
Scraper has identical keys, your integration never needs to handle a missing field.

A common pattern is a nightly keyword run feeding a dedupe step. Another is enrichment: widen
the keyword list and let the Realtor.ca Phone Number Scraper fill the gaps in an existing
sheet.

#### Troubleshooting the Realtor.ca Phone Number Scraper

**Few or no rows.** The keyword is probably too broad or too narrow. Ten specific keywords beat
one generic one, and adding a location raises the hit rate.

**Rows without contacts.** That is normal - most accounts publish none. The Realtor.ca Phone
Number Scraper reports only what is genuinely on the page.

**The run is slow to start.** Lower the concurrency. The Realtor.ca Phone Number Scraper is
querying faster than the proxy pool is comfortable with.

**Fewer results than requested.** Google caps one query at roughly 300 results. Query expansion
is what reaches past that ceiling, so leave it on.

#### How the Realtor.ca Phone Number Scraper handles export and integration

Export the Realtor.ca Phone Number Scraper dataset as CSV, JSON, Excel or XML from the Apify
console, or pull it through the API.

Every field is flat - no nested objects - so the CSV opens cleanly in Excel or Google Sheets
without a parsing step.

### Related Actors

| Actor | What it collects |
|---|---|
| [Realtor.ca Email Scraper](https://apify.com/leads-scraper/realtor-ca-email-scraper) | Public contact emails from Realtor.ca |
| [Realtor.ca Email and Phone Number Scraper](https://apify.com/neuro-scraper/realtor-ca-email-and-phone-number-scraper) | Emails and phone numbers from Realtor.ca |
| [Apartment List Email Scraper](https://apify.com/leads-scraper/apartment-list-email-scraper) | Public contact emails from Apartment List |
| [ApartmentFinder Email Scraper](https://apify.com/leads-scraper/apartmentfinder-email-scraper) | Public contact emails from ApartmentFinder |
| [Apartments.com Email Scraper](https://apify.com/leads-scraper/apartments-com-email-scraper) | Public contact emails from Apartments.com |
| [Century 21 Agent Email Scraper](https://apify.com/neuro-scraper/century-21-agent-email-scraper) | Public contact emails from Century 21 |
| [Coldwell Banker Agent Email Scraper](https://apify.com/neuro-scraper/coldwell-banker-agent-email-scraper) | Public contact emails from Coldwell Banker |
| [CommercialCafe Email Scraper](https://apify.com/neuro-scraper/commercialcafe-email-scraper) | Public contact emails from CommercialCafe |
| [CommercialSearch Email Scraper](https://apify.com/neuro-scraper/commercialsearch-email-scraper) | Public contact emails from CommercialSearch |
| [Compass Agent Email Scraper](https://apify.com/neuro-scraper/compass-agent-email-scraper) | Public contact emails from Compass |
| [Crexi Email Scraper](https://apify.com/leads-scraper/crexi-email-scraper) | Public contact emails from Crexi |
| [Domain Agents Email Scraper](https://apify.com/leads-scraper/domain-agents-email-scraper) | Public contact emails from Domain |
| [Homes & Land Email Scraper](https://apify.com/neuro-scraper/homes-and-land-email-scraper) | Public contact emails from Homes & Land |
| [Homes.com Email Scraper](https://apify.com/leads-scraper/homes-com-email-scraper) | Public contact emails from Homes.com |
| [HotPads Email Scraper](https://apify.com/leads-scraper/hotpads-email-scraper) | Public contact emails from HotPads |
| [Keller Williams Agent Email Scraper](https://apify.com/neuro-scraper/keller-williams-agent-email-scraper) | Public contact emails from Keller Williams |
| [Land And Farm Email Scraper](https://apify.com/leads-scraper/land-and-farm-email-scraper) | Public contact emails from Land And Farm |
| [Land.com Email Scraper](https://apify.com/leads-scraper/land-com-email-scraper) | Public contact emails from Land.com |
| [LandWatch Email Scraper](https://apify.com/leads-scraper/landwatch-email-scraper) | Public contact emails from LandWatch |
| [LoopNet Email Scraper](https://apify.com/leads-scraper/loopnet-email-scraper) | Public contact emails from LoopNet |
| [OnTheMarket Email Scraper](https://apify.com/leads-scraper/onthemarket-email-scraper) | Public contact emails from OnTheMarket |
| [RealEstate.com.au Agents Email Scraper](https://apify.com/neuro-scraper/realestate-com-au-agents-email-scraper) | Public contact emails from realestate.com.au |
| [Realtor.com Rentals Email Scraper](https://apify.com/leads-scraper/realtor-com-rentals-email-scraper) | Public contact emails from Realtor.com |
| [Redfin Rentals Email Scraper](https://apify.com/leads-scraper/redfin-rentals-email-scraper) | Public contact emails from Redfin |
| [RE/MAX Agent Email Scraper](https://apify.com/leads-scraper/remax-agent-email-scraper) | Public contact emails from RE/MAX |
| [Rent.com Email Scraper](https://apify.com/leads-scraper/rent-com-email-scraper) | Public contact emails from Rent.com |
| [RentCafe Email Scraper](https://apify.com/leads-scraper/rentcafe-email-scraper) | Public contact emails from RentCafe |
| [Zillow Rentals Email Scraper](https://apify.com/leads-scraper/zillow-rentals-email-scraper) | Public contact emails from Zillow |
| [Zumper Email Scraper](https://apify.com/leads-scraper/zumper-email-scraper) | Public contact emails from Zumper |
| [Apartment List Email and Phone Number Scraper](https://apify.com/neuro-scraper/apartment-list-email-and-phone-number-scraper) | Emails and phone numbers from Apartment List |
| [ApartmentFinder Email and Phone Number Scraper](https://apify.com/neuro-scraper/apartmentfinder-email-and-phone-number-scraper) | Emails and phone numbers from ApartmentFinder |
| [Apartments.com Email and Phone Number Scraper](https://apify.com/neuro-scraper/apartments-com-email-and-phone-number-scraper) | Emails and phone numbers from Apartments.com |
| [Century 21 Email and Phone Number Scraper](https://apify.com/neuro-scraper/century-21-agent-email-and-phone-number-scraper) | Emails and phone numbers from Century 21 |
| [Coldwell Banker Email and Phone Number Scraper](https://apify.com/neuro-scraper/coldwell-banker-agent-email-and-phone-number-scraper) | Emails and phone numbers from Coldwell Banker |
| [CommercialCafe Email and Phone Number Scraper](https://apify.com/neuro-scraper/commercialcafe-email-and-phone-number-scraper) | Emails and phone numbers from CommercialCafe |
| [CommercialSearch Email and Phone Number Scraper](https://apify.com/neuro-scraper/commercialsearch-email-and-phone-number-scraper) | Emails and phone numbers from CommercialSearch |
| [Compass Email and Phone Number Scraper](https://apify.com/neuro-scraper/compass-agent-email-and-phone-number-scraper) | Emails and phone numbers from Compass |
| [Crexi Email and Phone Number Scraper](https://apify.com/leads-scraper/crexi-email-and-phone-number-scraper) | Emails and phone numbers from Crexi |
| [Domain Email and Phone Number Scraper](https://apify.com/leads-scraper/domain-agents-email-and-phone-number-scraper) | Emails and phone numbers from Domain |
| [Homes & Land Email and Phone Number Scraper](https://apify.com/neuro-scraper/homes-and-land-email-and-phone-number-scraper) | Emails and phone numbers from Homes & Land |
| [Homes.com Email and Phone Number Scraper](https://apify.com/leads-scraper/homes-com-email-and-phone-number-scraper) | Emails and phone numbers from Homes.com |
| [Keller Williams Email and Phone Number Scraper](https://apify.com/neuro-scraper/keller-williams-agent-email-and-phone-number-scraper) | Emails and phone numbers from Keller Williams |

### FAQ

#### Does the Realtor.ca Phone Number Scraper need a login or cookies?

No. It reads public search results and public Realtor.ca pages only.

#### Where do the phone numbers come from?

From the public page the search result points at - the same text any visitor can read.

#### Are the numbers real?

Every number is checked against its country's numbering plan before it is written, so invalid strings are dropped rather than shipped.

#### Can I run it on a schedule?

Yes, with Apify Schedules. Progress is saved, so a migrated run continues instead of starting over.

**Something is missing or wrong.**\
Email <neurodata.apify@gmail.com>.

### More about the Realtor.ca Phone Number Scraper

Because the Realtor.ca Phone Number Scraper reads only pages Google has already indexed, it
never needs a login, a cookie jar or an API key from the platform it reads.

Run the Realtor.ca Phone Number Scraper with a narrow keyword set first. A short test run shows
the yield of a niche before a large run is paid for.

Output from the Realtor.ca Phone Number Scraper is flat - no nested objects - so a CSV export
opens cleanly in Excel or Google Sheets with no parsing step.

Pair the Realtor.ca Phone Number Scraper with Apify Schedules to rebuild a prospect list weekly
and catch accounts that published contact details since the last run.

Proxy and platform costs are already inside the per-result price of the Realtor.ca Phone Number
Scraper, so the figure quoted on the Store page is the figure you pay.

Every field the Realtor.ca Phone Number Scraper returns is documented in the output table
above, and the schema does not change between runs or between platforms.

#### Realtor.ca Phone Number Scraper at a glance

Teams that outgrow manual prospecting usually reach for the Realtor.ca Phone Number Scraper
first, because it needs no setup beyond a keyword list and a result cap.

Concurrency on the Realtor.ca Phone Number Scraper is adjustable, so a run can be tuned for
speed on a quiet network or for reliability on a busy one.

If a run of the Realtor.ca Phone Number Scraper is interrupted, Apify migrates it and progress
resumes rather than restarting from the first query.

Agencies commonly schedule the Realtor.ca Phone Number Scraper weekly, then diff each dataset
against the last to surface only newly published contacts.

Nothing in the Realtor.ca Phone Number Scraper guesses a contact from a name pattern. A value
is written only when it appears on the page itself.

Because the Realtor.ca Phone Number Scraper shares its output schema with every other scraper
in this catalogue, a pipeline built once works across all of them.

#### Realtor.ca Phone Number Scraper in practice

A first run of the Realtor.ca Phone Number Scraper is the cheapest market research available:
it shows how many reachable accounts a niche actually contains before any budget is committed.

Results from the Realtor.ca Phone Number Scraper arrive as they are found, so the dataset can
be read while the run is still going rather than only at the end.

Keyword choice matters more than run length with the Realtor.ca Phone Number Scraper. Ten
precise terms routinely beat one broad term run ten times longer.

Support for the Realtor.ca Phone Number Scraper is handled by the same people who build it, so
a bug report reaches the person who can fix it.

Everything the Realtor.ca Phone Number Scraper collects is data the account owner chose to
publish. Nothing private is accessed, inferred or reconstructed.

Use the Realtor.ca Phone Number Scraper alongside its sibling scrapers to cover several
platforms with one workflow and one output format.

Cost with the Realtor.ca Phone Number Scraper scales with results rather than with runtime,
which makes a large search predictable to budget for.

### Leave a review

If the Realtor.ca Phone Number Scraper saved you time, please leave a star rating and a short
review on the Realtor.ca Phone Number Scraper page.

Reviews are how other buyers judge whether a tool works, and they tell us which features to
build next.

If something did not work, email <neurodata.apify@gmail.com>
instead - bugs get fixed faster than they get complained about.

### Support

Questions, bugs or a custom build: <neurodata.apify@gmail.com>.

# Actor input Schema

## `keywords` (type: `array`):

Search terms describing the Realtor.ca accounts you want (niche, job title, industry).

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

Optional location phrase added to every query (e.g. "New York").

## `countries` (type: `array`):

Which countries' phone numbers to look for. The search asks Google for that country's dial code, and every number found is validated against that country's real numbering plan. Country name, ISO code or dial code all work. Each extra country multiplies the number of searches.

## `maxEmails` (type: `integer`):

Stop once this many unique contacts have been collected.

## `countryCode` (type: `string`):

Two-letter country code for the search proxy (e.g. US, GB, DE). Empty for any.

## `expandQueries` (type: `boolean`):

Search each keyword x domain pair with several phrasings. Recommended - Google caps a single query at ~300 results.

## `queryModifiers` (type: `array`):

Extra words combined with each keyword when Expand queries is on. Tuned for Realtor.ca.

## `maxPagesPerQuery` (type: `integer`):

Google rarely returns more than ~30 pages for one query.

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

How many queries run in parallel.

## Actor input object example

```json
{
  "keywords": [
    "real estate agent",
    "realtor"
  ],
  "location": "",
  "countries": [
    "United States",
    "United Kingdom",
    "India"
  ],
  "maxEmails": 20,
  "countryCode": "",
  "expandQueries": true,
  "queryModifiers": [
    "email",
    "contact",
    "listing agent",
    "inquiries",
    "broker"
  ],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

Records produced by Realtor.ca Phone Number Scraper, stored in the run's default dataset.

# 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 = {
    "keywords": [
        "real estate agent",
        "realtor"
    ],
    "location": "",
    "countries": [
        "United States",
        "United Kingdom",
        "India"
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "listing agent",
        "inquiries",
        "broker"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/realtor-ca-phone-number-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 = {
    "keywords": [
        "real estate agent",
        "realtor",
    ],
    "location": "",
    "countries": [
        "United States",
        "United Kingdom",
        "India",
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "listing agent",
        "inquiries",
        "broker",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/realtor-ca-phone-number-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 '{
  "keywords": [
    "real estate agent",
    "realtor"
  ],
  "location": "",
  "countries": [
    "United States",
    "United Kingdom",
    "India"
  ],
  "countryCode": "",
  "queryModifiers": [
    "email",
    "contact",
    "listing agent",
    "inquiries",
    "broker"
  ]
}' |
apify call neuro-scraper/realtor-ca-phone-number-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neuro-scraper/realtor-ca-phone-number-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/RiPQgHjXyHT8LhqRZ/builds/4ZTfWHEul6vh0nMMG/openapi.json
