Realtor.CA Scraper with Agents | $1 / 1k
Pricing
$0.99 / 1,000 results
Realtor.CA Scraper with Agents | $1 / 1k
Extract structured Canada real estate listings from Realtor.ca with property signals, seller details, media assets, contact data and more. Built for enterprise-grade Canada property intelligence, listing monitoring, lead enrichment and automated analytics pipelines.
Pricing
$0.99 / 1,000 results
Rating
0.0
(0)
Developer
Fatih Tahta
Maintained by CommunityActor stats
2
Bookmarked
77
Total users
14
Monthly active users
0.44 hours
Issues response
3 days ago
Last modified
Categories
Share
Realtor Canada Scraper
Slug: fatihtahta/realtor-canada-scraper
Overview
Realtor Canada Scraper collects structured Canadian real estate listing records, including listing identifiers, addresses, prices, property attributes, land and building details, agents, brokerages, media, open house information, and listing status. Realtor.ca is one of Canada's primary public real estate listing destinations, making its listing data useful for market analysis, inventory monitoring, lead enrichment, and operational reporting. The actor turns location-based property searches into repeatable JSON datasets that can be reviewed manually or consumed by downstream systems. It is designed for automation and recurring collection workflows where consistent record structure matters. Results reflect the public information available at run time and support dependable recurring data acquisition without assuming complete market coverage or service-level guarantees.
Why Use This Actor
- Market research and analytics: build structured extraction workflows for pricing bands, inventory movement, property types, locations, and availability trends across Canadian markets.
- Product and content teams: populate real estate experiences, location pages, comparison views, and editorial research with normalized public listing attributes.
- Developers and data engineering teams: feed repeatable collection results into downstream systems, ETL pipelines, warehouses, search indexes, and internal APIs.
- Lead generation and enrichment teams: enrich CRM records with public listing, agent, brokerage, and property context for qualification and segmentation.
- Monitoring and competitive tracking teams: schedule recurring data acquisition for market intelligence, listing change review, geographic coverage checks, and operational reporting.
Common Use Cases
- Market intelligence: monitor supply, pricing, property categories, locations, availability, and listing freshness across selected Canadian markets.
- Lead generation: build targeted prospect lists from public listings, associated agents, brokerages, and property attributes.
- Competitive monitoring: track visible inventory and positioning across regions, listing categories, and price bands.
- Catalog and directory building: populate internal real estate databases with structured public listing records.
- Data enrichment: add current public attributes to existing CRM, BI, underwriting, or analytics datasets.
- Recurring reporting: schedule periodic runs for dashboards, alerts, trend analysis, and market snapshots.
Quick Start
- Choose a required
locationvalue, such as a city, province, neighborhood, or city with province. - Select the
deal_type:buy,rent, orsold. - Add optional filters such as
property_type,building_type,bedroom_count,bathroom_count, price range, publication date, area, storeys, year built, property tax, or maintenance fee. - Choose a
sort_optionwhen you need a result order other than newest listings first. - Set a small
limitfor the first validation run. - Run the actor in Apify Console and inspect the first dataset records to confirm the shape matches your use case.
- Increase
limit, enablemaximize_coverage, adjust filters, or schedule the actor once the output is verified.
Input Parameters
Configure a location value, choose a deal_type, and optionally narrow results by listing, property, room, price, area, cost, and freshness filters.
| Parameter | Type | Description | Default |
|---|---|---|---|
location | string | Required. Canadian area to search. Enter a city, province, neighborhood, or city with province, such as Ottawa, Ottawa, Ontario, Toronto, Vancouver, Nova Scotia, or Ontario. Broader areas improve discovery; specific places produce more targeted datasets. | Required |
deal_type | string | Listing category. Allowed values: buy for properties for sale, rent for rental properties, sold for sold properties. | buy |
sold_within_days | string | Sold listing recency window. Applies only when deal_type is sold; buy and rent searches ignore it. Allowed values: all, 7, 14, 30, 90, 180, 365. | 365 |
property_type | string | Property category filter. Allowed values: residential, condo_strata, vacant_land, recreational, multi_family, agriculture, parking. | – |
building_type | string | Building format filter. Allowed values: house, row_townhouse, apartment, duplex, triplex, fourplex, garden_home, mobile_home, manufactured_home_mobile, special_purpose, residential_commercial_mix, manufactured_home, commercial_apartment, two_apartment_house, park_model_mobile_home, floathome. | – |
publication_date | string | Earliest listing publication date. Use a date value to include listings published on or after that date. | – |
keyword | string | Keyword or phrase used to focus results on listings that match specific text. | – |
open_house_only | boolean | When enabled, collects only listings with open house availability in the next 7 days. | false |
live_stream_only | boolean | When enabled, collects only listings with live stream open house availability in the next 7 days. | false |
sort_option | string | Listing order. Allowed values: date_desc, date_asc, price_asc, price_desc, open_houses_first, more_photos_first, virtual_tour_first. | date_desc |
maximize_coverage | boolean | Collects more listings that match the selected filters when a large search may exceed Realtor.ca's visible-result limit. It does not change the original filters. | true |
bedroom_count | string | Bedroom requirement. Allowed values: 1+, 2+, 3+, 4+, 5+, 1, 2, 3, 4, 5. Plus values mean minimum count; plain numbers mean exact count. | – |
bathroom_count | string | Bathroom requirement. Allowed values: 1+, 2+, 3+, 4+, 5+, 1, 2, 3, 4, 5. Plus values mean minimum count; plain numbers mean exact count. | – |
limit | integer | Maximum number of listings to save across the whole run. Minimum value: 1. Leave empty when no cap is needed. | – |
min_price | integer | Minimum asking price in CAD. Minimum value: 0. | – |
max_price | integer | Maximum asking price in CAD. Minimum value: 0. | – |
min_building_area | integer | Minimum building area in square feet. Minimum value: 0. | – |
max_building_area | integer | Maximum building area in square feet. Minimum value: 0. | – |
min_land_area | number | Minimum land area in acres. Minimum value: 0. | – |
max_land_area | number | Maximum land area in acres. Minimum value: 0. | – |
min_storey | string | Minimum number of storeys. Allowed values: 1, 2, 3, 4, 5, 6, 10, 15, 20, 50. | – |
max_storey | string | Maximum number of storeys. Allowed values: 1, 2, 3, 4, 5, 6, 10, 15, 20, 50. | – |
min_year_built | string | Earliest year built. Allowed values: 2026, 2025, 2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017, 2016, 2015, 2010, 2005, 2000, 1990, 1980, 1970, 1960, 1950, 1940, 1930, 1920, 1910, 1900. | – |
max_year_built | string | Latest year built. Allowed values: 2026, 2025, 2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017, 2016, 2015, 2010, 2005, 2000, 1990, 1980, 1970, 1960, 1950, 1940, 1930, 1920, 1910, 1900. | – |
min_property_tax | string | Minimum annual property tax in CAD. Allowed values: 250, 500, 1000, 2000, 3000, 4000, 5000, 6000, 8000, 10000, 20000. | – |
max_property_tax | string | Maximum annual property tax in CAD. Allowed values: 250, 500, 1000, 2000, 3000, 4000, 5000, 6000, 8000, 10000, 20000. | – |
min_maintenance_fee | string | Minimum monthly maintenance fee in CAD. Allowed values: 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1500, 2000. | – |
max_maintenance_fee | string | Maximum monthly maintenance fee in CAD. Allowed values: 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1500, 2000. | – |
Choosing Inputs
Use location as the primary scope control. A city or neighborhood usually produces cleaner segmentation, while a province or broad regional phrase is better for discovery and market-wide reporting.
Use deal_type to separate for-sale, rental, and sold listing workflows. Missing deal_type input defaults to buy. For sold searches, the default sold_within_days window is 365; set it to all only when you want to omit Realtor.ca's sold-within filter. Keep these categories in separate runs when you need cleaner analysis and simpler downstream reporting.
Filters such as property_type, building_type, bedrooms, bathrooms, price, building area, land area, storeys, year built, property tax, maintenance fee, publication_date, and keyword reduce the scope and produce more targeted datasets. Leave optional filters empty when broad discovery is more important than precision.
Start with a small limit to validate output quality and confirm that the selected filters return the expected records. Increase limit and consider maximize_coverage only after confirming the first dataset sample matches your use case.
Example Inputs
Scenario 1: For-sale condo listings in Toronto
{"location": "Toronto","deal_type": "buy","property_type": "condo_strata","building_type": "apartment","min_price": 500000,"max_price": 900000,"limit": 50}
Scenario 2: Rental listings with open houses in Vancouver
{"location": "Vancouver","deal_type": "rent","property_type": "residential","bedroom_count": "2+","bathroom_count": "1+","open_house_only": true,"limit": 25}
Scenario 3: Recently published vacant land listings in Nova Scotia
{"location": "Nova Scotia","deal_type": "buy","property_type": "vacant_land","publication_date": "2026-05-01","min_land_area": 1,"max_price": 250000,"limit": 100}
Output
9.1 Output destination
The actor writes results to an Apify dataset as JSON records. The dataset is designed for direct consumption by analytics tools, ETL pipelines, and downstream APIs with minimal post-processing.
This actor currently writes one public record family: property_listing.
9.2 Record envelope and stable identifiers
Each dataset item uses a normalized real estate record shape:
record_typeandrecord_ididentify the record and support deduplication.source_contextpreserves Realtor.ca provenance, search context, listing URL, and external IDs.entitystores the listing title, URL, description, category, and display identity.listingstores listing IDs, MLS number, deal type, and public listing status.pricing,location,property,availability,media,relationships, andattributesgroup the remaining public details.
Recommended idempotency key: record_id. If record_id is unavailable in a downstream workflow, use entity.url, followed by listing.mls_number or a composite key such as listing.mls_number plus location.address.
source_context.source_url and source_context.listing_url point to the public Realtor.ca listing. source_context.search_url preserves the run context that produced the record.
9.3 Examples
Example: listing
{"record_type": "property_listing","record_id": "29701641","source_context": {"source_name": "Realtor.ca","source_domain": "realtor.ca","country_site": "Canada","seed_id": "seed123","seed_type": "query","seed_value": "Miramichi","deal_type": "buy","page_index": 1,"source_url": "https://www.realtor.ca/real-estate/29701641/lot-craigville-road-miramichi","listing_url": "https://www.realtor.ca/real-estate/29701641/lot-craigville-road-miramichi","search_url": "https://api2.realtor.ca/Listing.svc/AsyncPropertySearch_Post?CurrentPage=1","relative_url": "/real-estate/29701641/lot-craigville-road-miramichi","external_ids": {"realtor_ca_listing_id": "29701641","mls_number": "NB138728"}},"entity": {"title": "Lot Craigville Road Miramichi, New Brunswick E1N5W2","url": "https://www.realtor.ca/real-estate/29701641/lot-craigville-road-miramichi","description": "11.1 ACRE LOT IN NELSON!","category": "Vacant Land","external_ids": {"realtor_ca_listing_id": "29701641","mls_number": "NB138728"}},"listing": {"listing_id": "29701641","mls_number": "NB138728","deal_type": "buy","listing_status": {"id": "1","time_on_realtor": "5 min ago","tags": [{"label": "5 min ago","listing_tag_type_id": "1"}]}},"pricing": {"display_price": "$28,500","amount": 28500,"currency": "CAD","short_value": "28.5K"},"location": {"address": "Lot Craigville Road Miramichi, New Brunswick E1N5W2","postal_code": "E1N5W2","province": "New Brunswick","country": "Canada","coordinates": {"latitude": 46.975478,"longitude": -65.5338},"permit_show_address": true},"property": {"property_type": "Vacant Land","building": {"floor_area_measurements": [{"area": "1013 sqft","type": "Square Footage","measure_unit_id": "1"}]},"land": {"size_total": "11.1 ac"},"ownership": {"type": "Freehold","group_ids": [1]}},"media": {"images": [{"sequence": 1,"high_res_url": "https://cdn.realtor.ca/listing.jpg","last_updated": "2026-05-05T12:15:07","type_id": "0"}]},"relationships": {"agents": [{"id": "1992277","name": "Kelsey Gorman","profile_url": "https://www.realtor.ca/agent/1992277/kelsey-gorman","phones": [{"type": "Telephone","number": "506-210-1240","area_code": "506","phone_type_id": "1"}],"websites": [{"url": "https://www.facebook.com/kelsey.gorman.31","website_type_id": "1"}],"organization": {"id": "296172","name": "RE/MAX Professionals"}}],"brokerages": [{"id": "296172","name": "RE/MAX Professionals"}]},"attributes": {"realtor_ca": {"source_details": {"relative_details_url": "/real-estate/29701641/lot-craigville-road-miramichi","inserted_at": "2026-05-05T12:15:07"},"raw_status_ids": {"status_id": "1"}}}}
Field Reference
Listing Record
record_type (string): Stable discriminator. Listing rows use property_listing.
record_id (string): Stable Realtor.ca listing identifier and recommended idempotency key.
source_context.source_name (string, optional): Source label, usually Realtor.ca.
source_context.source_domain (string, optional): Source domain, usually realtor.ca.
source_context.country_site (string, optional): Country site represented by the record, usually Canada.
source_context.source_url (string, optional): Public Realtor.ca listing URL.
source_context.listing_url (string, optional): Public Realtor.ca listing URL.
source_context.search_url (string, optional): Search request context that produced the record.
source_context.relative_url (string, optional): Source-provided relative listing URL.
source_context.seed_id (string, optional): Stable run seed identifier.
source_context.seed_type (string, optional): Seed category, such as a location query.
source_context.seed_value (string, optional): Location or search value that produced the record.
source_context.deal_type (string, optional): Deal type used for the record, such as buy, rent, or sold.
source_context.page_index (integer, optional): Result page index associated with the record.
source_context.external_ids.realtor_ca_listing_id (string, optional): Realtor.ca listing identifier.
source_context.external_ids.mls_number (string, optional): MLS number associated with the listing.
entity.title (string, optional): Human-readable listing title, typically based on the public address.
entity.url (string, optional): Public Realtor.ca listing URL.
entity.description (string, optional): Public listing description or remarks.
entity.category (string, optional): Public property category, such as residential, vacant land, or condo/strata.
listing.listing_id (string, optional): Realtor.ca listing identifier.
listing.mls_number (string, optional): MLS number associated with the listing.
listing.deal_type (string, optional): Listing transaction category, such as buy, rent, or sold.
listing.listing_status (object, optional): Public status fields including status IDs, freshness labels, sold flags, conditional-sold flags, image/open-house update flags, and tags.
pricing.display_price (string, optional): Price as displayed publicly.
pricing.amount (integer, optional): Numeric price amount in CAD when available.
pricing.currency (string, optional): Price currency. Typically CAD.
pricing.short_value (string, optional): Compact price label when provided.
pricing.lease_display_price (string, optional): Rental price as displayed when deal_type is rent.
pricing.lease_amount (integer, optional): Numeric rental amount in CAD when available.
pricing.sold_display_price (string, optional): Sold price text as displayed when deal_type is sold.
pricing.sold_amount (integer, optional): Numeric sold amount in CAD when publicly available.
pricing.list_display_price (string, optional): Original/list price display retained for sold records when available.
pricing.list_amount (integer, optional): Original/list price amount retained for sold records when available.
pricing.price_change_time_on_realtor (string, optional): Display text for price change timing when available.
pricing.price_change_tag_date (string, optional): Price change date when available.
location.address (string, optional): Public address text.
location.postal_code (string, optional): Postal code.
location.province (string, optional): Province name.
location.country (string, optional): Country label, usually Canada.
location.coordinates.latitude (number, optional): Latitude.
location.coordinates.longitude (number, optional): Longitude.
location.permit_show_address (boolean, optional): Indicates whether the public listing permits address display.
property.property_type (string, optional): Public property category.
property.building (object, optional): Building details such as bedrooms, bathrooms, interior size, building type, storeys, construction details, amenities, and floor area measurements.
property.building.floor_area_measurements (array, optional): Floor area measurements as provided by the listing.
property.land (object, optional): Lot or land details such as displayed size, frontage, depth, or other source-provided land facts.
property.ownership (object, optional): Ownership type and source group identifiers when available.
property.parking (object, optional): Parking display text, total spaces, and structured parking type records.
property.nearby_amenities (string, optional): Public nearby amenities text.
property.business (object, optional): Business-related listing attributes when available for the listing type.
availability.open_houses (array, optional): Public open house events associated with the listing.
availability.is_sold (boolean, optional): Indicates sold records when provided by Realtor.ca.
availability.conditionally_sold (boolean, optional): Indicates conditional sold status when provided.
availability.sold_on_realtor_at (string, optional): Sold timestamp reported by Realtor.ca when available.
availability.sold_close_date (string, optional): Sold close date when available.
availability.has_open_house_update (boolean, optional): Indicates a public open house update flag when available.
media.images (array, optional): Public listing images.
media.videos (array, optional): Public video media links.
media.floor_plans (array, optional): Public floor plan media links.
media.links (array, optional): Other public listing media or external links.
relationships.agents (array, optional): Public listing agents associated with the listing.
relationships.agents.organization (object, optional): Brokerage or organization associated with an agent.
relationships.brokerages (array, optional): Deduplicated public brokerages associated with the listing.
attributes.realtor_ca.source_details (object, optional): Realtor.ca-specific public timing, relative URL, boundary, time zone, upload, and historical-data fields that do not belong in the generic listing groups.
attributes.realtor_ca.raw_status_ids (object, optional): Source status identifiers retained for auditability.
Data Quality, Guarantees, And Handling
- Structured records: results are normalized into predictable JSON objects for downstream use.
- Best-effort extraction: fields may vary by region, session, availability, and public interface experiments.
- Optional fields: null-check in downstream code before using nested values.
- Deduplication: use
idas the strongest stable key when available, withurl,mls_number, or a composite key as fallbacks. - Freshness: results reflect the publicly available data at run time.
- Repeated runs: use the recommended idempotency key when syncing data into warehouses, CRMs, or search indexes.
Tips For Best Results
- Start with a small
limitto validate the output shape before scaling up. - Use one geography, listing category, or market segment per run when you need cleaner segmentation.
- Leave optional filters empty when the goal is broad discovery.
- Add filters gradually to understand how each field changes coverage.
- Use
publication_datefor freshness-oriented monitoring workflows. - Schedule recurring runs for monitoring workflows instead of relying on manual one-off runs.
- Use stable identifiers such as
idorurlfor deduplication when storing results over time.
How to Run on Apify
- Open the Actor in Apify Console.
- Configure the available input fields for the target location, listing category, and filters.
- Set the maximum number of outputs to collect with
limit. - Click Start and wait for the run to finish.
- Inspect the dataset records and download results in JSON, CSV, Excel, or other supported formats.
Scheduling & Automation
Scheduling
Automated Data Collection
Schedule runs to keep listing datasets fresh for market tracking, reporting, lead enrichment, and alerting workflows. Recurring runs are especially useful when you need consistent snapshots for the same location and filters.
- Navigate to Schedules in Apify Console
- Create a new schedule, such as daily, weekly, or custom cron
- Configure input parameters
- Enable notifications for run completion
- Add webhooks for automated processing
Integration Options
- CRM enrichment: sync public listing, agent, brokerage, price, and location attributes into account or lead records.
- BI dashboards: monitor pricing, availability, property category movement, and geographic coverage over time.
- Data warehouses: store repeated listing snapshots for historical analysis, modeling, and operational reporting.
- Webhooks: trigger validation, notification, enrichment, or ingestion workflows after each completed run.
- Google Sheets or Airtable: review smaller market samples, lead lists, or QA datasets with non-technical teams.
- Alerts and scheduled reports: notify teams when new matching listings, price bands, or open house records appear.
Export Formats And Downstream Use
Apify datasets can be exported or consumed by downstream systems for review, automation, and long-term storage.
- JSON: for APIs, applications, and data pipelines
- CSV or Excel: for spreadsheet workflows and manual review
- API access: for automated ingestion into internal systems
- BI and warehouses: for reporting, dashboards, and historical analysis
Performance
The following run times are estimates:
- Small runs (< 1,000 outputs): ~3-5 minutes
- Medium runs (1,000-5,000 outputs): ~5-15 minutes
- Large runs (5,000+ outputs): ~15-30 minutes
Execution time varies based on filters, result volume, and how much information is returned per record. Highly filtered runs can finish faster, while broad discovery or detail-rich records may take longer.
Limitations
- Availability depends on what Realtor.ca publicly exposes at run time.
- Some optional fields may be missing on sparse records, certain property types, or listings with limited public details.
- Very broad searches may take longer or require higher
limitvalues to collect enough records. - Target-side changes can affect field availability, labels, or naming.
- Regional, account, or availability differences may change visible results.
- Sold listing availability and detail level may differ from active for-sale or rental listings.
Troubleshooting
- No results returned: check filters, location spelling, listing category, and whether Realtor.ca has matching public records.
- Fewer results than expected: broaden filters, raise
limit, or verify that the selected location contains enough matching listings. - Some fields are empty: optional fields depend on what each public listing provides.
- Run takes longer than expected: reduce scope, lower
limitfor validation, or split broad collection into smaller location and filter segments. - Output changed: compare the current output with the field reference and report a small sample if support is needed.
FAQ
What data does this actor collect?
It collects public Realtor.ca listing records, including listing identifiers, URLs, prices, addresses, property attributes, building and land details, agents, brokerages, media, open house details, and listing status when available.
Can I filter by location, category, date, price, or other criteria?
Yes. The actor supports location, deal_type, property_type, building_type, publication_date, keyword, bedrooms, bathrooms, price range, building area, land area, storeys, year built, property tax, maintenance fee, and open house availability filters.
Why did I receive fewer results than my limit?
The selected location and filters may not have enough matching public records. Broaden the scope, remove optional filters, or try a nearby location if you need more results.
Can I schedule recurring runs?
Yes. Use Apify schedules to run the same location and filter configuration daily, weekly, or on a custom cron schedule.
How do I avoid duplicates across runs?
Use id as the preferred idempotency key. If id is not available in your destination system, use url, mls_number, or a composite key such as mls_number plus location.address.
Can I export the data to CSV, Excel, or JSON?
Yes. Apify datasets can be downloaded in JSON, CSV, Excel, and other supported formats, or consumed programmatically through Apify dataset access.
Does this actor collect private data?
No. The actor is intended to collect publicly available information visible on Realtor.ca. Users are responsible for ensuring their use of the data complies with applicable laws, regulations, and terms.
What should I include when reporting an issue?
Include the input used, a run ID, expected versus actual behavior, and a small output sample if it helps show the issue. Redact any sensitive operational context before sharing.
Compliance & Ethics
Responsible Data Collection
This actor collects publicly available real estate listing information from Realtor.ca for legitimate business purposes, including:
- Real estate research and market analysis
- Lead enrichment and operational reporting
- Inventory, pricing, and availability monitoring
Users are responsible for ensuring that their use of collected data complies with applicable laws, regulations, and the target site's terms. This section is informational and not legal advice.
Best Practices
- Use collected data in accordance with applicable laws, regulations, and the target site's terms
- Respect individual privacy and personal information
- Use data responsibly and avoid disruptive or excessive collection
- Do not use this actor for spamming, harassment, or other harmful purposes
- Follow relevant data protection requirements where applicable, such as GDPR and CCPA
Support
For help, use the actor page or Issues. Include the input used with sensitive values redacted, the run ID, the expected versus actual behavior, and a small output sample when useful. Avoid sharing private business data or credentials in support requests.