# Centris.ca Scraper — Quebec Real Estate Data & MLS API (`sian.agency/centris-ca-property-scraper`) Actor

Scrape Centris.ca Quebec and Montreal real estate listings into clean structured data. Search by city, region, map polygon, coordinates or listing URL; filter by price, beds, baths, property type and foreclosure; export full listing details, photos and geocoordinates with an HTML report.

- **URL**: https://apify.com/sian.agency/centris-ca-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 property extracteds

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

## Centris.ca Scraper — Quebec Real Estate Data & MLS API 🏠

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Realtor.ca Property Scraper](https://img.shields.io/badge/Store-Realtor.ca%20Property%20Scraper-D92228)](https://apify.com/sian.agency/realtor-ca-property-scraper?fpr=sian) [![Zillow Property Scraper](https://img.shields.io/badge/Store-Zillow%20Property%20Scraper-1F4E79)](https://apify.com/sian.agency/zillow-property-scraper?fpr=sian) [![Trulia Property Scraper](https://img.shields.io/badge/Store-Trulia%20Property%20Scraper-2EBE4E)](https://apify.com/sian.agency/trulia-property-scraper?fpr=sian)

#### 🎉 The only complete Centris.ca scraper — search Quebec real estate 4 ways, then pull full bilingual listing dossiers
##### For real estate investors, brokers, market analysts, and Quebec/Canada data teams who need fresh, structured MLS-grade listing data

---

### 📋 Overview

**Pull Centris.ca Quebec and Montreal listings — for-sale AND rentals — into clean structured data.** Search by city or region, by coordinates + radius, inside an arbitrary map polygon, or straight from a Centris search-results URL, then enrich any listing with a full bilingual (FR/EN) dossier: characteristics, units, financials, taxes, community profile, nearby amenities, photos and geocoordinates.

**Why real estate teams choose this scraper:**
- ✅ **Only complete Centris scraper**: 4 search modes + rich detail dossiers in one actor — nothing else on the market covers all of it for Centris.ca
- ⚡ **Search any way you have data**: location name, coordinates + radius, map polygon, or paste-a-URL — every mode auto-paginates up to 60 rows/page
- 🎯 **Full Centris filter set**: sale/rent, property type, price band, beds, baths, parking, garage, living/land area, pool, waterfront, elevator, open house, furnished, pets, and foreclosure
- 💰 **Best price on the market**: pay-per-result — charged only for listings actually returned, with a generous FREE tier to test on
- 💎 **Sourcing-grade detail**: bilingual FR/EN dossiers with structured characteristics, room-by-room units, municipal assessment, taxes and listing brokers
- ✨ **Built-in market KPIs**: median/average price, price distribution, and category + bedroom breakdowns in a clean HTML report

---

### ✨ Features

- 🧭 **Four search modes**: by location, by coordinates + radius, by map polygon, or by Centris search-results URL
- 🧾 **Full detail dossiers**: fetch complete listing data by listing number or URL — or auto-enrich every search row
- 🏷 **Sale + rent**: scrape either side of the Quebec market with a single `searchType` toggle
- 🔧 **Rich server-side filters**: price band, beds/baths/parking/garage, property type, foreclosure, waterfront, pool and more
- 📊 **Market KPIs + HTML report**: median/average price, distribution and inventory breakdowns computed automatically
- 🔁 **Automatic de-duplication**: the same listing is never charged or exported twice
- 🌐 **Bilingual data (FR/EN)**: Quebec listings served in both French and English
- 📍 **Location autocomplete**: a helper mode to discover valid Centris locations before you search
- 📦 **Bulk detail lookups**: pass arrays of listing numbers and/or URLs for batch dossier extraction

---

### 🎬 Quick Start

Pick a mode, give it a location (or coordinates, polygon, or URL), and run. Results stream straight to the Apify dataset with an HTML market report in the key-value store. No setup beyond your input.

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~centris-ca-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"mode":"location","location":"Montreal","searchType":"For_Sale","maxResults":25}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose your search mode

Set `mode` to `location`, `coordinates`, `polygon`, or `searchUrl` — and provide the matching target (a city name, a lat/lng, a polygon, or a Centris URL).

#### Step 2: Add filters (optional)

Narrow results with `searchType` (sale/rent), price band, beds, baths, property type, foreclosure, waterfront and more.

#### Step 3: Run and export

Run the actor. Optionally set `enrichDetails: true` (PAID) to attach a full dossier to every listing.

**That's it! In under a minute, you'll have:**

- A clean, de-duplicated dataset of Quebec listings
- Prices, addresses, beds/baths, photos and geocoordinates
- An HTML market report with median price, distribution and inventory breakdowns

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `mode` | string | No | `location`, `coordinates`, `polygon`, `searchUrl`, `listingDetail`, or `autocomplete` (default `location`) |
| `location` | string | For `location` mode | City, region or neighbourhood, e.g. `Montreal` |
| `latitude` / `longitude` | number | For `coordinates` mode | Centre point of the radius search |
| `radius` | number | No | Radius in km around the point (default 3) |
| `polygon` | string | For `polygon` mode | ≥3 space-separated `lat,lng` points |
| `searchUrl` | string | For `searchUrl` mode | A Centris search-results URL |
| `listingIds` / `listingUrls` | array | For `listingDetail` mode | Listing numbers and/or URLs to fetch dossiers for |
| `searchType` | string | No | `For_Sale` or `For_Rent` (default sale) |
| `category` | string | No | `Residential` or `Commercial` |
| `propertyType` | string | No | Comma-separated types, e.g. `House, Condo, Plex` |
| `minPrice` / `maxPrice` | integer | No | Price band in CAD |
| `bedrooms` / `bathrooms` / `parking` / `garage` | string | No | Exact (`3`) or N-or-more (`3+`) |
| `pool` / `waterfront` / `elevator` / `openHouse` / `furnished` / `petsAllowed` / `foreclosure` | boolean | No | Feature filters |
| `maxResults` | integer | No | Cap on listings per search (FREE tier capped at 25) |
| `enrichDetails` | boolean | No | Attach a full dossier to every search row (PAID) |

**Example — location search:**

```json
{
  "mode": "location",
  "location": "Montreal",
  "searchType": "For_Sale",
  "propertyType": "Condo",
  "minPrice": 300000,
  "maxPrice": 600000,
  "bedrooms": "2+",
  "maxResults": 50
}
```

**Example — bulk detail lookup:**

```json
{
  "mode": "listingDetail",
  "listingIds": ["23630164", "13441060"]
}
```

***

### 📤 Output

Results are saved to the Apify dataset. Search rows carry the core listing fields; detail rows (and enriched rows) add the full dossier.

| Field | Type | Description |
|-------|------|-------------|
| `propertyId` | string | Centris listing number (join key) |
| `listingType` | string | `sale` or `rent` |
| `category` | string | e.g. `Condo for sale`, `Triplex for sale` |
| `price` | number | Price in CAD |
| `priceText` | string | Formatted price, e.g. `$799,000` |
| `address` | string | Street / full address |
| `bedrooms` | integer | Bedroom count |
| `bathrooms` | integer | Bathroom count |
| `photo` | string | Primary listing photo URL |
| `url` | string | Full listing URL |
| `listingTitle` | string | Full title (detail rows) |
| `characteristics` | array | Structured features, interior/exterior (detail rows) |
| `financialInfo` | object | Assessment, taxes and fees (detail rows) |
| `agents` | array | Listing broker(s) with name, agency and phone (detail rows) |

**Example (search row):**

```json
{
  "propertyId": "23630164",
  "listingType": "sale",
  "category": "House for sale",
  "price": 799000,
  "priceCurrency": "CAD",
  "priceText": "$799,000",
  "address": "4346, boulevard Jacques-Bizard",
  "bedrooms": 3,
  "bathrooms": 2,
  "photo": "https://mspublic.centris.ca/media.ashx?id=...",
  "url": "https://www.centris.ca/en/houses~for-sale~montreal-pierrefonds-roxboro/23630164"
}
```

***

### 💼 Use Cases & Examples

#### 1. Quebec & Montreal Market Analysis

**Analysts tracking pricing and inventory across Quebec's biggest housing market.**

**Input:** `location: "Montreal"`, `searchType: "For_Sale"`, `maxResults: 200`
**Output:** De-duplicated listings + an HTML report with median price and inventory mix
**Use:** Weekly market sweeps, pricing trend dashboards, neighbourhood comparisons

#### 2. Comparables & Valuation Models

**Data teams building comparables and training AVMs on fresh Quebec data.**

**Input:** Location or polygon, `enrichDetails: true`
**Output:** Full dossiers with price, beds/baths, area, taxes and geocoordinates
**Use:** Automated valuation models, rent-prediction, comparable-sales datasets

#### 3. Investor Deal Sourcing

**Investors hunting foreclosures, plexes and waterfront opportunities.**

**Input:** `foreclosure: true` or `propertyType: "Plex, Triplex"`, price band
**Output:** Targeted listings with financials and gross scheduled income
**Use:** Off-market and value-add deal pipelines before the wider market reacts

#### 4. Lead Generation

**Sales teams pulling active listings and listing-broker contact data.**

**Input:** `mode: "listingDetail"` with listing numbers, or `enrichDetails: true`
**Output:** Listing dossiers with broker name, agency and phone
**Use:** Outreach lists, CRM enrichment, prospecting pipelines

#### 5. Canadian Housing Datasets & Dashboards

**Researchers and product teams powering monitors and dashboards.**

**Input:** Scheduled coordinates / polygon sweeps
**Output:** Continuously refreshed structured Quebec listing data
**Use:** Housing-market research, real-estate products, competitive monitoring

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/centris-ca-property-scraper').call({
  mode: 'location',
  location: 'Montreal',
  searchType: 'For_Sale',
  maxResults: 25
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/centris-ca-property-scraper').call(
    run_input={'mode': 'location', 'location': 'Montreal', 'searchType': 'For_Sale', 'maxResults': 25}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~centris-ca-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"mode":"location","location":"Montreal","searchType":"For_Sale","maxResults":25}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule or webhook
2. **HTTP Request**: Call the actor API
3. **Process**: Handle JSON results
4. **Action**: Save, notify, or transform

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run — full feature access, same data quality
- No credit card required
- Perfect for testing and small projects

#### PAID Tier (Production Ready)

- **Unlimited** listings per run
- Bulk detail lookups + per-row enrichment
- Pay-per-result: only charged for listings actually returned

💰 **Best price on the market** — a low per-listing headline rate for search, with full bilingual dossiers priced by value.

🔗 [View current pricing](https://apify.com/sian.agency/centris-ca-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How many listings can I scrape?**
A: FREE tier: 25 per run. PAID tier: unlimited, with auto-pagination up to 60 rows per page.

**Q: Can I search both for-sale and rentals?**
A: Yes — set `searchType` to `For_Sale` or `For_Rent`. Centris does not publish sold data.

**Q: How do I get full property details?**
A: Use `listingDetail` mode with listing numbers/URLs, or set `enrichDetails: true` on any search to attach a full dossier to every row.

**Q: Is the data bilingual?**
A: Yes — Quebec listings are served in both French and English; search rows are English-labelled and detail dossiers include French content.

**Q: What output formats are available?**
A: JSON, CSV, Excel — export directly from the Apify dataset.

**Q: Is this legal?**
A: Yes — we only extract publicly available listing data. See the legal section below.

***

### 🐛 Troubleshooting

**No results returned**

- Confirm the location resolves — try `autocomplete` mode with your query first
- Widen your filters (price band, beds/baths) or increase `maxResults`

**A location isn't matched**

- Use `autocomplete` mode to find the exact Centris location label, then search with it

**Detail enrichment skipped**

- `enrichDetails` requires the PAID tier; on FREE it is silently disabled

**Coordinates search too narrow**

- Increase `radius` (km) around your centre point

***

### ⚠️ Trademark Disclaimer

This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by Centris.ca, the Quebec Professional Association of Real Estate Brokers (QPAREB), or any of their subsidiaries or affiliates.** "Centris" and "Centris.ca" are trademarks of their respective owners. All product and company names are the property of their respective holders. This tool extracts only publicly available listing information for legitimate research and analysis purposes.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `mode` (type: `string`):

What to run.

• **location** — search active listings by city, region or neighbourhood name
• **coordinates** — search within a radius of a lat/lng point
• **polygon** — search inside an arbitrary map polygon
• **searchUrl** — run a search straight from a Centris search-results URL
• **listingDetail** — fetch full dossiers for specific listing numbers and/or URLs
• **autocomplete** — look up valid locations for the location mode (no per-row charge)

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

City, region or neighbourhood to search, e.g. "Montreal" or "Quebec City". Resolved to the matching Centris area automatically.

## `searchType` (type: `string`):

Which side of the market to search. Applies to location, coordinates and polygon modes. Centris has no sold data.

## `category` (type: `string`):

Property category. Leave empty for the Centris default (Residential).

## `propertyType` (type: `string`):

Comma-separated property types. Residential: House, Condo, Loft, Plex, Duplex, Triplex, Quadruplex, Quintuplex, Intergenerational, Mobile Home, Cottage, Lot, Multi-Family. Commercial: Office, Industrial, Commercial, Business, Accommodation, Agricultural.

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

Minimum asking price (sale) or monthly rent (rent). Leave empty for no minimum.

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

Maximum asking price (sale) or monthly rent (rent). Leave empty for no maximum.

## `bedrooms` (type: `string`):

Bedrooms — exact (e.g. "3") or N-or-more (e.g. "3+"). Leave empty for any.

## `bathrooms` (type: `string`):

Bath / powder rooms, N-or-more (e.g. "2+"). Leave empty for any.

## `parking` (type: `string`):

Parking spaces, N-or-more (e.g. "1+"). Leave empty for any.

## `garage` (type: `string`):

Garages, N-or-more (e.g. "1+"). Leave empty for any.

## `pool` (type: `boolean`):

Only listings with a pool.

## `waterfront` (type: `boolean`):

Only waterfront / near-water listings.

## `elevator` (type: `boolean`):

Only listings with an elevator.

## `openHouse` (type: `boolean`):

Only listings with an upcoming open house.

## `furnished` (type: `boolean`):

Only furnished listings.

## `petsAllowed` (type: `boolean`):

Only pet-friendly rentals.

## `foreclosure` (type: `boolean`):

Only repossession / foreclosed listings.

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

Hard cap on listings returned per search. Auto-paginates (up to 60 per page) until the cap is reached or the search is drained. FREE tier is always capped at 25 results per run.

## `enrichDetails` (type: `boolean`):

When ON, each search row is enriched with the full listing dossier — characteristics, units, financials, taxes, community and geocoordinates (1 extra call per listing, adds a Property Detail Enriched charge). PAID tier only.

## `latitude` (type: `number`):

Latitude of the centre point, e.g. 45.5017.

## `longitude` (type: `number`):

Longitude of the centre point, e.g. -73.5673.

## `radius` (type: `number`):

Search radius in kilometres around the point. Default 3.

## `polygon` (type: `string`):

Space-separated "lat,lng" points (at least 3), e.g. "45.50,-73.58 45.52,-73.58 45.52,-73.55 45.50,-73.55".

## `searchUrl` (type: `string`):

A Centris search-results URL copied from your browser address bar.

## `listingIds` (type: `array`):

One or more Centris listing numbers (e.g. 23630164) to fetch full dossiers for.

## `listingUrls` (type: `array`):

One or more full Centris listing URLs to fetch dossiers for.

## `query` (type: `string`):

At least 3 characters, e.g. "montreal" — returns matching Centris locations.

## `limit` (type: `integer`):

Maximum location suggestions to return (1–50). Default 20.

## Actor input object example

```json
{
  "mode": "location",
  "location": "Montreal",
  "searchType": "For_Sale",
  "pool": false,
  "waterfront": false,
  "elevator": false,
  "openHouse": false,
  "furnished": false,
  "petsAllowed": false,
  "foreclosure": false,
  "maxResults": 25,
  "enrichDetails": false
}
```

# Actor output Schema

## `results` (type: `string`):

Structured Centris.ca sale and rent listings — prices, addresses, beds/baths, photos and geocoordinates, plus full detail dossiers when enrichment is enabled.

## `htmlReport` (type: `string`):

HTML summary with run stats, market KPIs (median/average price, price distribution) and inventory breakdowns by category and bedrooms.

# 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 = {
    "location": "Montreal"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/centris-ca-property-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 = { "location": "Montreal" }

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/centris-ca-property-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 '{
  "location": "Montreal"
}' |
apify call sian.agency/centris-ca-property-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Centris.ca Scraper — Quebec Real Estate Data & MLS API",
        "description": "Scrape Centris.ca Quebec and Montreal real estate listings into clean structured data. Search by city, region, map polygon, coordinates or listing URL; filter by price, beds, baths, property type and foreclosure; export full listing details, photos and geocoordinates with an HTML report.",
        "version": "1.0",
        "x-build-id": "wKgtrblg72L3i9Qrz"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~centris-ca-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-centris-ca-property-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/sian.agency~centris-ca-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-centris-ca-property-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/sian.agency~centris-ca-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-centris-ca-property-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": {
                    "mode": {
                        "title": "🧭 Mode",
                        "enum": [
                            "location",
                            "coordinates",
                            "polygon",
                            "searchUrl",
                            "listingDetail",
                            "autocomplete"
                        ],
                        "type": "string",
                        "description": "What to run.\n\n• **location** — search active listings by city, region or neighbourhood name\n• **coordinates** — search within a radius of a lat/lng point\n• **polygon** — search inside an arbitrary map polygon\n• **searchUrl** — run a search straight from a Centris search-results URL\n• **listingDetail** — fetch full dossiers for specific listing numbers and/or URLs\n• **autocomplete** — look up valid locations for the location mode (no per-row charge)",
                        "default": "location"
                    },
                    "location": {
                        "title": "📍 Location (location mode)",
                        "type": "string",
                        "description": "City, region or neighbourhood to search, e.g. \"Montreal\" or \"Quebec City\". Resolved to the matching Centris area automatically.",
                        "default": "Montreal"
                    },
                    "searchType": {
                        "title": "🏷 Listing Type",
                        "enum": [
                            "For_Sale",
                            "For_Rent"
                        ],
                        "type": "string",
                        "description": "Which side of the market to search. Applies to location, coordinates and polygon modes. Centris has no sold data.",
                        "default": "For_Sale"
                    },
                    "category": {
                        "title": "🏢 Category",
                        "enum": [
                            "Residential",
                            "Commercial"
                        ],
                        "type": "string",
                        "description": "Property category. Leave empty for the Centris default (Residential)."
                    },
                    "propertyType": {
                        "title": "🏠 Property Types",
                        "type": "string",
                        "description": "Comma-separated property types. Residential: House, Condo, Loft, Plex, Duplex, Triplex, Quadruplex, Quintuplex, Intergenerational, Mobile Home, Cottage, Lot, Multi-Family. Commercial: Office, Industrial, Commercial, Business, Accommodation, Agricultural."
                    },
                    "minPrice": {
                        "title": "💵 Min price (CAD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum asking price (sale) or monthly rent (rent). Leave empty for no minimum."
                    },
                    "maxPrice": {
                        "title": "💵 Max price (CAD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum asking price (sale) or monthly rent (rent). Leave empty for no maximum."
                    },
                    "bedrooms": {
                        "title": "🛏 Bedrooms",
                        "type": "string",
                        "description": "Bedrooms — exact (e.g. \"3\") or N-or-more (e.g. \"3+\"). Leave empty for any."
                    },
                    "bathrooms": {
                        "title": "🛁 Bathrooms",
                        "type": "string",
                        "description": "Bath / powder rooms, N-or-more (e.g. \"2+\"). Leave empty for any."
                    },
                    "parking": {
                        "title": "🅿️ Parking",
                        "type": "string",
                        "description": "Parking spaces, N-or-more (e.g. \"1+\"). Leave empty for any."
                    },
                    "garage": {
                        "title": "🚗 Garage",
                        "type": "string",
                        "description": "Garages, N-or-more (e.g. \"1+\"). Leave empty for any."
                    },
                    "pool": {
                        "title": "🏊 Pool",
                        "type": "boolean",
                        "description": "Only listings with a pool.",
                        "default": false
                    },
                    "waterfront": {
                        "title": "🌊 Waterfront",
                        "type": "boolean",
                        "description": "Only waterfront / near-water listings.",
                        "default": false
                    },
                    "elevator": {
                        "title": "🛗 Elevator",
                        "type": "boolean",
                        "description": "Only listings with an elevator.",
                        "default": false
                    },
                    "openHouse": {
                        "title": "🚪 Open house",
                        "type": "boolean",
                        "description": "Only listings with an upcoming open house.",
                        "default": false
                    },
                    "furnished": {
                        "title": "🛋 Furnished",
                        "type": "boolean",
                        "description": "Only furnished listings.",
                        "default": false
                    },
                    "petsAllowed": {
                        "title": "🐾 Pets allowed",
                        "type": "boolean",
                        "description": "Only pet-friendly rentals.",
                        "default": false
                    },
                    "foreclosure": {
                        "title": "⚖️ Foreclosure",
                        "type": "boolean",
                        "description": "Only repossession / foreclosed listings.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "📊 Max results per search",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Hard cap on listings returned per search. Auto-paginates (up to 60 per page) until the cap is reached or the search is drained. FREE tier is always capped at 25 results per run.",
                        "default": 25
                    },
                    "enrichDetails": {
                        "title": "🧾 Enrich with full detail (PAID)",
                        "type": "boolean",
                        "description": "When ON, each search row is enriched with the full listing dossier — characteristics, units, financials, taxes, community and geocoordinates (1 extra call per listing, adds a Property Detail Enriched charge). PAID tier only.",
                        "default": false
                    },
                    "latitude": {
                        "title": "🌐 Latitude (coordinates mode)",
                        "type": "number",
                        "description": "Latitude of the centre point, e.g. 45.5017."
                    },
                    "longitude": {
                        "title": "🌐 Longitude (coordinates mode)",
                        "type": "number",
                        "description": "Longitude of the centre point, e.g. -73.5673."
                    },
                    "radius": {
                        "title": "📏 Radius km (coordinates mode)",
                        "minimum": 0.1,
                        "maximum": 200,
                        "type": "number",
                        "description": "Search radius in kilometres around the point. Default 3."
                    },
                    "polygon": {
                        "title": "🗺 Polygon (polygon mode)",
                        "type": "string",
                        "description": "Space-separated \"lat,lng\" points (at least 3), e.g. \"45.50,-73.58 45.52,-73.58 45.52,-73.55 45.50,-73.55\"."
                    },
                    "searchUrl": {
                        "title": "🔗 Search URL (searchUrl mode)",
                        "type": "string",
                        "description": "A Centris search-results URL copied from your browser address bar."
                    },
                    "listingIds": {
                        "title": "🆔 Listing numbers (listingDetail mode)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "One or more Centris listing numbers (e.g. 23630164) to fetch full dossiers for.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "listingUrls": {
                        "title": "🔗 Listing URLs (listingDetail mode)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "One or more full Centris listing URLs to fetch dossiers for.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "query": {
                        "title": "🔎 Query (autocomplete mode)",
                        "type": "string",
                        "description": "At least 3 characters, e.g. \"montreal\" — returns matching Centris locations."
                    },
                    "limit": {
                        "title": "🔢 Max suggestions (autocomplete mode)",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum location suggestions to return (1–50). Default 20."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
