Canada Distressed Property Scraper at a glance
Canada Distressed Property Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes record id, country, source, title and distress type, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.40 per 1,000 results on the Apify Free plan and from $1.80 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Real Estate, Automation, Developer Tools
- Region
- North America
- Pricing
- $2.40 per 1,000 results (Free plan), from $1.80 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 24 options
Canadian tax-sale properties from taxsales.ca: tender and auction listings across 9 provinces with minimum bid, deadline or auction date, roll number, legal description and the municipality's notice, plus resume and incremental change tracking.
What Canada Distressed Property Scraper can do
- The whole list, not the first page. A province walk reads every open listing, not just the first screen. A full run returns all of Canada's open listings, over a thousand at the time of writing, and the run log states how many the portal reports.
- Tenders and auctions, told apart. Each record says whether it is a tender sale or an auction, and carries the right date: the tender deadline, or the auction day, time and place.
- What a buyer needs to decide. Minimum tender or reserve bid, assessed value, roll number, parcel identifier, legal description, where to submit a tender, the municipality's bidding conditions and the official notice link.
- Made for recurring monitoring. Resume an interrupted run from its ID, or let incremental mode return only NEW and UPDATED listings, with EXPIRED markers when a listing leaves the portal.
- Search by province or paste links. Walk whole provinces, or paste province, search and listing links.
- Honest by design. If the portal refuses every request the run fails with a clear message instead of an empty dataset that looks like "no results". A province with no open listings says so.
Choose what to collect
These inputs let you configure Canada Distressed Property Scraper. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring | How to discover records. 'search' walks the selected provinces with your filters. 'url' reads only the links you paste into urls. Pasted links are ignored in search mode; the run log tells you when that happens. |
provincesarray | Which provincial lists to walk, in order. Leave empty to walk all 9 provinces the portal publishes (British Columbia and Newfoundland and Labrador often have no open listings). |
statusstring | Listing status filter. Leave empty for the site default (active listings). |
typestring | Property type filter (search mode). Leave empty for any type. |
minTenderinteger | Only listings with a minimum tender at or above this amount (CAD). Empty = no limit. |
maxTenderinteger | Only listings with a minimum tender at or below this amount (CAD). Empty = no limit. |
closingIninteger | Only listings closing within this many days. Empty = no limit. |
Show 17 more inputs
| Input | What it controls |
|---|---|
sortstring | Order of the walk. Newest first is the default and the only order that pages stably; other orders can shift between pages and miss listings on long provinces. |
urlsarray | Pasted taxsales.ca links: province pages (/province/ontario/), municipality pages (/ontario/tiny/), search pages (/search/ with its province, status, type, tender, closing_in and sort filters and ?page=N, read from the page you paste) or listing pages (/listing//). The site ignores free-text q= on search links (the link returns the unfiltered list and the run warns); use the province, status, type, tender and closing filters. Listing links emit one enriched record each. The site home and results pages are not listing sources and are skipped with a warning. Read in url mode only; left untouched it scrapes the example links. |
fetchDetailsboolean | Open each listing's own page for the full record: price, tender deadline or auction date, roll number, parcel identifier, legal description, assessed value, where to submit or attend, the municipality's conditions, map location and status history. Adds one request and a small per-record charge; turn it off for a fast listing-only run. |
maxItemsinteger | Stop after this many results in total across all provinces. Default 50; 0 = no limit (a full run holds more than a thousand listings, so set a number you are happy to pay for). |
maxPagesinteger | Stop each walk after this many result pages (24 listings per page). 0 = read to the last page. Max items always applies too. |
resumeFromRunIdstring | Continue a previous run: only records not already in that run’s dataset are pushed. Leave empty for a fresh run. |
incrementalModeboolean | Track records across scheduled runs with the same scope. Compared: every returned field (title, status, minimum bid / amount, deadline, description, parties, details) except the built-in volatile ones (the daily status-history line, timestamps, change markers) and any you list under ignore fields; a change in any compared field makes the record UPDATED with changedFields. Only NEW or UPDATED records are returned (UNCHANGED suppressed). Records that disappear are marked EXPIRED only with Emit expired, only after a full uncapped scan of whole provinces. Mutually exclusive with Resume. |
stateKeystring | Name for the incremental baseline when you want to share one baseline across different filter variants. Leave empty to derive it from the scope automatically. |
emitUnchangedboolean | In incremental mode, also return records that did not change (marked UNCHANGED). |
emitExpiredboolean | In incremental mode, also return records seen previously that no longer appear (marked EXPIRED). Never emitted from a capped run, a pasted listing or search link. A listing dropping off the portal can mean sold, withdrawn or just hidden; read status for the outcome. |
changeScopestring | all (default) compares every field. priceAndStock compares only the minimum bid / amount, currency, status and deadline, so a description or detail edit never makes a record UPDATED. |
compactUpdatesboolean | UPDATED rows carry only identifiers, current bid / status / deadline and priceChanges {field: {old, new}}. NEW and EXPIRED rows stay full. The detail-enrichment charge is not applied to a compact row, because it no longer carries the detail data. |
expireAfterMissedScansinteger | With Emit expired, a record is marked EXPIRED only after it was missing from this many consecutive complete scans. Default 1. A missing listing is not proof it is unavailable; check status. |
ignoreFieldsForChangesarray | Advanced: record fields that should never count as a change (in addition to the built-in ignore list). Use a dotted path such as "details.img" to ignore one nested key. Example: ["valueText"]. |
mcpConnectorsarray | Optionally send a summary of each returned listing to connected apps. Authorize a connector under Apify > Settings > Integrations, then select it here. Notion creates a page per record; other connectors receive a best-effort write or digest. Leave empty to skip. Dataset results are unaffected. |
notionParentPageUrlstring | URL or ID of the Notion page where record pages should be created. Required for Notion; ignored by other connectors. |
maxNotifyListingsinteger | Maximum number of records written to each connector. Does not affect dataset output. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
recordIdRecord ID (text)countryCountry (text)sourceSource (text)titleTitle (text)distressTypeDistress type (text)caseNumberRoll number (text)deadlineAtTender deadline (text)auctionDateAuction date (text)locationLocation (text)valueAmountValue (number)valueCurrencyCCY (text)valueTextValue (text) (text)Show 9 more fields
statusStatus (text)urlURL (link)changeTypeChange (incremental mode) (text)firstSeenAtFirst seen (date)lastSeenAtLast seen (date)descriptionDescription (text)attachmentsAttachments (text)detailsDetails (text)changedFieldsChanged fields (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"recordId": "ca:taxsales.ca:sampletown-6001000001400000000",
"country": "ca",
"source": "taxsales",
"title": "123 Sample Road, Sampleton",
"distressType": "tax-sale",
"caseNumber": "6001000001400000000",
"deadlineAt": "2026-10-14T15:00:00-04:00",
"location": {
"address": "123 Sample Road, Sampleton",
"city": "Sampleton",
"region": "ON",
"country": "ca"
},
"valueAmount": 17518.55,
"valueCurrency": "CAD",
"valueText": "$17518.55",
"status": "Active",
"attachments": [
{
"label": "Map view",
"url": "https://example.com/sample-map.jpg"
}
],
"details": {
"saleMethod": "tender",
"valueKind": "Minimum tender",
"legalDescription": "PCL 1 SEC 1; LT 1 PL 1",
"pin": "12345-0001",
"assessedValue": 8500,
"submitTenders": "the Township of Sampleton, 1 Sample Street, Sampleton, ON",
"geo": "49.40000,-91.65000",
"locationApproximate": false,
"officialSourceUrl": "https://example.com/sample-notice",
"statusHistory": [
"Oct 12, 2026 - Active (Automated)"
]
},
"url": "https://www.taxsales.ca/listing/sampletown-6001000001400000000/"
}Ways to use this data
- Investors and buyers: find below-market properties sold for unpaid taxes, with the deadline and the conditions in one place.
- Real-estate professionals: watch tender deadlines and auction dates by province for clients.
- Lead-generation teams: feed new tax-sale listings into a CRM or alerts on a schedule.
- Analysts: compare tax-sale volumes and minimum bids across provinces.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Canada Distressed Property Scraper return?
The documented output for Canada Distressed Property Scraper includes record id, country, source, title, distress type, roll number, tender deadline and auction date. Availability of each field depends on the source page and the selected mode.
How much does Canada Distressed Property Scraper cost?
It costs $2.40 per 1,000 results on the Apify Free plan and from $1.80 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Which provinces have listings?
The portal covers Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Nova Scotia, Ontario, Quebec and Saskatchewan. Quebec and Nova Scotia hold most listings; British Columbia and Newfoundland and Labrador often have none open, and a run over them says so instead of failing. Prince Edward Island and the territories are not listed by the portal.
Can I get only new or changed records on a schedule?
Yes. Use incremental mode: the actor remembers its baseline per scope and returns only what changed (NEW, UPDATED), with optional EXPIRED markers for listings that left the portal. Use stateKey to share one baseline across slightly different input variants.
Why does a run return fewer records than I expected?
Max items (50 by default) stops the run once the cap is reached, newest listings first; raise it or set it to 0 to collect everything. Only listings that are open for tender or auction are returned, so closed and sold listings are not included.
Can I use it with AI agents or MCP?
Yes, the output is a clean JSON dataset that works with MCP connectors and any AI workflow. Use the mcpConnectors input to send results into your apps after each run.
