1# House-Ka23**[www.house-ka.com](https://www.house-ka.com)** — *Every home for sale. One place.*45Homes-for-sale aggregator for Canada **outside Québec**, Ontario first — a6**Groupe KA** service and the English-language sister site of7[Immo-Ka](https://www.immo-ka.com) (Québec). House-Ka continuously aggregates8homes publicly listed by Canadian real-estate brokerages, teams and national9networks, with photos, details, maps, live mortgage rates and a direct link10back to each source's original listing.1112> House-Ka is an independent aggregator: it is not a brokerage, does not13> represent buyers or sellers, and is not affiliated with the sources it14> indexes. Prices and availability are those displayed by each source.1516## At a glance (live, 2026-08-28)1718| Metric | Value |19|---|---|20| Homes published (deduplicated) | **~258,000** |21| Cities & towns | **5,991** |22| Active sources | **28** CREA DDF brokerage feeds (247 offices) |23| Average asking price | ~$913,000 (from $360 to $79M) |24| Average data completeness | 77.6 / 100 |25| Coverage | 9 provinces + 2 territories (all of Canada except Québec & Nunavut) |26| Launched | 2026-08-27 |2728---2930## Guided tour3132Ten screenshots of the live site (in `docs/screenshots/`).3334### 1 — Home: search every home in one place35[`https://www.house-ka.com/`](https://www.house-ka.com/)36373839The landing page states the mission — *"Every home for sale. One place."* —40above the live counters (homes indexed, cities & towns, average and highest41price). A scrolling ticker streams per-source volumes in real time42(Century 21 Ontario, The Cody Group, Century 21 BC…). Below, the search bar43("Where do you want to live?") combines city, property type and price-range44filters with one-tap type chips (House, Land, Condo, Townhouse, Multi-family,45Mobile home, Farm), and the result header offers sorting plus a List / Map46toggle. The pine-green / cream / serif skin is deliberately distinct from47Immo-Ka's cherry theme.4849### 2 — Property page: full listing detail50[`https://www.house-ka.com/property/c21_ab%3Ac21123293118/2-amp-72-highways-rural-rocky-view-county`](https://www.house-ka.com/property/c21_ab%3Ac21123293118/2-amp-72-highways-rural-rocky-view-county)51525354A listing detail page (`/property/{uid}/{slug}`) — here a $2,900,000 land55parcel in Rural Rocky View County, Alberta from the Century 21 Canada —56Alberta feed. Photo gallery on top, then asking price with the canonical type57badge, address with province, a favorites heart (KA ID accounts), breadcrumb58navigation, and a **Location** card rendered by Ka Maps with the price marker59and the listing's building/lot highlighted. The DOM order follows the Groupe60KA detail-page standard (gallery → price → description → details → analyses →61map), identical on mobile and desktop.6263### 3 — Live mortgage rates64[`https://www.house-ka.com/rates`](https://www.house-ka.com/rates)65666768The `/rates` page publishes the rates **actually posted** by the big Canadian69institutions (banks, virtual lenders, monolines), collected continuously by70the shared Groupe KA mortgage engine. The market overview shows the best rate71per term (fixed 1/3/4/5/10 years, 5-year variable) with the median and 30-day72trend, plus every institution's prime rate. The comparison table lists each73product with its **kind** (posted or special offer), **freshness** and a link74to the **official source** — never an invented rate, never a stale one75without a warning.7677### 4 — Platform statistics & data quality78[`https://www.house-ka.com/stats`](https://www.house-ka.com/stats)79808182The `/stats` dashboard exposes the platform's own numbers live: homes for83sale, cities, average price, source count — and, unusually for a listings84site, its full **data-quality layer**: active vs published listings,85quarantine size, average completeness score, and a per-source table with86listing counts, completeness and anomaly flags. Every listing gets a87completeness score (photos, description, specs, coordinates); listings88without a plausible price or a known city are quarantined until the next89enrichment pass completes them.9091### 5 — Sources by brokerage92[`https://www.house-ka.com/agencies`](https://www.house-ka.com/agencies)93949596The `/agencies` registry lists every covered brokerage and team — 28 banners,97247 offices — with expandable per-banner listing counts (Century 21 Canada by98province, The Cody Group, Revel Realty, Grapevine…). Each source publishes99its board's full inventory through the CREA DDF feed; the same property100published on several sites is only counted once (deduplication by DDF101number). Clicking a source filters the search to its homes.102103### 6 — Contact104[`https://www.house-ka.com/contact`](https://www.house-ka.com/contact)105106107108The contact page, with the House-Ka identity and the Groupe KA footer linking109to the sister services.110111### 7 — Map view: the whole country on one map112[`https://www.house-ka.com/?view=map`](https://www.house-ka.com/?view=map)113114115116The split list/map view powered by **Ka Maps** (`@groupe-ka/ka-maps`, the117shared Groupe KA Mapbox framework). Clusters show the listing count with the118approximate median price underneath; "search this area" re-queries the119viewport, and the list panel stays in sync with the markers by construction120(single `/api/listings` search backend). 2D/3D toggle, drawing tool and121geolocation included.122123### 8 — Account: KA ID single sign-on124[`https://www.house-ka.com/account`](https://www.house-ka.com/account)125126127128The `/account` page plugs into **KA ID**, the central Groupe KA identity129(groupe-ka.com): one member identifier valid across the whole ecosystem.130Signed-in users get cross-site favorites ("My Ka universe"). The footer131presents the ecosystem: Groupe-Ka portal, Immo-Ka (homes for sale in Québec),132Lou-Ka (rentals in Québec), Vrai-Prix (Québec market-value estimates).133134### 9 — Terms of use135[`https://www.house-ka.com/terms`](https://www.house-ka.com/terms)136137138139Terms of use — including the independent-aggregator disclaimer and the rules140for source attribution and linking back to original listings.141142### 10 — Privacy policy143[`https://www.house-ka.com/privacy`](https://www.house-ka.com/privacy)144145146147Privacy policy: what is collected (KA ID account data, favorites), what is148not, and how the analytics distinguish human traffic.149150---151152## Features153154- **Nationwide search** — by city/town (5,991 of them), property type, price155 range and free-text query; quick type chips; newest-first and price156 sorting; list or map view.157- **Programmatic SEO pages** — `/for-sale/{city}` and158 `/for-sale/{city}/{type}` city pages plus `/type/{type}` pages, all159 server-rendered with meta, JSON-LD and sitemaps (in English, `en_CA`).160- **Listing pages** — gallery, price, canonical type, specs, description,161 nearby commerce banners adapted to each province, Ka Maps location card,162 link to the original listing.163- **Live mortgage rates** — national Canadian rates with kind, freshness and164 official source per product (shared `immoka/mortgage/` engine, see165 `docs/mortgage-engine.md`).166- **Transparent statistics** — public `/stats` dashboard including the167 quality layer (quarantine, completeness, anomaly flags per source).168- **KA ID accounts & favorites** — Groupe KA single sign-on, cross-site169 favorites hub.170- **Data quality pipeline** — completeness scoring, quarantine, image audit,171 coordinate guard covering all of Canada, cross-site dedup.172173## Data & sources174175All 28 active sources are Canadian brokerage / team / network sites whose176inventories come from the **CREA DDF** feed:177178- **RealtyPress connector** (`immoka/connectors/realtypress.py`) — one179 generic connector covers every brokerage or team site running the180 RealtyPress WordPress plugin (Revel Realty, The Cody Group, Grapevine,181 Sutton Ottawa, Hanlon Realty…). Each site exposes its board's full182 inventory; cross-site duplicates are masked by DDF number183 (`external_id = ddf<id>`, dedup by `MIN(uid)`).184- **Century 21 Canada connector** (`immoka/connectors/c21_canada.py`) — one185 provincial source per region: BC, AB, SK, MB, ON, NB, NS, PE, NL, YT, NT.186 (Saskatchewan has no polygon API and is searched via ~30 cities; the187 Alberta watcher uses adaptive sleep for cycles longer than 24 h.)188189DDF list cards carry no property type: most listings get their type when190their detail page is fetched (`IMMOKA_RP_DETAIL_LIMIT` per source per sync).191Sources are declared in `data/sources.json` and the site census lives in192`data/canada_agencies.json`; the checked-in `sources.json` documents the193initial registry.194195### Canonical property types (English)196197`House, Condo, Townhouse, Semi-detached, Duplex, Triplex, Multi-family,198Cottage, Mobile home, Land, Farm, Commercial, Parking` —199see `immoka/normalize.py`.200201## Architecture202203Forked from **Immo-Ka** on 2026-08-27 (the Ontario expansion paused there204moved here — see the immo-ka repo's `docs/ONTARIO-PAUSE.md`). The Python205package keeps its historical name `immoka`.206207- **Backend** — FastAPI + SQLite (`data/immoka.db`), same pipeline as208 Immo-Ka: connectors → `ingest` → dedup → `quality` (relaxed publication209 rule: price + city; type/description enrich over time via detail passes) →210 API. Sync loop runs every 240 minutes under PM2.211- **Frontend** — React/Vite, **English**, pine/cream/serif skin (deliberately212 different from Immo-Ka's cherry). SPA routes: `/`, `/property/{uid}[/{slug}]`,213 `/rates`, `/agencies`, `/stats`, `/account`, `/contact`, `/terms`,214 `/privacy`; SEO routes `/for-sale/{city}[/{type}]` and `/type/{type}` are215 resolved server-side. Map = Ka Maps (`@groupe-ka/ka-maps`, expected at216 `../../ka-maps`).217- **SEO** — `immoka/seo.py` renders server-side HTML (meta, JSON-LD,218 sitemaps, `robots.txt`) in English.219- **Mortgage engine** — shared with Immo-Ka (`immoka/mortgage/`), national220 Canadian rates. See `docs/mortgage-engine.md`.221- **Removed vs Immo-Ka** — everything Québec-only: Hydro-Québec estimates,222 BDZI flood, RSQAQ air, gazquebec, rental registry, quartier (census),223 Vrai-Prix, movers/inspectors directories, PDF listing sheets, all QC224 connectors.225226### Repository layout227228```229run.py CLI entry point (sync / watch / serve / list / geocode / mortgage-sync)230immoka/ Python package (historical name kept from the Immo-Ka fork)231 web.py FastAPI app: API + SEO HTML + SPA fallback232 ingest.py, quality.py, normalize.py, schema.py, db.py233 seo.py English server-side SEO (meta, JSON-LD, sitemaps)234 geocode.py, imgaudit.py, stats.py, commerces.py, poi.py235 auth.py, kaid.py, favorites.py, hubfav.py, hubprofile.py (KA ID SSO + favorites)236 mortgage/ shared Groupe KA mortgage-rate engine (+ /api/mortgage)237 connectors/ realtypress.py, c21_canada.py, base.py, jsonld.py, _detailutil.py, _resilient.py238frontend/ React/Vite SPA (src/pages: Home, Listing, Rates, Stats, Agencies, Account, Contact, Legal)239scripts/ scouting & maintenance (scout_canada_rp*.py, gen_connector_docs.py, …)240docs/ mortgage-engine.md, ontario-agencies.md, screenshots/241data/ SQLite DB + live registries (not committed)242```243244## API245246| Route | Description |247|---|---|248| `GET /api/listings` | search (city, type, price, text, bbox/polygon, sort, pagination) |249| `GET /api/listings/{uid}` | full listing detail |250| `GET /api/listings.geojson` | map markers/clusters feed |251| `GET /api/facets` | cities, property types, sources facets |252| `GET /api/agencies` | brokerage/office registry with counts |253| `GET /api/stats` | live platform + quality statistics |254| `GET /api/stats/catalog`, `/dashboard`, `/report` | stats module (kacharts/kapdf, custom reports via `POST /api/stats/report/custom`) |255| `GET /api/mortgage` | live mortgage rates |256| `GET /api/commerces` | nearby commerce banners per province |257| `/api/auth`, `/api/favorites` | KA ID session + favorites |258| `GET /api/sources`, `POST /api/sync` | connector registry & manual sync |259| `GET /api/seo/resolve`, `/sitemap.xml`, `/sitemaps/{name}`, `/robots.txt` | SEO plumbing |260261## Run262263```bash264python run.py sync [source ...] # sync listings265python run.py watch [minutes] # sync loop (default 60 min; prod uses 240)266python run.py serve [port] # API + frontend (default 8098)267python run.py list # registered connectors268python run.py geocode [n] # geocode listings missing coordinates269python run.py mortgage-sync # collect mortgage rates270```271272`.env` (see `.env.example`, never committed): `IMMOKA_BASE_URL=https://www.house-ka.com`,273`IMMOKA_RP_DETAIL_LIMIT=<n>` (detail pages fetched per source per sync),274plus optional scraping/SSO/mortgage-engine settings.275276## Deployment277278Node **M4M64b**, `~/apps/house-ka`, PM2:279280| Process | Role |281|---|---|282| `house-ka-web` | `run.py serve` on port **8098** |283| `house-ka-sync` | `run.py watch 240` (sync loop every 4 h) |284| `house-ka-ngrok` | tunnel → **www.house-ka.com** |285286Remote-first: the repo **on the node** is the source of truth (never the287laptop copies); `origin` = spbgit, the personal git server288(`gitsrv:srv/git/house-ka.git`, bare repos on M3U96a). Edit over SSH, build,289`pm2 restart`, then commit & push from the node (agent forwarding).290291## Adding sources (rest of Canada)292293RealtyPress sites exist across Canada. Census & instructions:294`docs/ontario-agencies.md` (method transposes to any province). Add the site295to `data/canada_agencies.json` + an entry in `data/sources.json`, then296`python run.py sync <id>`. The coordinate guard covers all of Canada.297298## Groupe KA ecosystem299300House-Ka is one of the Groupe KA platforms ([groupe-ka.com](https://www.groupe-ka.com)):301Immo-Ka (homes for sale, Québec), Lou-Ka (rentals, Québec), Rent-Ka (rentals,302Canada outside Québec), Vrai-Prix (market-value estimates), Auto-Ka, Food-Ka,303Resto-Ka, Sorti-Ka, Job-Ka, Trouve-Ka, Crea-Ka, Fabri-Ka — all sharing KA ID,304the ka-ui design system, Ka Maps and the stats/PDF modules.305306## Contact307308Simon-Pierre Boucher — contact@spboucher.ai — © 2026 Groupe-Ka309