DuProprio Quebec FSBO New Listings Alert
Pricing
from $2.10 / 1,000 listing scrapeds
DuProprio Quebec FSBO New Listings Alert
Newest for-sale-by-owner homes, condos, lots and farms on DuProprio (Quebec) from a search URL or filters, one flat row each: price in CAD, address, city, bedrooms, bathrooms, living area, lot, tags, open house, photo, coordinates.
Pricing
from $2.10 / 1,000 listing scrapeds
Rating
0.0
(0)
Developer
Superslow Sloth
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Read DuProprio, Quebec's for-sale-by-owner real estate site, and get one flat row per property: price in Canadian dollars, address, city, region, property type, bedrooms, bathrooms, living area, lot area, the site's badges, open-house day, photo and coordinates. Newest first by default, so a scheduled run is a Quebec FSBO new-listing alert: you give it a search (a URL copied from the site, or a few filters) and it returns the latest homes, condos, cottages, multiplexes, lots, farms and commercial properties that match.
No account, no API key, no login, no browser. Each page of results holds 11 properties.
Input
| Field | Notes |
|---|---|
searchUrls | The most flexible input. Open duproprio.com in English, set any filters you like, sort by "New listings first" and copy the address of the results list (https://duproprio.com/en/search/list?...). One URL per line. Each is walked on its own. Paging parameters are replaced; every filter in the URL is kept. |
regions | Quebec regions to search (21, from Abitibi-Témiscamingue to Saguenay-Lac-Saint-Jean, with Montréal / l'Île and Laval). Several allowed. Empty means the whole province. |
cityIds | DuProprio city ids, for a search narrower than a region (the number in cities[]= in a search URL). Cannot be combined with regions: the site ignores cities whenever a region is set. |
propertyTypes | house, condo, cottage, multiplex, lot, commercial, farm. Empty means all. |
minPrice, maxPrice | Asking-price band in Canadian dollars, inclusive, either end optional. |
minBedrooms, minBathrooms | At least this many (1 to 5; 5 means 5 or more). |
listedWithin | any, 2, 7 or 30 days: the site's own "online for" filter. |
openHouseOnly | Only properties with an open house scheduled. |
sort | newest (default), oldest, price-asc, price-desc. A pasted URL that already has a sort keeps it. |
maxItems | Listings to read per search (default 100, up to 10,000). |
proxyConfiguration | Apify proxy by default. |
The filters are laid over each search URL: set maxPrice and every URL you
pasted gets that ceiling. With no URL, the filters build the search. With
neither, you get the newest properties in Quebec.
Using it as a new-listing alert
The result cards carry no publication date, so "new" is a comparison, not a
column. Run it on a schedule with sort: newest, keep the listing_ids you
have already seen, and treat the ids you have not as new. Newest first means a
small maxItems (one or two pages) is enough for a daily run.
Output
| Field | Notes |
|---|---|
search_url | The search that first found the row, as the results-page URL requested. |
listing_id, url | DuProprio's id and the absolute https://duproprio.com/en/... link. |
address, city | As the card prints them; city carries the borough in brackets where there is one (Longueuil (St-Hubert)). Address is null when the seller hides it. |
region_slug, city_slug | The region and city as they appear in the listing URL (laurentides, ste-adele). |
property_type | The type in the listing URL: home, bungalow, condo, semi-detached, townhouse, mobile-home, duplex, triplex, lot, farm, commercial-property, ... |
price_cad, price_text | The asking price as a whole number, and exactly as printed. Null price and Price upon request text when no amount is shown. |
bedrooms | Null when the card shows none (lots, commercial). |
bathrooms, half_bathrooms | From the card's "Bathrooms + Half baths" figure: 1 + 1 is 1 and 1. A single number is bathrooms only; half_bathrooms is then null, not 0. |
living_area_sqft, lot_area_sqft | Square feet, whole numbers, as the site prints them. Null when not shown. |
intro | The card's one-line description, cut short by the site with .... |
tags | The card's plain badges in order: No Agents, Waterfront, Available Now, Price Taxes Not Included, With garage, ... |
open_house | The open-house badge as text (Sunday October 11th). The site prints no year, so it is not a date. |
has_3d_tour | True for the "3D Virtual Tour" badge. |
is_featured, newly_built, builder_id | DuProprio's flags: promoted card, filed under "newly built", and the builder's id. |
image_url | The main photo (600 px). Nothing is downloaded. |
latitude, longitude | From the results page's structured data; the point DuProprio places the listing at. |
page, position | The result page (1-based) and place on it. |
Honest nulls
A field the card does not print is null, never 0 or "". A lot has no
bedrooms; a condo has no lot size; a seller can leave the price out. Prices are
taken as printed: sellers occasionally enter a placeholder (a lot listed at $6
was seen), and the row carries it.
Personal data
Cards show a property's street address and an intro the seller wrote. They are carried as DuProprio publishes them; nothing is looked up, and no seller name, phone number or e-mail is on the results cards or collected.
Pricing
Pay per event:
- $0.002 per run (
actor-start), charged only after your input is validated, so a run that fails on bad input costs nothing. - $0.0021 per listing row written (
listing-scraped), i.e. $2.10 per 1,000 listings.
How it fetches
It reads the server-rendered results list at duproprio.com/en/search/list
(about 1.4 MB per page, 11 properties) and parses the property cards and the
page's structured data. Measured 2026-10-11 from a plain connection: HTTP 200
on every page, and from an Apify datacenter address: pages 1 and 2 both came
back with their 11 cards. A 403, 429, 5xx, or a 200 that is neither a results page nor the
site's "No property found" page is treated as a refusal: the actor rotates to a
fresh address and retries.
Things worth knowing, all measured:
- The site ignores a filter value it does not understand. An unknown region, a text price or a made-up sort comes back as the unfiltered list of all ~7,900 properties with HTTP 200. The actor therefore checks every filter against what the site offers before sending it, and fails the run before charging anything when one is wrong. A search URL you paste is sent as it is; check the first rows if you edited it by hand.
- A page past the end redirects to the start. Asking for page 5 of a 3-page search returns the unfiltered first page. The actor reads the page number the response says it is and stops there, so it never writes the wrong list as results. A walk ends on the site's own "no next page".
- The whole province is about 7,900 properties on 719 pages and every page of it was served; there is no hidden serving limit below that.
search=trueis what makes the site apply a filter. The actor always sends it, including on a pasted URL that lacks it.- Cities need ids and exclude regions.
cities[]filters on its own, but is ignored when a region is also set, so the two inputs cannot be combined. - Counts move. The "properties found" figure changes between requests as listings are added and sold; a listing seen twice is returned once.
- Promoted builder cards (
is_featured) are real listings with their own ids, pinned into pages of the list; they are rows like any other.