# HouseSigma Property Search API Documentation

Scrappa's `GET /api/housesigma/search` returns HouseSigma listings in Ontario, British Columbia and Alberta as structured JSON, for sale (`operation=sale`, the default) or for rent (`rent`).

## What you get

One request returns one page of up to 20 listings and the site's own match count in `total`. Each listing has `id` (feeds the listing and nearby endpoints), `ml_num`, `url`, `address`, `price` (amount, currency `CAD`, `abbr`, `gated`), `bedrooms`, `bedrooms_extra`, `bathrooms`, `parking`, `property_type` (code and label), `style`, `area` (a band such as 1100-1500 square feet with `min` and `max`), `lot`, `location` (`lat`, `lon`), `status`, `community`, `municipality`, `province`, `listed_at`, `updated_at`, `days_on_site`, one `photo`, `brokerage`, `estimate`, `rent_yield`, `scores`, `tags`, `open_house_date` and `data_source`.

## Location

`municipality_id` is required. Take it from `/api/housesigma/locations` (`cities.municipality_id`), for example 10343 for Toronto, 10597 for Vancouver (`province=BC`) or 10511 for Calgary (`province=AB`). `community_id` narrows the search to one neighbourhood. An id that HouseSigma does not know returns an empty list.

## Filters are honoured

The site applies the filters itself. Scrappa then checks every card once more against sale or rent, type, bedrooms, bathrooms, garage, price, area, lot and listing age, and drops a card that contradicts a filter. The number of dropped cards is `meta.filtered_out`, so a page can hold fewer than 20 listings. `total` stays the site's count. `applied_filters` echoes what was applied.

- `bedrooms` is exact, 0 means studio and 5 means five or more. `bathrooms` and `garage` are minimums.
- `area_min` and `area_max` are square feet. HouseSigma reports floor area as a band, and a band is kept when it touches your range.
- `price_min` and `price_max` are CAD. For rent they are monthly prices.
- `keyword` searches the listing description and is applied by the site.
- Unknown parameters are rejected with `422` instead of being ignored.

## Masked listings

About one listing in ten hides its price, rooms and area from visitors who are not signed in. Such a listing is returned with `gated: true` and `null` values, never with invented numbers. When you filter by price, rooms, area or lot, masked listings are left out because they cannot be checked.

## Sort and pagination

`sort` is `newest` (default), `price_asc` or `price_desc`. `page` is 1-based with 20 listings per page. HouseSigma serves at most 200 pages and counts at most 4000 matches, so `pagination.capped` is `true` for large searches. Slice big areas by neighbourhood (`community_id`) or add filters to reach other listings. A page past the last result page returns an empty list. It never returns another page's listings.

- **Documentation:** [https://scrappa.co/docs/housesigma-api/housesigma_search](https://scrappa.co/docs/housesigma-api/housesigma_search)
- **API group:** HouseSigma API
- **Endpoint:** `GET https://scrappa.co/api/housesigma/search`

## Authentication

Send your Scrappa API key in the `X-API-KEY` request header. Paid endpoints also support accountless x402 payments when called without an API key.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `municipality_id` | integer | Yes | City id from /api/housesigma/locations (cities.municipality_id), for example 10343 for Toronto. |
| `community_id` | integer | No | Neighbourhood id from /api/housesigma/locations (communities.community_id). |
| `operation` | string | No | sale (default) or rent. |
| `province` | string | No | ON (default), BC or AB. Use the province of the city. |
| `type` | string | No | detached, semi_detached, freehold_townhouse, condo_townhouse, condo_apartment, link, multiplex, vacant_land or other. |
| `price_min` | integer | No | Minimum price in CAD. Rent is the monthly price. |
| `price_max` | integer | No | Maximum price in CAD. Rent is the monthly price. |
| `bedrooms` | integer | No | 0 (studio) to 5. 5 means five or more. |
| `bathrooms` | integer | No | Minimum bathrooms, 1 to 5. |
| `garage` | integer | No | Minimum garage spaces, 1 to 5. |
| `area_min` | integer | No | Minimum floor area in square feet. |
| `area_max` | integer | No | Maximum floor area in square feet. |
| `lot_min` | integer | No | Minimum lot size in square feet. |
| `lot_max` | integer | No | Maximum lot size in square feet. |
| `listing_days` | integer | No | Listed within the last 1, 3, 7, 30 or 90 days. |
| `keyword` | string | No | Words from the listing description, for example pool. |
| `sort` | string | No | newest (default), price_asc or price_desc. |
| `page` | integer | No | Result page, 1 to 200. 20 listings per page. |

## Example request

```bash
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/housesigma/search?municipality_id=10343&operation=sale&bedrooms=3&price_max=1200000&sort=price_asc"
```

## Example response

```json
{
    "success": true,
    "total": 990,
    "returned": 1,
    "pagination": {
        "page": 1,
        "limit": 20,
        "total_pages": 50,
        "has_next_page": true,
        "has_previous_page": false,
        "capped": false
    },
    "applied_filters": {
        "operation": "sale",
        "province": "ON",
        "municipality_id": 10343,
        "sort": "price_asc",
        "bedrooms": 3,
        "price_max": 1200000
    },
    "listings": [
        {
            "id": "ZxwR7Mj4Jve3KabB",
            "ml_num": "W13861182",
            "url": "https://housesigma.com/on/toronto-real-estate/39-exeter-street/home/0A9X3jP8xJEyvgxV/",
            "address": "39 Exeter Street",
            "price": {
                "amount": 930000,
                "currency": "CAD",
                "abbr": "0.93M",
                "gated": false
            },
            "bedrooms": 3,
            "bedrooms_extra": 1,
            "bathrooms": 2,
            "parking": {
                "total": 2,
                "garage": 2,
                "garage_type": "Detached",
                "text": "Detached 2 garage,  2 parking"
            },
            "property_type": {
                "code": "S.",
                "label": "Semi-Detached"
            },
            "style": "2-Storey",
            "area": {
                "text": "1100-1500",
                "min": 1100,
                "max": 1500,
                "unit": "feet\u00b2"
            },
            "lot": {
                "front": 18,
                "depth": 110,
                "area": 1980,
                "unit": "feet"
            },
            "location": {
                "lat": 43.67327,
                "lon": -79.4558
            },
            "status": {
                "kind": "sale",
                "text": "For Sale",
                "code": "A",
                "live": true
            },
            "community": "Weston-Pellam Park",
            "municipality": "Toronto",
            "province": "ON",
            "postal_code": null,
            "listed_at": "2026-10-05",
            "updated_at": "2026-10-25",
            "days_on_site": 20,
            "photo": "https://cache-e15.housesigma.com/file/pix-treb/W13861182/e3665_1_1200.webp?7f6b4e72",
            "brokerage": "SUTTON GROUP REALTY SYSTEMS INC.",
            "estimate": null,
            "rent_yield": 4.1,
            "scores": {
                "school": 6,
                "rent": 7,
                "growth": 5
            },
            "tags": [
                "For Sale"
            ],
            "open_house_date": [],
            "data_source": "PROPTX",
            "gated": false
        }
    ],
    "meta": {
        "endpoint_family": "search",
        "billable": true,
        "attempts": 1,
        "filtered_out": 1
    }
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 422 | Validation Error | A query parameter is missing, unknown or unusable, for example `page` above 200. Unknown parameters are rejected, never ignored. Non-billable. |
| 503 | Upstream Unavailable | HouseSigma could not be reached after retries, answered with an error, or returned an unexpected answer (`upstream_unavailable`, `upstream_blocked`, `token_unavailable`, `upstream_changed`). Retryable and never billed. Clients are never rate limited. |

## More Scrappa resources

- [API documentation](https://scrappa.co/docs)
- [Full LLM-readable API reference](https://scrappa.co/llms-full.txt)
- [OpenAPI specification](https://scrappa.co/docs/api.json)
- [Pricing](https://scrappa.co/pricing)
