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

Collect HouseSigma real-estate listings across Canada with filters for status, price, bedrooms, and property type, plus optional full listing details including photos, schools, and price estimates.

- **URL**: https://apify.com/scraptivo/housesigma-scraper.md
- **Developed by:** [Scraptivo](https://apify.com/scraptivo) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 listings

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**HouseSigma Scraper** collects real-estate listings from HouseSigma across Canada and turns them into structured property records for investment research, price tracking, and market analysis. Search by place (`Toronto`, `Oshawa`) or paste a map/search URL, run the Actor, and export price, beds, baths, MLS number, and estimates to JSON, CSV, or Excel. Enable listing details to add photos, schools, history, and estimates. Pricing is **$1.50 per 1,000 listings**, plus **$2.50 per 1,000** full detail payloads.

### What can you automate with HouseSigma Scraper?

- **Build investor-grade databases** — collect for-sale, for-lease, sold, and de-listed listings with rich filters.
- **Track price history** — capture current price, estimates, and days-on-market per property.
- **Analyze neighborhoods** — filter by school score, rental yield, lot size, and square footage.
- **Enrich listings on demand** — switch on details to add photos, schools, and transaction history.
- **Schedule recurring collection** — re-run daily or weekly to keep listings current.

### Who is this scraper for?

| Team | Workflow |
|---|---|
| Real-estate investors | Find and compare investment properties by yield and price |
| Agents and brokerages | Monitor inventory, sold, and de-listed activity |
| Market researchers | Track pricing trends across provinces and cities |
| Data providers | Feed normalized Canadian property data downstream |

### What data can you collect from HouseSigma?

| Data group | Example fields | How it helps |
|---|---|---|
| Property identity | address, municipality, community, mlsNumber, idListing, houseType | Match and reference properties |
| Pricing and estimates | price, estimatePrice, estimateRent, dateAdded, dom | Assess value and timing |
| Characteristics | bedrooms, bathrooms, lotSize, propertySize, tax | Filter and compare properties |

When listing details are enabled, each listing adds photos, schools, history, and estimate detail.

### How to use HouseSigma Scraper

1. Open the Actor in the Apify Console.
2. Enter a place name (for example `Toronto`) or paste a HouseSigma map/search URL.
3. Choose status and optional filters (price, bedrooms, property type).
4. Run the Actor.
5. Export the dataset to JSON, CSV, Excel, or connect it to your pipeline.

```json
{
  "searchQueries": ["Toronto"],
  "listStatus": "for-sale",
  "scrapeDetails": true,
  "maxItems": 50,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Example workflow

#### Screen for rental-yield properties every week

1. Run a for-sale search for a target city each Monday.
2. Keep properties matching your minimum rental yield and budget.
3. Send new records to Google Sheets or a CRM.
4. Deduplicate using the stable `idListing` or `mlsNumber` field.

### Automate and integrate your results

Schedule runs in the Apify Console or via API and push results to Google Sheets, Make, Zapier, Slack, a CRM, or cloud storage using a webhook after each successful run. For recurring pipelines, call the Actor programmatically and use the `idListing` or `mlsNumber` field as your stable key for user-side deduplication.

### Input reference

| Field | Type | Required | Default | What it controls |
|---|---:|---|---|---|
| searchQueries | array | No | `["Toronto"]` | Place searches resolved to a map area |
| startUrls | array | No | prefilled | HouseSigma map/search URLs |
| province | string | No | `ON` | Province code (ON, AB, BC, QC, …) |
| listStatus | string | No | `for-sale` | for-sale, for-lease, sold, leased, de-listed |
| houseTypes | array | No | `["all"]` | Property types to include |
| priceMin / priceMax | integer | No | 0 / — | Price or rent range |
| bedrooms / bathroomMin / garageMin | — | No | all | Bedroom, bathroom, and garage filters |
| scrapeDetails | boolean | No | `true` | Full detail per listing (separate event) |
| maxItems | integer | No | `50` | Maximum listings (0 = unlimited) |
| proxyConfiguration | object | No | Residential | Apify Residential proxy settings |

### Output example

```json
{
  "photoUrl": "https://…/listing-photo.jpg",
  "url": "https://housesigma.com/on/toronto-real-estate/listing/12345",
  "address": "123 Example St, Toronto",
  "municipality": "Toronto",
  "status": "for-sale",
  "price": 899000,
  "bedrooms": 3,
  "bathrooms": 2,
  "houseType": "D.",
  "mlsNumber": "C1234567",
  "idListing": "12345",
  "estimatePrice": 905000,
  "estimateRent": 3200,
  "dateAdded": "2026-10-01",
  "dom": 12,
  "propertySize": "1600",
  "sourceQuery": "Toronto"
}
```

### How much does it cost to scrape HouseSigma?

This Actor uses pay-per-event billing. Each listing saved costs **$1.50 per 1,000 listings**. When listing details are enabled, each detailed listing adds **$2.50 per 1,000** (`listing-details`). A small one-time Actor-start fee applies, and residential proxy traffic is billed separately. A small run of 50 listings costs well under a cent in listing events.

### Reliability and responsible use

Residential proxies are recommended and enabled by default. Listings are fetched with configurable detail concurrency, and detail fields are conditional on `scrapeDetails`. Some fields, such as estimates and tax, may be empty when HouseSigma does not provide them. Only publicly listed property data is collected. You are responsible for using collected data lawfully and in line with HouseSigma's terms.

### Frequently asked questions

#### Can I scrape sold and de-listed properties?

Yes — set `listStatus` to `sold`, `leased`, or the de-listed options, and use `soldDays`/`deListDays` to control the window.

#### Can I schedule the HouseSigma scraper to run automatically?

Yes. Use the Apify Scheduler or API to re-run at the cadence you need.

#### What counts as one result?

Each listing is one billable result. Enabling details adds a second event per listing.

#### Why are some fields empty?

Detail fields appear only when `scrapeDetails` is on, and HouseSigma may not provide every estimate or tax figure.

#### How do I avoid duplicate records?

Deduplicate by the stable `idListing` or `mlsNumber` field in your own pipeline.

#### Do I need a proxy?

A residential proxy is recommended and enabled by default for reliable access.

### Related Scraptivo automations

- [Realtor Scraper](https://apify.com/scraptivo/realtor-scraper) — US Realtor.com listings
- [Realtor Agent Scraper](https://apify.com/scraptivo/realtor-agent-scraper) — agent and office data
- [Redfin Scraper](https://apify.com/scraptivo/redfin-scraper) — US residential listings
- [Trulia Scraper](https://apify.com/scraptivo/trulia-scraper) — US rental and sale listings

### Support and custom workflows

Need a different field, source, or delivery workflow? Contact Scraptivo at scraptivo@gmail.com. Include the Actor name, sample URL, required fields, and expected volume so we can assess the request.

# Actor input Schema

## `searchQueries` (type: `array`):

Location or place searches such as "Toronto", "Danforth", or "Oshawa". Resolved via HouseSigma suggest to a municipality / map area. Example: \["Toronto"].

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

Optional HouseSigma map/search URLs (e.g. https://housesigma.com/on/toronto-real-estate/map/?municipality=10343\&status=for-sale). Municipality, status, map center, zoom, and page are read from the URL and merged with the filters below.

## `province` (type: `string`):

Province code used by HouseSigma APIs.

## `listStatus` (type: `string`):

For sale, for lease, sold, leased, or de-listed.

## `houseTypes` (type: `array`):

Property types to include. Leave as All property types or pick one or more types.

## `priceMin` (type: `integer`):

Minimum list price (sale default currency CAD). For lease searches this is monthly rent.

## `priceMax` (type: `integer`):

Maximum list price. Defaults to 6000000 for sale and 10000 for lease when omitted in API defaults; set explicitly to override.

## `listingDays` (type: `string`):

Active listing date filter. Positive = listed within N days; 0 = all; negative = more than N days (e.g. -90).

## `soldDays` (type: `integer`):

Used when listing status is Sold. Number of days (or omit for default 90).

## `deListDays` (type: `integer`):

Used when listing status is de-listed. Number of days (default 90).

## `bedrooms` (type: `array`):

Bedroom filter values. 0 = all, -10 = 0 bedrooms, 5 = 5+.

## `bathroomMin` (type: `string`):

Minimum bathrooms (0 = all, otherwise N+).

## `garageMin` (type: `string`):

Minimum garage spaces (0 = all, otherwise N+).

## `basement` (type: `array`):

Basement features. Empty means any.

## `openHouseDate` (type: `string`):

Open house filter.

## `listingType` (type: `string`):

Resale vs exclusive assignment.

## `lotSizeMin` (type: `integer`):

Minimum lot size in square feet (0 = unspecified).

## `lotSizeMax` (type: `integer`):

Maximum lot size in square feet (10000000 = max).

## `frontFeetMin` (type: `integer`):

Minimum lot frontage in feet.

## `frontFeetMax` (type: `integer`):

Maximum lot frontage in feet.

## `squareFootageMin` (type: `integer`):

Minimum interior square footage.

## `squareFootageMax` (type: `integer`):

Maximum interior square footage.

## `schoolScoreMin` (type: `number`):

Minimum school score (0–10).

## `schoolScoreMax` (type: `number`):

Maximum school score (0–10).

## `rentalYieldMin` (type: `number`):

Minimum rental yield as a fraction (0.05 = 5%).

## `rentalYieldMax` (type: `number`):

Maximum rental yield as a fraction (0.1 = max).

## `municipalityId` (type: `integer`):

Optional HouseSigma municipality id (e.g. 10343 for Toronto). Also read from start URL query municipality=.

## `scrapeDetails` (type: `boolean`):

When enabled, fetch full detail for each listing (photos, schools, history, estimates). Charges the listing-details event per successful detail. When disabled, only list-card fields are returned.

## `detailConcurrency` (type: `integer`):

How many listing-detail requests to run in parallel (1–25). Higher is faster; pair with residential proxy rotation.

## `sortType` (type: `integer`):

HouseSigma list sort_type integer (0 = site default).

## `maxItems` (type: `integer`):

Maximum number of listings to scrape (0 = unlimited).

## `proxyConfiguration` (type: `object`):

Apify Proxy settings. Residential is recommended.

## Actor input object example

```json
{
  "searchQueries": [
    "Toronto"
  ],
  "startUrls": [
    {
      "url": "https://housesigma.com/on/toronto-real-estate/map/?municipality=10343&status=for-sale&lat=43.653226&lon=-79.383184&zoom=12&view=list"
    }
  ],
  "province": "ON",
  "listStatus": "for-sale",
  "houseTypes": [
    "all"
  ],
  "priceMin": 0,
  "listingDays": "0",
  "soldDays": 90,
  "deListDays": 90,
  "bedrooms": [
    "0"
  ],
  "bathroomMin": "0",
  "garageMin": "0",
  "basement": [],
  "openHouseDate": "0",
  "listingType": "all",
  "lotSizeMin": 0,
  "lotSizeMax": 10000000,
  "frontFeetMin": 0,
  "frontFeetMax": 100,
  "squareFootageMin": 0,
  "squareFootageMax": 4000,
  "schoolScoreMin": 0,
  "schoolScoreMax": 10,
  "rentalYieldMin": 0,
  "rentalYieldMax": 0.1,
  "scrapeDetails": true,
  "detailConcurrency": 8,
  "sortType": 0,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset containing scraped HouseSigma listings

## `runStats` (type: `string`):

Key-value store record with recordsScraped and timestamps

# 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 = {
    "searchQueries": [
        "Toronto"
    ],
    "startUrls": [
        {
            "url": "https://housesigma.com/on/toronto-real-estate/map/?municipality=10343&status=for-sale&lat=43.653226&lon=-79.383184&zoom=12&view=list"
        }
    ],
    "scrapeDetails": false,
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraptivo/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 = {
    "searchQueries": ["Toronto"],
    "startUrls": [{ "url": "https://housesigma.com/on/toronto-real-estate/map/?municipality=10343&status=for-sale&lat=43.653226&lon=-79.383184&zoom=12&view=list" }],
    "scrapeDetails": False,
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scraptivo/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 '{
  "searchQueries": [
    "Toronto"
  ],
  "startUrls": [
    {
      "url": "https://housesigma.com/on/toronto-real-estate/map/?municipality=10343&status=for-sale&lat=43.653226&lon=-79.383184&zoom=12&view=list"
    }
  ],
  "scrapeDetails": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scraptivo/housesigma-scraper --silent --output-dataset

```

## MCP server setup

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