# House-Ka > ⚠️ **Application archivée le 2026-09-04** — l'URL live (https://www.house-ka.com) est hors fonction ; l'app a été retirée du cluster MacLustr (registre mld, admin-ka, gardiens, site groupe-ka). Ce dépôt spbgit reste la source de vérité pour une remise en service. **[www.house-ka.com](https://www.house-ka.com)** — *Every home for sale. One place.* Homes-for-sale aggregator for Canada **outside Québec**, Ontario first — a **Groupe KA** service and the English-language sister site of [Immo-Ka](https://www.immo-ka.com) (Québec). House-Ka continuously aggregates homes publicly listed by Canadian real-estate brokerages, teams and national networks, with photos, details, maps, live mortgage rates and a direct link back to each source's original listing. > House-Ka is an independent aggregator: it is not a brokerage, does not > represent buyers or sellers, and is not affiliated with the sources it > indexes. Prices and availability are those displayed by each source. ## At a glance (live, 2026-08-28) | Metric | Value | |---|---| | Homes published (deduplicated) | **~258,000** | | Cities & towns | **5,991** | | Active sources | **28** CREA DDF brokerage feeds (247 offices) | | Average asking price | ~$913,000 (from $360 to $79M) | | Average data completeness | 77.6 / 100 | | Coverage | 9 provinces + 2 territories (all of Canada except Québec & Nunavut) | | Launched | 2026-08-27 | --- ## Guided tour Ten screenshots of the live site (in `docs/screenshots/`). ### 1 — Home: search every home in one place [`https://www.house-ka.com/`](https://www.house-ka.com/) ![Home page](docs/screenshots/01-accueil.jpg) The landing page states the mission — *"Every home for sale. One place."* — above the live counters (homes indexed, cities & towns, average and highest price). A scrolling ticker streams per-source volumes in real time (Century 21 Ontario, The Cody Group, Century 21 BC…). Below, the search bar ("Where do you want to live?") combines city, property type and price-range filters with one-tap type chips (House, Land, Condo, Townhouse, Multi-family, Mobile home, Farm), and the result header offers sorting plus a List / Map toggle. The pine-green / cream / serif skin is deliberately distinct from Immo-Ka's cherry theme. ### 2 — Property page: full listing detail [`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) ![Property page](docs/screenshots/02-property-c21_ab-3Ac21123293118-2-amp-72-highways-rural-rocky.jpg) A listing detail page (`/property/{uid}/{slug}`) — here a $2,900,000 land parcel in Rural Rocky View County, Alberta from the Century 21 Canada — Alberta feed. Photo gallery on top, then asking price with the canonical type badge, address with province, a favorites heart (KA ID accounts), breadcrumb navigation, and a **Location** card rendered by Ka Maps with the price marker and the listing's building/lot highlighted. The DOM order follows the Groupe KA detail-page standard (gallery → price → description → details → analyses → map), identical on mobile and desktop. ### 3 — Live mortgage rates [`https://www.house-ka.com/rates`](https://www.house-ka.com/rates) ![Mortgage rates](docs/screenshots/03-rates.jpg) The `/rates` page publishes the rates **actually posted** by the big Canadian institutions (banks, virtual lenders, monolines), collected continuously by the shared Groupe KA mortgage engine. The market overview shows the best rate per term (fixed 1/3/4/5/10 years, 5-year variable) with the median and 30-day trend, plus every institution's prime rate. The comparison table lists each product with its **kind** (posted or special offer), **freshness** and a link to the **official source** — never an invented rate, never a stale one without a warning. ### 4 — Platform statistics & data quality [`https://www.house-ka.com/stats`](https://www.house-ka.com/stats) ![Platform statistics](docs/screenshots/04-stats.jpg) The `/stats` dashboard exposes the platform's own numbers live: homes for sale, cities, average price, source count — and, unusually for a listings site, its full **data-quality layer**: active vs published listings, quarantine size, average completeness score, and a per-source table with listing counts, completeness and anomaly flags. Every listing gets a completeness score (photos, description, specs, coordinates); listings without a plausible price or a known city are quarantined until the next enrichment pass completes them. ### 5 — Sources by brokerage [`https://www.house-ka.com/agencies`](https://www.house-ka.com/agencies) ![Brokerages](docs/screenshots/05-agencies.jpg) The `/agencies` registry lists every covered brokerage and team — 28 banners, 247 offices — with expandable per-banner listing counts (Century 21 Canada by province, The Cody Group, Revel Realty, Grapevine…). Each source publishes its board's full inventory through the CREA DDF feed; the same property published on several sites is only counted once (deduplication by DDF number). Clicking a source filters the search to its homes. ### 6 — Contact [`https://www.house-ka.com/contact`](https://www.house-ka.com/contact) ![Contact](docs/screenshots/06-contact.jpg) The contact page, with the House-Ka identity and the Groupe KA footer linking to the sister services. ### 7 — Map view: the whole country on one map [`https://www.house-ka.com/?view=map`](https://www.house-ka.com/?view=map) ![Map view](docs/screenshots/07-accueil.jpg) The split list/map view powered by **Ka Maps** (`@groupe-ka/ka-maps`, the shared Groupe KA Mapbox framework). Clusters show the listing count with the approximate median price underneath; "search this area" re-queries the viewport, and the list panel stays in sync with the markers by construction (single `/api/listings` search backend). 2D/3D toggle, drawing tool and geolocation included. ### 8 — Account: KA ID single sign-on [`https://www.house-ka.com/account`](https://www.house-ka.com/account) ![Account](docs/screenshots/08-account.jpg) The `/account` page plugs into **KA ID**, the central Groupe KA identity (groupe-ka.com): one member identifier valid across the whole ecosystem. Signed-in users get cross-site favorites ("My Ka universe"). The footer presents the ecosystem: Groupe-Ka portal, Immo-Ka (homes for sale in Québec), Lou-Ka (rentals in Québec), Vrai-Prix (Québec market-value estimates). ### 9 — Terms of use [`https://www.house-ka.com/terms`](https://www.house-ka.com/terms) ![Terms](docs/screenshots/09-terms.jpg) Terms of use — including the independent-aggregator disclaimer and the rules for source attribution and linking back to original listings. ### 10 — Privacy policy [`https://www.house-ka.com/privacy`](https://www.house-ka.com/privacy) ![Privacy](docs/screenshots/10-privacy.jpg) Privacy policy: what is collected (KA ID account data, favorites), what is not, and how the analytics distinguish human traffic. --- ## Features - **Nationwide search** — by city/town (5,991 of them), property type, price range and free-text query; quick type chips; newest-first and price sorting; list or map view. - **Programmatic SEO pages** — `/for-sale/{city}` and `/for-sale/{city}/{type}` city pages plus `/type/{type}` pages, all server-rendered with meta, JSON-LD and sitemaps (in English, `en_CA`). - **Listing pages** — gallery, price, canonical type, specs, description, nearby commerce banners adapted to each province, Ka Maps location card, link to the original listing. - **Live mortgage rates** — national Canadian rates with kind, freshness and official source per product (shared `immoka/mortgage/` engine, see `docs/mortgage-engine.md`). - **Transparent statistics** — public `/stats` dashboard including the quality layer (quarantine, completeness, anomaly flags per source). - **KA ID accounts & favorites** — Groupe KA single sign-on, cross-site favorites hub. - **Data quality pipeline** — completeness scoring, quarantine, image audit, coordinate guard covering all of Canada, cross-site dedup. ## Data & sources All 28 active sources are Canadian brokerage / team / network sites whose inventories come from the **CREA DDF** feed: - **RealtyPress connector** (`immoka/connectors/realtypress.py`) — one generic connector covers every brokerage or team site running the RealtyPress WordPress plugin (Revel Realty, The Cody Group, Grapevine, Sutton Ottawa, Hanlon Realty…). Each site exposes its board's full inventory; cross-site duplicates are masked by DDF number (`external_id = ddf`, dedup by `MIN(uid)`). - **Century 21 Canada connector** (`immoka/connectors/c21_canada.py`) — one provincial source per region: BC, AB, SK, MB, ON, NB, NS, PE, NL, YT, NT. (Saskatchewan has no polygon API and is searched via ~30 cities; the Alberta watcher uses adaptive sleep for cycles longer than 24 h.) DDF list cards carry no property type: most listings get their type when their detail page is fetched (`IMMOKA_RP_DETAIL_LIMIT` per source per sync). Sources are declared in `data/sources.json` and the site census lives in `data/canada_agencies.json`; the checked-in `sources.json` documents the initial registry. ### Canonical property types (English) `House, Condo, Townhouse, Semi-detached, Duplex, Triplex, Multi-family, Cottage, Mobile home, Land, Farm, Commercial, Parking` — see `immoka/normalize.py`. ## Architecture Forked from **Immo-Ka** on 2026-08-27 (the Ontario expansion paused there moved here — see the immo-ka repo's `docs/ONTARIO-PAUSE.md`). The Python package keeps its historical name `immoka`. - **Backend** — FastAPI + SQLite (`data/immoka.db`), same pipeline as Immo-Ka: connectors → `ingest` → dedup → `quality` (relaxed publication rule: price + city; type/description enrich over time via detail passes) → API. Sync loop runs every 240 minutes under PM2. - **Frontend** — React/Vite, **English**, pine/cream/serif skin (deliberately different from Immo-Ka's cherry). SPA routes: `/`, `/property/{uid}[/{slug}]`, `/rates`, `/agencies`, `/stats`, `/account`, `/contact`, `/terms`, `/privacy`; SEO routes `/for-sale/{city}[/{type}]` and `/type/{type}` are resolved server-side. Map = Ka Maps (`@groupe-ka/ka-maps`, expected at `../../ka-maps`). - **SEO** — `immoka/seo.py` renders server-side HTML (meta, JSON-LD, sitemaps, `robots.txt`) in English. - **Mortgage engine** — shared with Immo-Ka (`immoka/mortgage/`), national Canadian rates. See `docs/mortgage-engine.md`. - **Removed vs Immo-Ka** — everything Québec-only: Hydro-Québec estimates, BDZI flood, RSQAQ air, gazquebec, rental registry, quartier (census), Vrai-Prix, movers/inspectors directories, PDF listing sheets, all QC connectors. ### Repository layout ``` run.py CLI entry point (sync / watch / serve / list / geocode / mortgage-sync) immoka/ Python package (historical name kept from the Immo-Ka fork) web.py FastAPI app: API + SEO HTML + SPA fallback ingest.py, quality.py, normalize.py, schema.py, db.py seo.py English server-side SEO (meta, JSON-LD, sitemaps) geocode.py, imgaudit.py, stats.py, commerces.py, poi.py auth.py, kaid.py, favorites.py, hubfav.py, hubprofile.py (KA ID SSO + favorites) mortgage/ shared Groupe KA mortgage-rate engine (+ /api/mortgage) connectors/ realtypress.py, c21_canada.py, base.py, jsonld.py, _detailutil.py, _resilient.py frontend/ React/Vite SPA (src/pages: Home, Listing, Rates, Stats, Agencies, Account, Contact, Legal) scripts/ scouting & maintenance (scout_canada_rp*.py, gen_connector_docs.py, …) docs/ mortgage-engine.md, ontario-agencies.md, screenshots/ data/ SQLite DB + live registries (not committed) ``` ## API | Route | Description | |---|---| | `GET /api/listings` | search (city, type, price, text, bbox/polygon, sort, pagination) | | `GET /api/listings/{uid}` | full listing detail | | `GET /api/listings.geojson` | map markers/clusters feed | | `GET /api/facets` | cities, property types, sources facets | | `GET /api/agencies` | brokerage/office registry with counts | | `GET /api/stats` | live platform + quality statistics | | `GET /api/stats/catalog`, `/dashboard`, `/report` | stats module (kacharts/kapdf, custom reports via `POST /api/stats/report/custom`) | | `GET /api/mortgage` | live mortgage rates | | `GET /api/commerces` | nearby commerce banners per province | | `/api/auth`, `/api/favorites` | KA ID session + favorites | | `GET /api/sources`, `POST /api/sync` | connector registry & manual sync | | `GET /api/seo/resolve`, `/sitemap.xml`, `/sitemaps/{name}`, `/robots.txt` | SEO plumbing | ## Run ```bash python run.py sync [source ...] # sync listings python run.py watch [minutes] # sync loop (default 60 min; prod uses 240) python run.py serve [port] # API + frontend (default 8098) python run.py list # registered connectors python run.py geocode [n] # geocode listings missing coordinates python run.py mortgage-sync # collect mortgage rates ``` `.env` (see `.env.example`, never committed): `IMMOKA_BASE_URL=https://www.house-ka.com`, `IMMOKA_RP_DETAIL_LIMIT=` (detail pages fetched per source per sync), plus optional scraping/SSO/mortgage-engine settings. ## Deployment Node **M4M64b**, `~/apps/house-ka`, PM2: | Process | Role | |---|---| | `house-ka-web` | `run.py serve` on port **8098** | | `house-ka-sync` | `run.py watch 240` (sync loop every 4 h) | | `house-ka-ngrok` | tunnel → **www.house-ka.com** | Remote-first: the repo **on the node** is the source of truth (never the laptop copies); `origin` = spbgit, the personal git server (`gitsrv:srv/git/house-ka.git`, bare repos on M3U96a). Edit over SSH, build, `pm2 restart`, then commit & push from the node (agent forwarding). ## Adding sources (rest of Canada) RealtyPress sites exist across Canada. Census & instructions: `docs/ontario-agencies.md` (method transposes to any province). Add the site to `data/canada_agencies.json` + an entry in `data/sources.json`, then `python run.py sync `. The coordinate guard covers all of Canada. ## Groupe KA ecosystem House-Ka is one of the Groupe KA platforms ([groupe-ka.com](https://www.groupe-ka.com)): Immo-Ka (homes for sale, Québec), Lou-Ka (rentals, Québec), Rent-Ka (rentals, Canada outside Québec), Vrai-Prix (market-value estimates), Auto-Ka, Food-Ka, Resto-Ka, Sorti-Ka, Job-Ka, Trouve-Ka, Crea-Ka, Fabri-Ka — all sharing KA ID, the ka-ui design system, Ka Maps and the stats/PDF modules. ## Contact Simon-Pierre Boucher — contact@spboucher.ai — © 2026 Groupe-Ka