Realtor.ca Scraper - Canadian MLS Listings
Pricing
from $2.20 / 1,000 results
Realtor.ca Scraper - Canadian MLS Listings
Collect Canadian Realtor.ca sale and rental listings by city, with MLS numbers, prices, property details, photos, and public agent contacts. Pay per delivered listing plus a run-start charge.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
5
Total users
3
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Realtor.ca Scraper
Get Canadian for-sale and rental listings from Realtor.ca as structured rows with prices, property details, and public agent contacts.
- Search one Canadian city by name or its Realtor.ca city page URL.
- Choose residential or commercial properties, including condo and land filters.
- Export MLS numbers, CAD prices, addresses, photos, and listing links.
- Include public remarks and additional photos with detail enrichment.
- Pay $3.00 per 1,000 delivered rows on the Free plan, plus a small start fee.
What does Realtor.ca Scraper do?
Realtor.ca Scraper collects current Canadian property listings for market research, rental comparisons, and property shortlists. Each dataset row represents one listing. Enter a location, choose filters, and download the rows or use them in an application.
- For sale:
listingType: "sale"returns properties offered for sale. - For rent:
listingType: "rent"returns rental listings. - Both:
listingType: "both"includes sale and rental listings within the same row limit. - Property categories:
propertyTypeGroupselects residential, commercial, or both groups.propertySearchTypenarrows residential searches. - Detail enrichment:
enrichDetailsis on by default. It adds available remarks, photos, and contact details to the same listing row, not separate paid rows.
What data can you extract from Realtor.ca?
One row contains the property and its available contact information. Values vary by listing; the examples below illustrate field formats, not verified properties.
| Field | Description | Example |
|---|---|---|
listingId | Realtor.ca listing identifier | 12345678 |
mlsNumber | MLS listing number | EXAMPLE123 |
name | Listing address used as its name | 123 Example Street |
listingType | Sale or rental classification | sale |
propertyTypeGroup | Requested property category | residential |
propertySearchType | Requested residential subtype | condo |
listPrice | Numeric list price or rent | 499000 |
priceDisplay | Original price text, including rental period when supplied | $2,400/Monthly |
currency | Price currency | CAD |
beds | Bedroom text, including additional rooms | 2 + 1 |
bedsNumeric | Sum of the bedroom numbers | 3 |
baths | Numeric bathroom count | 2 |
sqft | Numeric interior size; read with its unit | 900 |
sqftUnit | Unit attached to the interior size | sqft |
buildingType | Building category | Apartment |
ownership | Ownership description | Condominium/Strata |
address | Structured street, unit, city, province, and postal code | {"street":"123 Example Street","unit":"4"} |
geo | Latitude and longitude when supplied | {"lat":43.65,"lng":-79.38} |
agentName | Listing agent name | Jane Doe |
person | Agent name and role | {"name":"Jane Doe","role":"Salesperson"} |
org | Property brokerage name and identifier | {"name":"Example Realty","id":"123"} |
phones | Public contact numbers and their types | [{"value":"+1 555 0100","type":"Telephone"}] |
emails | Public email addresses, if supplied | [] |
web | Available contact website and social links | {"website":"https://example.com","socials":[]} |
leadAbsences | Reasons for missing contact fields | {"emails":"闸门锁"} |
descriptionText | Public property remarks when available | Example property description. |
imageUrls | Delivered property photo URLs | [] |
listingUrl | Link back to the listing | https://www.realtor.ca/real-estate/12345678/example-property |
source | Source website | realtor.ca |
scrapedAt | Collection timestamp | 2026-10-24T08:00:00+00:00 |
Other available fields include buildingStyle, storeys, landSize, parkingType, and photoCount. Missing-contact codes include 本站无 (not provided), 闸门锁 (contact form required), and 未验证 (not confirmed). The Actor does not turn contact identifiers into email addresses or submit contact forms.
How to scrape Realtor.ca
- Open Realtor.ca Scraper in Apify Console.
- Enter a Canadian city and province in
location, such asSaskatoon, SK. - Set
maxResultsto3for a small first run and choose any filters you need. - Click Start. Read the run status and wait for the final result.
- Open the dataset and download the rows, or retrieve them through the API.
Empty input starts an example run for Saskatoon, SK, limited to 3 rows using the form's sample values. This is a billed run under the prices below, not a separate free preview. There is one location-search mode: filling location selects it automatically, with no mode field to set.
For-sale listings
Use listingType: "sale", the default. Add minPrice or maxPrice to narrow the asking-price range in CAD. For condo-only searches, keep propertyTypeGroup: "residential" and select propertySearchType: "condo".
Rental listings
Use listingType: "rent". Read priceDisplay as well as listPrice, since rental price text may include a payment period. A city URL supplies the location; select the listing type explicitly rather than relying on the URL to choose rentals.
Sale and rent together
Use listingType: "both". Sale and rental rows share the location's maxResults allowance. Selecting propertyTypeGroup: "all" also includes residential and commercial categories within that same allowance; it does not multiply the number of rows requested.
What to fill in
| Field | What to enter | Default |
|---|---|---|
location | One Canadian city and province, or a Realtor.ca city page URL | No default; example is Saskatoon, SK |
maxResults | Maximum listing rows for the location, from 1 to 200 | 70; form suggests 3 |
listingType | sale, rent, or both | sale |
propertyTypeGroup | residential, commercial, or all | residential |
propertySearchType | any, residential, recreational, condo, agriculture, parking, vacant_land, or multi_family; residential only | any |
minPrice | Minimum price or rent in CAD | Not set |
maxPrice | Maximum price or rent in CAD | Not set |
enrichDetails | Include available extra listing details | true |
detailConcurrency | Number of listings enriched at once, from 1 to 4 | 1 |
maxDetailFailRatio | Stop when failed detail attempts exceed this fraction after at least two attempts | 0.5 |
For sale:
{"location": "Saskatoon, SK","listingType": "sale","maxResults": 3}
Rentals:
{"location": "Toronto, ON","listingType": "rent","maxResults": 3}
Sale and rent across both property categories:
{"location": "Calgary, AB","listingType": "both","propertyTypeGroup": "all","maxResults": 5}
maxItemsandlimitare accepted aliases formaxResults.cityandqueryare accepted aliases forlocation.- Unknown fields do not fail input resolution. Close misspellings are corrected; other unknown fields are ignored with a note.
- Unrecognized filter values fall back to defaults. If
minPriceexceedsmaxPrice, both are dropped. Residential subtypes are ignored for commercial or combined property groups. - Input validation failures stop before any row is delivered or charged, with an
INVALID_INPUT:message naming the field. The run-start charge is separate. Not every incorrect filter causes a failure. - The
INPUT_REPORTrecord in the default key-value store shows input resolution, including aliases, corrections, ignored fields, and example-run status.INPUT_ECHOshows the resulting settings.
Output example
This illustrative row uses placeholder personal details. Size and bathroom values are numeric; bedroom text retains the source's notation.
{"listingId": "12345678","mlsNumber": "EXAMPLE123","name": "123 Example Street","listingType": "sale","propertyTypeGroup": "residential","propertySearchType": "any","listPrice": 499000,"currency": "CAD","beds": "2 + 1","bedsNumeric": 3,"baths": 2,"sqft": 900,"sqftUnit": "sqft","country": "CA","address": {"street": "123 Example Street","unit": "4","locality": "Toronto","region": "ON","postalCode": null,"country": "CA","full": "4 - 123 Example Street, Toronto, ON"},"person": {"name": "Jane Doe", "role": "Salesperson"},"org": {"name": "Example Realty", "id": "123"},"phones": [{"value": "+1 555 0100", "type": "Telephone"}],"emails": [],"leadAbsences": {"emails": "闸门锁", "socials": "本站无"},"listingUrl": "https://www.realtor.ca/real-estate/12345678/example-property","source": "realtor.ca","scrapedAt": "2026-10-24T08:00:00+00:00"}
Export the dataset as JSON, CSV, Excel, XML, RSS, or an HTML table. JSON preserves nested contacts and addresses. RUN_SUMMARY records delivered counts and warnings; ERROR_SUMMARY contains failure details when a run fails.
Why use this Realtor.ca scraper?
- Pay for delivered rows. The row charge applies to listings written to the dataset, plus the separate start charge.
- Keep delivered data. Rows already written remain available after a stop or timeout. Available partial results can also be delivered; unreturned rows are not guaranteed.
- Compare like-for-like listings. Use one city, a property category, and a CAD price range for a focused sample.
- Keep missing values visible. Unavailable details stay empty instead of being invented. Missing contact fields have reason codes.
- No proxy setup. Network access is handled by the Actor's control plane; no proxy configuration is required.
How much does it cost to scrape Realtor.ca?
The Actor uses pay-per-event pricing. The start event costs $0.005 per allocated GB, with a minimum of one event. At the default memory of 512 MB, one normal run start costs $0.005. Platform usage is included in these prices.
| Apify plan | Start at 512 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.0030 | $3.00 |
| Starter | $0.005 | $0.0030 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
| Platinum | $0.005 | $0.0020 | $2.00 |
| Diamond | $0.005 | $0.0016 | $1.60 |
maxResultsapplies to the single location input. Its default is 70; larger requests are collected in parts of 70, up to the schema maximum of 200.- Sale, rent, residential, and commercial choices share this allowance. Enrichment does not create extra paid rows.
- Free Apify plan users have a developer-set limit of 10 runs of this Actor and up to 200 rows per run.
- The whole run stops at the Maximum cost per run you set in run options, named
maxTotalChargeUsdin the API. This is not an input field.
Example: one location delivering 5 rows on the Free plan at 512 MB costs 5 × $0.003 + $0.005 = $0.020. The 1,000-row prices are comparison rates, not a promise that one run accepts 1,000 rows.
What happens when the run timeout is too short
When a search needs longer than the chosen timeout, the run can pause with status ABORTED and the message "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." This pause is not a collection failure.
When results are ready, the same run resumes automatically, delivers remaining rows into the same dataset, and finishes as SUCCEEDED. A resumed delivery can report "Resumed: delivering N rows." Already delivered rows are skipped, so they are not delivered or charged twice. You do not need to restart the run manually.
This automatic pause/resume process is limited to 3 attempts. Keep the default timeout of 3,600 seconds to reduce the need for it. Other failures can still prevent completion; check the status message rather than assuming every ABORTED run will resume.
The synchronous API endpoints run-sync and run-sync-get-dataset-items wait at most 300 seconds and may return an empty dataset during a pause. For longer searches, start asynchronously and read the dataset after SUCCEEDED, or use an ACTOR.RUN.SUCCEEDED webhook.
Use with AI agents and the API
Apify MCP server
Add this remote server in Claude, ChatGPT, Cursor, VS Code, or another compatible MCP client:
https://mcp.apify.com?tools=lentic_clockss/realtor-ca-scraper
Sign in with Apify when prompted through OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; use get-dataset-items to read the rows after completion.
For clients without remote MCP support, run npx @apify/actors-mcp-server --tools lentic_clockss/realtor-ca-scraper with APIFY_TOKEN set.
Example prompt: "Get 3 residential rental listings in Toronto, ON, with prices, bedrooms, and listing links."
Apify API
These examples start asynchronously. Read the dataset after the run reaches SUCCEEDED.
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/realtor-ca-scraper").start(run_input={"location": "Saskatoon, SK", "maxResults": 3})print(run["id"], run["defaultDatasetId"])# After SUCCEEDED:# for row in client.dataset(run["defaultDatasetId"]).iterate_items():# print(row)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/realtor-ca-scraper').start({location: 'Saskatoon, SK', maxResults: 3});console.log(run.id, run.defaultDatasetId);// After SUCCEEDED:// const { items } = await client.dataset(run.defaultDatasetId).listItems();
Over HTTP, send the input as JSON to POST https://api.apify.com/v2/acts/lentic_clockss~realtor-ca-scraper/runs, with your token in the Authorization: Bearer header. After completion, retrieve GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.
Integrations
Use the Actor's Integrations tab to connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable, or your own webhook. Apify Schedules can repeat a saved city search.
FAQ
Is it legal to scrape Realtor.ca?
This Actor collects publicly available listing data. You are responsible for complying with Realtor.ca and CREA terms and applicable data protection law. Public availability alone does not authorize every use; personal data requires a lawful basis.
Why did my run end as ABORTED?
An automatic pause can appear as ABORTED before the same run resumes. Check for the queued/resume status message described above. A manually aborted run is different and should not be assumed to resume.
How many results can I get?
Request 1–200 rows for one location, with 70 as the default. Available inventory, filters, your maximum charge, and the Free plan allowance can reduce the number delivered. A limit is not a guaranteed count.
Why are some fields empty?
Listings do not all publish the same details. Sizes, remarks, photos, and contacts may be absent. Enrichment can add available information but cannot guarantee missing fields; inspect leadAbsences for contact-related gaps.
Why did my free-plan runs stop after 10 runs?
The Actor developer limits Free plan users to 10 runs of this Actor. The run reports the limit. Paid Apify plans remove that run-count restriction, but the schema's 200-row maximum still applies.
Can I collect commercial properties or only condos?
Use propertyTypeGroup: "commercial" for commercial listings. For condos, use propertyTypeGroup: "residential" and propertySearchType: "condo". Non-residential groups ignore residential subtype filters.
Can I search several cities in one run?
No. location accepts one city or city page URL, not a list. Create separate runs for separate cities. listingType: "both" combines listing types within one city, not multiple locations.
Will I receive agent email addresses?
Do not expect an email for every listing. Contact forms and contact identifiers are not email addresses. The Actor leaves emails empty when no public address is supplied and does not submit forms on your behalf.
Limitations
- Covers Canadian Realtor.ca listings, not the separate US Realtor.com site.
- Accepts a city search, not arbitrary property URLs, agent profiles, or a list of cities.
- Searches current available inventory; there is no historical-date input.
- City search areas and source result limits can omit properties. A sample is not a complete city inventory.
- Detail enrichment takes additional time. Excessive detail failures can fail the run according to
maxDetailFailRatio. - Photos, size units, public remarks, and contact details vary by listing. Keep the supplied unit and price-period text when comparing rows.
Related scrapers
More real estate and property data scrapers from the same publisher:
- Zumper Scraper
- Booli Scraper
- Craigslist Scraper
- PropertyGuru Scraper
- OpenSooq Scraper
- Apartments.com Rental Scraper
- Dot Property Scraper
- FINN.no Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report a problem or request a field through the Issues tab of this Actor page. Include the run ID and the input you used.