// ----------------------------------------------------------------------------- // Immo-Ka — Agrégateur de propriétés à vendre (province de Québec) // pages/Bannieres.tsx : annuaire des bannières (agences) immobilières du Québec // issu du registre OACIQ — ~690 bannières, 17 357 courtiers. Filtrable par // région et par texte ; chaque ligne se déplie pour lister les courtiers de la // bannière (/api/bannieres puis /api/bannieres/{id} à la demande). // ----------------------------------------------------------------------------- import { Fragment, useEffect, useMemo, useState } from "react"; type Banniere = { id: string; oaciq_id: string | null; name: string; regions: string[]; brokers_n: number; covered_by: string | null; site: string | null; }; type Broker = { name: string; city: string; region: string }; type Doc = { generated: string | null; total: number; brokers_total: number; count: number; regions: { region: string; n: number }[]; bannieres: Banniere[]; }; const host = (u: string) => { try { return new URL(u).hostname.replace(/^www\./, ""); } catch { return u; } }; export default function BannieresPage() { const [doc, setDoc] = useState(null); const [error, setError] = useState(null); const [q, setQ] = useState(""); const [region, setRegion] = useState(""); const [open, setOpen] = useState(null); const [brokers, setBrokers] = useState>({}); useEffect(() => { fetch("/api/bannieres") .then((r) => { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); }) .then(setDoc) .catch((e) => setError(String(e))); }, []); const filtered = useMemo(() => { if (!doc) return []; const needle = q.trim().toLowerCase(); return doc.bannieres.filter( (b) => (!region || b.regions.includes(region)) && (!needle || b.name.toLowerCase().includes(needle)), ); }, [doc, q, region]); const toggle = (id: string) => { if (open === id) { setOpen(null); return; } setOpen(id); if (!brokers[id]) { fetch(`/api/bannieres/${id}`) .then((r) => { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); }) .then((b) => setBrokers((prev) => ({ ...prev, [id]: b.brokers ?? [] }))) .catch(() => setBrokers((prev) => ({ ...prev, [id]: [] }))); } }; const filtering = q.trim() !== "" || region !== ""; return (
Annuaire — courtage immobilier

Bannières & courtiers du Québec

Toutes les bannières de courtage immobilier de la province selon le registre public de l'OACIQ : {doc ? doc.total : "…"} bannières et {doc ? doc.brokers_total.toLocaleString("fr-CA") : "…"}{" "} courtiers titulaires d'un permis, dans les 17 régions administratives. Cliquez sur une bannière pour voir la liste de ses courtiers {doc?.generated ? ` — recensement du ${doc.generated}` : ""}.

{error &&
⚠️ {error}
} {!doc && !error &&
Chargement…
} {doc && ( <>
setQ(e.target.value)} placeholder="Rechercher une bannière…" aria-label="Rechercher une bannière" style={{ flex: "1 1 240px", maxWidth: 380, padding: "10px 14px", border: "1.5px solid var(--line)", borderRadius: 10, font: "inherit", background: "var(--surface)", color: "inherit", }} /> {filtering && ( {filtered.length} bannière{filtered.length > 1 ? "s" : ""} )}
{filtered.length === 0 && (
Aucune bannière ne correspond à cette recherche.
)}
{filtered.map((b) => ( toggle(b.id)} style={{ cursor: "pointer" }} > {open === b.id && ( )} ))}
Bannière Courtiers Régions Site web Suivi Immo-Ka
{open === b.id ? "▾" : "▸"} {b.name} {b.brokers_n} {b.regions.length > 3 ? `${b.regions.slice(0, 3).join(", ")} +${b.regions.length - 3}` : b.regions.join(", ")} {b.site ? ( e.stopPropagation()} > {host(b.site)} ) : ( "—" )} {b.covered_by ? ( ✓ annonces suivies ) : ( "—" )}
{!brokers[b.id] ? ( Chargement des courtiers… ) : brokers[b.id].length === 0 ? ( Aucun courtier trouvé. ) : (
{brokers[b.id].map((c, i) => (
{c.name} {" "} — {c.city}
))}
)}

Annuaire informatif compilé à partir du registre public des titulaires de permis de l'OACIQ (Organisme d'autoréglementation du courtage immobilier du Québec). Pour vérifier le dossier professionnel d'un courtier (permis, mesures disciplinaires), consultez directement le registre officiel sur oaciq.com. « Annonces suivies » indique que les inscriptions de la bannière sont agrégées sur Immo-Ka. Le Groupe KA n'a aucun lien d'affaires avec les bannières listées.

)}
); }