# DuProprio Property Scraper (`solidcode/duproprio-scraper`) Actor

\[💰 $5.0 / 1K] Extract for-sale-by-owner listings from DuProprio, Canada's largest FSBO real estate platform. Get price, exact address and geo, property type, beds/baths, area, per-room dimensions, taxes, condo fees, construction year, mortgage estimate, and photos. Search by region or paste URLs.

- **URL**: https://apify.com/solidcode/duproprio-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## DuProprio Property Scraper

Pull for-sale-by-owner property listings from DuProprio at scale — asking prices, exact street addresses, map coordinates, per-room dimensions, split municipal and school taxes, condo fees, construction year, and full photo galleries for every home listed directly by its owner across Quebec. Built for real estate investors, relocating home buyers, and market analysts who need clean, structured FSBO data without manually combing DuProprio one listing at a time.

### Why This Scraper?

- **All 19 Quebec regions covered** — from Montreal, Montérégie, and Laval to Gaspésie–Îles-de-la-Madeleine and Nord-du-Québec, search the whole province or narrow to one region without hand-building a single URL.
- **Seven property type filters** — house, condo/apartment, plex (duplex, triplex), cottage/country home, mobile home, farm/acreage, or vacant lot/land.
- **Exact address plus map coordinates** — full street address, city, postal code, and precise latitude/longitude on every enriched listing, ready to drop straight onto a map.
- **Per-room dimensions and flooring** — each room broken out with its name, measured dimensions, and floor covering, not just a bedroom count.
- **Municipal and school taxes split out** — annual property tax and school tax reported as separate line items, plus condo/co-ownership fees where they apply.
- **Direct-from-owner FSBO listings** — every property comes straight from the seller with no agent middleman, the differentiator that sets DuProprio apart from agency portals.
- **Sale and rental in one actor** — flip a single dropdown to switch between for-sale asking prices and monthly rents.
- **Bilingual English and French output** — pull titles, descriptions, and feature labels in either language; DuProprio serves both and you pick per run.
- **Construction year, living space, lot size, and categorized features** — year built, living-space area, lot dimensions, and grouped feature sets (heating, services, and more) on every detail-enriched row.

### Use Cases

**Real Estate Investment**
- Compare owner asking prices against split municipal and school tax burdens by region
- Spot below-market FSBO listings before they reach agency portals
- Analyze price per square foot across Quebec regions using living-space area
- Track condo-fee levels across buildings to underwrite carrying costs

**Relocation & Home Search**
- Map available homes by exact coordinates around a new workplace or school
- Filter by minimum bedrooms and bathrooms to match family needs
- Read full listing descriptions and per-room layouts in English or French
- Watch a specific region or city for new owner-listed properties

**Market Research & Analytics**
- Build a province-wide FSBO inventory dataset across all 19 regions
- Compare house, condo, plex, and land supply by region and price band
- Track construction-year distribution to profile neighbourhood housing stock
- Measure asking prices against municipal assessment values where disclosed

**Lead Generation**
- Feed FSBO listings to mortgage brokers and moving-service providers targeting owner-sellers
- Build region-scoped prospect lists for agents offering seller representation
- Enrich existing property CRMs with fresh Quebec owner-listed inventory

**Data & Integration**
- Power real estate comparison tools and neighbourhood market reports
- Feed structured listing rows into dashboards and BI pipelines
- Sync new listings into Google Sheets or a database on a schedule

### Getting Started

#### Simple Guided Search

No URL needed — pick a region and let the scraper build the search:

```json
{
    "region": "montreal",
    "maxResults": 50
}
````

#### Region With Filters

Narrow by property type, price, and rooms:

```json
{
    "region": "monteregie",
    "propertyTypes": ["condo"],
    "maxPrice": 400000,
    "minBedrooms": 2,
    "minBathrooms": 1,
    "scrapeDetails": true,
    "maxResults": 100
}
```

#### Paste DuProprio URLs

Already built a search on the site, or have specific listings in mind? Paste search-result pages or individual property URLs directly:

```json
{
    "startUrls": [
        "https://duproprio.com/en/search/list?search=true&regions[0]=6",
        "https://duproprio.com/en/montreal/le-plateau-mont-royal/condo/hab-example-1234567"
    ],
    "maxResults": 200
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | string\[] | sample search URL | Paste one or more DuProprio URLs — either search-result pages (copy from your browser after applying filters on duproprio.com) or individual property detail pages. Filters are read straight from each search URL, so the Build a Search fields are ignored when URLs are supplied. |

#### Build a Search

Ignored when `startUrls` are supplied. Use these to search without touching the site.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `transactionType` | select | `For sale` | Whether to find properties For sale or For rent. |
| `region` | select | `Any region` | Quebec region to search: Montreal, Montérégie (Rive-Sud), Montérégie Ouest, Laurentides, Lanaudière, Laval, Estrie, Outaouais, Capitale-Nationale (Quebec City), Québec Rive-Sud (Lévis), Mauricie, Centre-du-Québec, Chaudière-Appalaches, Saguenay–Lac-Saint-Jean, Bas-Saint-Laurent, Abitibi-Témiscamingue, Côte-Nord, Gaspésie–Îles-de-la-Madeleine, or Nord-du-Québec. |
| `location` | string | `""` | Optional city or neighbourhood name to refine the search (for example "Montreal", "Sherbrooke", or "Laval"). |
| `propertyTypes` | select\[] | `[]` (all) | Limit to these types: House, Condo / Apartment, Plex (duplex, triplex, etc.), Cottage / Country home, Mobile home, Farm / Acreage, Residential lot / Land, or Commercial. Empty includes all. |

#### Price, Rooms & Size

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `minPrice` | integer | (none) | Only include listings at or above this price, in CAD. For rentals this is the monthly rent. |
| `maxPrice` | integer | (none) | Only include listings at or below this price, in CAD. For rentals this is the monthly rent. |
| `minBedrooms` | integer | (none) | Only include properties with at least this many bedrooms. |
| `minBathrooms` | integer | (none) | Only include properties with at least this many bathrooms. |

#### Output

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `scrapeDetails` | boolean | `true` | Follow each listing to its page for full data: room dimensions, feature groups (heating, services), living space and lot area, construction year, taxes, condo fees, and municipal assessment. Turn off for a faster, lighter run that returns only summary fields. |
| `language` | select | `English` | Language for listing text (titles, descriptions, feature labels). DuProprio serves both English and French. |
| `maxResults` | integer | `100` | Maximum listings to collect across all URLs and searches. Set to 0 for as many as available (up to a built-in safety cap). Start with 10–50 to test. |
| `maxResultsPerUrl` | integer | `0` | Maximum listings per individual URL or search. 0 means no per-URL limit. |
| `ignoreUrlFailures` | boolean | `true` | Skip any URL or search that fails and continue with the rest. Turn off to stop on the first failure. |

### Output

Each listing is one flat row. Here is a representative result with full details enabled:

```json
{
    "id": "1234567",
    "url": "https://duproprio.com/en/montreal/le-plateau-mont-royal/condo/hab-example-1234567",
    "title": "Bright 2-bedroom condo in Le Plateau-Mont-Royal",
    "transactionType": "sale",
    "propertyType": "Condo / Apartment",
    "price": 549000,
    "address": "1234 Rue Saint-Denis",
    "city": "Montréal",
    "region": "QC",
    "postalCode": "H2X 3K2",
    "latitude": 45.51861,
    "longitude": -73.58182,
    "bedrooms": 2,
    "bathrooms": 1,
    "halfBaths": 1,
    "levels": 1,
    "livingSpaceArea": "1,020 sq. ft.",
    "lotDimensions": "N/A",
    "constructionYear": 1998,
    "municipalTaxes": 2603,
    "schoolTaxes": 328,
    "condoFees": 3108,
    "municipalAssessment": 422200,
    "availability": "30 days after acceptance",
    "rooms": [
        { "name": "Living room", "dimensions": "12 x 15 ft", "flooring": "Hardwood" },
        { "name": "Master bedroom", "dimensions": "11 x 13 ft", "flooring": "Hardwood" }
    ],
    "features": {
        "Heating": ["Electric baseboard"],
        "Services": ["Elevator", "Storage"]
    },
    "description": "Sun-filled corner unit steps from Mont-Royal metro, with an open kitchen...",
    "imageUrls": [
        "https://photos.duproprio.com/example-1.jpg",
        "https://photos.duproprio.com/example-2.jpg"
    ],
    "scrapedAt": "2026-07-03T14:30:00Z"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | DuProprio listing identifier |
| `url` | string | Canonical listing URL |
| `title` | string | Listing title / heading |
| `transactionType` | string | `sale` or `rent` |
| `propertyType` | string | Property category — House, Condo / Apartment, Plex, Cottage / Country home, Mobile home, Farm / Acreage, Vacant lot / Land, or Commercial |
| `price` | number | Asking price in CAD (monthly rent for rentals) |
| `availability` | string | Availability / occupancy note |
| `description` | string | Full listing description (detail only) |
| `scrapedAt` | string | ISO-8601 timestamp of data extraction |

#### Location

| Field | Type | Description |
|-------|------|-------------|
| `address` | string | Street address (where disclosed) |
| `city` | string | City / municipality |
| `region` | string | Quebec region / province code |
| `postalCode` | string | Postal code (where disclosed) |
| `latitude` | number | Property latitude |
| `longitude` | number | Property longitude |

#### Size & Rooms

| Field | Type | Description |
|-------|------|-------------|
| `bedrooms` | integer | Bedroom count |
| `bathrooms` | integer | Bathroom count |
| `halfBaths` | integer | Half-bath / powder-room count |
| `levels` | integer | Number of levels / storeys |
| `livingSpaceArea` | string | Living space (sq ft / m²) |
| `lotDimensions` | string | Lot size / dimensions |
| `constructionYear` | integer | Year built |
| `rooms` | object\[] | Each room with name, dimensions, and flooring (detail only) |
| `features` | object | Categorized feature groups — heating, services, and more (detail only) |

#### Financials & Taxes

| Field | Type | Description |
|-------|------|-------------|
| `municipalTaxes` | number | Annual municipal taxes (CAD) |
| `schoolTaxes` | number | Annual school taxes (CAD) |
| `condoFees` | number | Annual condo / co-ownership fees (CAD), where the building has them |
| `municipalAssessment` | number | Municipal assessment value in CAD, where disclosed (detail only) |

#### Media

| Field | Type | Description |
|-------|------|-------------|
| `imageUrls` | string\[] | Photo gallery URLs |

### Tips for Best Results

- **Start small** — set `maxResults` to 10–50 on your first run to confirm the data matches your needs, then scale up.
- **Leave details on for the rich fields** — per-room dimensions, taxes, condo fees, construction year, coordinates, and full descriptions only populate when `scrapeDetails` is on. Turn it off only when you want a fast summary-only pass.
- **Use the region dropdown over hand-built URLs** — picking a region and property type is more reliable than copying a filtered search link, and covers all 19 Quebec regions.
- **Refine with the Location field** — set a city or neighbourhood name like "Sherbrooke" to zoom in below the region level; it accepts both English and French place names.
- **Mix URLs and guided search across runs** — paste specific listing URLs when you already know the properties, or build a fresh region search when you want the full inventory.
- **Watch a region on a schedule** — re-run the same region and filters daily to catch new owner listings as they post; rows carry a `scrapedAt` timestamp for change tracking.
- **Split taxes tell the real carrying cost** — DuProprio reports municipal and school taxes separately plus condo fees, so add all three (not just the asking price) when comparing true monthly cost across listings.

### Pricing

**From $5.00 per 1,000 results** — undercuts comparable DuProprio scrapers while returning richer per-listing detail. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.60 | $0.57 | $0.53 | $0.50 |
| 1,000 | $6.00 | $5.65 | $5.30 | $5.00 |
| 10,000 | $60.00 | $56.50 | $53.00 | $50.00 |
| 100,000 | $600.00 | $565.00 | $530.00 | $500.00 |

A "result" is any property row in the output dataset. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate real estate research, market analysis, and lead generation. Users are responsible for complying with applicable laws and DuProprio's Terms of Service. Do not use extracted data for spam, harassment, or any unlawful purpose, and handle any personal data in accordance with applicable privacy regulations. </content> </invoke>

# Actor input Schema

## `startUrls` (type: `array`):

Paste one or more DuProprio URLs — either search-result pages (copy the URL from your browser after applying filters on duproprio.com) or individual property detail pages. The scraper reads every filter straight from each search URL, so the Search Filters below are ignored for these. Use this when you already built a search on the site.

## `transactionType` (type: `string`):

Whether to find properties for sale or for rent. Only applies when you build a search below (not when pasting URLs).

## `region` (type: `string`):

Quebec region / area to search. Leave as 'Any region' to search the whole province, or narrow to a specific region. For a specific city or neighbourhood, use the Location field below.

## `location` (type: `string`):

Optional city or neighbourhood name to refine the search (for example 'Montreal', 'Sherbrooke', or 'Laval'). Leave empty to search the whole region selected above. Only applies when building a search (ignored when URLs are provided).

## `propertyTypes` (type: `array`):

Limit results to these property types. Leave empty to include all types.

## `minPrice` (type: `integer`):

Only include listings at or above this price, in Canadian dollars. For rentals this is the monthly rent. Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Only include listings at or below this price, in Canadian dollars. For rentals this is the monthly rent. Leave empty for no maximum.

## `minBedrooms` (type: `integer`):

Only include properties with at least this many bedrooms. Leave empty for any.

## `minBathrooms` (type: `integer`):

Only include properties with at least this many bathrooms. Leave empty for any.

## `scrapeDetails` (type: `boolean`):

Follow each listing to its page to collect full data: room dimensions, feature groups (heating, services), living space and lot area, construction year, annual taxes, annual condo fees, and municipal assessment. Turn off for a faster, lighter run that returns only the summary fields shown in search results.

## `language` (type: `string`):

Language for listing text (titles, descriptions, feature labels). DuProprio serves both English and French.

## `maxResults` (type: `integer`):

Maximum number of listings to collect across all URLs and searches. Set to 0 for as many as available (up to a built-in safety cap). Tip: start with 10-50 to test, then increase.

## `maxResultsPerUrl` (type: `integer`):

Maximum listings to collect from each individual URL or search. Set to 0 for no per-URL limit (the overall Max Results still applies).

## `ignoreUrlFailures` (type: `boolean`):

When enabled, the scraper skips any URL or search that fails and continues with the rest. When disabled, the run stops on the first failure.

## Actor input object example

```json
{
  "startUrls": [
    "https://duproprio.com/en/search/list?search=true&regions[0]=6"
  ],
  "transactionType": "sale",
  "region": "",
  "propertyTypes": [],
  "scrapeDetails": true,
  "language": "en",
  "maxResults": 100,
  "maxResultsPerUrl": 0,
  "ignoreUrlFailures": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped property listings with key fields.

## `detail` (type: `string`):

Full per-listing detail including price, taxes, rooms, features, and municipal assessment.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://duproprio.com/en/search/list?search=true&regions[0]=6"
    ],
    "transactionType": "sale",
    "region": "",
    "location": "",
    "propertyTypes": [],
    "scrapeDetails": true,
    "language": "en",
    "maxResults": 100,
    "maxResultsPerUrl": 0,
    "ignoreUrlFailures": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/duproprio-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": ["https://duproprio.com/en/search/list?search=true&regions[0]=6"],
    "transactionType": "sale",
    "region": "",
    "location": "",
    "propertyTypes": [],
    "scrapeDetails": True,
    "language": "en",
    "maxResults": 100,
    "maxResultsPerUrl": 0,
    "ignoreUrlFailures": True,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/duproprio-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://duproprio.com/en/search/list?search=true&regions[0]=6"
  ],
  "transactionType": "sale",
  "region": "",
  "location": "",
  "propertyTypes": [],
  "scrapeDetails": true,
  "language": "en",
  "maxResults": 100,
  "maxResultsPerUrl": 0,
  "ignoreUrlFailures": true
}' |
apify call solidcode/duproprio-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=solidcode/duproprio-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "DuProprio Property Scraper",
        "description": "[💰 $5.0 / 1K] Extract for-sale-by-owner listings from DuProprio, Canada's largest FSBO real estate platform. Get price, exact address and geo, property type, beds/baths, area, per-room dimensions, taxes, condo fees, construction year, mortgage estimate, and photos. Search by region or paste URLs.",
        "version": "1.0",
        "x-build-id": "gLrcIusxlTiSOBWO2"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~duproprio-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-duproprio-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/solidcode~duproprio-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-duproprio-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/solidcode~duproprio-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-duproprio-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "DuProprio URLs",
                        "type": "array",
                        "description": "Paste one or more DuProprio URLs — either search-result pages (copy the URL from your browser after applying filters on duproprio.com) or individual property detail pages. The scraper reads every filter straight from each search URL, so the Search Filters below are ignored for these. Use this when you already built a search on the site.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "transactionType": {
                        "title": "Transaction Type",
                        "enum": [
                            "sale",
                            "rent"
                        ],
                        "type": "string",
                        "description": "Whether to find properties for sale or for rent. Only applies when you build a search below (not when pasting URLs).",
                        "default": "sale"
                    },
                    "region": {
                        "title": "Region",
                        "enum": [
                            "",
                            "montreal",
                            "monteregie",
                            "monteregie-ouest",
                            "laurentides",
                            "lanaudiere",
                            "laval",
                            "estrie",
                            "outaouais",
                            "capitale-nationale",
                            "quebec-rive-sud",
                            "mauricie",
                            "centre-du-quebec",
                            "chaudiere-appalaches",
                            "saguenay-lac-saint-jean",
                            "bas-saint-laurent",
                            "abitibi-temiscamingue",
                            "cote-nord",
                            "gaspesie-iles-de-la-madeleine",
                            "nord-du-quebec"
                        ],
                        "type": "string",
                        "description": "Quebec region / area to search. Leave as 'Any region' to search the whole province, or narrow to a specific region. For a specific city or neighbourhood, use the Location field below.",
                        "default": ""
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Optional city or neighbourhood name to refine the search (for example 'Montreal', 'Sherbrooke', or 'Laval'). Leave empty to search the whole region selected above. Only applies when building a search (ignored when URLs are provided)."
                    },
                    "propertyTypes": {
                        "title": "Property Types",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Limit results to these property types. Leave empty to include all types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "house",
                                "condo",
                                "plex",
                                "cottage",
                                "mobile-home",
                                "farm",
                                "land",
                                "commercial"
                            ],
                            "enumTitles": [
                                "House",
                                "Condo / Apartment",
                                "Plex (duplex, triplex, etc.)",
                                "Cottage / Country home",
                                "Mobile home",
                                "Farm / Acreage",
                                "Residential lot / Land",
                                "Commercial"
                            ]
                        },
                        "default": []
                    },
                    "minPrice": {
                        "title": "Minimum Price (CAD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include listings at or above this price, in Canadian dollars. For rentals this is the monthly rent. Leave empty for no minimum."
                    },
                    "maxPrice": {
                        "title": "Maximum Price (CAD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include listings at or below this price, in Canadian dollars. For rentals this is the monthly rent. Leave empty for no maximum."
                    },
                    "minBedrooms": {
                        "title": "Minimum Bedrooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include properties with at least this many bedrooms. Leave empty for any."
                    },
                    "minBathrooms": {
                        "title": "Minimum Bathrooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include properties with at least this many bathrooms. Leave empty for any."
                    },
                    "scrapeDetails": {
                        "title": "Scrape Full Details",
                        "type": "boolean",
                        "description": "Follow each listing to its page to collect full data: room dimensions, feature groups (heating, services), living space and lot area, construction year, annual taxes, annual condo fees, and municipal assessment. Turn off for a faster, lighter run that returns only the summary fields shown in search results.",
                        "default": true
                    },
                    "language": {
                        "title": "Language",
                        "enum": [
                            "en",
                            "fr"
                        ],
                        "type": "string",
                        "description": "Language for listing text (titles, descriptions, feature labels). DuProprio serves both English and French.",
                        "default": "en"
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of listings to collect across all URLs and searches. Set to 0 for as many as available (up to a built-in safety cap). Tip: start with 10-50 to test, then increase.",
                        "default": 100
                    },
                    "maxResultsPerUrl": {
                        "title": "Max Results Per URL",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum listings to collect from each individual URL or search. Set to 0 for no per-URL limit (the overall Max Results still applies).",
                        "default": 0
                    },
                    "ignoreUrlFailures": {
                        "title": "Continue If a URL Fails",
                        "type": "boolean",
                        "description": "When enabled, the scraper skips any URL or search that fails and continues with the rest. When disabled, the run stops on the first failure.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
