# HouseSigma Scraper (`solidcode/housesigma-scraper`) Actor

\[💰 $1.3 / 1K] Extract Ontario, BC, and Alberta real estate from HouseSigma — for-sale, sold, and lease listings with list prices, the HouseSigma AI estimate on for-sale homes, MLS numbers, beds/baths, square footage, taxes, photos, and GPS. Search by city or paste URLs.

- **URL**: https://apify.com/solidcode/housesigma-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 9 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## HouseSigma Scraper

Pull Ontario, British Columbia, and Alberta real estate from HouseSigma at scale — for-sale, sold, and for-lease listings with HouseSigma's signature AI home-value estimate on active for-sale homes, each property's full listing-event history, MLS numbers, taxes, condo fees, square footage, and GPS coordinates in clean, analysis-ready rows. Search any city across those three provinces or paste a HouseSigma URL and get back structured data instead of copy-pasting one listing at a time. Built for Canadian real estate investors, agents, and market analysts who need HouseSigma's valuation and listing data in bulk without manual page-by-page collection.

### Why This Scraper?

- **HouseSigma's AI home-value estimate on 94–99% of for-sale homes** — the machine-learned valuation HouseSigma is known for, captured on detached, semi-detached, townhouse, and condo listings, ready for underwriting and CMA work. HouseSigma does not value rentals, vacant land, or multiplexes, so those rows arrive without it.
- **Complete listing-event history on 99–100% of rows** — every For Sale, Sold, Leased, Terminated, and price-change event a property has been through, in order, with the current asking price attached — not just today's snapshot. (Historic event dates and past sale prices are reserved for signed-in HouseSigma accounts.)
- **7 property types × 3 listing statuses of filtering** — Detached, Semi-Detached, Townhouse, Condo Apartment, Condo Townhouse, Multiplex, and Land, crossed with For Sale, Sold, and For Lease.
- **~28 structured fields per listing** — MLS number, list price, beds/baths, square footage, lot size, annual property tax, monthly maintenance/condo fee, days on market, and full listing description in one flat row.
- **Split address plus GPS on 100% of listings** — street, city, province, and community as separate fields, and latitude/longitude on every single row for mapping and geo-analysis without a geocoding step. Postal code arrives wherever the listing board publishes it.
- **Up to ~48 photo URLs per listing** — the full gallery, available as an optional toggle for the lightest possible runs when you don't need images.
- **Coverage across 3 provinces — Ontario, British Columbia, and Alberta** — type "Toronto", "Vancouver, BC", or "Calgary" and the right municipality is matched for you; a city outside those three is named in the run log instead of quietly returning nothing.
- **Search by city name or paste any HouseSigma URL** — type "Toronto" or "Mississauga", or drop in a regional search or single-property HouseSigma link: the region is read straight out of the URL, and a sold or for-lease page sets the status for you.
- **Analysis-ready numeric output** — prices, beds, baths, taxes, and fees arrive as numbers, not raw strings like `"$1,250,000"`, so they drop straight into spreadsheets and dashboards.

### Use Cases

**Investment Analysis**

- Compare HouseSigma's AI estimate against the list price to spot under- or over-priced listings
- Underwrite deals using days-on-market, property tax, and maintenance-fee data in one row
- Track price-change events over time from the price-history timeline
- Screen for cash-flow candidates by condo fee and property type

**Comparative Market Analysis (CMA)**

- Pull the last ~90 days of sold activity — address, property type, and coordinates — to build geographic comps
- Group sold and active listings by community and property type for a like-for-like view
- Benchmark list-to-estimate spreads across neighbourhoods

**Lead Generation**

- Build lists of fresh for-sale and for-lease listings by city and property type
- Target newly listed homes using days-on-market and list-date fields
- Filter to specific property types (condos, detached, multiplex) for niche outreach

**Market Research & Trends**

- Map inventory by city, community, and status across Ontario, British Columbia, and Alberta
- Track for-lease supply and pricing versus for-sale inventory
- Measure how long active inventory sits using days-on-market and list dates across a region

**Data Enrichment**

- Enrich an existing property database with MLS numbers, GPS coordinates, and estimates
- Feed structured HouseSigma rows into analytics dashboards and BI tools
- Geocode and plot listings using built-in latitude/longitude

### Getting Started

#### Search a Single City

The simplest run — type a city and go:

```json
{
    "searchLocations": ["Toronto, ON"],
    "maxResults": 50
}
```

#### Filtered Search with Full Detail and Photos

Detached homes for sale, enriched with price history, taxes, and the full photo gallery:

```json
{
    "searchLocations": ["Mississauga, ON", "Oakville, ON"],
    "listingStatus": "for_sale",
    "propertyType": "detached",
    "maxResults": 300,
    "includeDetails": true,
    "includePhotos": true
}
```

#### Sold Comps for CMA

Condos sold in the last ~90 days — street address, city, property type, and map coordinates for every sale, ready to plot as geographic comps:

```json
{
    "searchLocations": ["Vancouver, BC"],
    "listingStatus": "sold",
    "propertyType": "condo_apt",
    "maxResults": 200
}
```

#### Using HouseSigma URLs

Paste a regional search page or a single-property URL — the region comes from the URL, and the filters below cover the rest:

```json
{
    "startUrls": [
        "https://housesigma.com/on/toronto-real-estate"
    ],
    "maxResults": 100,
    "includeDetails": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | string\[] | `["https://housesigma.com/on/toronto-real-estate"]` | Paste HouseSigma URLs — a regional search page or a single property page. The type is auto-detected. A search URL supplies the province and municipality, and a sold or for-lease page also supplies the status; the Search Filters below cover everything else. |
| `searchLocations` | string\[] | `[]` | Search by city, region, or neighbourhood (e.g. "Toronto", "Mississauga, ON", "Vancouver, BC", "Calgary"). Covers Ontario, British Columbia, and Alberta. No need to build URLs manually. |

#### Search Filters

These apply to Search Locations and to Start URLs alike — the one exception is that a sold or for-lease URL sets its own status.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `listingStatus` | select | `For Sale` | Which listings to find: For Sale, Sold, or For Lease. Applies to any URL that does not already carry a status. |
| `propertyType` | select | `All Types` | Filter by type: All Types, Detached, Semi-Detached, Townhouse, Condo Apartment, Condo Townhouse, Multiplex, or Land. Applies to Start URLs too, so set it to match the URL you paste. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `100` | Maximum listings to collect across all URLs and searches. Set to 0 for unlimited. Start with 10-50 to test, then scale up. |
| `includeDetails` | boolean | `true` | Fetch each listing's full detail page — description, price history, HouseSigma estimate, lot size, square footage, taxes, and maintenance fees. Slower but much richer. When off, only listing-summary fields are returned. |
| `includePhotos` | boolean | `false` | Include the full photo gallery (image URLs) for each listing. Disable for the fastest, lightest runs. |

### Output

Each listing is one row. Here's a representative for-sale result with details and photos enabled. Fields with no value are left out of the row entirely, so what you get is always real data:

```json
{
    "listingId": "abc123XYZ",
    "mlsNumber": "W7654321",
    "status": "for_sale",
    "listPrice": 1250000,
    "estimate": 1278000,
    "addressLine": "123 Maple Avenue",
    "city": "Toronto",
    "province": "ON",
    "community": "The Beaches",
    "latitude": 43.6712,
    "longitude": -79.2967,
    "propertyType": "Detached",
    "bedrooms": 4,
    "bathrooms": 3,
    "sqft": "2000-2500",
    "lotSize": "30 x 120 Feet",
    "daysOnMarket": 12,
    "listDate": "2026-05-30",
    "listingEndDate": "2026-11-30",
    "propertyTax": 7480,
    "description": "Beautifully renovated detached home steps from the boardwalk...",
    "priceHistory": [
        { "event": "For Sale", "price": 1250000, "type": "Sale" },
        { "event": "Terminated", "type": "Lease" },
        { "event": "Sold", "type": "Sale" }
    ],
    "photos": ["https://media.housesigma.com/example1.jpg"],
    "url": "https://housesigma.com/on/toronto/123-maple-avenue/home/abc123XYZ/"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | HouseSigma internal listing identifier |
| `mlsNumber` | string | MLS listing number |
| `status` | string | Normalized status: for\_sale, sold, for\_lease, or leased |
| `propertyType` | string | Detached, Condo Apartment, Townhouse, etc. |
| `daysOnMarket` | number | Days an active listing has been on the market (on 96–100% of for-sale and for-lease rows) |
| `listDate` | string | Date the listing went live (active listings) |
| `listingEndDate` | string | Date the listing agreement runs to — not a sale date (on 15% of for-sale and 13% of for-lease rows, rising to 28% in dense city segments) |
| `soldDate` | string | Completion date where HouseSigma publishes one. Sale and lease dates are account-gated on HouseSigma, so expect this to be absent |
| `url` | string | Canonical HouseSigma listing URL |

#### Address & Location

| Field | Type | Description |
|-------|------|-------------|
| `addressLine` | string | Street address |
| `city` | string | City or municipality |
| `province` | string | Province code (e.g. ON, BC) |
| `postalCode` | string | Postal code, where the listing board publishes it (about 1 row in 8; land listings run much higher) |
| `community` | string | Neighbourhood or community name |
| `latitude` | number | Latitude for mapping |
| `longitude` | number | Longitude for mapping |

#### Pricing & Valuation

| Field | Type | Description |
|-------|------|-------------|
| `listPrice` | number | Asking price in CAD, or monthly rent on for-lease rows |
| `estimate` | number | HouseSigma's AI home-value estimate — on 94–99% of for-sale homes |
| `propertyTax` | number | Annual property tax in CAD |
| `maintenanceFee` | number | Monthly maintenance / condo fee in CAD (condo listings) |

HouseSigma publishes exact sold prices only to signed-in account holders, so sold rows carry street address, city, property type, and coordinates rather than a final sale figure — which is what makes them useful as geographic comps.

#### Property Details

| Field | Type | Description |
|-------|------|-------------|
| `bedrooms` | number | Bedroom count |
| `bathrooms` | number | Bathroom count |
| `sqft` | string | Floor area as reported (often a range, e.g. "2000-2500") |
| `lotSize` | string | Lot dimensions as reported (e.g. "30 x 120 Feet") |
| `description` | string | Full listing remarks (detail mode only) |

#### History & Media

| Field | Type | Description |
|-------|------|-------------|
| `priceHistory` | object\[] | Ordered sequence of the property's listing events — For Sale, Sold, Leased, Terminated, price change. Each event carries `event`, `type` (Sale or Lease) and, for the current listing, a numeric `price`. Dates and past sale prices are account-gated on HouseSigma (detail mode only) |
| `photos` | string\[] | Full gallery of listing image URLs (only when Include Photo Gallery is on) |

### Tips for Best Results

- **Start small** — set `maxResults` to 10-50 on your first run to confirm the data fits your needs, then scale up.
- **Use sold listings as geographic comps** — a sold run covers roughly the last 90 days and returns street address, city, property type, and coordinates on virtually every row. Prices, MLS numbers, and bed/bath counts on sold homes are reserved for signed-in HouseSigma accounts, so pair sold locations with active listings when you need dollar figures.
- **Split hot markets to go past the cap** — a single search returns at most 4,000 listings. To go deeper in a busy city, split the run by neighbourhood, property type, or price range across multiple search locations.
- **Keep details on for sold searches** — property type only comes back on sold rows when Include Full Listing Details is on. For active listings you can turn it off for fast summary-only runs, and on for description, listing history, taxes, lot size, and the estimate.
- **Leave photos off unless you need them** — the gallery adds up to ~48 image URLs per listing; disable it for the lightest, fastest runs.
- **Set Property Type to match a pasted URL** — a URL hands over its region, and a sold or for-lease page its status, but the type filter is the one you choose above. Mix several city searches and URLs in a single run to cover multiple markets at once.
- **Map with built-in coordinates** — every listing ships latitude and longitude, so you can plot results directly without a separate geocoding step.

### Pricing

**From $1.30 per 1,000 results** — richer per-listing data than other HouseSigma actors, including the AI estimate and the full sequence of listing events, at a lower entry price. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.16 | $0.15 | $0.14 | $0.13 |
| 1,000 | $1.55 | $1.45 | $1.40 | $1.30 |
| 10,000 | $15.50 | $14.50 | $14.00 | $13.00 |
| 100,000 | $155.00 | $145.00 | $140.00 | $130.00 |

A "result" is any listing row in the output dataset. The fixed per-run start fee is additional and is independent of the number of results.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate real estate research, market analysis, and lead generation. Users are responsible for complying with applicable laws and HouseSigma's Terms of Service. Do not use extracted data for spam, harassment, or any unlawful purpose. Be mindful of privacy regulations and MLS rules when handling listing and contact data. </content> </invoke>

# Actor input Schema

## `startUrls` (type: `array`):

Paste HouseSigma URLs directly — a regional search page or a single property page. The scraper auto-detects which kind it is. From a search URL it reads the province and the municipality, and a sold or for-lease page (for example /on/listings/just-sold/) also sets the Listing Status for you. Everything else — Property Type, Max Results, and Listing Status on URLs that do not carry one — still comes from the settings below, so set them to match your URL.

## `searchLocations` (type: `array`):

Search by city, region, or neighbourhood — for example 'Toronto', 'Mississauga, ON', 'Vancouver, BC', or 'Calgary'. HouseSigma lists Ontario, British Columbia, and Alberta; a city outside those is reported in the run log rather than returning nothing. No need to build URLs manually.

## `listingStatus` (type: `string`):

Which listings to find. Applies to Search Locations, and to any Start URL that does not already carry a status — HouseSigma's sold and for-lease pages do.

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

Filter by property type. Applies to Search Locations and to Start URLs alike — a type baked into a URL is not read, so set this to match the URL you paste.

## `maxResults` (type: `integer`):

Maximum number of listings to collect across all URLs and searches. Set to 0 for unlimited. Tip: start with 10-50 to test, then increase. Note: HouseSigma returns at most 4,000 listings per individual search; to go beyond that for one area, split the search by neighbourhood, property type, or price range.

## `includeDetails` (type: `boolean`):

Fetch the full detail page for each listing (description, price history, HouseSigma estimate, lot size, square footage, taxes). Slower but much richer data. When off, only the listing summary fields are returned.

## `includePhotos` (type: `boolean`):

Include the full photo gallery (image URLs) for each listing. Disable for the fastest, lightest runs.

## Actor input object example

```json
{
  "startUrls": [
    "https://housesigma.com/on/toronto-real-estate"
  ],
  "searchLocations": [],
  "listingStatus": "for_sale",
  "propertyType": "all",
  "maxResults": 100,
  "includeDetails": true,
  "includePhotos": false
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped listings with key fields like status, price, address, beds, and baths.

# 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 = {
    "startUrls": [
        "https://housesigma.com/on/toronto-real-estate"
    ],
    "searchLocations": [],
    "listingStatus": "for_sale",
    "propertyType": "all",
    "maxResults": 100,
    "includeDetails": true,
    "includePhotos": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/housesigma-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 = {
    "startUrls": ["https://housesigma.com/on/toronto-real-estate"],
    "searchLocations": [],
    "listingStatus": "for_sale",
    "propertyType": "all",
    "maxResults": 100,
    "includeDetails": True,
    "includePhotos": False,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/housesigma-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 '{
  "startUrls": [
    "https://housesigma.com/on/toronto-real-estate"
  ],
  "searchLocations": [],
  "listingStatus": "for_sale",
  "propertyType": "all",
  "maxResults": 100,
  "includeDetails": true,
  "includePhotos": false
}' |
apify call solidcode/housesigma-scraper --silent --output-dataset

```

## MCP server setup

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