# Centris.ca 🔥 $1/1K MLS & Real Estate 🇨🇦 (`azzouzana/centris-scraper`) Actor

From $1/1K on Gold 💰 Paste any Centris.ca search URL, Montreal houses, Quebec City condos, Laval homes, rentals. Price, address, beds, baths, MLS, photo. Optional full details (description, features, broker phone, gallery & more). JSON/CSV/Excel. Start now!

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

## Pricing

from $1.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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Centris.ca Quebec real estate scraper 🔥⚡** Paste any **Centris.ca search URL**, for sale or for rent, city, property type, and price filters included, and get **clean JSON/CSV** in seconds. Every row includes **price**, **address**, **beds**, **baths**, **Centris number**, **photo**, and **listing URL**. Turn on **`fetchFullDetails`** for the **description**, **characteristics**, **broker phone**, **agency**, and **photo gallery**. **Need a large market slice?** Pagination is handled for you up to your **`maxItems`**. **Quebec listings, start now!**

👉 [Start free on Apify](https://apify.com/sign-up?fpr=cbgdsf), **no credit card required.**

***

### 🤩 What you get

One **search URL** in → export-ready listing rows out. Duplicate listings are skipped automatically.

**Search cards (default)**, everything on the results list:

Each result row is the listing record as the site publishes it, including price, address, photos, and the other fields on that record.

**Optional full details** (`fetchFullDetails: true`). Adds the public description, characteristics (year built, living area, parking, pool, and more), room count, gallery, broker name and phone, and agency on the **same row**.

**Built for real workflows:**

- ✅ **Filter-preserving**, your URL’s city, sale/rent, property type, and price band stay intact
- ✅ **Past the first page**, Centris paginates; we keep collecting unique listings up to **`maxItems`**
- ✅ **Lead-gen ready**, broker, phone, agency, address, and listing link
- ✅ **CRM-friendly**, one listing per row for Airtable, HubSpot, or Sheets

***

### 📚 How to use, 5-second setup

1. 👉 [Create a free Apify account](https://apify.com/sign-up?fpr=cbgdsf), **no credit card required**
2. Open this actor → paste your search URL into **`startUrl`**
3. Set **`maxItems`** (default **100**)
4. Optional: turn on **`fetchFullDetails`** for richer fields
5. Hit **Start** → download JSON, CSV, Excel, or pull via API

**Where to get `startUrl`:** On Centris.ca, apply your filters (city, price, sale or rent), then copy the address bar.

**Free plan:** **5 listings per run**, **5 runs/day**, and a **1-minute gap** between runs. Upgrade to use your full **`maxItems`**.

***

### 🛠️ Input

| Field | Type | Description | Default |
|-------|------|-------------|---------|
| `startUrl` | string | Centris.ca **search results** URL | Montreal for sale |
| `maxItems` | integer | Max unique listings to save | `100` |
| `fetchFullDetails` | boolean | Merge description, characteristics, broker, and gallery into each row | `false` |

Pagination is handled for you. Set **`maxItems`** higher when you need a larger market slice, duplicate listings are skipped automatically.

***

### 💡 Why scrape Centris.ca?

- **Market comps**, CAD prices, beds, and living area across Quebec cities and boroughs
- **Lead lists**, broker name, phone, agency, and listing link at scale
- **New-listing watches**, re-run the same search URL on a schedule
- **Houses, condos, plexes, commercial, and rentals**, one actor for any Centris search
- **Proptech**, structured feeds for dashboards and alerts

***

### 🧐 Output sample

```json
{
  "mlsNumber": "16349878",
  "url": "https://www.centris.ca/en/condos~for-sale~montreal-ville-marie/16349878",
  "price": "$865,000",
  "priceValue": 865000,
  "currency": "CAD",
  "propertyType": "Condo for sale",
  "street": "1420, Rue Sherbrooke Ouest, apt. 1004",
  "city": "Montréal (Ville-Marie)",
  "address": "1420, Rue Sherbrooke Ouest, apt. 1004, Montréal (Ville-Marie)",
  "bedrooms": "2",
  "bathrooms": "1",
  "latitude": 45.498005,
  "longitude": -73.579842,
  "photoUrl": "https://mspublic.centris.ca/media.ashx?id=ADDD250DA2B8158DDDDDDDDDDA&t=pi&w=320&h=240&sm=c"
}
```

This row is one full listing from a run with `fetchFullDetails` enabled.

***

### ❓ FAQ

**What URLs work?**

Any **search results** URL on `www.centris.ca`, in English or French, Montreal, Laval, Quebec City, for sale or for rent, residential or commercial. Copy the address bar after you apply filters. Single listing pages are not supported.

**How many listings can I pull?**

Set **`maxItems`** to your cap (up to **10,000**). Each listing is saved once. You are not limited to the first page of results.

The actor **bypasses the website result limit** and can collect **thousands** of listings. Duplicates are skipped.

**Why am I only getting 5 results?**

Free Apify plan: **5 items per run**. Upgrade to a paid plan to use your full **`maxItems`**.

**What is `fetchFullDetails`?**

Optional per-listing enrichment (description, characteristics, broker phone, photo gallery).

**Why did my run stop before `maxItems`?**

Usually: no more listings match your **`startUrl`**, free-tier cap, or daily run limit (5 runs/day, 1 minute between runs for free users).

**Wrong URL or “page not found”?**

Use a **search** URL copied from Centris.ca after your filters. If the URL is invalid, the run still **finishes successfully** and the dataset may include one row explaining the problem, fix **`startUrl`** and run again.

**Is it legal to scrape Centris.ca?**

The actor collects **publicly visible** listing data for research and analysis. You must comply with Centris.ca terms and local laws (including Quebec’s Law 25). This tool is **not affiliated** with Centris or the QPAREB. See [Apify’s legality article](https://blog.apify.com/is-web-scraping-legal?fpr=cbgdsf).

***

### 🔎 SEO keywords

Centris.ca scraper, Quebec real estate data, Montreal homes for sale, Montreal condos, Laval houses, Quebec City condos, plex for sale, Montreal rentals, Centris MLS number, broker phone Quebec, real estate agency leads, JSON CSV Excel export, Apify Centris actor, QPAREB listings

***

### 🔍 Looking for something else?

Browse more scrapers on [Apify Store](https://apify.com/store?fpr=cbgdsf).

#### Contact 📬

**Custom filters, scheduling, or integrations?**

- 💬 **Discord**: `@azzouzana`
- 📧 **Email**: <labs@azzouzana.com>

### ⚠️ 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 their member boards.

The actor collects **publicly visible** search-result data (and optional enriched listing fields when enabled). You are responsible for using exported data in line with **Centris.ca’s terms of use**, applicable **privacy laws** (including Quebec’s Law 25), and your local regulations. For general guidance on scraping, see [Apify’s legality article](https://blog.apify.com/is-web-scraping-legal?fpr=cbgdsf).

# Actor input Schema

## `startUrl` (type: `string`):

Paste a Centris.ca search results URL from your browser (city, price, sale or rent, property type). Single listing pages are not supported.

## `maxItems` (type: `integer`):

Maximum listings to scrape. Effective limit also respects run budget and free-tier cap (5 for free users).

## `fetchFullDetails` (type: `boolean`):

Enrich each listing with the description, characteristics, broker phone, agency, and photo gallery. Slower; billed separately when enabled.

## Actor input object example

```json
{
  "startUrl": "https://www.centris.ca/en/properties~for-sale~montreal",
  "maxItems": 100,
  "fetchFullDetails": false
}
```

# Actor output Schema

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

No description

# 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 = {
    "startUrl": "https://www.centris.ca/en/properties~for-sale~montreal",
    "maxItems": 100,
    "fetchFullDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("azzouzana/centris-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 = {
    "startUrl": "https://www.centris.ca/en/properties~for-sale~montreal",
    "maxItems": 100,
    "fetchFullDetails": False,
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrl": "https://www.centris.ca/en/properties~for-sale~montreal",
  "maxItems": 100,
  "fetchFullDetails": false
}' |
apify call azzouzana/centris-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,azzouzana/centris-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/QLysM2QOTWoY1bG7H/builds/nyn09CxYcPGc9hubw/openapi.json
