Realtor.ca Scraper - Canadian MLS Listings avatar

Realtor.ca Scraper - Canadian MLS Listings

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Realtor.ca Scraper - Canadian MLS Listings

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

kane liu

Maintained by Community

Actor stats

1

Bookmarked

5

Total users

3

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

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: propertyTypeGroup selects residential, commercial, or both groups. propertySearchType narrows residential searches.
  • Detail enrichment: enrichDetails is 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.

FieldDescriptionExample
listingIdRealtor.ca listing identifier12345678
mlsNumberMLS listing numberEXAMPLE123
nameListing address used as its name123 Example Street
listingTypeSale or rental classificationsale
propertyTypeGroupRequested property categoryresidential
propertySearchTypeRequested residential subtypecondo
listPriceNumeric list price or rent499000
priceDisplayOriginal price text, including rental period when supplied$2,400/Monthly
currencyPrice currencyCAD
bedsBedroom text, including additional rooms2 + 1
bedsNumericSum of the bedroom numbers3
bathsNumeric bathroom count2
sqftNumeric interior size; read with its unit900
sqftUnitUnit attached to the interior sizesqft
buildingTypeBuilding categoryApartment
ownershipOwnership descriptionCondominium/Strata
addressStructured street, unit, city, province, and postal code{"street":"123 Example Street","unit":"4"}
geoLatitude and longitude when supplied{"lat":43.65,"lng":-79.38}
agentNameListing agent nameJane Doe
personAgent name and role{"name":"Jane Doe","role":"Salesperson"}
orgProperty brokerage name and identifier{"name":"Example Realty","id":"123"}
phonesPublic contact numbers and their types[{"value":"+1 555 0100","type":"Telephone"}]
emailsPublic email addresses, if supplied[]
webAvailable contact website and social links{"website":"https://example.com","socials":[]}
leadAbsencesReasons for missing contact fields{"emails":"闸门锁"}
descriptionTextPublic property remarks when availableExample property description.
imageUrlsDelivered property photo URLs[]
listingUrlLink back to the listinghttps://www.realtor.ca/real-estate/12345678/example-property
sourceSource websiterealtor.ca
scrapedAtCollection timestamp2026-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

  1. Open Realtor.ca Scraper in Apify Console.
  2. Enter a Canadian city and province in location, such as Saskatoon, SK.
  3. Set maxResults to 3 for a small first run and choose any filters you need.
  4. Click Start. Read the run status and wait for the final result.
  5. 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

FieldWhat to enterDefault
locationOne Canadian city and province, or a Realtor.ca city page URLNo default; example is Saskatoon, SK
maxResultsMaximum listing rows for the location, from 1 to 20070; form suggests 3
listingTypesale, rent, or bothsale
propertyTypeGroupresidential, commercial, or allresidential
propertySearchTypeany, residential, recreational, condo, agriculture, parking, vacant_land, or multi_family; residential onlyany
minPriceMinimum price or rent in CADNot set
maxPriceMaximum price or rent in CADNot set
enrichDetailsInclude available extra listing detailstrue
detailConcurrencyNumber of listings enriched at once, from 1 to 41
maxDetailFailRatioStop when failed detail attempts exceed this fraction after at least two attempts0.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
}
  • maxItems and limit are accepted aliases for maxResults. city and query are accepted aliases for location.
  • 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 minPrice exceeds maxPrice, 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_REPORT record in the default key-value store shows input resolution, including aliases, corrections, ignored fields, and example-run status. INPUT_ECHO shows 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 planStart at 512 MBPrice per rowPrice 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
  • maxResults applies 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 maxTotalChargeUsd in 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 ApifyClient
client = 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

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.

More real estate and property data scrapers from the same publisher:

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.