Skip to content
Scrappa Get API key
Realtor.ca API 1 credit/request

Realtor.ca Search

GET https://scrappa.co/api/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2

Searches Canadian property inventory. transaction_type accepts for_sale, for_rent and sold. property_type_group accepts residential and commercial. Range filters use min-max with 0 meaning no upper bound, so bed_range=3-0 is three or more bedrooms. Price filters map to the sale fields for sale and sold inventory and to the rental fields for rent inventory. Scope a search with a bounding box, a geo_id, an individual_id or an organization_id. Results carry the full listing record including the brokerage and the listing agents.

Realtor.ca Search 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2
Auth header
x-api-key
Cost
1 credit/request
Response preview
200 OK
{
    "success": true,
    "data": {
        "search": {
            "results": [
                {
                    "Id": "30362491",
                    "MlsNumber": "C13859810",
                    "Price": 1200000
                }
            ],
            "count": 1,
            "paging": {
                "total_records": 2777
...

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.

26 optional filters available.

transaction_type string Optional

for_sale, for_rent or sold.

Example value for_sale
property_type_group string Optional

residential or commercial.

Example value example
sort string Optional

price_asc, price_desc, newest, oldest, virtual_tour, most_photos or floor_area.

Example value relevance
property_type_id integer Optional

Commercial sub-type, so it requires property_type_group=commercial and is refused with 422 on residential inventory. Coverage overlaps between sub-types, so totals are not additive.

Example value 1234567890
min_price integer Optional

Minimum price in CAD. Applies to the rental range on rent inventory.

Example value 10
max_price integer Optional

Maximum price in CAD. Applies to the rental range on rent inventory.

Example value 10
bed_range string Optional

min-max with 0 for no upper bound, for example 3-0.

Example value example
bath_range string Optional

min-max with 0 for no upper bound, for example 2-0.

Example value example
storey_range string Optional

min-max with 0 for no upper bound, for example 1-0.

Example value example
garage boolean Optional

Only listings with a garage.

Example value true
pool boolean Optional

Only listings with a pool.

Example value true
waterfront boolean Optional

Only waterfront listings.

Example value true
fireplace boolean Optional

Only listings with a fireplace.

Example value true
air_condition boolean Optional

Only listings with air conditioning.

Example value true
acreage boolean Optional

Only acreage listings.

Example value true
latitude_min number Optional

South edge of the bounding box. Send all four bounds together.

Example value 43.63
latitude_max number Optional

North edge of the bounding box.

Example value 43.68
longitude_min number Optional

West edge of the bounding box.

Example value -79.43
longitude_max number Optional

East edge of the bounding box.

Example value -79.35
geo_id string Optional

Location id from the locations endpoint.

Example value 1234567890
individual_id integer Optional

Listings represented by one REALTOR.

Example value 1234567890
organization_id integer Optional

Listings from one brokerage.

Example value 1234567890
page integer Optional

Page number within the current scope, 1 to 100. The paging hint in a response never names a page beyond that. If the origin still reports pages past that limit, the response carries next.page_ceiling_reached with the current page and the origin's total_pages instead of next.scope_exhausted, so a capped result set is never mistaken for a complete one.

Example value 1
records_per_page integer Optional

Results requested per page.

Example value 2
sold_within_days integer Optional

Required when transaction_type=sold: look back this many days, capped at 365. A sold search without it is refused with 422 rather than answered with an unbounded national set or a silently narrowed one. Rejected on any other transaction type.

Example value 10
zoom_level integer Optional

Map zoom used to group result markers. Accepted range 1 to 20, default 12.

Example value 10

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2",
    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
<?php

use Illuminate\Support\Facades\Http;

$response = Http::timeout(30)
    ->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
    ->get('https://scrappa.co/api/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2');

if ($response->successful()) {
    echo $response->body();
} else {
    echo "Error: " . $response->status();
}
JavaScript
const options = {
    method: 'GET',
    headers: {
        'x-api-key': 'YOUR_API_KEY_HERE'
    }
};

fetch('https://scrappa.co/api/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2', 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));
JavaScript
const axios = require('axios');

const options = {
    method: 'GET',
    url: 'https://scrappa.co/api/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2',
    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);
}
Ruby
require 'net/http'
require 'uri'

uri = URI.parse("https://scrappa.co/api/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2")
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
Python
import http.client
import json

conn = http.client.HTTPSConnection("scrappa.co")

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    conn.request("GET", "/api/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2", headers=headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
except Exception as e:
    print(f"Error: {e}")
finally:
    conn.close()
Python
import requests

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    response = requests.get('https://scrappa.co/api/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2', headers=headers)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")
Java
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/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2")
        .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());
        }
    }
}
Go
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://scrappa.co/api/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2", 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))
}
Terminal
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2"
C#
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/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2"));
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
TypeScript
import axios from 'axios';

async function run(): Promise<void> {
    try {
        const response = await axios({
            method: 'GET',
            url: 'https://scrappa.co/api/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2',
            headers: {
        'x-api-key': 'YOUR_API_KEY_HERE',
            },
        });

        console.log(response.data);
    } catch (error) {
        console.error('Error:', error);
    }
}

void run();
RUST
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/realtor-ca/search?transaction_type=for_sale&latitude_min=43.63&latitude_max=43.68&longitude_min=-79.43&longitude_max=-79.35&records_per_page=2")
        .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
JSON Response
200 OK
{
    "success": true,
    "data": {
        "search": {
            "results": [
                {
                    "Id": "30362491",
                    "MlsNumber": "C13859810",
                    "Price": 1200000
                }
            ],
            "count": 1,
            "paging": {
                "total_records": 2777
            },
            "map_pins": []
        }
    }
}

Errors

Handle these documented responses before retrying or showing customer-facing failures.

Listing Not Found

The requested listing reference number resolved to nothing on the origin. This response is not billable and is not retryable: a well-behaved client should not resend a reference number that does not exist.

Validation Error

A public parameter is invalid, including an unknown transaction type, property group or out-of-range price. This response is not billable.

Service Unavailable

The service could not obtain a complete result. 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.