Realtor.ca Scraper & API — Canada MLS Listings & Agents avatar

Realtor.ca Scraper & API — Canada MLS Listings & Agents

Pricing

from $15.00 / 1,000 realtor.ca records

Go to Apify Store
Realtor.ca Scraper & API — Canada MLS Listings & Agents

Realtor.ca Scraper & API — Canada MLS Listings & Agents

Scrape Realtor.ca searches, listings and REALTOR profiles into JSON: price, MLS number, address, photos, agent and brokerage contacts. $15 per 1,000 records.

Pricing

from $15.00 / 1,000 realtor.ca records

Rating

0.0

(0)

Developer

Muhammad Afzal

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

3

Monthly active users

6 days ago

Last modified

Security

Limited permissions

Share

Realtor.ca Scraper & API turns public Realtor.ca map searches, property pages, and REALTOR® directories into structured JSON: price, MLS® number, address, beds, baths, size, description, photos, listing agent, and brokerage contacts. It is built for Canadian PropTech, mortgage, brokerage-intelligence, and housing-research teams, and costs USD 15 per 1,000 records on every Apify tier, including FREE.

The Actor recognises each Realtor.ca URL type automatically and returns one normalized record per listing or agent through the Apify API, MCP, or a dataset export (JSON, CSV, Excel). It covers Canada's Realtor.ca only; it does not read the US realtor.com site.

What data does the Realtor.ca Scraper return?

Each record is a listing or an agent (recordType). Every field is always present; values a page does not show are null, [], or {}.

Data groupFields
Listing identitypropertyId, mlsNumber, listingUrl, address
Price and layoutprice, currency, bedrooms, bathrooms, sizeInterior
Property typepropertyType, buildingType, ownershipType
Listing detailsdescription (up to 900 characters), timeOnRealtor, features (for example taxes, parking), imageUrls (up to 8)
Map positionlatitude, longitude when the search response includes them
Listing agentagentId, agentName, agentTitle, agentPhone, agentWebsite, agentProfileUrl, agentPhotoUrl
BrokerageofficeName, officeAddress, officePhone, officeWebsite
Agent profilelanguages, specialties, tradingAreas, socialLinks (Facebook, Instagram, LinkedIn, X)
ProvenancerecordType, sourceUrl, sourceSearchUrl, scrapedAt, warnings

Agent emails, sold-price history, owner names, and private MLS® remarks are not returned; the Actor reads only what public Realtor.ca pages show.

How do I scrape Realtor.ca listings with prices, photos, and agent details?

Set up the search on Realtor.ca, copy the URL into startUrls, and keep enrichPropertyDetails on. The Actor reads the search results, opens each property page, and returns the full listing with photos, agent, and brokerage.

{
"startUrls": [{ "url": "https://www.realtor.ca/on/ottawa/real-estate" }],
"maxResults": 50,
"enrichPropertyDetails": true,
"responseFormat": "detailed"
}

Supported URL types:

URLWhat you get
https://www.realtor.ca/map#... or https://www.realtor.ca/on/toronto/real-estateListings from a map or city search, with pagination
https://www.realtor.ca/real-estate/30023436/...One fully parsed property
https://www.realtor.ca/realtors/ab/edmontonREALTOR® directory for a city; with enrichAgentProfiles each profile is opened
https://www.realtor.ca/agent/1946468/...One fully parsed agent profile

responseFormat: "concise" keeps core listing and contact fields (one photo, no description, features, or profile lists), which suits AI agents comparing many records. "detailed" adds description, up to 8 photos, features, languages, specialties, and trading areas. Turning enrichPropertyDetails off returns search-card data only and finishes faster.

Call it from code

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);
from apify_client import ApifyClient
client = 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.default_dataset_id).list_items().items

Is there an official Realtor.ca API?

Not a public one. CREA's Data Distribution Facility (DDF®) is the official listing feed, and it is available to REALTOR® members and approved technology providers. Realtor.ca Scraper & API gives you programmatic access to what the public Realtor.ca pages show, with no membership needed, but it does not grant any licence to the data.

Use it from an AI assistant

Realtor.ca Scraper & API works from Claude, ChatGPT, Cursor, or any MCP client through Apify's MCP server. Add https://mcp.apify.com/?tools=muhammadafzal/realtor-ca-api-scraper, then ask, for example: "Get 20 houses for sale in Ottawa from Realtor.ca with price, bedrooms, and the listing brokerage, in concise format." The assistant sees the inputs and the price per record before it runs.

What does the output look like?

One listing and one agent record, shortened. Names and phone numbers are placeholders.

[
{
"recordType": "listing",
"sourceUrl": "https://www.realtor.ca/real-estate/30023436/example",
"sourceSearchUrl": "https://www.realtor.ca/on/ottawa/real-estate",
"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...",
"imageUrls": ["https://cdn.realtor.ca/listings/example.jpg"],
"agentName": "Example Agent",
"agentTitle": "Salesperson",
"agentPhone": "613-555-0100",
"officeName": "Example Brokerage",
"officePhone": "613-555-0101",
"features": { "Annual Property Taxes": "$5,752 (CAD)", "Parking Type": "Attached Garage" },
"warnings": []
},
{
"recordType": "agent",
"sourceUrl": "https://www.realtor.ca/agent/1946468/example",
"agentId": "1946468",
"agentName": "Example Agent",
"agentTitle": "REALTOR®",
"agentPhone": "780-555-0100",
"officeName": "Example Realty",
"languages": ["English", "French"],
"specialties": ["Residential"],
"tradingAreas": ["Edmonton"],
"price": null,
"warnings": []
}
]

Pricing: how much does it cost to scrape 1,000 Realtor.ca records?

USD 15 per 1,000 records, the same on every tier, plus a start fee. Platform usage is included.

EventFREEBRONZESILVERGOLDPLATINUMDIAMOND
Realtor.ca record (listing or agent)$0.015$0.015$0.015$0.015$0.015$0.015
Actor start, per started GB of allocated memory$0.01$0.01$0.01$0.01$0.01$0.01

The Actor runs a real browser with 2 GB by default, so a run pays two start events ($0.02). Worked totals:

  • 10 records: $0.02 + 10 × $0.015 = $0.17.
  • 100 records: $0.02 + 100 × $0.015 = $1.52.
  • 1,000 records: $0.02 + 1,000 × $0.015 = $15.02.

A record is charged only after it passes schema validation and is saved. Duplicates are skipped and not charged. If Realtor.ca blocks every request, the run fails and only the start fee is charged.

When should I use it, and when not?

Use it when you need:

  • a snapshot of listings inside a saved Realtor.ca map area or city, with price, MLS® number, and brokerage;
  • full property-page details (description, features, photos) for a short list of properties;
  • REALTOR® directory data by city: titles, phones, offices, languages, specialties, trading areas.

Use something else when you need:

Limits and reliability

  • 1 to 1,000 records per run (maxResults, default 10), across all URLs.
  • Realtor.ca uses bot protection. The Actor uses a real browser, session rotation, retries, and about 20 page requests per minute, so 100 detailed records take several minutes. Runs can still be blocked; a fully blocked run fails instead of returning a misleading empty success.
  • When a property or agent page fails after retries, the search-card record is returned with a warning instead.
  • The OUTPUT record summarises listing and agent counts, failed URLs, charged events, and warnings.

FAQ

How many Realtor.ca listings can I scrape per run?

Up to 1,000 records per run. Start with 10 to 50, because each detailed record opens its own property page.

Can I get REALTOR® phone numbers and brokerages?

Yes. Listing records include the listing agent's name, title, and phone plus the brokerage name, address, and phone when Realtor.ca shows them. Agent records add website, languages, specialties, trading areas, and social links. Emails are not shown publicly, so none are returned.

Should I use concise or detailed output?

Use concise for many records or AI-agent workflows, because it drops long text and keeps one photo. Use detailed when you analyse a small set of properties or agents.

Do I need proxies or a Realtor.ca account?

No. Browser, session, and retry settings are managed by the Actor, and it reads only public pages without logging in.

What happens if Realtor.ca blocks the run?

The run fails with a clear status message, no records are charged, and only the start fee applies. Retry later or with fewer records.

Does it work with realtor.com?

No. realtor.com URLs are rejected with a message. Use the Realtor Agents Scraper for US agents.

Realtor.ca's Terms of Use restrict its content to private, non-commercial use and prohibit scraping. Get the necessary permission and legal advice before you run the Actor or use its data.

Compliance note

Running this Actor does not grant permission from Realtor.ca, CREA, brokerages, or listing owners. Comply with copyright, database rights, PIPEDA, Quebec Law 25, CASL, and real-estate board rules; do not republish photos or descriptions, and treat agent contact details as personal information.

Last verified: 2026-10-26