Realtor.CA Commercial Scraper | Enterprise Grade
Pricing
from $0.70 / 1,000 results
Realtor.CA Commercial Scraper | Enterprise Grade
Extract structured Canada commercial real estate listings from Realtor.ca with property signals, seller details, media assets, contact data and more. Built for enterprise-grade Canada commercial property intelligence, listing monitoring, lead enrichment and automated analytics pipelines.
Pricing
from $0.70 / 1,000 results
Rating
3.0
(1)
Developer
Fatih Tahta
Maintained by CommunityActor stats
1
Bookmarked
4
Total users
2
Monthly active users
8 days ago
Last modified
Categories
Share
Realtor.ca Commercial Scraper
Slug: fatihtahta/realtor-ca-commercial-scraper
Overview
Realtor.ca Commercial Scraper collects structured commercial property listing records from Realtor.ca, including listing identity, pricing, location, building and land attributes, broker and agent contacts, media, listing status, and source provenance. Realtor.ca is one of Canada's primary real estate listing portals, making its commercial listing data useful for market analysis, lead generation, competitive monitoring, and operational reporting. The actor turns public listing pages and search results into repeatable JSON records that are easier to load into analytics tools, CRMs, data warehouses, and enrichment workflows. It is designed for consistent recurring data acquisition across Canadian locations, deal types, and commercial property segments. Results reflect the public data available at run time and should be validated against your own business rules before production use.
Why Use This Actor
- Market research and analytics teams: Build structured extraction workflows for pricing, availability, geographic distribution, property types, and listing status.
- Product and content teams: Populate internal tools, content databases, and market pages with normalized commercial listing attributes.
- Developers and data engineering teams: Feed downstream systems with predictable JSON records suitable for ETL, warehouse ingestion, and API-backed applications.
- Lead generation and enrichment teams: Create targeted prospect lists from public listings, agents, brokerages, property categories, and locations.
- Monitoring and competitive intelligence teams: Schedule recurring runs to observe market movement, new listings, sold records, lease inventory, and category-level changes.
Common Use Cases
- Market intelligence: Monitor commercial supply, pricing, listing status, and location coverage across Canadian markets.
- Lead generation: Build targeted prospect datasets from public commercial listings, agents, and brokerage records.
- Competitive monitoring: Track changes in commercial inventory by property type, geography, deal type, and listing recency.
- Catalog and directory building: Populate internal databases with normalized commercial property records and contact metadata.
- Data enrichment: Add current public listing details to existing CRM, BI, or market research datasets.
- Recurring reporting: Schedule periodic runs for dashboards, alerts, trend analysis, and operational reporting.
Quick Start
- Enter a Canadian
location, such asOttawa, Ontario,Toronto,Vancouver, orNova Scotia. - Choose a
deal_type:sale,lease, orsold. - Set a small
limit, such as25, for your first validation run. - Run the actor in Apify Console.
- Inspect the first dataset records to confirm the fields match your workflow.
- Increase
limit, add filters, enable broader coverage, or schedule the actor after validating the output.
Input Parameters
This actor accepts one required location and optional commercial listing filters for deal type, property category, price, land size, building size, date, keyword, sort order, coverage, and output limit.
| Parameter | Type | Description | Default |
|---|---|---|---|
location | string | Canadian location to search. Use a city, province, neighborhood, or city with province, such as Ottawa, Ontario. Required. | Ottawa, Ontario prefill |
deal_type | string | Listing category. Allowed values: sale, lease, sold. | sale |
sold_within_days | string | Sold listing recency window. Used only when deal_type is sold. Allowed values: all, 7, 14, 30, 90, 180, 365. | 365 |
property_type | string | Commercial property category. Allowed values: business, multi_family, retail, industrial, office, vacant_land, agriculture, hospitality, institutional. | - |
publication_date | string | Earliest publication date for listings, formatted as a date value. Leave empty to include listings regardless of publication date. | - |
keyword | string | Keyword or phrase to match against listing text. Leave empty when no text filter is needed. | - |
min_price | integer | Minimum asking price in CAD. Applies to sale and sold listings; ignored for lease searches. | - |
max_price | integer | Maximum asking price in CAD. Applies to sale and sold listings; ignored for lease searches. | - |
exterior_building_size | string | Exterior building size range. Allowed values: 0-5000, 5001-10000, 10001-15000, 15001-20000, 20001-25000, 25001-30000, 30001-35000, 35001-40000, 40001-45000, 45001-50000, 50001-75000, 75001-100000, 100001-150000, 150001-200000, 200001-250000, 250001-0. Values represent square feet. | - |
min_land_area | number | Minimum land area in acres. | - |
max_land_area | number | Maximum land area in acres. | - |
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 match min_year_built. | - |
min_property_tax | string | Minimum annual property tax amount. Allowed values: 250, 500, 1000, 2000, 3000, 4000, 5000, 6000, 8000, 10000, 20000. | - |
max_property_tax | string | Maximum annual property tax amount. Allowed values match min_property_tax. | - |
min_maintenance_fee | string | Minimum monthly maintenance fee. Allowed values: 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1500, 2000. | - |
max_maintenance_fee | string | Maximum monthly maintenance fee. Allowed values match min_maintenance_fee. | - |
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 | When enabled, collects more matching listings for broad searches while respecting filters and limit. Disable for faster exploratory runs. | true |
limit | integer | Maximum number of listing records to save. Minimum value is 1. | 100 prefill |
Choosing Inputs
Use location as the primary scope control. Specific locations such as neighborhoods or city-province combinations produce more targeted datasets, while broader provinces or large metro areas improve discovery. Use deal_type to separate sale, lease, and sold workflows; this is especially useful when syncing results into downstream systems with different business rules.
Filters such as property_type, keyword, publication_date, price, land area, building size, year built, property tax, and maintenance fee narrow the dataset. Broader filters are better for discovery, while narrower filters are better for repeatable reporting and segmented monitoring. Start with a small limit to verify the output shape and then increase it once the first records match your use case. Use sort_option when the order of collected listings matters, such as newest listings first or price-based review.
Example Inputs
Scenario: Lease listings in Ottawa
{"location": "Ottawa, Ontario","deal_type": "lease","property_type": "multi_family","limit": 50,"sort_option": "date_desc","maximize_coverage": false}
Scenario: Sold retail properties in Toronto
{"location": "Toronto, Ontario","deal_type": "sold","sold_within_days": "90","property_type": "retail","min_price": 500000,"max_price": 5000000,"limit": 100,"sort_option": "price_desc"}
Scenario: Targeted office discovery in Vancouver
{"location": "Vancouver, British Columbia","deal_type": "sale","property_type": "office","publication_date": "2026-05-01","keyword": "medical","min_land_area": 0.25,"limit": 75,"maximize_coverage": true}
Output
9.1 Output destination
The actor writes commercial property listing rows to the default Apify dataset. Each row uses one normalized real estate envelope, so sale, lease, and sold listings share the same top-level groups while optional fields appear only when Realtor.ca provides them.
The optional results-map key-value-store artifact remains a visual review aid for rows with coordinates; the dataset is the primary machine-readable output.
9.2 Record envelope and stable identifiers
Use record_id as the preferred dedupe and upsert key. It is derived from the Realtor.ca listing identifier when available, with source IDs also retained under source_context.external_ids, entity.external_ids, and listing. The source listing URL is available at entity.url, source_context.listing_url, and source_context.canonical_url.
Top-level groups:
| Field | Type | Description |
|---|---|---|
record_type | string | Stable discriminator. Listing rows use property_listing. |
record_id | string | Stable listing key for dedupe and recurring syncs. |
source_context | object | Source name, domain, URLs, seed context, page index, source IDs, and raw source provenance. |
entity | object | Human-facing listing identity: title, description, URL, category, and external IDs. |
listing | object | Listing-level business context such as MLS number, deal type, status, sold flags, recency, and open houses. |
pricing | object | Price text, numeric price, currency, original listing price, price changes, and source price values. |
location | object | Address, postal code, province, country, coordinates, and source display flags. |
property | object | Commercial property characteristics: type, building, land, ownership, parking, business, farm, zoning, and amenities. |
availability | object | Viewing and availability-style details such as open house events. |
media | object | Main image, image records, video records, floor plans, and public listing links. |
contact_details | object | Embedded public agent and brokerage contact records. |
relationships | object | Linked real estate entities such as agents, brokerages, and agency records. |
metrics | object | Source-provided counts, distance values, or market signals when available. |
attributes | object | Tags, source-specific values, and a raw preservation bucket for meaningful values that do not fit a stronger group. |
9.3 Example record
{"record_type": "property_listing","record_id": "29857918","source_context": {"source_name": "Realtor.ca","source_domain": "realtor.ca","source_url": "https://api2.realtor.ca/Listing.svc/AsyncPropertySearch_Post?CurrentPage=1","listing_url": "https://www.realtor.ca/real-estate/29857918/146-148-dalhousie-street-ottawa-4001-lower-townbyward-market","canonical_url": "https://www.realtor.ca/real-estate/29857918/146-148-dalhousie-street-ottawa-4001-lower-townbyward-market","seed_type": "query","seed_value": "Ottawa, Ontario","seed_id": "7cb78a2f9284","page_index": 1,"language": "en-CA","external_ids": {"realtor_listing_id": "29857918","mls_number": "X13245650"},"raw": {"relative_urls": {"details": "/real-estate/29857918/146-148-dalhousie-street-ottawa-4001-lower-townbyward-market"},"timestamps": {"inserted": "2026-06-05T00:55:18.173000+00:00"},"bounds_label": "Ottawa, ON, Canada"}},"entity": {"title": "146-148 DALHOUSIE STREET, Ottawa, Ontario K1N7C4","url": "https://www.realtor.ca/real-estate/29857918/146-148-dalhousie-street-ottawa-4001-lower-townbyward-market","category": "Retail","external_ids": {"realtor_listing_id": "29857918","mls_number": "X13245650"}},"listing": {"listing_id": "29857918","mls_number": "X13245650","deal_type": "sale","listing_status": "1","time_on_realtor": "5 hours ago","has_new_image_update": true},"pricing": {"price_text": "$2,695,000","price": 2695000,"currency": "CAD","short_value": "2.7M"},"location": {"address": "146-148 DALHOUSIE STREET, Ottawa, Ontario K1N7C4","postal_code": "K1N7C4","province": "Ontario","country": "Canada","country_code": "CA","coordinates": {"latitude": 45.4332481,"longitude": -75.6952881},"permit_show_address": true},"property": {"property_type": "Retail","property_type_id": "305","building": {"size_interior": "6000 sqft"},"land": {"size_total": "38.52 x 69.16 FT","size_frontage": "38 ft ,6 in"}},"media": {"main_image_url": "https://cdn.realtor.ca/listings/example/highres/0/x13245650_1.jpg","images": [{"sequence": 1,"high_res_url": "https://cdn.realtor.ca/listings/example/highres/0/x13245650_1.jpg"}]},"contact_details": {"contacts": [{"id": "1562423","name": "Nancy O'Dea","position": "Salesperson","phones": [{"type": "Telephone","number": "613-286-9881"}]}]},"relationships": {"agents": [{"id": "1562423","name": "Nancy O'Dea"}],"brokerages": [{"id": "278405","name": "ENGEL & VOLKERS OTTAWA","designation": "Brokerage"}]},"attributes": {"tags": [{"label": "5 hours ago","listing_tag_type_id": "1"}],"source_specific": {"uploaded_by": "76"}}}
9.4 Field notes
pricing.price_text preserves the public source wording, while pricing.price is present only when the amount can be parsed safely. Postal codes, listing IDs, MLS numbers, contact IDs, phone numbers, and source IDs are strings. Source-specific fields are preserved under source_context.raw, attributes.source_specific, or attributes.raw_attributes instead of becoming top-level clutter.
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 UI 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, property type, or deal type per run when you need clean segmentation.
- Leave optional filters empty when the goal is broad market discovery.
- Add filters gradually to understand how each field changes coverage.
- Use
deal_typeto keep sale, lease, and sold workflows separate. - Schedule recurring runs for monitoring workflows instead of relying on manual one-off collection.
- Use stable identifiers such as
idandurlfor 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, deal type, and filters.
- Set the maximum number of outputs to collect with
limit. - Click Start and wait for the run to finish.
- Open the dataset and inspect the first records.
- Download results in JSON, CSV, Excel, or other supported formats.
Scheduling & Automation
Scheduling
Automated Data Collection
Use schedules to keep commercial listing datasets fresh for monitoring, reporting, and enrichment workflows. Scheduled runs are most useful when the same location, property type, and deal type need to be collected repeatedly.
- Navigate to Schedules in Apify Console
- Create a new schedule, such as daily, weekly, or a custom cron interval
- Configure input parameters
- Enable notifications for run completion
- Add webhooks for automated processing
Integration Options
- CRM enrichment: sync public listing, brokerage, and agent attributes into account, lead, or opportunity records.
- BI dashboards: monitor pricing, availability, property type movement, and geographic coverage over time.
- Data warehouses: load normalized listing records for historical analysis and operational reporting.
- Google Sheets or Airtable: review smaller datasets, qualify leads, and coordinate manual follow-up.
- Webhooks: trigger validation, notification, or ingestion workflows after each completed run.
- Alerts and scheduled reporting: notify teams when new listings, sold records, or targeted property segments appear.
Export Formats And Downstream Use
Apify datasets can be exported or consumed by downstream systems for reporting, automation, and application workflows.
- 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
Estimated run times:
- 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 or listing types with limited public details.
- Very broad searches may take longer or require a higher
limitto collect enough records. - Target-side changes can affect field availability, labels, or naming.
- Regional, account, or availability differences may change visible results.
- Sold, lease, and sale records may expose different pricing, status, and timestamp fields.
Troubleshooting
- No results returned: Check filter combinations, location spelling, property type selection, and whether Realtor.ca has matching public records.
- Fewer results than expected: Broaden filters, raise
limit, or verify that the target location contains enough matching commercial listings. - Some fields are empty: Optional fields depend on what each listing publicly provides.
- Run takes longer than expected: Reduce scope, lower
limitfor validation, or split broad collection into smaller market segments. - Output changed: Compare the current output with the field reference and include a small sample when reporting the issue.
FAQ
What data does this actor collect?
It collects public commercial property listing records from Realtor.ca, including identity fields, pricing, location, property attributes, media, status, agent and brokerage contacts, and source provenance.
Can I filter by location, category, date, price, or other criteria?
Yes. The actor supports location, deal_type, property_type, publication_date, keyword, price ranges, land area, exterior building size, year built, property tax, maintenance fee, sort order, coverage, and output limit.
Why did I receive fewer results than my limit?
The source may have fewer matching public listings than requested, filters may be narrow, or some listings may not provide enough usable information to save as records.
Can I schedule recurring runs?
Yes. Use Apify schedules to run the actor daily, weekly, or on a custom interval for monitoring and reporting workflows.
How do I avoid duplicates across runs?
Use id as the primary idempotency key. If id is unavailable, use url, then mls_number, or a composite key appropriate for your destination system.
Can I export the data to CSV, Excel, or JSON?
Yes. Apify datasets support export formats such as JSON, CSV, Excel, and other formats available in Apify Console.
Does this actor collect private data?
It is intended to collect publicly available listing information from Realtor.ca. Users are responsible for ensuring their use of the data complies with applicable laws and terms.
What should I include when reporting an issue?
Include the input used, the run ID, expected versus actual behavior, and a small output sample when possible.
Compliance & Ethics
Responsible Data Collection
This actor collects publicly available commercial real estate listing information from Realtor.ca for legitimate business purposes, including:
- Commercial real estate research and market analysis
- Lead generation and enrichment for public listing, agent, and brokerage workflows
- Operational reporting and monitoring for pricing, availability, and market coverage
This section is informational and not legal advice. Users are responsible for confirming that their collection and use of data complies with applicable laws, regulations, and contractual obligations.
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 Issues tab or the actor page in Apify Console. Include the input used, with sensitive values redacted if needed; the run ID; expected versus actual behavior; and a small output sample when relevant. Avoid sharing private credentials, proprietary datasets, or unnecessary personal information in support requests.