// ----------------------------------------------------------------------------- // House-Ka — Homes-for-sale aggregator (Canada outside Québec, Ontario first) // Author: Simon-Pierre Boucher — contact@spboucher.ai // pages/Agencies.tsx : brokerage registry — banner → brokerage (office) // ----------------------------------------------------------------------------- import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { Franchise, fetchAgencies } from "../api"; export default function AgenciesPage() { const [data, setData] = useState(null); const [error, setError] = useState(null); const [open, setOpen] = useState>({}); useEffect(() => { document.title = "Covered brokerages | House-Ka"; fetchAgencies().then((r) => setData(r.franchises)).catch((e) => setError(String(e))); }, []); const totalProps = (data ?? []).reduce((s, f) => s + f.total, 0); const totalSub = (data ?? []).reduce((s, f) => s + f.sub_agencies, 0); return (
Registry — brokerages & offices

Sources by brokerage

Every covered brokerage or team publishes its board's full inventory through the CREA DDF feed. Each listing is synced by a dedicated connector and deduplicated by DDF number — the same property published on several sites is only counted once. Click a source to see its homes.

{error &&
{error}
} {!data && !error &&
Loading…
} {data && ( <>

{totalProps.toLocaleString("en-CA")} homes ·{" "} {data.length} banners ·{" "} {totalSub.toLocaleString("en-CA")} offices

{data.map((f) => { const isOpen = open[f.franchise] ?? false; return (
{isOpen && (
    {f.agencies.map((a) => (
  • {a.name} {a.count.toLocaleString("en-CA")}
  • ))}
)}
); })}

Sites sharing the same CREA DDF pool also serve as backup sources, deduplicated by DDF number — no double counting.

)}
); }