Realtor.ca Scraper - Canadian MLS Listings
Pricing
from $2.20 / 1,000 results
Realtor.ca Scraper - Canadian MLS Listings
Scrape Realtor.ca Canadian MLS listings by city. Extract for-sale and rental prices, beds, baths, sqft, MLS numbers, agents, and photos. A Realtor.ca / CREA API alternative for Excel, CSV, or JSON.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
19 hours ago
Last modified
Categories
Share
Realtor.ca Scraper — Canadian MLS Listings
Scrape Realtor.ca for-sale and rental listings by Canadian city — then download structured MLS data as Excel, CSV, or JSON.
This Actor is a practical Realtor.ca / CREA API alternative for market research, investor screening, rental comps, and lead lists. Enter a city such as Toronto, ON, choose For sale, For rent, or Both, and get listing rows with MLS numbers, prices, beds, baths, size, agents, photos, and addresses.
- Pull Canadian homes for sale and rentals from Realtor.ca
- Resolve cities to map bounding boxes, then call CREA
PropertySearch_Post - Optionally enrich with PropertyDetails (remarks, extra photos, extra agent/office phones)
- Extract outreach-ready lead fields (
phones,addressincluding unit/门牌,person,org,web) - Filter by CAD price range — or paste a realtor.ca city URL
- Export to Excel / CSV / JSON, or connect Make, n8n, Zapier, Python, or MCP
- Pay per event — Actor start + each Dataset listing; no subscription
Worker URL is config, not code: the Actor reads
WORKER_BASE_URLfrom Actor environment variables (plus optional per-runworkerBaseUrl). If you migrate the worker to a new host, updateWORKER_BASE_URL(andWORKER_AUTHif the API key changes) in Apify Console — no Actor code change required. SetWORKER_PROVIDES_PROXY=1when the worker supplies its ownPROXY_URL.
Free Apify plan limits (set by this Actor's developer)
| Limit | Free Apify plan | Paid Apify plan |
|---|---|---|
| Runs of this Actor | 10 total | Unlimited |
| Results per run | Up to 200 (maxResults) | Up to schema max (200) |
These limits are set by the Actor developer, not Apify. Hitting the run cap finishes with a clear status message — it is not a platform bug. Upgrade to a paid Apify plan for unlimited runs.
Need a dedicated scraper for one website?
This Actor is the general tool for protected public pages. If you already have one specific site and a field list, a dedicated scraper is faster and more stable: listing + detail, your export format, delivered to your Apify account or as a standalone runnable client.
I confirm the tier before you pay. The clock starts after that confirmation.
Start here: Submit a custom scraper request
| Starter $50 | Dedicated $100 | Hard target $200–999 | |
|---|---|---|---|
| Site | 1 simple anti-bot public site | 1 medium anti-bot public site | Cloudflare / aggressive anti-bot / custom parser |
| Scope | Full listing + detail fields | Listing + detail + pagination, your field list | Agreed fields, repeatable runs |
| Delivery | CSV/JSON · Apify Actor or standalone runnable client (script/CLI) | Same, plus a sample run and short instructions | Feasibility first, then build |
| Time | 24 hours after we confirm the URL is in scope | 48 hours after confirmation | Quoted after feasibility |
| Fixes | 30 days for small public-layout changes | 30 days | Scoped in the quote |
Hard-target sites are not a 100% uptime promise. You get a dedicated parser that can be re-run on the agreed fields. If the URL is not feasible, you get a refund or pay an assessment fee only — you will know before the build starts.
Not in Starter/Dedicated: login-walled data, native APK / Windows installer / full web apps, or two-year maintenance. Those are a separate quote.
What does the Realtor.ca Scraper do?
It turns a Canadian city search on Realtor.ca into a clean Apify Dataset of MLS listings.
Under the hood, this thin Actor:
- Validates input and mints an Apify Canadian RESIDENTIAL sticky
proxyUrl - Calls the hosted Cloud Run scrape worker over HTTPS + API key
- The worker resolves your city bbox, warms a stealth browser on Realtor.ca (Imperva-aware), and calls CREA
PropertySearch_Post/PropertyDetailsfrom page context - Pushes normalized Dataset rows (same field names as before:
country=CA,source=realtor.ca, MLS fields,scrapedAt, …)
When WORKER_PROVIDES_PROXY is unset, Apify Canadian RESIDENTIAL proxy (country CA) is minted and passed to the worker. With WORKER_PROVIDES_PROXY=1, the worker uses its own PROXY_URL instead.
What data can you extract from Realtor.ca?
| Data point | For sale | For rent |
|---|---|---|
| Address / listing name | ✅ | ✅ |
| MLS number & listing ID | ✅ | ✅ |
| List price or rent (CAD) | ✅ | ✅ |
| Beds / baths / size | ✅ | ✅ |
| Property type & ownership | ✅ | ✅ |
| GPS coordinates | ✅ | ✅ |
| Listing URL & main image | ✅ | ✅ |
| Agent / office | ✅ | ✅ |
| Agent / office phones | ✅ | ✅ |
| Time on Realtor.ca | ✅ | ✅ |
| Public remarks (when enriched) | ✅ | ✅ |
Every Dataset row also includes scrapedAt, country = CA, and source = realtor.ca. A RUN_SUMMARY record in the key-value store reports counts and warnings.
Lead / Contact fields
Every Dataset row carries a normalized lead block (phones, emails, address, geo, person, org, web, leadSource, leadReveal, leadAbsences) in addition to the MLS fields above. Keys are always present. A missing sub-field is explained in leadAbsences rather than silently omitted.
| Field | Type | Meaning on Realtor.ca |
|---|---|---|
phones | [{value, type, e164?}] | Agent Telephone / Mobile / Fax / Toll Free from CREA Individual[].Phones[] and Organization.Phones[] (AreaCode + PhoneNumber, e.g. 905-673-1212, 226-929-5512). SEO listing cards do not show a phone. Search items still often carry phones because the worker reads CREA PropertySearch_Post (acceptance run 42umn7jWw1kBUuWFb search item included 905-220-7755 / 289-644-1111). Already-visible JSON — no click-reveal. |
emails | [{value, type}] | Per-listing contact email. Realtor.ca does not publish plaintext emails. CREA Emails[] is ContactId only (numeric id such as 578540770). The on-page Email button is a Gigya lead form (href="#"), not mailto:. Search payloads have no email field. |
address | {street, unit, locality, region, postalCode, country, full} | Listing address from Address.AddressText (pipe-delimited). unit = 门牌 / unit (e.g. 1807 from 1807 - 1926 LAKE SHORE BOULEVARD W; 608 from 40 HARRISFORD Street Unit# 608). street is the street line, locality city, region province code (ON), postalCode Canadian postal, country = CA, full assembled display string. Already-visible on SEO cards and in CREA JSON. |
geo | {lat, lng} | Listing coordinates from Address.Latitude / Address.Longitude (and LDP ListingModel). Complements the street address; it does not replace it. Example: 43.6360788, -79.467159. |
person | {name, role?} | Listing agent. Search PropertySearch_Post often includes Individual.Name + Position (e.g. BRITTNEY KOOY / Salesperson). Detail / PropertyDetails adds the same plus extra office phones. SEO cards typically show brokerage name only. |
org | {name, id?} | Brokerage / office from Organization.Name + OrganizationID (e.g. RE/MAX PARAMOUNT REALTY / 285750, Keller Williams Complete Realty / 275238). Visible on SEO cards and in CREA JSON. |
web | {website, socials[]} | Brokerage website from Organization.Websites[] when PropertyDetails (or a search payload that already includes it) returns one (e.g. https://www.kwcomplete.com/, http://www.remaxparamount.com/). Per-agent / per-brokerage social profiles are not published. |
leadSource | enum | Surface that produced the lead: search (CREA PropertySearch_Post stub) | detail (PropertyDetails / LDP enrich) | entity | contact | reveal-xhr. Default Actor path emits search and detail. |
leadReveal | enum | How the lead was obtained: visible (already in CREA JSON / DOM) | click | xhr | gated | image | absent. Realtor.ca phones / address / person / org are visible. Email is gated (see leadAbsences), not click-revealed. |
leadAbsences | object/map | Reason each missing sub-field is absent: 本站无 (site never provides it on that surface), 闸门锁 (Gigya / lead-form wall), 未验证 (not confirmed). Example detail item: {"emails":"闸门锁","socials":"本站无"}. Example search item with phones present: {"emails":"本站无","web":"本站无","socials":"本站无"}. |
Sample search item (leadSource=search) from acceptance run 42umn7jWw1kBUuWFb — phones already present via PropertySearch_Post, not from the SEO card HTML:
{"phones": [{ "value": "905-220-7755", "type": "Telephone", "e164": "+19052207755" },{ "value": "289-644-1111", "type": "Telephone", "e164": "+12896441111" }],"emails": [],"address": {"street": "1334 UPPER PARADISE ROAD","unit": null,"locality": "Hamilton","region": "ON","postalCode": "L9B 0C3","country": "CA","full": "1334 UPPER PARADISE ROAD, Hamilton (Carpenter), Ontario L9B0C3"},"geo": { "lat": 43.2051493, "lng": -79.9211255 },"person": { "name": "BRITTNEY KOOY", "role": "Salesperson" },"org": { "name": "RE/MAX HALLMARK REALTY LTD.", "id": "257818" },"web": { "website": null, "socials": [] },"leadSource": "search","leadReveal": "visible","leadAbsences": { "emails": "本站无", "web": "本站无", "socials": "本站无" }}
Sample detail / enrich item (leadSource=detail, enrichDetails=true):
{"phones": [{ "value": "226-929-5512", "type": "Telephone", "e164": "+12269295512" },{ "value": "905-308-8333", "type": "Telephone", "e164": "+19053088333" }],"emails": [],"address": {"street": "40 HARRISFORD Street Unit","unit": "608","locality": "Hamilton","region": "ON","postalCode": "L8K 6N1","country": "CA","full": "40 HARRISFORD Street Unit# 608, Hamilton, Ontario L8K6N1"},"geo": { "lat": 43.21717213, "lng": -79.79510971 },"person": { "name": "Callum McGregor", "role": "Salesperson" },"org": { "name": "Keller Williams Complete Realty", "id": "275238" },"web": { "website": "https://www.kwcomplete.com/", "socials": [] },"leadSource": "detail","leadReveal": "visible","leadAbsences": { "emails": "闸门锁", "socials": "本站无" }}
Reveal cost
Realtor.ca does not use a "show phone / show email" click-reveal. Phones, address, geo, agent name, and brokerage are already in CREA JSON after the Imperva-warmed page-context call.
- Search (
PropertySearch_Post): one map-bbox search request (paginated,MaxRecords~500) already returnsIndividual.Phoneson most listings. Opening the SEO card HTML is not required for phones. No extra reveal XHR. - Detail (
PropertyDetails,enrichDetailsdefaulttrue): one extra GET per listing (concurrency 1–4). This is the main time/proxy cost. It adds remarks, extra photos, extra office Fax / Toll Free numbers, andOrganization.Websites[]. It does not unlock email. - Email: there is no reveal path. The Email button opens a Gigya lead form. This Actor does not submit that form, so
emailsstays[]. - Agent / brokerage profile pages also show phones already-visible (JSON-LD + DOM). The default Actor path does not need those extra page loads for listing leads.
- Rate-limit / proxy impact: Canadian residential proxy is required to pass Cloudflare / Imperva. Reveal itself adds no extra clicks. Run duration scales with
maxResults×detailConcurrencyPropertyDetails fetches, not with phone reveals.
Honest limitations
The following lead sub-fields are not available (or not on every surface) and are reported in leadAbsences. This Actor does not invent ContactId emails, submit Gigya forms, or log in.
| Sub-field | Surface | Reason | leadAbsences value |
|---|---|---|---|
emails | Detail / LDP / Agent / Brokerage | CREA Emails[] is ContactId only; DOM Email is a Gigya lead form, not mailto: | 闸门锁 |
emails | Search stub | Search payload has no email field | 本站无 |
web.socials | All listing / agent / office pages | No per-agent or per-brokerage Facebook / Instagram / LinkedIn / X links | 本站无 |
web.website | Some search stubs | Brokerage website usually arrives on PropertyDetails Organization.Websites[], not on every search card | 本站无 when the search payload has none |
| SEO-card phone (HTML only) | SEO city landing cards | The public .listingCard HTML does not print a phone. The worker still emits phones when CREA PropertySearch_Post includes Individual.Phones | not an absence — do not document search phones as 本站无 |
phones / person | Rare search stubs with no Individual | If CREA omits the agent block, keys stay empty and leadAbsences records 本站无 for that search item | 本站无 |
| Rent / other metros / FR | Rent SRP, Vancouver / Calgary / Montreal / FR | Same CREA template expected; not separately opened during research | 未验证 only if a sub-field is actually missing on that item |
Platform /contact-us addresses and CREA corporate contacts are not copied onto listing rows.
What you can do with it
1. Scrape Canadian homes for sale in a metro
Enter a city like Toronto, ON, set listing type to For sale, and get structured rows with MLS number, price, beds, baths, size, agent, and a direct listing URL — ready for comps or investor shortlists.
2. Scrape Canadian rentals
Set listing type to For rent. Rows include rent/price display, beds/baths, size, and agent/office when present.
3. Cover sale and rent in one run
Set listingType to both. maxResults is split across sale and rent when both are selected.
4. Feed Canadian MLS data into automations
Schedule the Actor and send the Dataset to Sheets, Slack, CRM, Make, n8n, Zapier, or an AI agent via Apify MCP / API.
More Actors like this
Need US Realtor.com, Zillow, other country portals, or a different vertical? Use a dedicated Actor below for structured fields. Stay on Realtor.ca Scraper for Canadian MLS for-sale and rental listings.
Similar real estate scrapers
- Realtor.com Scraper
- Realtor.com Agents Scraper
- Zillow & Zumper Scraper
- Zillow Group Scraper
- Apartments.com Rental Scraper
- Rightmove Scraper
- Idealista Scraper
- realestate.com.au Scraper
- PropertyGuru Scraper
- Funda Scraper
- ImmoScout24 Scraper
- Bayut Scraper
Prefer another specialized scraper?
If your target has a specialized Actor below, use that first — usually cheaper and more structured than a generic scrape.
Jobs & Freelance
- LinkedIn Jobs Scraper
- Indeed Jobs Scraper
- Upwork Jobs Scraper
- Glassdoor Scraper
- Fiverr Gigs Scraper
- Bayt Jobs Scraper
E-commerce
- Walmart Product Scraper
- Amazon Search Scraper
- Shopee Search Scraper
- Etsy Scraper
- SHEIN Product Scraper
- Temu Product Scraper
- Target Product Scraper
- Allegro Scraper
Travel & Stays
Social & Content
Ads Intelligence
Local & Maps
General tools
→ See the full catalog in Related Actors below, or browse apify.com/lentic_clockss.
How to scrape Realtor.ca (no code required)
- Click Try for free
- Enter a location (
Toronto, ONorVancouver, BC) - Choose For sale, For rent, or Both
- Optionally set max results and CAD price filters
- Keep Apify RESIDENTIAL proxy enabled (Canada)
- Click Start — open the Dataset tab when the run finishes
Start with maxResults: 5–10 to verify the market, then scale up.
Pricing — how much does it cost to scrape Realtor.ca?
Pay per event. No subscription.
| Event | Price | When charged |
|---|---|---|
apify-actor-start | $0.005 | When a normal run starts (scaled by allocated memory GB) |
apify-default-dataset-item (result) | $2.50 / 1,000 ($0.0025 each) | Each listing written to the default Dataset |
User pays platform usage costs: No — Apify compute for the thin Actor is billed to the developer. Event charges (start + result) are billed to the user. Browser scrape runs on Cloud Run, not inside Actor CU.
Example product charges (events only):
| Scenario | Approx. event charge |
|---|---|
| Canary: 10 listings | $0.005 + 10 × $0.0025 = $0.030 |
| City scan: 100 listings | $0.005 + $0.25 = $0.255 |
| 1,000 listings | $0.005 + $2.50 = $2.505 |
Developer-paid Actor compute scales with allocated memory and run duration. Browser acquisition runs on Cloud Run, not inside Actor CU.
Input
| Field | Description |
|---|---|
location | City and province, e.g. Toronto, ON / Saskatoon, SK, or a realtor.ca city URL |
listingType | sale, rent, or both |
propertyTypeGroup | residential, commercial, or all (default residential) |
propertySearchType | Residential subtype: any, condo, vacant_land, multi_family, etc. (default any; only with residential) |
maxResults | 1–200 (default 1 for Console Test; free users capped at 200/run) |
minPrice / maxPrice | Optional CAD filters |
enrichDetails | Fetch PropertyDetails per listing (default true) |
detailConcurrency | Parallel detail fetches 1–4 (default 1) |
maxDetailFailRatio | Fail when detail errors exceed this ratio (default 0.5) |
applicationId | Advanced CREA ApplicationId override (optional) |
proxyConfiguration | Apify RESIDENTIAL CA when Actor mints proxy; ignored if WORKER_PROVIDES_PROXY=1 |
workerBaseUrl | Optional per-run worker origin override (Advanced) |
Open the Input tab in Console for the full form and tooltips.
Output example
You can download the Dataset as JSON, CSV, Excel, or HTML.
{"name": "123 King St W","listingType": "sale","mlsNumber": "C1234567","city": "Toronto","state": "ON","listPrice": 899000,"currency": "CAD","beds": "2 + 1","baths": "2","sqft": "900 sqft","agentName": "Jane Smith","phones": [{ "value": "905-673-1212", "type": "Telephone", "e164": "+19056731212" }],"emails": [],"address": {"street": "123 King St W","unit": null,"locality": "Toronto","region": "ON","postalCode": "M5H 1A1","country": "CA","full": "123 King St W, Toronto, Ontario M5H1A1"},"geo": { "lat": 43.647, "lng": -79.382 },"person": { "name": "Jane Smith", "role": "Salesperson" },"org": { "name": "Example Realty", "id": "285750" },"web": { "website": "http://www.example-realty.ca/", "socials": [] },"leadSource": "detail","leadReveal": "visible","leadAbsences": { "emails": "闸门锁", "socials": "本站无" },"listingUrl": "https://www.realtor.ca/real-estate/...","source": "realtor.ca","scrapedAt": "2026-07-17T00:00:00+00:00"}
Core fields include listingId, mlsNumber, address/price/size/GPS, listingUrl, imageUrl, agent/office, the lead block above, and detail extras such as descriptionText when enrichment is enabled.
Live View endpoints
When Standby / Live View is enabled, the Actor exposes a small OpenAPI surface for readiness and discovery:
| Endpoint | Purpose |
|---|---|
GET / | Readiness / service info |
GET /health | Health check |
GET /input-example | Low-cost example input |
GET /openapi.json | Deployed OpenAPI document |
Scraping still runs through a normal Actor run — Live View does not scrape Realtor.ca by itself.
Connect from code
Actor ID: lentic_clockss/realtor-ca-scraper
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("lentic_clockss/realtor-ca-scraper").call(run_input={"location": "Toronto, ON","listingType": "sale","maxResults": 10,"proxyConfiguration": {"useApifyProxy": True,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "CA",},})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item.get("name"), item.get("listPrice"), item.get("listingUrl"))
Use the same Actor ID in Make, n8n, Zapier, or Apify MCP for AI-agent workflows.
FAQ
Why did my free-plan run stop after 10 runs?
Free Apify plan users get 10 runs of this Actor and up to 200 results per run. These limits are set by the Actor developer (not Apify). When you hit the run cap, the run finishes with a clear status message — it is not a platform bug. Upgrade to a paid Apify plan for unlimited runs.
Is there a free Realtor.ca / CREA API?
CREA / Realtor.ca does not offer a simple public listing API for bulk third-party export. This Actor gives you structured Canadian MLS data through Apify runs, Dataset exports, and integrations.
Can I scrape commercial or condo-only inventory?
Yes. Set propertyTypeGroup to residential, commercial, or all. For residential subtypes use propertySearchType (condo, vacant_land, multi_family, etc.). Commercial and all require propertySearchType: any. Each dataset row includes the requested propertyTypeGroup and propertySearchType.
Can I scrape both for-sale and rental listings?
Yes. Set listingType to both. maxResults is split across sale and rent when both are selected.
Why is a Canadian residential proxy required?
Realtor.ca sits behind Imperva and blocks many datacenter/direct IPs. Apify RESIDENTIAL with country CA is required for reliable runs.
Why might a dense metro return fewer than maxResults?
CREA search uses a map bounding box with an internal result cap (~600). The worker paginates within that cap and stops at maxResults. Very dense metros may need tighter price filters or smaller areas. Partial worker responses surface as warnings in RUN_SUMMARY.
How are unknown Canadian cities resolved?
Major metros use a versioned curated bbox table. Other Canadian cities are geocoded (Nominatim, Photon fallback) and expanded to an approximate map box.
Can I schedule daily Realtor.ca scrapes?
Yes. Create an Apify schedule with the same input and send the Dataset to Sheets, Slack, a CRM, or your pipeline.
Is it legal to scrape Realtor.ca?
Use this Actor for legitimate research and analysis only. Respect Realtor.ca / CREA terms of use and applicable law. Results may include publicly displayed listing information; do not use personal data without a lawful basis.
Related Actors
All 77 public Actors from [lentic_clockss]. Click a name to open the Store detail page.
Jobs & Freelance
- LinkedIn Jobs Scraper
- Bayt Jobs Scraper
- Fiverr Gigs Scraper
- Freelancer.com Scraper
- Glassdoor Scraper
- Himalayas Jobs Scraper
- Indeed Jobs Scraper
- Jobicy Remote Jobs Scraper
- RemoteOK Jobs Scraper
- SEEK Jobs Scraper
- Upwork Jobs Scraper
Real Estate
- Zillow & Zumper Scraper
- Realtor.com Scraper
- 99.co Scraper
- Realtor.com Agents Scraper
- Apartments.com Rental Scraper
- Bayut Scraper
- Craigslist Housing Scraper
- Daft.ie Scraper
- Dot Property Scraper
- FINN.no Scraper
- Funda Scraper
- Hepsiemlak Scraper
- Idealista Scraper
- Immobiliare.it Scraper
- ImmoScout24 Scraper
- Naver Land Scraper
- OpenSooq Scraper
- Otodom Scraper
- Property Finder Scraper
- PropertyGuru Scraper
- realestate.com.au Scraper
- Realtor.ca Scraper
- Rightmove Scraper
- SeLoger Scraper
- SUUMO Scraper
- Zillow Group Scraper
E-commerce
- Shopee Search Scraper
- E-commerce Scraper
- 1688 Global Product Search Scraper
- Allegro Scraper
- Amazon Search Scraper
- ASOS Product Scraper
- Cdiscount Product Scraper
- Costco Product Scraper
- Coupang Product Scraper
- Etsy Scraper
- Lazada Scraper
- MercadoLibre Scraper
- Mercari Japan Scraper
- Rakuten Japan Scraper
- SHEIN Product Scraper
- Target Product Scraper
- Temu Product Scraper
- Walmart Product Scraper
Travel & Stays
- Booking.com & Airbnb Scraper
- Agoda Scraper
- Airbnb Listings Scraper
- Booking.com Hotels Scraper
- Despegar Scraper
- Expedia Scraper
- Traveloka Scraper
- Travelstart Flights Scraper
- Trip.com Scraper
- TripAdvisor Scraper
Social & Content
Ads Intelligence
Local & Maps
General Tools
→ Browse the full profile: apify.com/lentic_clockss