Realtor.ca Scraper — Listings, Details & Agents
Pricing
from $5.00 / 1,000 realtor.ca records
Realtor.ca Scraper — Listings, Details & Agents
Realtor.ca scraper for Canadian listings, full property details, agent contacts, brokerages, photos, and MLS data. MCP-ready at $0.005 per record.
Pricing
from $5.00 / 1,000 realtor.ca records
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Realtor.ca Scraper extracts Canadian property listings, full property-page details, REALTOR agent profiles, and brokerage contacts from public Realtor.ca pages. Use it for Canadian housing research, property monitoring, brokerage intelligence, and compliant real-estate lead workflows. Do not use it for US realtor.com data or private MLS fields. It returns one normalized record per listing or agent with stable, MCP-friendly fields and charges $0.005 per record returned plus the small Actor-start event.
The Actor accepts Realtor.ca map searches, city real-estate pages, individual property pages, city/province REALTOR directories, and individual agent profiles. It automatically recognizes each URL type, uses a real browser with consistent Canadian proxy sessions, captures Realtor.ca JSON search responses when available, and falls back to public DOM and JSON-LD data when the internal response shape changes.
What data can I extract with Realtor.ca Scraper?
| Data group | Included fields |
|---|---|
| Listing identity | propertyId, mlsNumber, listingUrl, address |
| Price and layout | price, currency, bedrooms, bathrooms, sizeInterior |
| Property classification | propertyType, buildingType, ownershipType |
| Full page details | description, timeOnRealtor, features, imageUrls |
| Map data | latitude, longitude when present in the captured search payload |
| Listing agent | agentId, agentName, agentTitle, agentPhone, profile and website URLs |
| Brokerage | officeName, officeAddress, officePhone, officeWebsite |
| Agent profile | languages, specialties, tradingAreas, public social links |
| Provenance | recordType, sourceUrl, sourceSearchUrl, scrapedAt, warnings |
Optional fields are always present as null, [], or {}. This consistent shape is useful for database imports and for AI agents using the Apify MCP server, because consumers do not need to guess whether an absent key means “not available” or “parser failure.”
Realtor.ca Scraper use cases
- Monitor new Canadian property listings within a saved map boundary.
- Build market snapshots by MLS number, property type, price, bedrooms, or brokerage.
- Enrich listing summaries with public descriptions, photos, property facts, and agent contacts.
- Research REALTOR coverage, languages, specialties, and trading areas in a Canadian city.
- Compare brokerage inventory or create internal dashboards for mortgage, inspection, staging, and PropTech teams.
- Schedule repeat runs and compare datasets to detect listing additions, removals, and price changes.
- Give an AI agent a narrow Realtor.ca search/detail tool with predictable input, output, and billing.
This Actor does not provide sold-history databases, owner identities, buyer or tenant data, private broker remarks, showing instructions, or any other login-only MLS information.
How to use Realtor.ca Scraper
- Open Realtor.ca and configure the map, city search, property page, or REALTOR directory you need.
- Copy the resulting URL into
startUrls. - Set
maxResultsto your required record and billing cap. - Leave detail enrichment enabled for richer records, or disable it for the fastest search-card export.
- Run the Actor and export its dataset as JSON, CSV, Excel, XML, RSS, or JSONL.
Supported URL examples
https://www.realtor.ca/map#ZoomLevel=10&Center=45.25%2C-75.79&...https://www.realtor.ca/on/toronto/real-estatehttps://www.realtor.ca/real-estate/30023436/example-listinghttps://www.realtor.ca/realtors/ab/edmontonhttps://www.realtor.ca/agent/1946468/example-agent
The scraper is Canada-only. A realtor.com URL is rejected with a soft, actionable status message rather than being sent to the wrong extractor.
Input
{"startUrls": [{ "url": "https://www.realtor.ca/realtors/ab/edmonton" },{ "url": "https://www.realtor.ca/on/ottawa/real-estate" }],"maxResults": 50,"enrichPropertyDetails": true,"enrichAgentProfiles": true,"responseFormat": "detailed"}
| Input | Default | Notes |
|---|---|---|
startUrls | Small Ottawa map search | One or more supported Realtor.ca URLs |
maxResults | 10 | Hard cap across all URLs; range 1–1000 |
enrichPropertyDetails | true | Visits each listing page for full public details |
enrichAgentProfiles | true | Visits each agent page for qualifications and office data |
responseFormat | detailed | concise keeps core fields; detailed adds bounded enrichment |
Proxy, concurrency, retry, and fingerprint settings are intentionally managed by the Actor. Realtor.ca is protected by Imperva and can reject datacenter or inconsistent sessions; exposing these settings would make successful runs harder for most users and AI agents.
Output
{"recordType": "listing","sourceUrl": "https://www.realtor.ca/real-estate/30023436/example","sourceSearchUrl": "https://www.realtor.ca/on/ottawa/real-estate","scrapedAt": "2026-07-13T12:00:00.000Z","propertyId": "30023436","mlsNumber": "X13554518","listingUrl": "https://www.realtor.ca/real-estate/30023436/example","address": "116 PASSAGEWAY PRIVATE, Ottawa, Ontario K2M1H6","price": 840000,"currency": "CAD","bedrooms": "2 + 1","bathrooms": "3","sizeInterior": "1500 - 2000 sqft","propertyType": "Single Family","buildingType": "Row / Townhouse","ownershipType": "Freehold","description": "Bright end-unit bungalow with an open-concept main floor...","timeOnRealtor": "9 minutes","latitude": null,"longitude": null,"imageUrls": ["https://cdn.realtor.ca/listings/example.jpg"],"agentId": "2135240","agentName": "Example Agent","agentTitle": "Salesperson","agentPhone": "613-555-0100","agentWebsite": null,"agentProfileUrl": "https://www.realtor.ca/agent/2135240/example","agentPhotoUrl": null,"officeName": "Example Brokerage","officeAddress": "Ottawa, Ontario","officePhone": "613-555-0101","officeWebsite": null,"languages": [],"specialties": [],"tradingAreas": [],"socialLinks": { "facebook": null, "instagram": null, "linkedin": null, "twitter": null },"features": { "Annual Property Taxes": "$5,752 (CAD)", "Parking Type": "Attached Garage" },"warnings": []}
The OUTPUT key in the default key-value store contains the final run summary: pushed listing/agent counts, source modes, failed URLs, warnings, runtime, response format, charge count, and billed result-event total.
How much does scraping Realtor.ca cost?
The Actor uses transparent pay-per-event billing:
| Event | Price |
|---|---|
| Actor start | $0.00005, scaled by allocated memory |
| Schema-valid listing or agent record | $0.005 |
Examples: 10 records cost about $0.05, 100 records cost $0.50, and 1,000 records cost $5.00, plus the small start event and any platform usage option shown by Apify. The Actor prints the maximum result-event cost before scraping and charges only after a valid record has been stored. maxResults, Apify’s paid-dataset cap, and the run’s total-charge cap are all enforced before another charge can occur.
API and MCP examples
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('muhammadafzal/realtor-ca-api-scraper').call({startUrls: [{ url: 'https://www.realtor.ca/realtors/ab/edmonton' }],maxResults: 25,enrichAgentProfiles: true,responseFormat: 'concise'});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
from apify_client import ApifyClientclient = ApifyClient('MY_APIFY_TOKEN')run = client.actor('muhammadafzal/realtor-ca-api-scraper').call(run_input={'startUrls': [{'url': 'https://www.realtor.ca/on/toronto/real-estate'}],'maxResults': 20,'responseFormat': 'detailed',})items = client.dataset(run['defaultDatasetId']).list_items().items
For MCP clients, configure https://mcp.apify.com/?tools=muhammadafzal/realtor-ca-api-scraper. The concise response format is best when the agent needs to compare many records; detailed format is better for analyzing a small number of properties or agents.
Reliability and limits
Realtor.ca can present Imperva/GeoTest challenges. The Actor uses a low-concurrency Playwright browser, Canadian residential proxy sessions, persistent cookies, browser fingerprints, retries, session retirement on 403/429 responses, a canary page, and partial-result preservation. Search extraction uses two layers: intercepted Realtor.ca JSON when available and stable public card selectors as a fallback. Property pages additionally use JSON-LD and labeled public detail sections.
Fields vary by listing and real-estate board. Missing optional values remain null rather than being guessed. A detail-page failure returns the already captured search-card record with a warning when that is truthful. If every request is blocked, the run fails honestly instead of returning a misleading empty success.
Legal and responsible use
Realtor.ca’s Terms of Use state that its content is intended for private, non-commercial use and expressly prohibit web/data scraping, collection, storage, reorganization, manipulation, AI training, and republication. Building or running this Actor does not grant permission from Realtor.ca, CREA, a brokerage, or a listing owner. Before use, obtain any required authorization and legal advice, and comply with copyright, database rights, privacy law, PIPEDA, Quebec Law 25, CASL, contracts, and applicable real-estate-board rules.
Do not use the Actor to create a competing public listing database, republish photos or descriptions, send spam, infer sensitive traits, or retrieve data beyond the public page. Use the smallest amount of data necessary for a lawful purpose, retain it only as long as needed, and honour deletion or correction obligations.
Other dedicated scrapers
- Realtor Lead Scraper
- Fast Realtor.com Agents Scraper
- Google Maps Scraper
- Apartments.com Email Scraper
- Idealista Scraper
- Domain.com.au Scraper
- Craigslist Scraper
- Auto Dealer Lead Scraper
- Lawyer Lead Scraper
- Shopify Product Scraper
FAQ
How many results can I scrape with Realtor.ca Scraper?
Up to 1,000 records per run through maxResults. Start small because detail enrichment adds one browser request per record.
Can I integrate Realtor.ca Scraper with other apps?
Yes. Use Apify Integrations, webhooks, Zapier, Make, datasets, schedules, or the REST API.
Can I use Realtor.ca Scraper with the Apify API?
Yes. Call the Actor synchronously or asynchronously and read its default dataset and OUTPUT summary.
Can I use Realtor.ca Scraper through an MCP Server?
Yes. Add this Actor through Apify’s hosted MCP server and use concise output for lower token usage.
Do I need proxies to scrape Realtor.ca?
Cloud runs use Canadian residential proxies automatically. Direct local runs may be blocked and are mainly intended for parser/schema testing.
Is it legal to scrape Realtor.ca data?
Realtor.ca’s terms expressly prohibit scraping and restrict content to private, non-commercial use. Obtain permission and qualified legal advice before running the Actor.
Your feedback
Report a failing URL, run ID, expected record type, and missing field in the Actor’s Issues tab. Do not include private credentials or personal data.