Searches Quebec residential listings. transaction_type accepts for_sale (default) and for_rent. Scope the search with location_id and location_type from the locations route, which always travel as a pair. Every page holds up to 20 listings. count is the true total for the scope, and reachable_count is the part you can page through, at most 5000 listings. page above 250 is refused with 422. The origin sometimes places a sale listing inside rent results, and a sale-or-rent listing shows its sale price. Those cards are removed, and filtered_out reports how many. Text values such as categories and feature names are in French.
Run this endpoint
Endpoint
Parameters
Start with the required fields, then add optional filters only when your use case needs them.
Runnable path
This endpoint has no required query parameters.
15 optional filters available.
string
Optional
for_sale (default) or for_rent.
for_sale
string
Optional
The id of a location from the locations route. Send it with location_type.
5
string
Optional
The type of that location: CityDistrictAll, CityDistrict, CityDistrictNeighbourhoodSearch, GeographicArea, GeographicSubArea or PostalCodeSearch.
CityDistrictAll
string
Optional
condo, single_family or plex.
example
string
Optional
detached, semi_detached or attached.
example
integer
Optional
Minimum price in CAD. For for_rent this is the monthly rent.
10
integer
Optional
Maximum price in CAD. For for_rent this is the monthly rent.
600000
integer
Optional
Minimum number of bedrooms, 1 to 9.
2
integer
Optional
Minimum number of bathrooms and powder rooms, 1 to 9.
10
integer
Optional
Minimum number of parking spaces, 1 to 9.
10
integer
Optional
Minimum number of garage spaces, 1 to 9.
10
boolean
Optional
Only listings with a pool.
true
string
Optional
Only listings of one broker. Use the broker_id from the broker autocomplete route.
1234567890
string
Optional
price_asc, price_desc, newest or oldest. Without it the origin default order applies.
price_asc
integer
Optional
Page number, 1 to 250. A page past the end of the scope returns no listings.
1
Request Examples
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrappa.co/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: YOUR_API_KEY_HERE"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
<?php
use Illuminate\Support\Facades\Http;
$response = Http::timeout(30)
->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
->get('https://scrappa.co/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc');
if ($response->successful()) {
echo $response->body();
} else {
echo "Error: " . $response->status();
}
const options = {
method: 'GET',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE'
}
};
fetch('https://scrappa.co/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc', options)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.text();
})
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
const axios = require('axios');
const options = {
method: 'GET',
url: 'https://scrappa.co/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc',
headers: {
x-api-key: 'YOUR_API_KEY_HERE',
}
};
try {
const response = await axios(options);
console.log(response.data);
} catch (error) {
console.error('Error:', error.message);
}
require 'net/http'
require 'uri'
uri = URI.parse("https://scrappa.co/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'
request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'
begin
response = http.request(request)
puts response.body
rescue => e
puts "Error: #{e.message}"
end
import http.client
import json
conn = http.client.HTTPSConnection("scrappa.co")
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
conn.request("GET", "/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
except Exception as e:
print(f"Error: {e}")
finally:
conn.close()
import requests
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
response = requests.get('https://scrappa.co/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc', headers=headers)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class ApiExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://scrappa.co/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc")
.addHeader("x-api-key", "YOUR_API_KEY_HERE")
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.out.println("Error: " + response.code());
}
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest("GET", "https://scrappa.co/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc", nil)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error making request:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
fmt.Println(string(body))
}
#!/bin/bash
curl -X GET \
-H "x-api-key: YOUR_API_KEY_HERE" \
"https://scrappa.co/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc"
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");
try
{
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc"));
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
import axios from 'axios';
async function run(): Promise<void> {
try {
const response = await axios({
method: 'GET',
url: 'https://scrappa.co/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE',
},
});
console.log(response.data);
} catch (error) {
console.error('Error:', error);
}
}
void run();
use reqwest::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let response = client
.get("https://scrappa.co/api/centris/search?transaction_type=for_sale&location_id=5&location_type=CityDistrictAll&bedrooms=2&max_price=600000&sort=price_asc")
.header("x-api-key", "YOUR_API_KEY_HERE")
.send()
.await?;
println!("{}", response.text().await?);
Ok(())
}
Response Schema
Example response fields are illustrative; inspect the JSON before integrating.
Example response fields
Scan these fields before integrating.
success
data
{
"success": true,
"data": {
"listings": [
{
"mls": "27894956",
"title": "Maison \u00e0 vendre \u00e0 Montr\u00e9al (Pierrefonds-Roxboro), 9486, boulevard Gouin Ouest",
"category": "Maison \u00e0 vendre",
"transaction_type": "for_sale",
"price": 649000,
"currency": "CAD",
"address": "9486, boulevard Gouin Ouest",
"city": "Montr\u00e9al (Pierrefonds-Roxboro)",
"latitude": 45.48204,
"longitude": -73.862114,
"bedrooms": 5,
"bathrooms": 3,
"photo_count": 49,
"url": "https://www.centris.ca/fr/maison~a-vendre~montreal-pierrefonds-roxboro/27894956"
}
],
"count": 9790,
"reachable_count": 5000,
"page": 1,
"page_size": 20,
"total_pages": 250,
"next_page": 2,
"filtered_out": 0
}
}
Errors
Handle these documented responses before retrying or showing customer-facing failures.
Not Found
The listing number or broker code does not exist. This response is not billable and not retryable.
Validation Error
A public parameter is invalid, for example a page above 250, an unknown property type or a location_id without its location_type. This response is not billable.
Service Unavailable
The data could not be loaded right now. Retry the request. This response is not billable.
Generate Code with AI
Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.
Try It Live
Test this endpoint in our interactive playground with real data.