Centris APIcentris.ca ↗
Search and retrieve Quebec real estate listings from Centris.ca. Access prices, addresses, room counts, photos, and rental data via 6 structured endpoints.
What is the Centris API?
The Centris.ca API provides access to Quebec real estate data through 6 endpoints covering for-sale and rental listings, plex properties, intergenerational homes, and keyword-filtered searches. The get_listing_details endpoint returns a full property record including price, address, bedroom and bathroom counts, room totals, description text, property type, and an array of photo URLs — all keyed by a Centris listing ID.
curl -X GET 'https://api.parse.bot/scraper/3937f45a-c256-4bc2-bc85-6b630ec600a5/search_listings?limit=5' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace centris-ca-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Centris Real Estate API — search rentals, browse for-sale listings, drill into details."""
from parse_apis.Centris_Real_Estate_API import Centris, ListingNotFound
client = Centris()
# Search rental listings in Montreal within a budget
for rental in client.listing_summaries.search_rentals(location="Montreal", max_price=2000, limit=3):
print(rental.price, rental.address, rental.property_type)
# Search for-sale listings and drill into the first result's full details
summary = client.listing_summaries.search(limit=1).first()
if summary:
detail = summary.details()
print(detail.price, detail.address, detail.property_type)
# Search plex properties in Montreal
for plex in client.listing_summaries.search_plex(min_price=800000, max_price=1500000, limit=3):
print(plex.id, plex.price, plex.address)
# Typed error handling for a non-existent listing
try:
gone = client.listingsummary(id="99999999").details()
print(gone.price)
except ListingNotFound as exc:
print(f"Listing not found: {exc.listing_id}")
print("exercised: listing_summaries.search_rentals / search / search_plex / details")
Search for residential real estate listings for sale across Quebec. Returns a paginated list of property listing summaries. Each summary includes id, URL, price, address, and a description teaser. Use get_listing_details with an id from the results to fetch full property information.
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of listings to return. |
{
"type": "object",
"fields": {
"listings": "array of listing summaries each containing id, url, price, price_value, address, and description_teaser"
},
"sample": {
"data": {
"listings": [
{
"id": "20102820",
"url": "https://www.centris.ca/en/houses~for-sale~laval-sainte-rose/20102820",
"price": "$499,999",
"address": "7035, Rue Galarneau\nLaval (Sainte-Rose)",
"price_value": "499999",
"description_teaser": "House for sale"
}
]
},
"status": "success"
}
}About the Centris API
Search and Filter Listings
The search_listings endpoint returns paginated summaries of residential for-sale properties across Quebec. Each summary includes id, url, price, price_value, address, and a description_teaser. The limit parameter controls page size. Rental equivalents are available through search_rentals, which adds a property_type field per result and accepts location, min_price, and max_price filters to narrow by city or monthly rent range.
Specialized Property Searches
search_plex_montreal targets multi-unit properties (duplex through quintuplex) on the Island of Montreal and accepts min_price and max_price bounds in CAD. search_intergenerational_montreal focuses on intergenerational homes in the same region with a max_price cap. Both return the same summary shape — id, url, price, price_value, address, and description_teaser — designed to be passed directly into get_listing_details for full records.
Keyword and Room-Count Filtering
search_houses_keywords_montreal applies a secondary filter layer on top of Montreal single-family house results. It accepts min_rooms to enforce a minimum room count and matches listings whose descriptions contain terms like "bachelor" or "intergenerational". Results from this endpoint are full detail objects — not summaries — and include id, url, price, address, property_type, description, and financial fields, sparing you the extra get_listing_details call.
Full Listing Details
get_listing_details accepts a listing_id (numeric string) and returns the complete property record: formatted price, address, bedrooms, bathrooms, rooms, property_type, description, a photos array of image URLs, and url. Tax assessment and other financial details are included where present on the source listing. Every search endpoint's results expose the id field needed to call this endpoint.
The Centris API is a managed, monitored endpoint for centris.ca — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when centris.ca changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official centris.ca API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate Montreal plex listings within a price range to build an investment property tracker.
- Pull
photos,price, andaddressfromget_listing_detailsto populate a property comparison tool. - Use
search_rentalswith alocationfilter to monitor rental prices across Quebec cities. - Filter Montreal houses by
min_roomsand keyword match to surface intergenerational-ready properties. - Collect
price_valuefrom search results over time to chart Quebec real estate price trends. - Build a notification system that alerts users when new plex listings appear under a
max_pricethreshold. - Extract
descriptionandproperty_typefields to train a real estate text classification model on Quebec listings.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Centris.ca have an official developer API?+
What does `get_listing_details` return beyond what the search endpoints provide?+
get_listing_details returns fields not present in search summaries: bedrooms, bathrooms, rooms, description (full text), photos (array of image URLs), property_type, and financial details such as tax assessments. Search endpoints return only id, url, price, price_value, address, and description_teaser.Does `search_listings` support filtering by city, property type, or price range?+
search_listings endpoint currently accepts only a limit parameter. Location and price filtering is available on search_rentals (via location, min_price, max_price) and on the plex/intergenerational endpoints (via min_price, max_price). You can fork this API on Parse and revise search_listings to add those filter parameters.