Realtor.ca Scraper avatar

Realtor.ca Scraper

Pricing

from $2.50 / 1,000 results

Go to Apify Store
Realtor.ca Scraper

Realtor.ca Scraper

Realtor.ca scraper & API for Canadian real estate: search homes for sale & rent and export address, price, beds, baths, property type, MLS number, description, agent & brokerage, photos and GPS coordinates. Canada property market data and real-estate lead generation — fast, no login.

Pricing

from $2.50 / 1,000 results

Rating

0.0

(0)

Developer

Haketa

Haketa

Maintained by Community

Actor stats

1

Bookmarked

82

Total users

7

Monthly active users

6 days ago

Last modified

Share

Realtor.ca Scraper — Canada MLS Listings, Agents & Brokerages Extractor (CREA / Realtor.ca API Alternative)

The most complete Realtor.ca data extraction tool on Apify. Pull live MLS listings, REALTOR agent profiles, and brokerage office records from Realtor.ca — Canada's national MLS portal operated by CREA — with a deep, normalized schema covering price (CAD), beds/baths in Canadian X+Y format, ownership type, taxes, condo fees, heating fuel, agent contact, and brokerage franchise data. Built for prop-tech, investor research, immigration intel, brokerage analytics, mortgage broker outreach, and Canadian real-estate data teams who need MLS Canada data without building their own anti-bot-bypassing crawler.

Apify Actor


What This Actor Does

The Realtor.ca Scraper is a production-grade Apify Actor that extracts the full public MLS listing universe from Realtor.ca — the national real-estate portal operated by the Canadian Real Estate Association (CREA) and powered by data from every member real-estate board in Canada (TREB, REBGV, OREB, CREB, QPAREB, and 70+ others). Realtor.ca is the single most-trafficked Canadian real-estate website and the only consumer-facing surface that aggregates listings from coast to coast — Toronto's Yorkville condos, Vancouver's Kitsilano detached homes, Montreal's Plateau triplexes, Calgary acreages, Halifax waterfronts, and Yellowknife cabins all live in one searchable index.

In a single run, the actor returns structured records covering:

  • Active for-sale residential listings — single-family detached, semi-detached, townhomes, condo apartments, lofts, co-ops, mobile homes, vacant land
  • Active for-rent residential listings — apartments, condos, rental houses, basement suites
  • Active commercial listings — office, retail, industrial, multi-family investment, hospitality, business-for-sale
  • REALTOR agent profiles — licensed CREA REALTOR members with bio, designations, languages, service areas, and current listing counts
  • Brokerage / office profiles — franchise affiliations (RE/MAX, Royal LePage, Century 21, Sutton, Coldwell Banker, EXP, Engel & Völkers, independent boutiques), agent counts, and total active listings

Every record arrives flattened, normalized, and ready for ingestion into Postgres, BigQuery, Snowflake, Google Sheets, Salesforce, HubSpot, or any BI / CRM stack — no parsing scripts, no anti-bot cookie wrangling, no per-province board logic, no CSV stitching.

Why scrape Realtor.ca yourself when this exists?

Realtor.ca is one of the most aggressively anti-bot real-estate portals on the public internet. Teams that try to roll their own crawler — even experienced ones — discover the same problems in the same order:

  • Realtor.ca sits behind Imperva Incapsula with IP-reputation gating and a challenge/CAPTCHA wall — datacenter IPs are blocked within seconds, and a flagged IP never clears until you rotate to a fresh one
  • The undocumented api2.realtor.ca/Listing.svc/PropertySearch_Post endpoint is a map-centric search that expects an ApplicationId, a lat/lng bounding box, and a consistent browser-like client fingerprint — reverse-engineering it takes days
  • Pagination tops out at a hard 200-results-per-query cap; provincewide queries silently truncate unless you split the geography into a bounding-box grid
  • Listing detail pages are bilingual (English + French) — Quebec inventory is FR-only and naive parsers drop or mangle accented characters
  • Beds/baths come as "3 + 1" strings (above-ground + basement) — a uniquely Canadian convention foreign scrapers stringify as "3" and lose half the bedrooms
  • Ownership types include Freehold, Condominium, Strata (BC), Leasehold, Co-operative, Life Lease, and Undivided Co-ownership — each implies a different cost structure
  • Taxes are annual CAD values with a separate taxYear; condo fees include a condoFeeIncludes array (heat, water, parking, common elements) that nobody parses correctly the first time
  • Agent and office data live on separate realtor.ca/agent/{id} and realtor.ca/office/firm/{id} profile pages (each server-renders a PropertySearch_Post payload into the HTML) — joining them to listings requires coordinated request streams
  • Realtor.ca throttles aggressively: more than 2-4 parallel requests from the same IP triggers a cooldown
  • When the site's response schema shifts (it has several times), every rigid selector-based scraper breaks silently — this actor parses with a tolerant, key-fuzzy schema instead
  • CREA's robots.txt and ToS expressly forbid datacenter crawling — only residential-IP, low-concurrency access keeps you under the radar

This actor solves all of that: sticky-session Canadian residential proxy with fresh-IP rotation on every block, conservative concurrency, the correct ApplicationId, automatic bounding-box grid splitting, X+Y bed/bath decoding, EN/FR language detection, joined agent + office enrichment, and a flat output schema you can drop straight into a warehouse.


Quick Start

One-Click Run (Apify UI)

  1. Open the actor page on Apify Store: haketa/realtor-ca-scraper
  2. Click "Try for free"
  3. In Cities / Markets, pick one or more Canadian cities from the dropdown (Toronto, Vancouver, Calgary are prefilled) — no URLs, IDs or codes needed. Leave it empty to pull a fresh mixed sample from popular markets across Canada.
  4. Optionally set filters — For Sale / For Rent, Property Category, price, beds, baths — and a Max Results cap for a fast, cheap test run
  5. Hit Start — your dataset is available in the Dataset tab within minutes, downloadable as JSON, CSV, Excel, HTML, XML, or JSON-Lines

Power users: switch Advanced Input Mode to paste your own Realtor.ca area-page links, a map bounding box, MLS numbers, or agent / brokerage profile links in the Advanced Inputs field. See the Scrape Mode Reference below.

API Run (Python)

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("haketa/realtor-ca-scraper").call(run_input={
"cities": ["toronto", "vancouver", "calgary"],
"transactionType": "for-sale",
"propertyTypeGroup": "residential",
"priceMin": 500000,
"priceMax": 2000000,
"bedroomsMin": 2,
"fetchDetails": True,
"fetchAgentProfiles": False,
"fetchOfficeProfiles": False,
"maxItems": 500,
"maxPages": 10,
"proxyConfiguration": {
"useApifyProxy": True,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "CA"
}
})
for record in client.dataset(run["defaultDatasetId"]).iterate_items():
print(record["mlsNumber"], record["addressLine"], record["city"], record["priceAmount"])

API Run (Node.js / TypeScript)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('haketa/realtor-ca-scraper').call({
advancedMode: 'map-bbox',
mapBoundingBox: {
latMin: 43.62, // Toronto downtown core
latMax: 43.72,
lngMin: -79.45,
lngMax: -79.32
},
transactionType: 'for-sale',
propertyTypeGroup: 'residential',
priceMin: 800000,
bedroomsMin: 2,
fetchDetails: true,
maxItems: 300,
proxyConfiguration: {
useApifyProxy: true,
apifyProxyGroups: ['RESIDENTIAL'],
apifyProxyCountry: 'CA'
}
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Pulled ${items.length} downtown Toronto for-sale listings`);

API Run (cURL)

curl -X POST "https://api.apify.com/v2/acts/haketa~realtor-ca-scraper/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"advancedMode": "single-listing",
"searchUrls": ["X8234567", "W8123450", "C8765432"],
"fetchDetails": true,
"fetchAgentProfiles": true,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "CA"
}
}'

How It Works

Realtor.ca is not a static HTML site. The consumer-facing pages at realtor.ca/{province}/{city}/real-estate and realtor.ca/real-estate/{mls-number}/... are React shells that hydrate from CREA's internal JSON API at api2.realtor.ca. This actor talks to that API directly using got-scraping (no headless browser overhead), parses the JSON, and — for the few fields that only appear in the HTML hydration payload — falls back to Cheerio against the rendered listing page.

Source EndpointPurposeMethod
api2.realtor.ca/Listing.svc/PropertySearch_PostPaginated listing search by map bounding box (built from the city you pick), price, beds/baths, transaction typePOST (form-encoded)
api2.realtor.ca/Listing.svc/PropertyDetailsFull listing detail by PropertyID + ReferenceNumber (MLS) — remarks, all photos, features, appliances, financialsGET
www.realtor.ca/agent/{id}/{slug}Agent profile HTML — agent-profile mode & fetchAgentProfiles enrichment. The page server-renders a JSON-LD Person block + a PropertySearch_Post payload (bio, designations, languages, current listing count)GET (Cheerio)
www.realtor.ca/office/firm/{id}/{slug}Brokerage / office profile HTML — office-profile mode & fetchOfficeProfiles enrichment. Carries the office JSON-LD + an embedded PropertySearch_Post payload (franchise, total listing count)GET (Cheerio)

There is no separate Profile.svc API — Realtor.ca exposes agent and office data only through their HTML profile pages, which the actor parses (JSON-LD + the embedded search payload rendered into the page). The listing search and detail both come from api2.realtor.ca/Listing.svc.

Engineering details

  • HTTP-first with got-scraping — no Puppeteer / Playwright overhead; bypasses most browser fingerprint blocks by emulating a realistic Chrome client
  • Canadian residential proxy mandatory — apifyProxyGroups: ["RESIDENTIAL"] + apifyProxyCountry: "CA"; datacenter IPs are blocked within a few requests
  • Sticky-session + fresh-IP rotation — Realtor.ca is gated by IP reputation, so a clean Canadian residential IP is pinned for all requests while it works (pagination reuses the cleared IP); the instant a request is challenged, the actor rotates to a brand-new IP and retries — up to 10 fresh-IP attempts per request
  • Bounding-box grid auto-split — every city you pick (and any custom map-bbox) is split into a grid of cells so each query stays under Realtor.ca's 200-result-per-query cap, then results are deduplicated by MLS number / listing ID
  • ApplicationId injection — the actor uses a known-good ApplicationId by default and exposes it as an override input for the rare day CREA rotates it
  • Conservative concurrency (2-4) + request delay — well below Realtor.ca's throttling threshold; tuned for sustained multi-thousand-listing runs
  • Soft-deadline shutdown — the actor stops starting new work a safety buffer before the platform timeout, so a run always finishes cleanly (SUCCEEDED) with whatever it gathered instead of being killed mid-flight
  • X+Y bed/bath decoder — "3 + 1" → bedroomsTotal: 4, bedroomsAbove: 3, bedroomsBelow: 1; bathrooms decoded as bathroomsTotal = full + half × 0.5
  • EN/FR language detection — descriptionLang is set per-listing so downstream pipelines can route Quebec inventory to French NLP, and Ontario/Alberta/BC inventory to English
  • CAD currency normalization — every priceAmount, taxAnnualAmount, condoFeeMonthly is a numeric value; priceCurrency is always "CAD"
  • Tax-to-price ratio precomputed — taxToPrice = taxAnnualAmount / priceAmount for instant comparables filtering
  • Agent + office enrichment — fetchAgentProfiles and fetchOfficeProfiles add one request per unique agent/office (not per listing) — extremely cheap even on thousand-listing runs
  • Deterministic, flat output — one record per listing (or per agent/office in profile modes); same shape regardless of mode so a single ingestion script handles everything

Input Parameters

{
"cities": ["toronto", "vancouver", "calgary"],
"transactionType": "for-sale",
"propertyTypeGroup": "residential",
"priceMin": 500000,
"priceMax": 2000000,
"bedroomsMin": 2,
"bathroomsMin": 1,
"newListingsOnlyDays": 0,
"language": "both",
"fetchDetails": true,
"fetchAgentProfiles": false,
"fetchOfficeProfiles": false,
"maxItems": 500,
"maxPages": 10,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "CA"
},
"requestDelay": 1500,
"maxConcurrency": 2,
"maxRetries": 4,
"debugMode": false
}

Parameter reference

ParameterTypeDefaultDescription
citiesarray<string>["toronto","vancouver","calgary"]Primary input. Pick one or more Canadian cities from the dropdown — 27 markets across all provinces (Toronto, Mississauga, Ottawa, Montreal, Quebec City, Vancouver, Surrey, Victoria, Calgary, Edmonton, Winnipeg, Halifax, St. John's, and more). No URLs or codes required. Leave empty for a fresh mixed sample of popular markets.
transactionTypestringfor-salefor-sale, for-rent, or both.
propertyTypeGroupstringresidentialresidential (houses, condos, townhomes), commercial (office, retail, industrial), or all.
priceMininteger0Minimum price in CAD. 0 = no minimum.
priceMaxinteger0Maximum price in CAD. 0 = no maximum.
bedroomsMininteger0Minimum bedroom count. 0 = no filter.
bathroomsMininteger0Minimum bathroom count. 0 = no filter.
newListingsOnlyDaysinteger0Keep only listings first published within the last N days. 0 = keep all. Great for fresh-lead monitoring.
languagestringbothboth, en, or fr — filter by detected description language. Useful for Quebec-only or rest-of-Canada feeds.
fetchDetailsbooleantrueVisit each listing's detail endpoint for full remarks, all photos, features, appliances, financials. Off = search-summary only.
fetchAgentProfilesbooleanfalseAdditionally fetch the REALTOR agent profile (bio, designations, languages, service areas, listing count) for each listing's agent. One request per unique agent.
fetchOfficeProfilesbooleanfalseAdditionally fetch the brokerage office profile (franchise, total listings). One request per unique office.
maxItemsinteger0 (prefill 100)Hard cap on total records across all cities/inputs. 0 = unlimited. Keep a limit for fast, low-cost test runs.
maxPagesinteger10Maximum result pages per city / bbox cell. Each page returns up to ~200 listings.
proxyConfigurationobjectCA ResidentialREQUIRED. Use Apify Proxy with RESIDENTIAL group and CA country. Datacenter IPs are blocked.
requestDelayinteger1500Milliseconds between requests. Keep at 1000+ for sustained runs.
maxConcurrencyinteger2Parallel area-search tasks. Realtor.ca tolerates 2-4 — higher risks a cooldown.
maxRetriesinteger4Retry attempts on blocked / challenged responses.
debugModebooleanfalseVerbose logging — dumps API request/response shapes and field maps for the first page. Use only when troubleshooting.

Advanced input (power users)

Most users only need the city dropdown. To scrape your own targets, set Advanced Input Mode (advancedMode) to one of the options below and put your links / numbers in the Advanced Inputs field (searchUrls), or supply a mapBoundingBox:

ParameterTypeDescription
advancedModestringcities (default, uses the dropdown), search-area, map-bbox, single-listing, agent-profile, or office-profile.
searchUrlsarray<string>Realtor.ca area-page links (https://www.realtor.ca/on/ottawa/real-estate), MLS numbers (X13126780), agent links (https://www.realtor.ca/agent/2182401/jane-doe), or brokerage links (https://www.realtor.ca/office/firm/259003/royal-lepage-team) — matched to the chosen advancedMode.
mapBoundingBoxobjectA { latMin, latMax, lngMin, lngMax } box in decimal degrees for map-bbox mode. Large boxes auto-split into a grid.
applicationIdstringOverride the ApplicationId sent to api2.realtor.ca. Leave blank to use the built-in default.

Output Schema

Every record arrives as a flat JSON object with the same top-level shape regardless of whether it was produced by a listing mode, an agent-profile mode, or an office-profile mode. The recordType field tells you which one to expect, and irrelevant fields are simply null.

Identity & source fields

FieldTypeDescription
recordTypestringlisting (default) / agent / office
mlsNumberstringMLS listing ID, board-prefixed (e.g. X8234567, W8123450, C8765432)
listingIdstringRealtor.ca internal listing ID
sourcestringAlways realtor.ca
modestringScrape mode that produced this record
listingUrlstringFull canonical Realtor.ca listing URL
searchUrlstringSource input URL / search query
scrapedAtstringISO-8601 timestamp of extraction

Transaction & price fields (CAD)

FieldTypeDescription
transactionTypestringFor Sale / For Rent
statusstringactive (v1 — sold inference reserved)
priceRawstringOriginal price string from Realtor.ca
priceAmountnumberParsed numeric price in CAD
priceCurrencystringAlways CAD
priceFrequencystringMonthly / Yearly / Weekly (rentals)
pricePerSqftnumberPrice ÷ interior size

Property characteristics

FieldTypeDescription
propertyTypestringSingle Family / Condo / Vacant Land / Multi-Family / Commercial etc.
buildingTypestringHouse / Apartment / Row-Townhouse / Duplex / Mobile Home etc.
ownershipTypestringFreehold / Condominium / Strata / Leasehold / Co-operative / Life Lease
bedroomsRawstringOriginal bed string (e.g. "3 + 1")
bedroomsTotalnumberTotal bedrooms (above + below ground)
bedroomsAbovenumberAbove-ground bedrooms
bedroomsBelownumberBasement bedrooms (may be non-conforming)
bathroomsRawstringOriginal bath string (e.g. "2 + 1")
bathroomsTotalnumberFull + half × 0.5
bathroomsFullnumberFull bathrooms
bathroomsHalfnumberHalf / powder bathrooms
sizeInteriorRawstringOriginal interior size string
sizeInteriornumberParsed square footage
lotSizeRawstringLot / land size string
sizeFrontagestringLot frontage
yearBuiltintegerConstruction year
parkingTypestringGarage / Carport / Underground / Street
parkingSpacesintegerNumber of parking spots
basementTypestringFull / Partial / Crawl Space / None
basementFeaturesarrayFinished / Walk-out / Separate Entrance etc.
heatingTypestringForced Air / Baseboard / Heat Pump / Radiant
heatingFuelstringNatural Gas / Electric / Oil / Propane / Wood
coolingTypestringCentral Air / Wall Unit / None
exteriorFinishstringBrick / Vinyl / Stucco / Wood / Stone
roofTypestringAsphalt Shingle / Metal / Tile
flooringTypestringHardwood / Carpet / Tile / Laminate / Vinyl
poolTypestringInground / Above Ground / None
waterSourcestringMunicipal / Well / Lake
sewerstringMunicipal / Septic
zoningDescriptionstringZoning text
fireplacePresentbooleanWhether the property has a fireplace
viewTypestringWater / Mountain / City etc.
waterfrontNamestringAdjacent water body name
featuresarrayProperty features / amenities
appliancesarrayIncluded appliances

Location

FieldTypeDescription
addressLinestringStreet address
citystringCity
provincestringProvince code (ON, QC, BC, AB, MB, SK, NS, NB, NL, PE, YT, NT, NU)
postalCodestringCanadian postal code (A1A 1A1)
latitudenumberLatitude
longitudenumberLongitude
communityNamestringCommunity / subdivision name
neighbourhoodstringNeighbourhood name
locationDescriptionstringCross-streets / directions

Financials

FieldTypeDescription
taxAnnualAmountnumberAnnual property tax in CAD
taxYearintegerTax assessment year
taxToPricenumberAnnual tax ÷ price (precomputed)
condoFeeMonthlynumberMonthly condo / strata / maintenance fee in CAD
condoFeeIncludesarrayWhat the condo fee covers (heat, water, parking, common elements)
associationFeenumberHOA-style association fee if present

Listing lifecycle & media

FieldTypeDescription
listingDatestringDate the listing was published
lastUpdatedstringDate last modified
daysOnMarketintegerDOM (reserved for future versions — requires cross-run state)
hasOpenHousebooleanWhether an open house is scheduled
openHousesarrayScheduled open house dates / times
photoCountintegerNumber of photos
thumbnailUrlstringPrimary photo URL
photosarrayAll photo URLs
virtualTourUrlstring3D / virtual tour link
videoUrlstringVideo link
publicRemarksstringPublic listing description
descriptionLangstringen or fr

Agent fields

FieldTypeDescription
agentNamestringREALTOR name
agentIdstringRealtor.ca agent ID
agentUrlstringAgent profile URL
agentPhonestringContact phone
agentEmailstringAlways null — Realtor.ca hides agent emails behind a contact form (use agentPhone / agentWebsite)
agentWebsitestringPersonal website
agentPhotostringPhoto URL
agentBiostringAgent biography (profile modes)
agentDesignationsarrayProfessional designations / certifications
agentLanguagesarrayLanguages spoken
agentServiceAreasarrayGeographic service areas (agent-profile mode)
agentSpecializationsarrayResidential / Commercial / Luxury / Rural
currentListingCountintegerAgent's active listing count (agent-profile mode)

Office / brokerage fields

FieldTypeDescription
officeNamestringBrokerage / office name
officeIdstringRealtor.ca office firm ID
officeUrlstringOffice profile URL
officeAddressstringBrokerage address
officePhonestringBrokerage phone
officeWebsitestringBrokerage website
officeEmailstringAlways null — not published by Realtor.ca (use officePhone / officeWebsite)
brokerageFranchisestringParent franchise (RE/MAX, Royal LePage, Century 21, Sutton, Coldwell Banker, eXp Realty, Engel & Völkers, Sotheby's, HomeLife, and more; null if independent/unknown)
officeAgentCountintegerNumber of agents at the office (office-profile mode)
officeListingCountintegerActive listings at the office (office-profile mode)

Intelligence fields (reserved)

FieldTypeNotes
firstSeenAt, priceHistory, priceChanged, priceReduced, changePercent, hpiBenchmark, deviationVsHPI, marketCondition, estimatedStatusvariousReserved for a future version that tracks state across runs and joins to CREA MLS HPI benchmarks. Present in the schema for forward-compatibility; emitted as null in v1.

Example: Toronto condo for-sale listing

{
"recordType": "listing",
"mlsNumber": "C8123450",
"listingId": "27345610",
"source": "realtor.ca",
"mode": "search-area",
"listingUrl": "https://www.realtor.ca/real-estate/27345610/210-1080-bay-st-toronto",
"transactionType": "For Sale",
"status": "active",
"priceRaw": "$899,000",
"priceAmount": 899000,
"priceCurrency": "CAD",
"priceFrequency": null,
"pricePerSqft": 1199,
"propertyType": "Single Family",
"buildingType": "Apartment",
"ownershipType": "Condominium",
"bedroomsRaw": "2 + 0",
"bedroomsTotal": 2,
"bedroomsAbove": 2,
"bedroomsBelow": 0,
"bathroomsRaw": "2 + 0",
"bathroomsTotal": 2,
"bathroomsFull": 2,
"bathroomsHalf": 0,
"sizeInteriorRaw": "700 - 799 sqft",
"sizeInterior": 750,
"yearBuilt": 2015,
"parkingType": "Underground",
"parkingSpaces": 1,
"heatingType": "Forced Air",
"heatingFuel": "Natural Gas",
"coolingType": "Central Air",
"addressLine": "210 - 1080 Bay St",
"city": "Toronto",
"province": "ON",
"postalCode": "M5S 0A5",
"latitude": 43.6685,
"longitude": -79.3870,
"communityName": "Bay Street Corridor",
"neighbourhood": "Yorkville",
"taxAnnualAmount": 3420,
"taxYear": 2024,
"taxToPrice": 0.0038,
"condoFeeMonthly": 615,
"condoFeeIncludes": ["Heat", "Water", "Common Area Maintenance", "Building Insurance"],
"features": ["Concierge", "Gym", "Pool", "Visitor Parking"],
"appliances": ["Dishwasher", "Fridge", "Stove", "Washer", "Dryer"],
"listingDate": "2026-05-10",
"lastUpdated": "2026-05-15",
"photoCount": 28,
"thumbnailUrl": "https://cdn.realtor.ca/listing/TS123/cdn/...",
"publicRemarks": "Bright south-facing 2-bed in the heart of Yorkville. Steps to the subway, U of T, and Bloor Street shopping. Building amenities include 24-hr concierge, gym, and indoor pool.",
"descriptionLang": "en",
"agentName": "Jane Doe",
"agentId": "2182401",
"agentPhone": "(416) 555-0199",
"agentEmail": null,
"officeName": "Royal LePage Signature Realty",
"officeId": "259003",
"brokerageFranchise": "Royal LePage",
"scrapedAt": "2026-05-16T14:30:00.000Z"
}

Example: Vancouver West End for-rent listing

{
"recordType": "listing",
"mlsNumber": "R2891234",
"source": "realtor.ca",
"mode": "map-bbox",
"transactionType": "For Rent",
"priceRaw": "$3,200 / Monthly",
"priceAmount": 3200,
"priceCurrency": "CAD",
"priceFrequency": "Monthly",
"propertyType": "Single Family",
"buildingType": "Apartment",
"ownershipType": "Strata",
"bedroomsTotal": 1,
"bathroomsTotal": 1,
"sizeInterior": 620,
"addressLine": "1205 - 1234 Davie St",
"city": "Vancouver",
"province": "BC",
"postalCode": "V6E 1N5",
"neighbourhood": "West End",
"descriptionLang": "en",
"officeName": "RE/MAX Crest Realty",
"brokerageFranchise": "RE/MAX",
"scrapedAt": "2026-05-16T14:30:00.000Z"
}

Example: Montreal Plateau French-language listing

{
"recordType": "listing",
"mlsNumber": "Q19876543",
"source": "realtor.ca",
"transactionType": "For Sale",
"priceAmount": 749000,
"priceCurrency": "CAD",
"propertyType": "Multi-Family",
"buildingType": "Triplex",
"ownershipType": "Freehold",
"bedroomsTotal": 6,
"bathroomsTotal": 3,
"addressLine": "4520 Rue Saint-Denis",
"city": "Montréal",
"province": "QC",
"postalCode": "H2J 2L4",
"neighbourhood": "Le Plateau-Mont-Royal",
"publicRemarks": "Magnifique triplex au cœur du Plateau. Trois logements rénovés avec revenus stables. Idéal pour propriétaire-occupant ou investisseur.",
"descriptionLang": "fr",
"scrapedAt": "2026-05-16T14:30:00.000Z"
}

Scrape Mode Reference

advancedMode selects how the actor finds listings. The default — cities — needs nothing but the dropdown; the rest are for power users who paste their own links, numbers, or a map box in the searchUrls / mapBoundingBox fields.

advancedModeInput shapeOutputWhen to use
cities (default)City slugs in the Cities / Markets dropdownlisting recordsThe easy path — pick Toronto, Vancouver, Montreal, Calgary… and go. Every city maps to a map-search box automatically.
search-areaRealtor.ca province/city result URLs in searchUrlslisting recordsPoint at a specific Realtor.ca area page URL you already have
map-bboxmapBoundingBox (lat/lng box)listing recordsPrecision geo-search — a single neighbourhood, school catchment, transit corridor, or investment zone
single-listingMLS numbers in searchUrls (e.g. X13126780)listing recordsRefresh a known watchlist of MLS numbers (CRM enrichment, alerting, comp pulls)
agent-profileAgent profile URLs (e.g. realtor.ca/agent/2182401/jane-doe)agent recordsRecruit top producers, build broker contact databases, audit competitor agents
office-profileOffice URLs (e.g. realtor.ca/office/firm/259003/royal-lepage-team)office recordsMap brokerage market share, audit franchise expansion, build M&A target lists

Property Type & Ownership Taxonomy

Property types

TypeTypical building types
Single FamilyHouse, Apartment, Row-Townhouse, Mobile Home
Multi-FamilyDuplex, Triplex, Fourplex, Apartment Building
Vacant LandLot, Acreage, Farm, Recreational
CommercialOffice, Retail, Industrial, Mixed-Use, Hospitality
BusinessBusiness-without-property listings

Ownership types (uniquely Canadian)

OwnershipWhere commonNotes
FreeholdDetached/semi-detached across CanadaOwner holds title to land and building
CondominiumON, AB, NS, NB, PE, MB, SK, NL, QCOwner holds title to unit + share of common elements
StrataBC, NT, YT, NUBC's equivalent of condominium (Strata Property Act)
Co-operativeON & QC (older buildings)Owner holds shares in a corporation that owns the building
LeaseholdFirst Nations land, military bases, some Toronto sitesTime-limited land lease (typically 99 years)
Life LeaseSenior housing across ON, MBRight to occupy for life; capital refunded on exit

🔁 Pagination & scale

The Realtor.ca scraper paginates automatically — you never manage pages or cursors yourself.

  • Every city you pick becomes a map search. The city's bounding box is split into a grid of cells (up to 16), and each cell is queried against PropertySearch_Post at 200 listings per page, advancing CurrentPage until the box is exhausted (it stops at the API's reported TotalPages, on an empty page, or when a page yields no new records).
  • Large areas are handled by the grid, so Realtor.ca's hard 200-results-per-query cap never silently truncates your results — the geography is subdivided until every cell fits under the cap.
  • De-duplication is built in. Listings are keyed on mlsNumber (falling back to the internal listing ID), so the same property is never emitted twice even when grid cells overlap or multiple cities share inventory.
  • You control scale with two inputs: maxItems (hard cap on total records across all cities/inputs; 0 = unlimited) and maxPages (pages per city/cell). Independent city searches run in a small worker pool (maxConcurrency, 2–4), so one slow IP never stalls the whole run.
  • Runs always finish cleanly. A soft deadline winds the run down a safety buffer before the platform timeout, flushing everything gathered so the run ends SUCCEEDED rather than being killed mid-page.

In practice a single metro returns hundreds to thousands of de-duplicated listings; multi-city runs scale linearly. Keep maxItems small (e.g. 50–100) for a near-free test, then raise it for a full sweep.


Use Cases

Canadian Prop-Tech & Real Estate SaaS

Prop-tech founders building Canadian-market apps (CRM, alerting, lead gen, AVM, mortgage prequal) use this dataset to:

  • Bootstrap an MVP listings index without negotiating CREA DDF / VOW access agreements (which require board membership and months of paperwork)
  • Power consumer-facing search UIs for niche audiences (luxury, off-grid, multigenerational, accessible housing) that the big portals underserve
  • Train AVM and price-prediction models on real Canadian inventory with full feature vectors (beds, baths, sqft, condo fees, taxes, neighbourhood)
  • Generate market reports segmented by city, neighbourhood, building age, ownership type
  • Build school-catchment, commute-time, or transit-overlay tools by joining listing coordinates to municipal open data
  • A/B test pricing strategies against live brokerage inventory

Investor & Portfolio Research

Canadian REITs, family offices, and individual buy-and-hold investors use Realtor.ca data to:

  • Screen multi-family inventory (duplex/triplex/fourplex) by price-per-door and cap rate proxies (using taxAnnualAmount and rental comps)
  • Track condo pipeline absorption in Toronto's CityPlace, Liberty Village, and Vancouver's Yaletown and Coal Harbour
  • Identify under-priced freehold inventory by computing $/sqft vs. neighbourhood median
  • Spot price reductions by rerunning the same search weekly and diffing
  • Build short-listing pipelines for property managers and acquisition teams
  • Score new-build vs resale spread to time entry into a market

Immigration & Relocation Buyer Intelligence

Newcomer-focused real-estate teams, relocation consultants, and immigration law firms use this dataset to:

  • Build neighbourhood guides for clients arriving on PR / work permit visas — cost-of-housing snapshots per family-size cohort
  • Generate "what your budget buys" reports in Toronto, Vancouver, Calgary, Montreal, Ottawa, Halifax, and Edmonton
  • Connect newcomers with multilingual agents by joining the dataset on agentLanguages (Mandarin, Punjabi, Tagalog, Spanish, Arabic, French, Portuguese, Russian)
  • Track rental availability by neighbourhood for short-term staging accommodations
  • Surface bilingual French/English inventory for clients relocating to Quebec or Acadian regions of NB

Brokerage Operations & Recruiting

Real-estate brokerages and team leaders use the agent + office endpoints to:

  • Recruit producing agents by filtering competitor offices by officeListingCount and agentSpecializations
  • Benchmark franchise market share (RE/MAX vs. Royal LePage vs. Century 21 vs. Sutton vs. EXP) per city
  • Audit team manager candidates by triangulating currentListingCount across years
  • Build poaching shortlists of top producers at competing offices
  • Monitor brokerage expansion as new offices open or franchise affiliations change
  • Generate competitive intelligence dashboards for franchise leadership

Mortgage Brokers & Lender Marketing

Mortgage brokers, lender BDM teams, and fintech underwriters use this dataset to:

  • Time outreach to new buyers by scraping fresh listings daily and contacting the listing agent within hours
  • Pre-screen properties for unconventional construction, leasehold land, or non-conforming basement units that affect lendability
  • Generate purchase-price-vs-tax-burden affordability reports for pre-approval marketing campaigns
  • Identify high-rise condo inventory in projects with known mortgage-insurance restrictions
  • Cross-sell HELOC and refinance offers to neighbourhoods showing high turnover and equity appreciation

REIT & Institutional Investor Research

Public Canadian REITs (CAPREIT, Boardwalk, InterRent, Killam, RioCan) and institutional investors use the actor for:

  • Acquisition pipeline scouting — every multi-family >5 unit listing in target metros
  • Tenant-base research — average asking rents per bedroom count per neighbourhood
  • Submarket cap-rate calibration — combining tax data with rent comps
  • Disposition timing — tracking when comparable buildings list and at what price
  • Board reporting with hard data on competing inventory

Valuation, Appraisal & Comp Research

Residential and commercial appraisers, AACI candidates, and mortgage default underwriters use this dataset to:

  • Pull active comps by lat/lng box, property type, beds/baths, and price range — bypassing slow MLS comp tools
  • Cross-check disclosed sale prices against initial list prices (when combined with historical archives)
  • Build neighbourhood adjustments grids with thousands of data points per quarter
  • Reverse-engineer condo building $/sqft trajectories for refinance and divorce appraisals
  • Support expert witness reports in expropriation and matrimonial property cases

Real Estate Journalism & Data Reporting

Newsrooms covering Canada's housing market — The Globe and Mail, Toronto Star, Vancouver Sun, La Presse, Le Devoir, CBC News, CTV, Global News, Daily Hive, blogTO — use the dataset to:

  • Cover housing affordability stories with current asking-price data per neighbourhood
  • Investigate foreign-buyer trends by tracking inventory and language fingerprints
  • Map "ghost listings" that vanish and reappear at higher prices
  • Produce annual market reports with metro-level $/sqft tables and YoY change
  • Visualize the rental crisis with current asking rents in every major city
  • Investigate brokerage misconduct by joining disciplined-agent registries to active listings

Government & Urban Planning Research

Municipal planning departments, CMHC researchers, provincial housing ministries, and academic urban-policy programs use Realtor.ca data for:

  • Measure supply elasticity — listing volume vs. price by neighbourhood quarter-over-quarter
  • Study missing-middle housing — duplex/triplex/fourplex availability in restrictive-zoning jurisdictions
  • Benchmark short-term-rental impact — sudden inventory drops in tourist neighbourhoods (Old Quebec, Banff, Tofino, Mont-Tremblant)
  • Quantify the rental-vs-ownership gap in priced-out metros (Vancouver, Toronto)
  • Inform zoning reform debates with hard data on what's actually for sale

M&A and Brokerage Investment Banking

Boutique investment banks advising on brokerage roll-ups and franchise acquisitions use the office-profile endpoint to:

  • Build target lists of independent brokerages with N+ agents in target metros
  • Quantify pipeline — total active listings × estimated commission × split ratios
  • Score franchise vs. independent market share trajectories
  • Identify succession candidates at brokerages whose principals appear in retirement age cohorts

Sample Queries & Recipes

Recipe 1: All for-sale Toronto condos under $700K — first-time buyer feed

{
"cities": ["toronto"],
"transactionType": "for-sale",
"propertyTypeGroup": "residential",
"priceMax": 700000,
"bedroomsMin": 1,
"fetchDetails": true,
"maxItems": 1000
}

Then filter downstream for buildingType === "Apartment" to isolate condos.

Recipe 2: Vancouver West End rental inventory — landlord-rep CMA pull

{
"advancedMode": "map-bbox",
"mapBoundingBox": {
"latMin": 49.275,
"latMax": 49.295,
"lngMin": -123.150,
"lngMax": -123.120
},
"transactionType": "for-rent",
"language": "en",
"fetchDetails": true
}

Recipe 3: Montreal French-language triplex investor target list

{
"cities": ["montreal"],
"transactionType": "for-sale",
"propertyTypeGroup": "residential",
"bedroomsMin": 5,
"language": "fr",
"fetchDetails": true,
"maxItems": 300
}

Then filter downstream for buildingType === "Triplex".

Recipe 4: Calgary new listings in the last 7 days — buyer alert feed

{
"cities": ["calgary"],
"transactionType": "for-sale",
"newListingsOnlyDays": 7,
"fetchDetails": true
}

Recipe 5: Refresh a watchlist of specific MLS numbers — CRM enrichment

{
"advancedMode": "single-listing",
"searchUrls": [
"X8234567", "W8123450", "C8765432", "E8111111", "N8222222"
],
"fetchDetails": true,
"fetchAgentProfiles": true,
"fetchOfficeProfiles": true
}

Recipe 6: A specific brokerage office — agent recruiting research

{
"advancedMode": "office-profile",
"searchUrls": [
"https://www.realtor.ca/office/firm/259003/re-max-crest-realty-vancouver"
]
}

Recipe 7: Ottawa Westboro single-family $800K-$1.5M with parking and basement — relocation buyer brief

{
"advancedMode": "map-bbox",
"mapBoundingBox": {
"latMin": 45.385,
"latMax": 45.405,
"lngMin": -75.760,
"lngMax": -75.730
},
"transactionType": "for-sale",
"priceMin": 800000,
"priceMax": 1500000,
"bedroomsMin": 3,
"bathroomsMin": 2,
"fetchDetails": true,
"fetchAgentProfiles": true
}

Integration Examples

Google Sheets

Schedule the actor daily in Apify (the built-in Scheduler accepts any cron expression), add the Apify → Google Sheets integration on the schedule, and a fresh Realtor.ca inventory sheet lands in your Drive every morning. Add conditional formatting to flag priceReduced rows (once you start diffing against your own historical snapshots).

Make.com / Zapier / n8n

The official Apify connectors on Make, Zapier, and n8n let you trigger downstream workflows on every actor run. Common automations:

  • New listings in a saved geography → Slack alert in #new-toronto-inventory
  • Listings with priceFrequency === "Monthly" and a target neighbourhood → push to a rental CRM as fresh leads
  • Agent-profile records with email + currentListingCount > 20 → enqueue into an Outreach.io recruiting sequence
  • Listings with condoFeeMonthly > 1000 → tag as "high-fee" in HubSpot for client warning

Power BI, Tableau, Looker, Metabase

Use Apify's REST API as a connected data source and refresh on schedule. Out-of-the-box dashboards:

  • Median ask $/sqft by neighbourhood quarter-over-quarter
  • Inventory by ownership type per metro
  • Brokerage franchise market share by city
  • Bilingual inventory share in Quebec / Ottawa / Moncton
  • Year-built distribution per neighbourhood (heritage / mid-century / new-build)

Postgres / Snowflake / BigQuery

Configure an Apify webhook on the ACTOR.RUN.SUCCEEDED event pointing at your warehouse ingestion endpoint. The flat schema deserializes cleanly into a listings table keyed on mlsNumber, with agents and offices as side tables. Run the actor multiple times per day to build a slowly-changing-dimension history of asking-price moves.

Salesforce / HubSpot / Pipedrive CRM enrichment

Trigger an Apify run hourly during business hours, upsert listing records on mlsNumber and agent records on agentId. Status changes (active → withdrawn → relisted) and price drops can auto-create Tasks for agents or Cases for sales managers. Brokerage records become Accounts; agents become Contacts hierarchically linked to their Office.

Slack & Microsoft Teams alerts

Use the Apify Slack integration to post new-listing alerts directly to channels — #toronto-luxury, #vancouver-investor, #calgary-acreage, #halifax-relocations — formatted with thumbnail, price, address, and a clickable Realtor.ca link.


Major Canadian Markets at a Glance

MetroProvincePopulation (CMA)Realtor.ca Coverage Notes
Toronto (GTA)ON~6.7MHighest listing volume nationwide; Yorkville, Liberty Village, Etobicoke, Scarborough, North York, Vaughan, Mississauga, Markham, Oakville, Burlington
MontrealQC~4.4MBilingual (FR-dominant) inventory; Plateau-Mont-Royal, Westmount, Outremont, NDG, Mile End, Old Montreal, Laval, Longueuil
VancouverBC~2.7MStrata ownership dominates; West End, Yaletown, Kitsilano, Coal Harbour, Mount Pleasant, Burnaby, Richmond, North Vancouver, Surrey
CalgaryAB~1.6MStrong detached + acreage market; Beltline, Mission, Inglewood, Kensington, Bridgeland, plus rural foothills inventory
EdmontonAB~1.5MOlder detached stock + new-build sprawl; Oliver, Whyte Avenue, Glenora, Westmount, Sherwood Park
OttawaON~1.5MBilingual; Westboro, Glebe, Hintonburg, Centretown, Manor Park, plus Gatineau (QC) cross-river inventory
Quebec CityQC~0.85MPredominantly FR; Old Quebec, Saint-Roch, Limoilou, Sainte-Foy
WinnipegMB~0.85MAffordable detached + character home stock; Wolseley, Crescentwood, St. Boniface, Osborne Village
HamiltonON~0.8MGTA-adjacent affordability story; Westdale, Durand, Ainslie Wood
HalifaxNS~0.5MEast coast capital; South End, North End, Bedford, Dartmouth, Spryfield
VictoriaBC~0.4MPremium island market; Oak Bay, Fairfield, James Bay, Saanich
St. John'sNL~0.21MCoastal heritage stock
Whitehorse / YellowknifeYT / NTsmallSparse but covered — useful for resource-sector relocations

The actor handles all 10 provinces and 3 territories. There is no built-in cap on geography — you control scope through searchUrls and mapBoundingBox.


Cost & Performance

MetricValue
EngineHTTP via got-scraping + Cheerio (no headless browser)
Runtime (100 listings, search-area)3-6 minutes (governed by 1500ms delay + concurrency 2)
Runtime (1000 listings, search-area, fetchDetails on)30-60 minutes
Runtime (single MLS lookup)5-15 seconds
Cost per runVaries with item count — pay-per-event pricing
Pricing modelPay-per-event (transparent per-record billing)
Data freshnessLive at run time — same data Realtor.ca serves to a browser
Auth requiredNone
Proxy requiredYes — Apify Proxy, RESIDENTIAL group, country CA
Concurrency2 default, 4 max — Realtor.ca throttles above
Memory footprint256 MB baseline; 1024 MB safe for thousand-listing runs with fetchDetails: true

  • Public data only — every field this actor extracts is publicly visible to anyone browsing realtor.ca without an account
  • No PII beyond what listings already publish — agent name, brokerage phone, and listing address are public marketing data; no SIN, no date-of-birth, no banking
  • No buyer / tenant data — Realtor.ca does not expose buyer or tenant identities and this actor cannot retrieve them
  • CREA's MLS®, Multiple Listing Service®, and REALTOR® trademarks remain property of CREA — use of scraped data must respect trademark guidelines
  • CREA Terms of Use prohibit republishing the full database; this actor is intended for internal analytics, lead generation, research, journalism, and CRM enrichment — not for building a competing public listings portal
  • Robots.txt — Realtor.ca's robots.txt restricts crawling certain endpoints; the actor's request patterns (low concurrency, residential IPs, conservative rate) emulate a human browsing session
  • GDPR / PIPEDA / Quebec Law 25 — agent contact data falls under business-card-exemption guidance in most cases; consult counsel before bulk outreach
  • CASL (Canadian Anti-Spam Law) — bulk email outreach to scraped agent addresses requires CASL-compliant consent and unsubscribe handling
  • Provincial real-estate Acts (RECO ON, RECA AB, RECBC BC, OACIQ QC, NSREC NS, etc.) regulate how MLS data may be republished by licensed brokerages

Important: This actor is a tool. You are responsible for the lawful use of its output. Do not use Realtor.ca data for unlawful contact, harassment, stalking, fraud, or to mislead consumers about agent affiliations.


Frequently Asked Questions

How fresh is the data?

Live at run time. Realtor.ca does not publish a downloadable dataset — the actor pulls the same JSON that powers realtor.ca in your browser, at the moment your run executes. Schedule it hourly, daily, or weekly to maintain a rolling snapshot.

How many listings will I get per run?

Depends on geography and filters. A single city from the dropdown with no filters can return thousands of listings (each city's bounding box is grid-split and paginated 200 at a time); picking several cities multiplies that, and a tight map-bbox over one neighbourhood returns hundreds. The actor honours maxItems and maxPages to cap your run — set a small maxItems for a fast, cheap test and raise it for a full sweep.

Does this actor require a Realtor.ca login?

No. Realtor.ca is publicly browseable and this actor uses the same public endpoints a logged-out user would hit. You only need an Apify account.

Why is residential proxy required?

Realtor.ca sits behind Imperva Incapsula, which gates primarily on IP reputation. Datacenter IP ranges (AWS, GCP, Azure, DigitalOcean, OVH) are challenged/blocked within a few requests. Canadian residential IPs from Apify Proxy emulate a real consumer browsing pattern and pass; when one is flagged, the actor rotates to a fresh residential IP and retries.

Can I run this on the Apify Free Plan?

Yes — small runs work on the Free tier. Realistic production usage (thousands of listings/day with residential proxy) requires a paid Apify plan to cover Proxy and Compute Unit costs.

Can I scrape sold or expired listings?

Realtor.ca only exposes active listings publicly. Sold inference (status: sold, daysOnMarket, priceHistory) requires cross-run state and is reserved for a future version of this actor — the schema fields are present for forward-compatibility.

Does the actor handle French-language listings?

Yes. Quebec inventory is predominantly French; the actor sets descriptionLang: "fr" so you can route Quebec records to French NLP pipelines. Filter at extraction time with language: "fr", language: "en", or keep both with language: "both" (default).

What's the difference between Freehold, Condominium, and Strata?

Freehold means you own the land and building outright (typical of detached houses). Condominium is the term used outside BC for shared-ownership multi-unit buildings (you own the unit + a share of common elements). Strata is BC's equivalent term (BC's Strata Property Act). The actor preserves the exact term Realtor.ca uses.

Why is bedroom count in "X + Y" format?

This is a uniquely Canadian convention: above-ground bedrooms + basement bedrooms. A "3 + 1" listing has 3 main-floor bedrooms and 1 basement bedroom (often non-conforming). The actor decodes this into bedroomsAbove, bedroomsBelow, and bedroomsTotal so downstream code can treat them separately if needed.

Are agent emails included?

No — Realtor.ca does not publish agent emails. The site hides them behind an "Email a REALTOR®" contact form, and the underlying API only carries internal contact IDs, not real addresses. So agentEmail is always null. What you do get for the listing agent is agentName, agentPhone, agentWebsite, agentPhoto, agentDesignations, and agentLanguages; the brokerage carries officeName, officePhone, officeWebsite, and brokerageFranchise. Phone and website are the reliable outreach channels.

Can I scrape commercial listings?

Yes. Set propertyTypeGroup: "commercial" and Realtor.ca will return office, retail, industrial, mixed-use, hospitality, and business-for-sale inventory.

How do I scrape only luxury listings?

Use the priceMin filter (e.g. priceMin: 3000000 for $3M+ in Toronto / Vancouver, priceMin: 1500000 for most other metros) combined with the city dropdown. For a specific luxury pocket (Yorkville, Forest Hill, Westmount, West Vancouver, Rosedale), switch advancedMode to map-bbox and draw a tight bounding box around the neighbourhood.

How do I avoid blocks?

Stick to the defaults: maxConcurrency: 2, requestDelay: 1500, proxyConfiguration set to CA residential. If you start seeing 403/429s, increase the delay to 2500-3000 and lower concurrency to 1.

Can I run multiple parallel jobs?

Yes, but each parallel run draws from the same residential proxy pool. Spreading jobs across geographies (one Toronto, one Vancouver, one Montreal) is safer than running 3 parallel jobs against the same city.

Does this scrape realtor.com (US)?

No — realtor.com is a different site for US inventory. This Realtor.ca scraper targets realtor.ca (Canada) exclusively. For other markets, see the Related scrapers section below.

Can I get historical price data for a listing?

V1 returns the current asking price. Building a historical price archive requires running the actor on a schedule and storing each snapshot — Apify retains dataset history indefinitely on most plans, and a planned v2 will surface priceHistory directly.

What if Realtor.ca changes their API structure?

The actor includes a debugMode flag that dumps API request/response shapes for troubleshooting. Schema breaks are typically patched within hours — open an issue on the Apify Store actor page and the developer will push a fix.

What export formats are supported?

Apify supports JSON, CSV, Excel (XLSX), HTML, XML, RSS, and JSON-Lines streaming — all from the Dataset tab or REST API.

Can I schedule it?

Yes — Apify's built-in Scheduler accepts any cron expression. Common patterns: hourly for active watchlists, every 6 hours for metro snapshots, daily for full provincial sweeps.

How is pay-per-event pricing better than a monthly subscription?

You pay only for the records you actually pull. Stop running and your bill stops. Sample with maxItems: 50 for pennies before committing to a full sweep — see the dedicated pricing section below.


If you need real-estate or classified data from other markets, these sibling actors are built on the same engineering foundation — deep schemas, auto-pagination, and a one-row-per-listing output you can drop straight into a warehouse:


Comparison vs. Alternatives

ApproachSetup timeAnti-bot bypassSchema normalizationBilingual EN/FRAgent + Office joinCost (1K listings)
This actor< 5 minutesBuilt-in (CA residential + fresh-IP rotation)Built-in (X+Y decode, CAD, taxonomies)YesYesPay-per-event, transparent
CREA DDF / VOW data feedWeeks (board membership required)N/ADIYYesYes (separate feeds)Board dues + dev cost
Custom Playwright script1-3 weeksDIY (Imperva is hard)DIYDIYDIYFree + infra + ongoing maintenance
Manual copy-pasteHours per runN/ANoneManualNoneFree + brutal labour
Generic web scraping APIsHoursOften blockedNoneNoNo$50-500+/mo

Why Pay-Per-Event Pricing?

Most data tools either bill a flat monthly subscription (you pay even when you're not running anything) or per Compute Unit (unpredictable). This actor uses pay-per-event pricing, which means:

  • You pay only when the actor runs and only for the records it returns
  • Costs scale with actual usage — sample 50 records for pennies before committing to a full sweep
  • No monthly minimums, no annual contracts, no "seat" fees
  • Transparent line-item billing inside the Apify Console
  • Free to evaluate — set maxItems: 20 and the run costs effectively nothing

Changelog

VersionDateNotes
1.0.02026-05Initial public release — 5 modes (search-area / map-bbox / single-listing / agent-profile / office-profile), HTTP + Cheerio engine, CA residential proxy, X+Y bed/bath decode, EN/FR detection, agent + office enrichment, pay-per-event pricing

Keywords

Realtor.ca scraper · MLS Canada data · Realtor.ca API alternative · Toronto Vancouver MLS scraper · Canadian real estate data · CREA MLS data scraper · Canada home price data · Realtor.ca listings extractor · Realtor.ca data API · Canada MLS scraper · CREA REALTOR data · Canadian property data extraction · Realtor.ca for sale scraper · Realtor.ca for rent scraper · Toronto condo data · Vancouver real estate scraper · Montreal property data · Calgary MLS scraper · Ottawa real estate data · Edmonton property listings · Halifax MLS data · Quebec City real estate data · Winnipeg property scraper · Yorkville condo listings · Liberty Village real estate · Etobicoke MLS data · West End Vancouver rentals · Yaletown condo prices · Kitsilano home prices · Plateau Montreal triplex data · Westmount luxury real estate · Canadian brokerage market share · Royal LePage agent data · RE/MAX office data · Century 21 brokerage scraper · CREA agent profiles · Canadian property tax data · Canadian condo fee data · Canada freehold strata leasehold data · Apify Realtor.ca actor · Canadian PR newcomer housing data · CMHC research data · Canadian REIT acquisition research · Canadian mortgage broker leads · MLS comparable sales data · bilingual EN FR Canadian real estate · Canadian real estate journalism data


Support

  • Bug reports: Use the Issues tab on the Apify Store actor page
  • Feature requests: Same place — please describe your use case, target geography, and expected output
  • Direct contact: Through the Apify developer profile messaging
  • Schema breaks: If Realtor.ca changes its API or HTML, open an issue with a debugMode: true run log — patches are typically shipped within hours

If this actor saves you time, a 5-star rating on the Apify Store helps other Canadian real-estate, prop-tech, and investor research teams discover it. Thank you!

📅 Changelog & Maintenance

Last updated: 2026-07-02 — Actor verified and maintained. Data pipeline tested for quality, structure and freshness; selectors/endpoints confirmed against the live site.