# Centris.ca Scraper (`one-api/centris-scraper`) Actor

Scrape Centris.ca, Quebec's leading real-estate marketplace. Enriched property details by listing number or URL, search For-Sale / For-Rent by location, coordinates, polygon or URL, real-estate broker (agent) search + profiles, and location autocomplete. Residential & commercial, prices in CAD.

- **URL**: https://apify.com/one-api/centris-scraper.md
- **Developed by:** [ONE API](https://apify.com/one-api) (community)
- **Categories:** Lead generation, Real estate
- **Features:** Limited permissions
- **Stats:** 34 total users, 6 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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.

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 Scraper

Scrape **[Centris.ca](https://www.centris.ca)** — Quebec's (Canada) leading real-estate marketplace, run by the Quebec Professional Association of Real Estate Brokers. Pull **For-Sale / For-Rent** listings (residential & commercial), fully-enriched **property details**, real-estate **broker (agent)** profiles, and **location autocomplete**, all as clean tabular rows you can sort, filter and export to CSV / Excel / JSON.

Every row also carries the full upstream JSON in the **`Raw`** column for power users.

***

### What you can scrape

Fill **any subset** of the input sections — each runs in parallel.

#### 🏠 Property Details (one per line)

Auto-detects each entry:

- A **numeric Centris listing number / MLS №** (e.g. `18658627`) → full property record
- A **centris.ca listing URL** → full property record

A property record includes price, full address, latitude/longitude, every photo, complete characteristics, units, financials & taxes, the description, and the listing broker(s).

#### 🔎 Search Listings (one per line)

- A **city / borough / region name** (e.g. `Montreal`, `Quebec City`, `Laval`) → searches listings there
- A **centris.ca search URL** → replays that exact search (including any encoded filters)

#### 📍 Search by Coordinates

`latitude,longitude` or `latitude,longitude,radiusKm` (radius in km, default 3) — e.g. `45.5017,-73.5673,2`.

#### 🗺️ Search by Polygon

One polygon per line, as space-separated `lat,lng` points (≥ 3) — e.g. `45.52,-73.60 45.50,-73.55 45.48,-73.62`.

#### 👤 Agents (real-estate brokers)

- A **broker name**, or `agency:<office>` / `area:<city>` → broker search (`/agent/search`)
- A **broker id / code** (e.g. `h6088`) → full broker profile (`/agent/details`)

#### 🔍 Location Autocomplete

Free text (≥ 3 chars) → Centris geographic records (id, label, type, level).

***

### Search filters (apply to every property search)

Listing type (For Sale / For Rent), category (Residential / Commercial), property type, plex type, price range (`min:…,max:…`), bedrooms, bathrooms, parking, garages, living-area & land-area ranges (with unit), and toggles for pool, waterfront, elevator, furnished, pets-allowed and open-house — plus pages and results-per-page. An optional broker-language filter narrows the Agents search.

***

### Output

One flat row per result. The `Type` column tells you what each row is: `property`, `agent` or `location`. Common columns include Name / Title, Category, Price (CAD), Beds, Baths, Rooms, Address, Latitude, Longitude, Agent, Agency, Phone, Cover Photo (thumbnail), Listing URL and the complete `Raw` JSON.

***

### Notes

- Coverage is the Canadian province of **Quebec** (prices in **CAD**).
- “Sold” is **not** a Centris listing status — use **For Sale** / **For Rent**.
- This actor is a friendly wrapper over a hosted Centris.ca API; you don't need any Centris account or key.

# Actor input Schema

## `property_inputs` (type: `array`):

Auto-detects each entry and calls the right endpoint:
• A numeric Centris listing number / MLS № (e.g. `18658627`) → `/details/byid`
• A `https://www.centris.ca/...` listing URL → `/details/byurl`

Each row = one fully-enriched property record (price, address, latitude/longitude, every photo, full characteristics, units, financials & taxes, description, and the listing broker(s)). The complete upstream JSON is always kept in the `Raw` column.

## `search_inputs` (type: `array`):

Auto-detects each entry and routes to the right `/search/*` endpoint:
• A Centris.ca results URL (e.g. `https://www.centris.ca/en/properties~for-sale~montreal`) → `/search/byurl` (replays that exact search, including any encoded filters)
• Anything else (a city / borough / region name, e.g. `Montreal`, `Quebec City`, `Laval`) → `/search/bylocation`

The Search Filters & Pagination below apply to every location search. Each hit returns one row per property listing.

## `coordinate_inputs` (type: `array`):

Radius search around a point via `/search/bycoordinates`. One point per line as `latitude,longitude` or `latitude,longitude,radiusKm` (radius in kilometres, default 3). Example: `45.5017,-73.5673,2` searches 2 km around downtown Montreal. The Search Filters below also apply. One row per listing.

## `polygon_inputs` (type: `array`):

Search inside an arbitrary map polygon via `/search/bypolygon`. One polygon per line, as space-separated `lat,lng` points (at least 3). Example: `45.52,-73.60 45.50,-73.55 45.48,-73.62`. The Search Filters below also apply. One row per listing.

## `agent_search_inputs` (type: `array`):

Search real-estate brokers via `/agent/search`. Per line:
• A broker name (e.g. `Marie Tremblay`) → brokers whose name matches
• `agency:<office name>` (e.g. `agency:RE/MAX`) → brokers at that agency / office
• `area:<city or region>` (e.g. `area:Montreal`) → brokers active in that area

Use the optional Broker language filter below to narrow by spoken language. Each row = one broker (name, title, agency, phone, photo, profile URL). Use a broker id in the section below for the full profile.

## `agent_id_inputs` (type: `array`):

For each Centris broker code (e.g. `h6088`) the actor fetches `/agent/details` — the full broker profile (name, title, agency, phones, email, languages, address, listing count, profile URL). Get broker ids from the Agent search above.

## `autocomplete_inputs` (type: `array`):

Resolve a free-text place (city / borough / region) to the Centris geographic records used by Search, via `/autocomplete`. Minimum 3 characters. Each suggestion = one row (id, label, type, level). Feed an id back into a location search if you want an exact geographic scope.

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

For Sale or For Rent. Applies to every location / coordinate / polygon search. (Centris has no Sold data — listing status is Sale or Rent only.)

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

Residential or Commercial property. Applies to every search.

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

Limit results to a property type. Leave as Any for all types. Commercial types (Office, Industrial, Commercial building, Business) require Category = Commercial above. You can also pass several comma-separated types directly in this field.

## `plexType` (type: `string`):

Only used when Property type is Plex — pick the plex size. Leave as Any for all plexes.

## `priceRange` (type: `string`):

Format: `min:200000,max:600000` — or just `min:200000` / `max:600000`. For rent, this is the monthly rent.

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

Minimum bedrooms. Use an exact count (e.g. `3`) or `3+` for 3 or more.

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

Minimum bath / powder rooms (e.g. `2` → 2 or more).

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

Minimum parking spaces (e.g. `1` → 1 or more).

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

Minimum garages (e.g. `1` → 1 or more).

## `livingArea` (type: `string`):

Living-area range in the unit chosen below, e.g. `min:800,max:2000` (or just one half).

## `landArea` (type: `string`):

Lot / land-area range in the unit chosen below, e.g. `min:3000,max:10000` (or just one half).

## `areaUnit` (type: `string`):

Unit for the living-area and land-area ranges above.

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

Only listings with a pool.

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

Only waterfront / near-water listings.

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

Only listings with an elevator.

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

Only furnished listings (most relevant for rentals).

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

Only listings where pets are allowed (most relevant for rentals).

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

Only listings with an upcoming open house.

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

Filter the Agents search above by a language the broker speaks. Leave as Any for no filter. Ignored by property searches.

## `pages` (type: `integer`):

How many result pages to fetch for each location / coordinate / polygon / agent search (stops early when there are no more results).

## `resultCount` (type: `integer`):

Listings (or brokers) per page for every search (1–60).

## Actor input object example

```json
{
  "property_inputs": [
    "18658627",
    "https://www.centris.ca/en/condos~for-sale~montreal-ahuntsic-cartierville/24335151"
  ],
  "search_inputs": [
    "Montreal"
  ],
  "coordinate_inputs": [
    "45.5017,-73.5673,2"
  ],
  "polygon_inputs": [],
  "agent_search_inputs": [
    "area:Montreal"
  ],
  "agent_id_inputs": [],
  "autocomplete_inputs": [
    "montreal"
  ],
  "searchType": "For_Sale",
  "category": "Residential",
  "propertyType": "",
  "plexType": "",
  "priceRange": "",
  "bedrooms": "",
  "bathrooms": "",
  "parking": "",
  "garage": "",
  "livingArea": "",
  "landArea": "",
  "areaUnit": "sqft",
  "pool": false,
  "waterfront": false,
  "elevator": false,
  "furnished": false,
  "petsAllowed": false,
  "openHouse": false,
  "language": "",
  "pages": 1,
  "resultCount": 20
}
```

# 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 = {
    "property_inputs": [
        "18658627",
        "https://www.centris.ca/en/condos~for-sale~montreal-ahuntsic-cartierville/24335151"
    ],
    "search_inputs": [
        "Montreal"
    ],
    "coordinate_inputs": [
        "45.5017,-73.5673,2"
    ],
    "polygon_inputs": [],
    "agent_search_inputs": [
        "area:Montreal"
    ],
    "agent_id_inputs": [],
    "autocomplete_inputs": [
        "montreal"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("one-api/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 = {
    "property_inputs": [
        "18658627",
        "https://www.centris.ca/en/condos~for-sale~montreal-ahuntsic-cartierville/24335151",
    ],
    "search_inputs": ["Montreal"],
    "coordinate_inputs": ["45.5017,-73.5673,2"],
    "polygon_inputs": [],
    "agent_search_inputs": ["area:Montreal"],
    "agent_id_inputs": [],
    "autocomplete_inputs": ["montreal"],
}

# Run the Actor and wait for it to finish
run = client.actor("one-api/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 '{
  "property_inputs": [
    "18658627",
    "https://www.centris.ca/en/condos~for-sale~montreal-ahuntsic-cartierville/24335151"
  ],
  "search_inputs": [
    "Montreal"
  ],
  "coordinate_inputs": [
    "45.5017,-73.5673,2"
  ],
  "polygon_inputs": [],
  "agent_search_inputs": [
    "area:Montreal"
  ],
  "agent_id_inputs": [],
  "autocomplete_inputs": [
    "montreal"
  ]
}' |
apify call one-api/centris-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,one-api/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/aIjNr7UJZ1Ja7giTv/builds/IgIT6ASoTg12QeuK5/openapi.json
