SPB Git forge

spb/immo-ka

Public

Immo-Ka — agrégateur des propriétés à vendre au Québec (73 connecteurs, ~40 000 annonces, React+FastAPI)

112commits 1branches 0releases
125.4 MBsize
maindefault branch
13 days agolast push
Python 47.5% HTML 27.9% TypeScript 15.5% CSS 7.2% JavaScript 2%

Docs connecteurs : générateur rejouable + 46 fiches standardisées (41 nommées, 4 familles dynamiques, INDEX)

Croise data/sources.json + registres d agences + introspection du code +
BD live (complétude GPS/photos/prix/CAC/SDB/année-rôle/taxes, sync_log).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed 1 mo ago (Aug 18, 2026) parent 7c5bc1b

47 changed files +2,977 −0

added docs/connecteurs/INDEX.md +85 −0
@@ -0,0 +1,85 @@
1 +# Immo-Ka — Connecteurs (documentation standardisée)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +**92 connecteurs** enregistrés (auto-découverte `immoka/connectors/__init__.py`) : 41 connecteurs nommés (`data/sources.json`) + 4 familles dynamiques (RE/MAX sous-agences, Via Capitale, Century 21, source.immo).
6 +
7 +Base vivante `data/immoka.db` : 138 468 annonces, 122 797 actives, 77 668 visibles après dédup (45 129 masquées).
8 +
9 +## Mécanismes transverses (tous connecteurs)
10 +
11 +- **Enrichissements détail budgétés** : chaque connecteur qui visite les pages
12 + détail plafonne le nombre de fiches par exécution via une variable
13 + d'environnement `IMMOKA_*_DETAIL_LIMIT` (défauts dans le tableau des fiches).
14 + Les fiches déjà en cache BD (`detail_cache`) sont réutilisées gratuitement ;
15 + sur plusieurs cycles, tout le parc finit enrichi.
16 +- **Dédup Centris + adresse** (`immoka/db.py`) : les doublons inter-sources
17 + (même n° Centris via les sous-agences, ou même adresse normalisée) sont
18 + marqués `dup_hidden=1` — 45 129 annonces masquées actuellement — et la
19 + lecture filtre en `AND dup_hidden=0`.
20 +- **Jointure rôle d'évaluation** (`immoka/vraiprix_local.py`) : appariement
21 + local FTS par adresse contre `data/vraiprix.db` (3,7 M unités d'évaluation).
22 + Remplit lat/lng manquants, l'estimation Vrai-Prix (P10-P90 + lien) et les
23 + champs du rôle (année de construction, superficies, évaluations). Impact :
24 + **year_built rempli à 67 %** des annonces visibles, dont
25 + 71 % proviennent du rôle (`year_built_source: role`).
26 +- **Historique — vagues du 2026-08-18** :
27 + - `7911d58` Vague 1 : clé Algolia auto-extraite (Barnes), taxes/éval RE/MAX
28 + (cache détail v4), specs Via Capitale, Kijiji étendu.
29 + - `e9bc9d7` Vague 2 : jointure au rôle d'évaluation, fiches
30 + Sutton/Royal LePage/LesPAC enrichies, days_on_market, dédup par adresse.
31 +
32 +## Familles dynamiques
33 +
34 +| Famille | Fiche | Membres | Visibles |
35 +|---|---|---|---|
36 +| Famille RE/MAX sous-agences | [famille-remax-ag](famille-remax-ag.md) | 50 | 3 349 |
37 +| Famille Via Capitale agences | [famille-via-ag](famille-via-ag.md) | 4 | 82 |
38 +| Famille Century 21 | [famille-c21-ag](famille-c21-ag.md) | 2 | 1 576 |
39 +| Famille source.immo | [famille-source-immo](famille-source-immo.md) | 6 | 1 877 |
40 +
41 +## Connecteurs nommés
42 +
43 +| id | Nom | Type | Statut | Visibles | Année (dont rôle) | Dernier sync | OK |
44 +|---|---|---|---|---|---|---|---|
45 +| [`remax_quebec`](remax_quebec.md) | RE/MAX Québec | franchise | actif | 25 348 | 77.0 % | 2026-08-18 01:45 | ✅ |
46 +| [`duproprio`](duproprio.md) | DuProprio (sans courtier) | fsbo | actif | 7 393 | 79.3 % | 2026-08-18 02:37 | ✅ |
47 +| [`kijiji`](kijiji.md) | Kijiji Québec | — | actif | 7 104 | 4.2 % | 2026-08-18 02:59 | ✅ |
48 +| [`via_capitale`](via_capitale.md) | Via Capitale | franchise | actif | 5 153 | 68.9 % | 2026-08-18 00:27 | ✅ |
49 +| [`sutton`](sutton.md) | Groupe Sutton Québec | franchise | actif | 4 515 | 65.4 % | 2026-08-18 02:17 | ✅ |
50 +| [`lespac`](lespac.md) | LesPAC Québec | — | actif | 2 720 | 57.5 % | 2026-08-18 03:10 | ✅ |
51 +| [`proprio_direct`](proprio_direct.md) | Proprio Direct | agence | actif | 2 464 | 67.5 % | 2026-08-18 03:14 | ✅ |
52 +| [`c21_ag_quebec`](c21_ag_quebec.md) | Century 21 Québec (All Quebec) | — | actif | 1 576 | 75.6 % | 2026-08-18 02:35 | ✅ |
53 +| [`domicilia`](domicilia.md) | Domicilia Agence Immobilière | agence | actif | 1 445 | 73.4 % | 2026-08-18 02:27 | ✅ |
54 +| [`cio_ag_outaouais`](cio_ag_outaouais.md) | Chambre immobilière de l'Outaouais | portail | actif | 1 394 | 69.6 % | 2026-08-18 02:35 | ✅ |
55 +| [`engel_volkers`](engel_volkers.md) | Engel & Völkers Montréal / Québec | luxe | actif | 1 228 | 69.9 % | 2026-08-18 02:37 | ✅ |
56 +| [`ubee`](ubee.md) | Ubee | — | actif | 1 176 | 100.0 % | 2026-08-18 00:23 | ✅ |
57 +| [`vendirect`](vendirect.md) | Vendirect | agence | actif | 1 170 | 79.4 % | 2026-08-18 00:23 | ✅ |
58 +| [`royal_lepage`](royal_lepage.md) | Royal LePage (Québec) | franchise | actif | 1 009 | 85.7 % | 2026-08-18 02:20 | ✅ |
59 +| [`exp_ag_qc`](exp_ag_qc.md) | eXp Agence immobilière (Québec) | agence | actif | 888 | 55.6 % | 2026-08-18 02:40 | ✅ |
60 +| [`charisma_ag_qc`](charisma_ag_qc.md) | Les Immeubles Charisma | agence | actif | 696 | 81.2 % | 2026-08-18 02:37 | ✅ |
61 +| [`kw_urbain`](kw_urbain.md) | Keller Williams Urbain | franchise | actif | 351 | 68.7 % | 2026-08-18 02:59 | ✅ |
62 +| [`profusion`](profusion.md) | Profusion Immobilier (Christie's) | luxe | actif | 351 | 61.5 % | 2026-08-18 03:14 | ✅ |
63 +| [`barnes_quebec`](barnes_quebec.md) | BARNES Québec | luxe | actif | 336 | 81.5 % | 2026-08-18 02:35 | ✅ |
64 +| [`kw_prestige`](kw_prestige.md) | Keller Williams Prestige | franchise | actif | 277 | 0.0 % | 2026-08-18 02:59 | ✅ |
65 +| [`si_ag_theagency`](si_ag_theagency.md) | The Agency Montréal | agence | actif | 245 | 88.6 % | 2026-08-18 02:27 | ✅ |
66 +| [`glmc_ag_qc`](glmc_ag_qc.md) | Les Immeubles GLMC | agence | actif | 176 | 36.4 % | 2026-08-18 02:40 | ✅ |
67 +| [`kw_distinction`](kw_distinction.md) | Keller Williams Distinction | franchise | actif | 167 | 0.0 % | 2026-08-18 02:59 | ✅ |
68 +| [`imcha_ag_qc`](imcha_ag_qc.md) | Les Immeubles Charlevoix | agence | actif | 107 | 0.0 % | 2026-08-18 02:40 | ✅ |
69 +| [`immodev`](immodev.md) | Immodev Agence Immobilière | agence | actif | 92 | 64.1 % | 2026-08-18 02:27 | ✅ |
70 +| [`bhhs_ag_qc`](bhhs_ag_qc.md) | Berkshire Hathaway HomeServices Québec | franchise | actif | 91 | 86.8 % | 2026-08-18 02:35 | ✅ |
71 +| [`realta`](realta.md) | Réalta Agence Immobilière | agence | actif | 82 | 80.5 % | 2026-08-18 02:27 | ✅ |
72 +| [`image_ag_qc`](image_ag_qc.md) | Image, l'agence immobilière | agence | actif | 77 | 0.0 % | 2026-08-18 02:27 | ✅ |
73 +| [`m_immobilier`](m_immobilier.md) | M Immobilier | luxe | actif | 67 | 85.1 % | 2026-08-18 03:13 | ✅ |
74 +| [`contact_ag_qc`](contact_ag_qc.md) | Les Immeubles Contact | agence | actif | 43 | 83.7 % | 2026-08-18 02:40 | ✅ |
75 +| [`sothebys_quebec`](sothebys_quebec.md) | Sotheby's International Realty Québec | luxe | actif | 42 | 71.4 % | 2026-08-18 00:21 | ✅ |
76 +| [`via_ag_acces`](via_ag_acces.md) | Via Capitale Acces | franchise | actif | 31 | 96.8 % | 2026-08-18 00:27 | ✅ |
77 +| [`via_ag_select`](via_ag_select.md) | Via Capitale Select | franchise | actif | 17 | 100.0 % | 2026-08-18 00:28 | ✅ |
78 +| [`gaillardetz`](gaillardetz.md) | Gaillardetz Agence Immobilière | agence | actif | 13 | 92.3 % | 2026-08-18 02:27 | ✅ |
79 +| [`via_ag_elite`](via_ag_elite.md) | Via Capitale Elite | franchise | actif | 11 | 81.8 % | 2026-08-18 00:28 | ✅ |
80 +| [`expert_immobilier_pm`](expert_immobilier_pm.md) | L'Expert Immobilier P.M. | agence | actif | 9 | 88.9 % | 2026-08-18 02:40 | ✅ |
81 +| [`century21`](century21.md) | Century 21 (Québec) | franchise | actif | 0 | — | — | — |
82 +| [`via_ag_dumontroyal`](via_ag_dumontroyal.md) | Via Capitale Dumontroyal | franchise | inactif | 0 | — | 2026-08-18 00:27 | ✅ |
83 +| [`c21_ag_vision`](c21_ag_vision.md) | Century 21 Vision (Outaouais) | — | actif | 0 | — | 2026-08-18 02:35 | ✅ |
84 +| [`niddamour`](niddamour.md) | Nid d'Amour Agence Immobilière | agence | a_faire | 0 | — | 2026-08-18 02:27 | ✅ |
85 +| [`coldwell_banker`](coldwell_banker.md) | Coldwell Banker Québec | franchise | a_faire | 0 | — | — | — |
added docs/connecteurs/barnes_quebec.md +63 −0
@@ -0,0 +1,63 @@
1 +# BARNES Québec (`barnes_quebec`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://barnes-quebec.com
8 +- **Recherche** : https://barnes-quebec.com/property
9 +- **Couverture** : Montréal + province — luxe international
10 +- **Type** : luxe
11 +- **Statut** : actif
12 +
13 +> Algolia (App HCW55VIQNM, index quebec_all). ~344 propriétés, prix/MLS/chambres/sdb/superficie/géoloc. Images non indexées (viendront de la page détail). Dédoublonnage FR/EN par adresse.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/barnes_quebec.py` — classe `BarnesQuebecConnector`
18 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_BARNES_DETAIL_LIMIT` (défaut 400)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/barnes_quebec.py : BARNES Québec (barnes-quebec.com)
26 +> Site WordPress indexé dans Algolia. La config expose l'App ID et une clé
27 +> API dans le HTML (PHPVars) ; l'index « quebec_all » contient les propriétés
28 +> (type "property") avec adresse, prix, MLS, chambres, salles de bains,
29 +> superficie et géolocalisation. Les enregistrements sont dupliqués par
30 +> langue → on dédoublonne par référence MLS. Les permaliens pointent vers le
31 +> domaine de staging Kinsta ; on les réécrit vers le domaine de production.
32 +> RÉSILIENCE : la clé Algolia a déjà été rotée (403 le 2026-08-15) — on
33 +> l'extrait donc À CHAQUE FOIS du HTML public du site (avec cache process),
34 +> avec repli sur la dernière clé connue si l'extraction échoue.
35 +
36 +## Mécanismes clés
37 +
38 +- **Clé Algolia auto-extraite** : App ID / admin key / préfixe d'index lus dans les PHPVars du plugin `barnes-algolia` (wp_localize_script), avec cache et repli sur les derniers identifiants connus — la clé a déjà été rotée (403 le 2026-08-15) et le connecteur s'auto-répare.
39 +- Algolia ne contient pas les photos : elles sont récupérées sur la fiche détail.
40 +
41 +## Volumétrie & complétude (BD live)
42 +
43 +| Indicateur | Valeur |
44 +|---|---|
45 +| Annonces en base (toutes) | 351 |
46 +| Actives | 336 |
47 +| Visibles (après dédup) | 336 |
48 +| Masquées par la dédup | 0 |
49 +| GPS (lat/lng) | 99.4 % |
50 +| Photos | 68.5 % |
51 +| Prix | 99.7 % |
52 +| CAC (chambres) | 92.0 % |
53 +| SDB (salles de bains) | 91.1 % |
54 +| Année de construction | 81.5 % (dont rôle : 100.0 %) |
55 +| Taxes / évaluation municipale | 49.4 % |
56 +| Estimation Vrai-Prix (rôle) | 100.0 % |
57 +
58 +## Synchronisation
59 +
60 +- **Dernier sync** : 2026-08-18 02:35 — trouvé 336, +0 / ~0 / -0 — OK
61 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
62 +
63 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/bhhs_ag_qc.md +54 −0
@@ -0,0 +1,54 @@
1 +# Berkshire Hathaway HomeServices Québec (`bhhs_ag_qc`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://bhhsquebec.ca
8 +- **Recherche** : https://bhhsquebec.ca/proprietes/
9 +- **Couverture** : Grand Montréal, Laurentides, Montérégie, Outaouais
10 +- **Type** : franchise
11 +- **Statut** : actif
12 +
13 +> WordPress (MW Properties / marketingwebsites.ca), liste SSR paginée ?pages=N (~9/page, ~11 pages). Carte col-lg-4: no Centris (URL+image+property-meta), région, adresse, ville, prix ($US), chambres/sdb, photo. source_id _ag_ = dédup Centris.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/bhhs_quebec.py` — classe `BhhsQuebecConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/bhhs_quebec.py : Berkshire Hathaway HomeServices Québec
25 +> (bhhsquebec.ca) — Grand Montréal, Laurentides, Montérégie, Outaouais.
26 +> Site WordPress (plugin « MW Properties » / realestate.marketingwebsites.ca),
27 +> liste rendue SERVEUR sur /proprietes/, paginée par ?pages=N (~9/page,
28 +> ~11 pages). Chaque carte porte : n° Centris (URL + image + property-meta),
29 +> région, adresse, ville, prix ($US), chambres/sdb et photo.
30 +> source_id « bhhs_ag_qc » : infixe _ag_ = dédup Centris (db.refresh_dedup).
31 +
32 +## Volumétrie & complétude (BD live)
33 +
34 +| Indicateur | Valeur |
35 +|---|---|
36 +| Annonces en base (toutes) | 97 |
37 +| Actives | 93 |
38 +| Visibles (après dédup) | 91 |
39 +| Masquées par la dédup | 2 |
40 +| GPS (lat/lng) | 90.1 % |
41 +| Photos | 100.0 % |
42 +| Prix | 67.0 % |
43 +| CAC (chambres) | 93.4 % |
44 +| SDB (salles de bains) | 93.4 % |
45 +| Année de construction | 86.8 % (dont rôle : 100.0 %) |
46 +| Taxes / évaluation municipale | 0.0 % |
47 +| Estimation Vrai-Prix (rôle) | 100.0 % |
48 +
49 +## Synchronisation
50 +
51 +- **Dernier sync** : 2026-08-18 02:35 — trouvé 93, +0 / ~0 / -4 — OK
52 +- **Erreurs récentes** : 0 sur les 3 derniers syncs
53 +
54 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/c21_ag_quebec.md +59 −0
@@ -0,0 +1,59 @@
1 +# Century 21 Québec (All Quebec) (`c21_ag_quebec`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://quebec.c21.ca
8 +- **Recherche** : https://quebec.c21.ca
9 +- **Plateforme** : source.immo
10 +- **Rôle** : sous-agence
11 +- **Statut** : actif
12 +
13 +> Compte source.immo partagé (quebec/excel/immoplus) = inventaire provincial C21 complet (~1600 à vendre). Pagination st/nt. Dédup par n° Centris.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/century21_agences.py` — classe `C21AgQuebec`
18 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/century21_agences.py : Century 21 par SOUS-AGENCES (robuste)
25 +> Le portail central c21.ca délègue à une iframe moxiworks verrouillée
26 +> (503/WAF, même via Firecrawl). Mais les bureaux Century 21 du Québec tournent
27 +> sur la plateforme source.immo (ID-3 Technologies) : quebec.c21.ca,
28 +> excel.c21.ca et century21immoplus.com partagent un même compte
29 +> « Century 21 - All Quebec » (inventaire provincial complet), et
30 +> vision.c21.ca a son propre compte. L'API publique (api-v1.source.immo)
31 +> est paginée par st/nt (voir sourceimmo.py) — inventaire complet accessible.
32 +> Une classe par sous-agence est générée depuis data/century21_agencies.json
33 +> (source_id « c21_ag_<slug> »). Le n° Centris sert de clé de déduplication
34 +> (voir web.py, sources « %_ag_% ») — aucun double-comptage entre les skins
35 +> partageant le même compte ni avec le reste du site.
36 +
37 +## Volumétrie & complétude (BD live)
38 +
39 +| Indicateur | Valeur |
40 +|---|---|
41 +| Annonces en base (toutes) | 1 663 |
42 +| Actives | 1 603 |
43 +| Visibles (après dédup) | 1 576 |
44 +| Masquées par la dédup | 27 |
45 +| GPS (lat/lng) | 99.9 % |
46 +| Photos | 100.0 % |
47 +| Prix | 100.0 % |
48 +| CAC (chambres) | 75.1 % |
49 +| SDB (salles de bains) | 72.8 % |
50 +| Année de construction | 75.6 % (dont rôle : 10.0 %) |
51 +| Taxes / évaluation municipale | 83.7 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 +
54 +## Synchronisation
55 +
56 +- **Dernier sync** : 2026-08-18 02:35 — trouvé 1 603, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 +
59 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/c21_ag_vision.md +59 −0
@@ -0,0 +1,59 @@
1 +# Century 21 Vision (Outaouais) (`c21_ag_vision`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://vision.c21.ca
8 +- **Recherche** : https://vision.c21.ca
9 +- **Plateforme** : source.immo
10 +- **Rôle** : sous-agence
11 +- **Statut** : actif
12 +
13 +> Century 21 Vision (Gatineau) — compte source.immo distinct (~139 à vendre).
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/century21_agences.py` — classe `C21AgVision`
18 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/century21_agences.py : Century 21 par SOUS-AGENCES (robuste)
25 +> Le portail central c21.ca délègue à une iframe moxiworks verrouillée
26 +> (503/WAF, même via Firecrawl). Mais les bureaux Century 21 du Québec tournent
27 +> sur la plateforme source.immo (ID-3 Technologies) : quebec.c21.ca,
28 +> excel.c21.ca et century21immoplus.com partagent un même compte
29 +> « Century 21 - All Quebec » (inventaire provincial complet), et
30 +> vision.c21.ca a son propre compte. L'API publique (api-v1.source.immo)
31 +> est paginée par st/nt (voir sourceimmo.py) — inventaire complet accessible.
32 +> Une classe par sous-agence est générée depuis data/century21_agencies.json
33 +> (source_id « c21_ag_<slug> »). Le n° Centris sert de clé de déduplication
34 +> (voir web.py, sources « %_ag_% ») — aucun double-comptage entre les skins
35 +> partageant le même compte ni avec le reste du site.
36 +
37 +## Volumétrie & complétude (BD live)
38 +
39 +| Indicateur | Valeur |
40 +|---|---|
41 +| Annonces en base (toutes) | 142 |
42 +| Actives | 138 |
43 +| Visibles (après dédup) | 0 |
44 +| Masquées par la dédup | 138 |
45 +| GPS (lat/lng) | — |
46 +| Photos | — |
47 +| Prix | — |
48 +| CAC (chambres) | — |
49 +| SDB (salles de bains) | — |
50 +| Année de construction | — |
51 +| Taxes / évaluation municipale | — |
52 +| Estimation Vrai-Prix (rôle) | — |
53 +
54 +## Synchronisation
55 +
56 +- **Dernier sync** : 2026-08-18 02:35 — trouvé 138, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 +
59 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/century21.md +27 −0
@@ -0,0 +1,27 @@
1 +# Century 21 (Québec) (`century21`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.c21.ca
8 +- **Recherche** : https://listings.moxiworks.com/m214-1731446488/fr-ca
9 +- **Couverture** : Toute la province — ~339 courtiers, ~22 agences
10 +- **Type** : franchise
11 +- **Statut** : actif
12 +
13 +> Central c21.ca->moxiworks (company_uuid=3341197) : même flux search_v2 anonyme accessible, MAIS données Rest-of-Canada/MLS (pas Centris QC : Québec-ville=0). La couverture QC de C21 vient des sous-agences source.immo (c21_ag_*), déjà actives. Le central moxi n'ajoute rien au QC.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +_Pas de classe connecteur dédiée (voir la note du registre)._
18 +
19 +## Volumétrie & complétude (BD live)
20 +
21 +_Aucune annonce en base pour cette source (voir la note du registre : couverture assurée ailleurs ou connecteur inactif)._
22 +
23 +## Synchronisation
24 +
25 +Aucune entrée `sync_log` pour cette source.
26 +
27 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/charisma_ag_qc.md +57 −0
@@ -0,0 +1,57 @@
1 +# Les Immeubles Charisma (`charisma_ag_qc`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://charisma.ca
8 +- **Recherche** : https://charisma.ca/fr/proprietes/
9 +- **Couverture** : Laval, Montréal, Montérégie — 3e bannière indépendante du Québec
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> WordPress (MW Properties / marketingwebsites.ca), liste SSR paginée ?pages=N (~10/page). Carte box-house: no Centris, prix ($US), ville, chambres/sdb, photo. ⚠ fusion avec L'Expert Immobilier P.M. (2021) → source_id _ag_ = dédup Centris.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/charisma.py` — classe `CharismaConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/charisma.py : Les Immeubles Charisma (charisma.ca) — Laval,
25 +> Montréal, Montérégie. 3e bannière indépendante du Québec (200+ courtiers).
26 +> Site WordPress (plugin « MW Properties » / realestate.marketingwebsites.ca),
27 +> liste rendue SERVEUR sur /fr/proprietes/, paginée par ?pages=N (~10/page,
28 +> ~84 pages). Chaque carte (box-house) porte : n° Centris (URL + image), prix,
29 +> ville, chambres/sdb et photo (property-images/{Centris}/).
30 +> ⚠ DÉDUP : Charisma a fusionné avec L'Expert Immobilier P.M. (déjà couvert)
31 +> en 2021 → beaucoup de co-inscriptions. source_id « charisma_ag_qc » : l'infixe
32 +> _ag_ (db.refresh_dedup) masque les fiches dont le n° Centris est déjà porté
33 +> par une source couverte ; les inscriptions uniques restent visibles.
34 +
35 +## Volumétrie & complétude (BD live)
36 +
37 +| Indicateur | Valeur |
38 +|---|---|
39 +| Annonces en base (toutes) | 760 |
40 +| Actives | 755 |
41 +| Visibles (après dédup) | 696 |
42 +| Masquées par la dédup | 59 |
43 +| GPS (lat/lng) | 92.4 % |
44 +| Photos | 100.0 % |
45 +| Prix | 53.0 % |
46 +| CAC (chambres) | 100.0 % |
47 +| SDB (salles de bains) | 100.0 % |
48 +| Année de construction | 81.2 % (dont rôle : 100.0 %) |
49 +| Taxes / évaluation municipale | 0.0 % |
50 +| Estimation Vrai-Prix (rôle) | 100.0 % |
51 +
52 +## Synchronisation
53 +
54 +- **Dernier sync** : 2026-08-18 02:37 — trouvé 755, +0 / ~0 / -5 — OK
55 +- **Erreurs récentes** : 0 sur les 3 derniers syncs
56 +
57 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/cio_ag_outaouais.md +61 −0
@@ -0,0 +1,61 @@
1 +# Chambre immobilière de l'Outaouais (`cio_ag_outaouais`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://avecuncourtier.com
8 +- **Recherche** : https://avecuncourtier.com/fr/proprietes
9 +- **Couverture** : Tout l'Outaouais (Gatineau → Maniwaki/Pontiac) — portail MLS régional
10 +- **Type** : portail
11 +- **Statut** : actif
12 +
13 +> Portail de chambre (Concrete5/Tonik). Liste SSR paginée ?page=N (12/page, ~341 pages). Carte: MLS Centris, adresse, ville, type, prix, photo. source_id _ag_ = dédup Centris (agrège bannières couvertes de l'Outaouais).
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/avecuncourtier.py` — classe `AvecUnCourtierConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_AUC_MAX_PAGES` (défaut 400)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/avecuncourtier.py : portail « avec un courtier » de la Chambre
26 +> immobilière de l'Outaouais (avecuncourtier.com). Couvre TOUT l'Outaouais
27 +> (Gatineau → Maniwaki/Pontiac) d'un coup — c'est le portail MLS régional de
28 +> la chambre, pas une agence unique. Recherche rendue SERVEUR (plateforme
29 +> Concrete5, Tonik Web Studio), paginée par ?page=N (12 cartes/page, ~341
30 +> pages). Chaque carte porte déjà : n° MLS (Centris), adresse, ville/secteur,
31 +> type, aire habitable, prix et photo.
32 +> source_id « cio_ag_outaouais » : l'infixe _ag_ active la dédup Centris
33 +> (db.refresh_dedup, sources %_ag_%). Comme le portail agrège les inscriptions
34 +> des bannières déjà couvertes (RE/MAX, Royal LePage, Via Capitale, Proprio
35 +> Direct…), la dédup masque les fiches dont le n° Centris est déjà porté par
36 +> une source canonique ; seules les inscriptions d'agences NON couvertes de
37 +> l'Outaouais restent visibles. Aucun double-comptage.
38 +
39 +## Volumétrie & complétude (BD live)
40 +
41 +| Indicateur | Valeur |
42 +|---|---|
43 +| Annonces en base (toutes) | 4 148 |
44 +| Actives | 4 104 |
45 +| Visibles (après dédup) | 1 394 |
46 +| Masquées par la dédup | 2 710 |
47 +| GPS (lat/lng) | 93.7 % |
48 +| Photos | 100.0 % |
49 +| Prix | 99.9 % |
50 +| CAC (chambres) | 33.7 % |
51 +| SDB (salles de bains) | 0.0 % |
52 +| Année de construction | 69.6 % (dont rôle : 100.0 %) |
53 +| Taxes / évaluation municipale | 0.0 % |
54 +| Estimation Vrai-Prix (rôle) | 99.9 % |
55 +
56 +## Synchronisation
57 +
58 +- **Dernier sync** : 2026-08-18 02:35 — trouvé 4 104, +0 / ~0 / -44 — OK
59 +- **Erreurs récentes** : 0 sur les 3 derniers syncs
60 +
61 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/coldwell_banker.md +27 −0
@@ -0,0 +1,27 @@
1 +# Coldwell Banker Québec (`coldwell_banker`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://coldwellbanker.ca
8 +- **Recherche** : https://coldwellbanker.ca/
9 +- **Couverture** : Québec — franchise (L'Héritage, Prestige…)
10 +- **Type** : franchise
11 +- **Statut** : a_faire
12 +
13 +> moxiworks org m102181-1733247042 / company_uuid=4277740. FLUX ANONYME CRACKÉ : GET svc.moxiworks.com/service/v1/listing/search_v2?company_uuid=<id>&bounds_west/east/south/north=..&status=active (pas d'auth ; le WAF n'est que sur listings.moxiworks.com, pas sur svc). MAIS le feed = Rest-of-Canada/MLS (TREB Toronto : MLS C.../T...) ; couverture Québec/Centris ~nulle (Québec-ville=0, Montréal=4 fiches à MLS torontois). Non exploitable pour Immo-Ka (QC). CB Québec quasi inexistant sur ce feed.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +_Pas de classe connecteur dédiée (voir la note du registre)._
18 +
19 +## Volumétrie & complétude (BD live)
20 +
21 +_Aucune annonce en base pour cette source (voir la note du registre : couverture assurée ailleurs ou connecteur inactif)._
22 +
23 +## Synchronisation
24 +
25 +Aucune entrée `sync_log` pour cette source.
26 +
27 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/contact_ag_qc.md +56 −0
@@ -0,0 +1,56 @@
1 +# Les Immeubles Contact (`contact_ag_qc`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.lesimmeublescontact.com
8 +- **Recherche** : https://www.lesimmeublescontact.com/immeubles_centris.php?page=residentiel
9 +- **Couverture** : Alma / Lac-Saint-Jean-Est + Chibougamau-Chapais
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> Site PHP maison (ISO-8859-1), liste SSR immeubles_centris.php (residentiel/revenu/commercial). Carte: data-cost, no_mls Centris, adresse, ville, prix, photo. source_id _ag_ = dédup Centris.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/immeuble_contact.py` — classe `ImmeubleContactConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/immeuble_contact.py : Les Immeubles Contact (Alma / Lac-Saint-Jean-Est
25 +> + Chibougamau-Chapais). Agence indépendante, site PHP maison (Solution Globale
26 +> Informatique). La liste est rendue SERVEUR sur immeubles_centris.php?page=…
27 +> (résidentiel + revenu), encodage ISO-8859-1. Chaque carte porte déjà tout :
28 +> n° MLS (Centris), type, adresse, ville, prix (data-cost) et photo Centris.
29 +> source_id « contact_ag_qc » : l'infixe _ag_ active la dédup Centris (db.refresh_dedup,
30 +> sources %_ag_%) — si le n° Centris est déjà porté par une bannière couverte
31 +> (RE/MAX, Via Capitale…), la fiche est masquée ; les inscriptions propres de
32 +> l'agence restent visibles. Aucun double-comptage.
33 +
34 +## Volumétrie & complétude (BD live)
35 +
36 +| Indicateur | Valeur |
37 +|---|---|
38 +| Annonces en base (toutes) | 44 |
39 +| Actives | 43 |
40 +| Visibles (après dédup) | 43 |
41 +| Masquées par la dédup | 0 |
42 +| GPS (lat/lng) | 97.7 % |
43 +| Photos | 100.0 % |
44 +| Prix | 100.0 % |
45 +| CAC (chambres) | 9.3 % |
46 +| SDB (salles de bains) | 0.0 % |
47 +| Année de construction | 83.7 % (dont rôle : 100.0 %) |
48 +| Taxes / évaluation municipale | 0.0 % |
49 +| Estimation Vrai-Prix (rôle) | 100.0 % |
50 +
51 +## Synchronisation
52 +
53 +- **Dernier sync** : 2026-08-18 02:40 — trouvé 43, +0 / ~0 / -1 — OK
54 +- **Erreurs récentes** : 0 sur les 3 derniers syncs
55 +
56 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/domicilia.md +59 −0
@@ -0,0 +1,59 @@
1 +# Domicilia Agence Immobilière (`domicilia`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.domicilia.com
8 +- **Recherche** : https://www.domicilia.com/proprietes/
9 +- **Couverture** : Agence indépendante (Québec)
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). 1427 propriétés à vendre. Généré par agences_source_immo.py.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/agences_source_immo.py` — classe `AgenceSIDomicilia`
18 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme
25 +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC
26 +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à
27 +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique
28 +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences
29 +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES —
30 +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_).
31 +> EXCEPTION : les équipes/agences dont une partie des inscriptions est
32 +> co-listée avec une bannière couverte (co-inscription Centris) portent un id
33 +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%)
34 +> masque leurs doublons tout en gardant leurs fiches uniques visibles.
35 +> Un connecteur par agence est généré depuis data/source_immo_agencies.json.
36 +
37 +## Volumétrie & complétude (BD live)
38 +
39 +| Indicateur | Valeur |
40 +|---|---|
41 +| Annonces en base (toutes) | 1 485 |
42 +| Actives | 1 445 |
43 +| Visibles (après dédup) | 1 445 |
44 +| Masquées par la dédup | 0 |
45 +| GPS (lat/lng) | 99.9 % |
46 +| Photos | 100.0 % |
47 +| Prix | 100.0 % |
48 +| CAC (chambres) | 67.8 % |
49 +| SDB (salles de bains) | 66.6 % |
50 +| Année de construction | 73.4 % (dont rôle : 6.2 %) |
51 +| Taxes / évaluation municipale | 89.5 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 +
54 +## Synchronisation
55 +
56 +- **Dernier sync** : 2026-08-18 02:27 — trouvé 1 445, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 +
59 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/duproprio.md +57 −0
@@ -0,0 +1,57 @@
1 +# DuProprio (sans courtier) (`duproprio`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://duproprio.com
8 +- **Recherche** : https://duproprio.com/sitemaps/fr/index.xml.gz
9 +- **Couverture** : Toute la province — vente par le propriétaire (FSBO), ~7 600 propriétés QC
10 +- **Type** : fsbo
11 +- **Statut** : actif
12 +
13 +> FSBO. Enumeration via sitemaps FR par region QC (/sitemaps/fr/<region>-listings.xml.gz) : l'URL encode region/ville/type/id. Fiche detail JSON-LD Product (prix, description, galerie photos.duproprio.com). Fetch direct + Scrapfly ASP en secours. agency='DuProprio (sans courtier)'.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/duproprio.py` — classe `DuProprioConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_DUPROPRIO_DETAIL_LIMIT` (défaut 500)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/duproprio.py : DuProprio (FSBO — vente sans courtier)
26 +> DuProprio est la grande plateforme québécoise de vente « à vendre par le
27 +> propriétaire » (sans agence). Segment complémentaire absent de toutes les
28 +> bannières de courtage. Énumération EXHAUSTIVE via les sitemaps FR par région
29 +> du Québec (`/sitemaps/fr/<region>-listings.xml.gz`) : l'URL encode déjà
30 +> région, ville, type et l'id DuProprio (= external_id). La fiche détail
31 +> (JSON-LD Product) fournit prix, description et galerie ; enrichissement
32 +> plafonné + cache (comme les autres connecteurs). Scrapfly en secours si le
33 +> fetch direct est bloqué.
34 +
35 +## Volumétrie & complétude (BD live)
36 +
37 +| Indicateur | Valeur |
38 +|---|---|
39 +| Annonces en base (toutes) | 7 569 |
40 +| Actives | 7 393 |
41 +| Visibles (après dédup) | 7 393 |
42 +| Masquées par la dédup | 0 |
43 +| GPS (lat/lng) | 90.8 % |
44 +| Photos | 100.0 % |
45 +| Prix | 98.6 % |
46 +| CAC (chambres) | 80.5 % |
47 +| SDB (salles de bains) | 79.8 % |
48 +| Année de construction | 79.3 % (dont rôle : 9.0 %) |
49 +| Taxes / évaluation municipale | 52.7 % |
50 +| Estimation Vrai-Prix (rôle) | 100.0 % |
51 +
52 +## Synchronisation
53 +
54 +- **Dernier sync** : 2026-08-18 02:37 — trouvé 7 393, +0 / ~0 / -30 — OK
55 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
56 +
57 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/engel_volkers.md +53 −0
@@ -0,0 +1,53 @@
1 +# Engel & Völkers Montréal / Québec (`engel_volkers`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://immobilier.evquebec.com
8 +- **Recherche** : https://immobilier.evquebec.com/property-sitemap.xml
9 +- **Couverture** : Montréal, Québec, Tremblant — luxe #1 au Québec
10 +- **Type** : luxe
11 +- **Statut** : actif
12 +
13 +> immobilier.evquebec.com : property-sitemap.xml (~1240 fiches FR /propriete/{no-centris}/). Fiche = JSON-LD (prix/adresse/description) ; galerie séquentielle media.evquebec.com/listings/{id}/NN.webp (sondée jusqu'au 1er trou). Enrichissement cache+plafond (IMMOKA_EV_DETAIL_LIMIT).
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/engel_volkers.py` — classe `EngelVolkersConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_EV_DETAIL_LIMIT` (défaut 400)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/engel_volkers.py : Engel & Völkers Montréal / Québec (luxe)
26 +> Le site local immobilier.evquebec.com publie un property-sitemap.xml
27 +> exhaustif (~1240 fiches, /propriete/{no-centris}/). Chaque fiche a un
28 +> JSON-LD RealEstateListing (prix, adresse, description, n° Centris). La
29 +> galerie est servie séquentiellement sur media.evquebec.com/listings/{id}/NN.webp.
30 +
31 +## Volumétrie & complétude (BD live)
32 +
33 +| Indicateur | Valeur |
34 +|---|---|
35 +| Annonces en base (toutes) | 1 282 |
36 +| Actives | 1 228 |
37 +| Visibles (après dédup) | 1 228 |
38 +| Masquées par la dédup | 0 |
39 +| GPS (lat/lng) | 87.1 % |
40 +| Photos | 98.9 % |
41 +| Prix | 89.7 % |
42 +| CAC (chambres) | 35.2 % |
43 +| SDB (salles de bains) | 20.4 % |
44 +| Année de construction | 69.9 % (dont rôle : 100.0 %) |
45 +| Taxes / évaluation municipale | 0.0 % |
46 +| Estimation Vrai-Prix (rôle) | 89.3 % |
47 +
48 +## Synchronisation
49 +
50 +- **Dernier sync** : 2026-08-18 02:37 — trouvé 1 228, +0 / ~0 / -0 — OK
51 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
52 +
53 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/exp_ag_qc.md +64 −0
@@ -0,0 +1,64 @@
1 +# eXp Agence immobilière (Québec) (`exp_ag_qc`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://expquebec.com
8 +- **Recherche** : https://expquebec.com/fr/properties/
9 +- **Couverture** : Toute la province — agence virtuelle (~1000+ inscriptions)
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> Site officiel eXp QC (expquebec.com, WordPress + MW Properties). API cliente marketingwebsites.ca bloquée (whitelist IP) MAIS inventaire complet en SSR sur /fr/properties/?pages=N (9/page, param 'pages', stop après 3 pages vides). Carte: data-href mls={Centris}, data-price ($US), data-address, data-pic. Ville via map-property.php?mls={Centris}&lang=fr (enrich requests, plafonné+cache). source_id _ag_ = dédup Centris.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/exp_quebec.py` — classe `ExpQuebecConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_EXP_DETAIL_LIMIT` (défaut 1200)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/exp_quebec.py : eXp Realty Québec (expquebec.com) — toute la province.
26 +> L'API cliente realestate.marketingwebsites.ca/api.php est verrouillée par
27 +> whitelist IP (impasse, même via proxy). MAIS le serveur WordPress (autorisé
28 +> sur l'API) rend l'inventaire COMPLET côté serveur sur
29 +> /fr/properties/?pages={N} (9 fiches/page, param « pages » uniquement).
30 +> Chaque carte porte data-href /fr/properties/mls/{MLS}, data-price ($US),
31 +> data-address (rue) et data-pic (property-images/{MLS}/). Le n° MLS = n° Centris.
32 +> La VILLE (absente de la liste) vient de l'endpoint SSR interne
33 +> /wp-content/themes/canvas/load/map-property.php?mls={MLS}&lang=fr
34 +> (enrichissement requests direct, plafonné + cache).
35 +> ⚠ PLAFOND : le SSR reflète le limit=1000 de l'API sous-jacente → au plus
36 +> ~1000 fiches (pages 1..~114, crawl vérifié). C'est l'inventaire pratique
37 +> complet ; si eXp QC dépasse un jour 1000 inscriptions, segmenter par région
38 +> (params MW_region / MW_q du formulaire), chaque segment ayant son propre cap.
39 +> source_id « exp_ag_qc » : infixe _ag_ = dédup Centris (db.refresh_dedup) —
40 +> les fiches co-listées avec une bannière couverte sont masquées.
41 +
42 +## Volumétrie & complétude (BD live)
43 +
44 +| Indicateur | Valeur |
45 +|---|---|
46 +| Annonces en base (toutes) | 1 018 |
47 +| Actives | 1 000 |
48 +| Visibles (après dédup) | 888 |
49 +| Masquées par la dédup | 112 |
50 +| GPS (lat/lng) | 67.3 % |
51 +| Photos | 100.0 % |
52 +| Prix | 99.8 % |
53 +| CAC (chambres) | 14.6 % |
54 +| SDB (salles de bains) | 0.0 % |
55 +| Année de construction | 55.6 % (dont rôle : 100.0 %) |
56 +| Taxes / évaluation municipale | 0.0 % |
57 +| Estimation Vrai-Prix (rôle) | 100.0 % |
58 +
59 +## Synchronisation
60 +
61 +- **Dernier sync** : 2026-08-18 02:40 — trouvé 1 000, +0 / ~0 / -18 — OK
62 +- **Erreurs récentes** : 0 sur les 3 derniers syncs
63 +
64 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/expert_immobilier_pm.md +54 −0
@@ -0,0 +1,54 @@
1 +# L'Expert Immobilier P.M. (`expert_immobilier_pm`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://expertimmobilierpm.com
8 +- **Recherche** : https://expertimmobilierpm.com/proprietes/
9 +- **Couverture** : Grand Montréal — ~305 courtiers, grosse indépendante
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> Vrai site QC trouve (l'ancienne URL lexpertimmobilier.com = agence de Casablanca). WordPress + plugin mw-properties2 (plateforme marketingwebsites.ca, comme KW Urbain). /proprietes/ rend 9 fiches serveur (inventaire complet derriere l'API REST mw-properties/v2 en 401). Cartes: adresse, ville, type, prix, chambres, sdb, superficie ; fiche detail: galerie complete (marketingwebsites) + description. external_id = no Centris.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/expert_immobilier_pm.py` — classe `ExpertImmobilierPmConnector`
18 +- Délai entre requêtes : 0.6 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_EPM_DETAIL_LIMIT` (défaut 300)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/expert_immobilier_pm.py : L'Expert Immobilier P.M. (Laval, QC)
26 +> Vrai site : expertimmobilierpm.com (WordPress + plugin mw-properties2, la
27 +> même plateforme marketingwebsites.ca que KW Urbain). NB : l'ancienne URL du
28 +> registre (lexpertimmobilier.com) était une agence de Casablanca — corrigée.
29 +> La page /proprietes/ rend les fiches côté serveur (n° Centris dans l'URL) ;
30 +> la fiche détail fournit la galerie complète (marketingwebsites) + description.
31 +
32 +## Volumétrie & complétude (BD live)
33 +
34 +| Indicateur | Valeur |
35 +|---|---|
36 +| Annonces en base (toutes) | 26 |
37 +| Actives | 9 |
38 +| Visibles (après dédup) | 9 |
39 +| Masquées par la dédup | 0 |
40 +| GPS (lat/lng) | 88.9 % |
41 +| Photos | 100.0 % |
42 +| Prix | 88.9 % |
43 +| CAC (chambres) | 100.0 % |
44 +| SDB (salles de bains) | 100.0 % |
45 +| Année de construction | 88.9 % (dont rôle : 100.0 %) |
46 +| Taxes / évaluation municipale | 0.0 % |
47 +| Estimation Vrai-Prix (rôle) | 100.0 % |
48 +
49 +## Synchronisation
50 +
51 +- **Dernier sync** : 2026-08-18 02:40 — trouvé 9, +0 / ~0 / -0 — OK
52 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
53 +
54 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/famille-c21-ag.md +53 −0
@@ -0,0 +1,53 @@
1 +# Famille Century 21 (`c21_ag_*`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +Connecteurs par compte Century 21, générés depuis `data/century21_agencies.json` (plateforme source.immo).
6 +
7 +- Registre : `data/century21_agencies.json` — **2 entrées**
8 +- Connecteurs instanciés : **2**
9 +- Module : `immoka/connectors/century21_agences.py`
10 +
11 +**En-tête du module :**
12 +
13 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
14 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
15 +> connectors/century21_agences.py : Century 21 par SOUS-AGENCES (robuste)
16 +> Le portail central c21.ca délègue à une iframe moxiworks verrouillée
17 +> (503/WAF, même via Firecrawl). Mais les bureaux Century 21 du Québec tournent
18 +> sur la plateforme source.immo (ID-3 Technologies) : quebec.c21.ca,
19 +> excel.c21.ca et century21immoplus.com partagent un même compte
20 +> « Century 21 - All Quebec » (inventaire provincial complet), et
21 +> vision.c21.ca a son propre compte. L'API publique (api-v1.source.immo)
22 +> est paginée par st/nt (voir sourceimmo.py) — inventaire complet accessible.
23 +> Une classe par sous-agence est générée depuis data/century21_agencies.json
24 +> (source_id « c21_ag_<slug> »). Le n° Centris sert de clé de déduplication
25 +> (voir web.py, sources « %_ag_% ») — aucun double-comptage entre les skins
26 +> partageant le même compte ni avec le reste du site.
27 +
28 +## Membres et statuts
29 +
30 +| source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK |
31 +|---|---|---|---|---|---|---|---|
32 +| [`c21_ag_quebec`](c21_ag_quebec.md) | — | source.immo | 1 576 | 1 603 | 27 | 2026-08-18 02:35 | ✅ |
33 +| [`c21_ag_vision`](c21_ag_vision.md) | — | source.immo | 0 | 138 | 138 | 2026-08-18 02:35 | ✅ |
34 +
35 +Entrées du registre sans connecteur instancié (2) : `quebec.c21.ca`, `vision.c21.ca`
36 +
37 +## Volumétrie & complétude agrégées (famille, BD live)
38 +
39 +| Indicateur | Valeur |
40 +|---|---|
41 +| Annonces en base (toutes) | 1 805 |
42 +| Actives | 1 741 |
43 +| Visibles (après dédup) | 1 576 |
44 +| Masquées par la dédup | 165 |
45 +| GPS (lat/lng) | 99.9 % |
46 +| Photos | 100.0 % |
47 +| Prix | 100.0 % |
48 +| CAC (chambres) | 75.1 % |
49 +| SDB (salles de bains) | 72.8 % |
50 +| Année de construction | 75.6 % (dont rôle : 10.0 %) |
51 +| Taxes / évaluation municipale | 83.7 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 +
added docs/connecteurs/famille-remax-ag.md +108 −0
@@ -0,0 +1,108 @@
1 +# Famille RE/MAX sous-agences (`remax_ag_*`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +Un connecteur par sous-agence RE/MAX (sites propres, indépendants du portail central), généré dynamiquement depuis `data/remax_agencies.json`.
6 +
7 +- Registre : `data/remax_agencies.json` — **54 entrées**
8 +- Connecteurs instanciés : **50**
9 +- Module : `immoka/connectors/remax_agences.py`
10 +
11 +**En-tête du module :**
12 +
13 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
14 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
15 +> connectors/remax_agences.py : BACKUP RE/MAX — un connecteur par sous-agence
16 +> Les ~54 bannières RE/MAX du Québec (RE/MAX 1er Choix, du Cartier, 3000,
17 +> Platine…) ont chacune leur SITE PROPRE, indépendant du portail central
18 +> remax-quebec.com. La majorité (42) partagent la même plateforme Centris
19 +> (« /fr/nos-proprietes/{ville}/{adresse}/{no-centris} », rendu serveur,
20 +> sitemap.xml exhaustif). C'est un plan B si la clé Meilisearch centrale
21 +> (voir remax_quebec.py) est rotée ou bloquée.
22 +> Une CLASSE PAR AGENCE est générée dynamiquement depuis
23 +> data/remax_agencies.json (source_id « remax_ag_<slug> »). L'énumération
24 +> se fait via le sitemap (1 requête → toutes les propriétés) ; le numéro
25 +> Centris (dans l'URL) sert de clé de déduplication contre le flux central
26 +> (voir la fusion dédupliquée dans immoka/web.py) — aucun double-comptage.
27 +
28 +## Mécanismes clés
29 +
30 +- **Backup du flux central** : plan B si la clé Meilisearch de remax-quebec.com est rotée/bloquée. Énumération par sitemap (1 requête → tout le parc) sur les plateformes « nos-proprietes » et « centris-other ».
31 +- **Dédup Centris** : le n° Centris (dans l'URL) sert de clé de déduplication contre le flux central — les doublons sont masqués (`dup_hidden=1`), aucun double-comptage.
32 +
33 +Budgets env : `IMMOKA_AGENCE_DETAIL_LIMIT` (défaut 0)
34 +
35 +## Membres et statuts
36 +
37 +| source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK |
38 +|---|---|---|---|---|---|---|---|
39 +| `remax_ag_1erchoix` | www.remax1erchoix.com | nos-proprietes | 211 | 1 064 | 853 | 2026-08-18 00:15 | ✅ |
40 +| `remax_ag_2000` | www.remax-2000.com | centris-other | 72 | 735 | 663 | 2026-08-18 00:15 | ✅ |
41 +| `remax_ag_2001` | www.remax2001.com | nos-proprietes | 37 | 366 | 329 | 2026-08-18 00:15 | ✅ |
42 +| `remax_ag_3000` | remax3000.com | nos-proprietes | 52 | 782 | 730 | 2026-08-18 00:15 | ✅ |
43 +| `remax_ag_acces` | www.remaxacces.com | nos-proprietes | 140 | 622 | 482 | 2026-08-18 00:15 | ✅ |
44 +| `remax_ag_action` | remax-action.ca | nos-proprietes | 85 | 1 361 | 1 276 | 2026-08-18 00:15 | ✅ |
45 +| `remax_ag_alliance` | www.remax-alliance.ca | nos-proprietes | 183 | 1 258 | 1 075 | 2026-08-18 00:15 | ✅ |
46 +| `remax_ag_avantages` | www.remax-avantages.com | nos-proprietes | 177 | 772 | 595 | 2026-08-18 00:15 | ✅ |
47 +| `remax_ag_avanttout` | www.remaxavanttout.com | nos-proprietes | 37 | 404 | 367 | 2026-08-18 00:15 | ✅ |
48 +| `remax_ag_cite` | remax-cite.com | nos-proprietes | 12 | 116 | 104 | 2026-08-18 00:15 | ✅ |
49 +| `remax_ag_crystal` | remaxcrystal.com | nos-proprietes | 168 | 1 305 | 1 137 | 2026-08-18 00:15 | ✅ |
50 +| `remax_ag_d_ici` | remaxdici.com | nos-proprietes | 131 | 871 | 740 | 2026-08-18 00:15 | ✅ |
51 +| `remax_ag_dabord` | www.remax-dabord.com | centris-other | 126 | 796 | 670 | 2026-08-18 00:15 | ✅ |
52 +| `remax_ag_defi` | remax-defi1996.com | nos-proprietes | 27 | 348 | 321 | 2026-08-18 00:15 | ✅ |
53 +| `remax_ag_defrancheville` | remaxdefrancheville.com | nos-proprietes | 168 | 1 461 | 1 293 | 2026-08-18 00:15 | ✅ |
54 +| `remax_ag_direct` | remax-direct.com | nos-proprietes | 28 | 1 068 | 1 040 | 2026-08-18 00:15 | ✅ |
55 +| `remax_ag_distinction` | remaxdistinction.com | nos-proprietes | 27 | 149 | 122 | 2026-08-18 00:15 | ✅ |
56 +| `remax_ag_ducartier` | www.remaxducartier.com | centris-other | 237 | 1 860 | 1 623 | 2026-08-18 00:15 | ✅ |
57 +| `remax_ag_ducartieractif` | www.remaxactif.com | centris-other | 25 | 119 | 94 | 2026-08-18 00:15 | ✅ |
58 +| `remax_ag_ducartierbonjour` | remaxbonjour.com | centris-other | 120 | 1 548 | 1 428 | 2026-08-18 00:15 | ✅ |
59 +| `remax_ag_dynamique` | remaxdynamique.com | nos-proprietes | 3 | 151 | 148 | 2026-08-18 00:15 | ✅ |
60 +| `remax_ag_dynastie` | remax-dynastie.com | centris-other | 9 | 240 | 231 | 2026-08-18 00:15 | ✅ |
61 +| `remax_ag_elegance` | remax-elegance.ca | nos-proprietes | 13 | 87 | 74 | 2026-08-18 00:15 | ✅ |
62 +| `remax_ag_elite` | remax-elite.ca | nos-proprietes | 83 | 856 | 773 | 2026-08-18 00:15 | ✅ |
63 +| `remax_ag_energie` | remax-energie.com | nos-proprietes | 8 | 173 | 165 | 2026-08-18 00:15 | ✅ |
64 +| `remax_ag_evolution` | remax-evolution.com | centris-other | 39 | 494 | 455 | 2026-08-18 00:15 | ✅ |
65 +| `remax_ag_excellence` | remax-excellence.ca | nos-proprietes | 6 | 286 | 280 | 2026-08-18 00:15 | ✅ |
66 +| `remax_ag_extra` | remax-extra.ca | centris-other | 122 | 672 | 550 | 2026-08-18 00:15 | ✅ |
67 +| `remax_ag_fortindelage` | remaxfortindelage.com | nos-proprietes | 67 | 408 | 341 | 2026-08-18 00:15 | ✅ |
68 +| `remax_ag_futur` | remax-futur.ca | centris-other | 4 | 197 | 193 | 2026-08-18 00:15 | ✅ |
69 +| `remax_ag_harmonie` | remaxharmonie.com | nos-proprietes | 58 | 376 | 318 | 2026-08-18 00:15 | ✅ |
70 +| `remax_ag_harricana` | remax-harricana.com | nos-proprietes | 6 | 155 | 149 | 2026-08-18 00:16 | ✅ |
71 +| `remax_ag_horizon` | remax-horizon.ca | nos-proprietes | 94 | 466 | 372 | 2026-08-18 00:16 | ✅ |
72 +| `remax_ag_imagine` | remax-imagineprivilege.com | nos-proprietes | 64 | 457 | 393 | 2026-08-18 00:16 | ✅ |
73 +| `remax_ag_immobilia` | remaximmobilia.ca | nos-proprietes | 0 | 7 | 7 | 2026-08-18 00:16 | ✅ |
74 +| `remax_ag_immobilierplus` | remax-immobilierplus.com | nos-proprietes | 5 | 56 | 51 | 2026-08-18 00:16 | ✅ |
75 +| `remax_ag_infinite` | remax-infinite.com | nos-proprietes | 2 | 61 | 59 | 2026-08-18 00:16 | ✅ |
76 +| `remax_ag_invest` | remaxinvest.ca | nos-proprietes | 0 | 1 | 1 | 2026-08-18 00:16 | ✅ |
77 +| `remax_ag_lespace` | www.remaxlespace.com | nos-proprietes | 41 | 472 | 431 | 2026-08-18 00:16 | ✅ |
78 +| `remax_ag_lespace_commercial` | remaxlespace.com | nos-proprietes | 0 | 472 | 472 | 2026-08-18 00:16 | ✅ |
79 +| `remax_ag_performance` | remaxperformance.net | nos-proprietes | 20 | 204 | 184 | 2026-08-18 00:16 | ✅ |
80 +| `remax_ag_platine` | www.remax-platine.com | nos-proprietes | 107 | 1 313 | 1 206 | 2026-08-18 00:16 | ✅ |
81 +| `remax_ag_plus` | remaxplus.ca | nos-proprietes | 71 | 349 | 278 | 2026-08-18 00:16 | ✅ |
82 +| `remax_ag_prestige` | remaxprestige.ca | nos-proprietes | 94 | 482 | 388 | 2026-08-18 00:16 | ✅ |
83 +| `remax_ag_privilege` | remax-imagineprivilege.com | nos-proprietes | 0 | 457 | 457 | 2026-08-18 00:16 | ✅ |
84 +| `remax_ag_professionnel` | www.remax-professionnel.com | nos-proprietes | 81 | 729 | 648 | 2026-08-18 00:16 | ✅ |
85 +| `remax_ag_renaissance` | remax-renaissance.ca | nos-proprietes | 36 | 302 | 266 | 2026-08-18 00:16 | ✅ |
86 +| `remax_ag_royaljordan` | remax-royaljordan.com | nos-proprietes | 134 | 1 307 | 1 173 | 2026-08-18 00:16 | ✅ |
87 +| `remax_ag_signature` | remaxsignature.ca | nos-proprietes | 88 | 569 | 481 | 2026-08-18 00:16 | ✅ |
88 +| `remax_ag_vision` | remaxvision.ca | nos-proprietes | 31 | 1 074 | 1 043 | 2026-08-18 00:16 | ✅ |
89 +
90 +Entrées du registre sans connecteur instancié (2) : `remax-pro-commercial.ca`, `nancyforlini.com`
91 +
92 +## Volumétrie & complétude agrégées (famille, BD live)
93 +
94 +| Indicateur | Valeur |
95 +|---|---|
96 +| Annonces en base (toutes) | 31 174 |
97 +| Actives | 29 878 |
98 +| Visibles (après dédup) | 3 349 |
99 +| Masquées par la dédup | 26 529 |
100 +| GPS (lat/lng) | 96.8 % |
101 +| Photos | 0.0 % |
102 +| Prix | 0.0 % |
103 +| CAC (chambres) | 7.9 % |
104 +| SDB (salles de bains) | 0.0 % |
105 +| Année de construction | 87.1 % (dont rôle : 100.0 %) |
106 +| Taxes / évaluation municipale | 0.0 % |
107 +| Estimation Vrai-Prix (rôle) | 100.0 % |
108 +
added docs/connecteurs/famille-source-immo.md +57 −0
@@ -0,0 +1,57 @@
1 +# Famille source.immo (agences indépendantes)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +Agences indépendantes servies par la plateforme source.immo (comptes/API dans `data/source_immo_agencies.json`).
6 +
7 +- Registre : `data/source_immo_agencies.json` — **6 entrées**
8 +- Connecteurs instanciés : **6**
9 +- Module : `immoka/connectors/agences_source_immo.py`
10 +
11 +**En-tête du module :**
12 +
13 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
14 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
15 +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme
16 +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC
17 +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à
18 +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique
19 +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences
20 +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES —
21 +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_).
22 +> EXCEPTION : les équipes/agences dont une partie des inscriptions est
23 +> co-listée avec une bannière couverte (co-inscription Centris) portent un id
24 +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%)
25 +> masque leurs doublons tout en gardant leurs fiches uniques visibles.
26 +> Un connecteur par agence est généré depuis data/source_immo_agencies.json.
27 +
28 +## Membres et statuts
29 +
30 +| source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK |
31 +|---|---|---|---|---|---|---|---|
32 +| [`domicilia`](domicilia.md) | — | source.immo | 1 445 | 1 445 | 0 | 2026-08-18 02:27 | ✅ |
33 +| [`gaillardetz`](gaillardetz.md) | — | source.immo | 13 | 13 | 0 | 2026-08-18 02:27 | ✅ |
34 +| [`immodev`](immodev.md) | — | source.immo | 92 | 92 | 0 | 2026-08-18 02:27 | ✅ |
35 +| [`niddamour`](niddamour.md) | — | source.immo | 0 | 0 | 0 | 2026-08-18 02:27 | ✅ |
36 +| [`realta`](realta.md) | — | source.immo | 82 | 82 | 0 | 2026-08-18 02:27 | ✅ |
37 +| [`si_ag_theagency`](si_ag_theagency.md) | — | source.immo | 245 | 304 | 59 | 2026-08-18 02:27 | ✅ |
38 +
39 +Entrées du registre sans connecteur instancié (6) : `www.realta.ca`, `www.immodev.ca`, `www.gaillardetz.ca`, `www.domicilia.com`, `www.niddamour.ca`, `theagencymontreal.com`
40 +
41 +## Volumétrie & complétude agrégées (famille, BD live)
42 +
43 +| Indicateur | Valeur |
44 +|---|---|
45 +| Annonces en base (toutes) | 1 984 |
46 +| Actives | 1 936 |
47 +| Visibles (après dédup) | 1 877 |
48 +| Masquées par la dédup | 59 |
49 +| GPS (lat/lng) | 99.9 % |
50 +| Photos | 100.0 % |
51 +| Prix | 100.0 % |
52 +| CAC (chambres) | 66.3 % |
53 +| SDB (salles de bains) | 64.6 % |
54 +| Année de construction | 75.4 % (dont rôle : 6.6 %) |
55 +| Taxes / évaluation municipale | 89.3 % |
56 +| Estimation Vrai-Prix (rôle) | 100.0 % |
57 +
added docs/connecteurs/famille-via-ag.md +54 −0
@@ -0,0 +1,54 @@
1 +# Famille Via Capitale agences (`via_ag_*`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +Connecteurs par bannière Via Capitale, générés depuis `data/via_capitale_agencies.json` (comptes API source.immo par agence).
6 +
7 +- Registre : `data/via_capitale_agencies.json` — **5 entrées**
8 +- Connecteurs instanciés : **4**
9 +- Module : `immoka/connectors/via_capitale_agences.py`
10 +
11 +**En-tête du module :**
12 +
13 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
14 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
15 +> connectors/via_capitale_agences.py : Via Capitale par SOUS-AGENCES (robuste)
16 +> Le portail central viacapitalevendu.com est derrière Cloudflare (scrape
17 +> fragile, 1 page). Les sous-agences Via Capitale (Élite, Sélect, du Mont-Royal,
18 +> Accès…) tournent chacune sur la plateforme source.immo (plugin WordPress),
19 +> dont l'API publique (api-v1.source.immo) est stable et paginée — même
20 +> mécanique que Vendirect (voir sourceimmo.py). On génère une classe par
21 +> sous-agence depuis data/via_capitale_agencies.json ; le n° Centris
22 +> (ref_number) sert de clé de déduplication (voir web.py, sources « %_ag_% »).
23 +> La config publique de chaque site est à
24 +> /wp-content/uploads/_sourceimmo/_configs.json (account_id/api_key/app_id +
25 +> default_view). Le registre est régénérable par scripts/refresh_via_capitale.
26 +
27 +## Membres et statuts
28 +
29 +| source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK |
30 +|---|---|---|---|---|---|---|---|
31 +| [`via_ag_acces`](via_ag_acces.md) | — | source.immo | 31 | 181 | 150 | 2026-08-18 00:27 | ✅ |
32 +| [`via_ag_elite`](via_ag_elite.md) | — | source.immo | 11 | 319 | 308 | 2026-08-18 00:28 | ✅ |
33 +| `via_ag_partenaires` | — | source.immo | 23 | 444 | 421 | 2026-08-18 00:28 | ✅ |
34 +| [`via_ag_select`](via_ag_select.md) | — | source.immo | 17 | 580 | 563 | 2026-08-18 00:28 | ✅ |
35 +
36 +Entrées du registre sans connecteur instancié (5) : `viacapitaleacces.com`, `viacapitaledumontroyal.com`, `viacapitaleelite.immo`, `viacapitalepartenaires.com`, `viacapitaleselect.com`
37 +
38 +## Volumétrie & complétude agrégées (famille, BD live)
39 +
40 +| Indicateur | Valeur |
41 +|---|---|
42 +| Annonces en base (toutes) | 1 580 |
43 +| Actives | 1 524 |
44 +| Visibles (après dédup) | 82 |
45 +| Masquées par la dédup | 1 442 |
46 +| GPS (lat/lng) | 100.0 % |
47 +| Photos | 100.0 % |
48 +| Prix | 100.0 % |
49 +| CAC (chambres) | 67.1 % |
50 +| SDB (salles de bains) | 62.2 % |
51 +| Année de construction | 93.9 % (dont rôle : 10.4 %) |
52 +| Taxes / évaluation municipale | 89.0 % |
53 +| Estimation Vrai-Prix (rôle) | 100.0 % |
54 +
added docs/connecteurs/gaillardetz.md +59 −0
@@ -0,0 +1,59 @@
1 +# Gaillardetz Agence Immobilière (`gaillardetz`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.gaillardetz.ca
8 +- **Recherche** : https://www.gaillardetz.ca/proprietes/
9 +- **Couverture** : Agence indépendante (Québec)
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). 13 propriétés à vendre. Généré par agences_source_immo.py.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/agences_source_immo.py` — classe `AgenceSIGaillardetz`
18 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme
25 +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC
26 +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à
27 +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique
28 +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences
29 +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES —
30 +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_).
31 +> EXCEPTION : les équipes/agences dont une partie des inscriptions est
32 +> co-listée avec une bannière couverte (co-inscription Centris) portent un id
33 +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%)
34 +> masque leurs doublons tout en gardant leurs fiches uniques visibles.
35 +> Un connecteur par agence est généré depuis data/source_immo_agencies.json.
36 +
37 +## Volumétrie & complétude (BD live)
38 +
39 +| Indicateur | Valeur |
40 +|---|---|
41 +| Annonces en base (toutes) | 13 |
42 +| Actives | 13 |
43 +| Visibles (après dédup) | 13 |
44 +| Masquées par la dédup | 0 |
45 +| GPS (lat/lng) | 100.0 % |
46 +| Photos | 100.0 % |
47 +| Prix | 100.0 % |
48 +| CAC (chambres) | 0.0 % |
49 +| SDB (salles de bains) | 0.0 % |
50 +| Année de construction | 92.3 % (dont rôle : 16.7 %) |
51 +| Taxes / évaluation municipale | 100.0 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 +
54 +## Synchronisation
55 +
56 +- **Dernier sync** : 2026-08-18 02:27 — trouvé 13, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 +
59 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/glmc_ag_qc.md +59 −0
@@ -0,0 +1,59 @@
1 +# Les Immeubles GLMC (`glmc_ag_qc`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.glmc.ca
8 +- **Recherche** : https://www.glmc.ca/proprietes/
9 +- **Couverture** : Rivière-du-Loup / KRTB / Témiscouata / Les Basques (Bas-Saint-Laurent)
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> WordPress (thème X), liste SSR paginée ?_paged=N (60/page). Carte: URL /{slug}-{Centris}/, adresse, ville, prix, photo ; détail enrichi (JSON-LD + tableau Centris). source_id _ag_ = dédup Centris.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/glmc.py` — classe `GlmcConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_GLMC_DETAIL_LIMIT` (défaut 250)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/glmc.py : Les Immeubles GLMC (glmc.ca) — Rivière-du-Loup + KRTB /
26 +> Témiscouata / Les Basques (Bas-Saint-Laurent). Plus grosse agence
27 +> indépendante de l'Est du Québec. Site WordPress (plugin mw-centris, thème X),
28 +> liste rendue SERVEUR sur /proprietes/, paginée par ?pg=N (60/page, ~176
29 +> fiches). Chaque carte : lien /proprietes/{adresse-slug}-{n°Centris}/ (le n°
30 +> Centris termine le slug), adresse+ville, photo. Prix/chambres via la page
31 +> détail (enrichissement plafonné + cache). La section « Vendus » (fiches
32 +> vendues, après la pagination) est exclue du parsing.
33 +> source_id « glmc_ag_qc » : infixe _ag_ = dédup Centris (db.refresh_dedup) —
34 +> si le n° Centris est déjà porté par une bannière couverte, la fiche est
35 +> masquée ; les inscriptions propres de GLMC restent visibles.
36 +
37 +## Volumétrie & complétude (BD live)
38 +
39 +| Indicateur | Valeur |
40 +|---|---|
41 +| Annonces en base (toutes) | 177 |
42 +| Actives | 176 |
43 +| Visibles (après dédup) | 176 |
44 +| Masquées par la dédup | 0 |
45 +| GPS (lat/lng) | 63.1 % |
46 +| Photos | 100.0 % |
47 +| Prix | 99.4 % |
48 +| CAC (chambres) | 0.0 % |
49 +| SDB (salles de bains) | 0.0 % |
50 +| Année de construction | 36.4 % (dont rôle : 1.6 %) |
51 +| Taxes / évaluation municipale | 52.8 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 +
54 +## Synchronisation
55 +
56 +- **Dernier sync** : 2026-08-18 02:40 — trouvé 176, +0 / ~0 / -1 — OK
57 +- **Erreurs récentes** : 0 sur les 4 derniers syncs
58 +
59 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/image_ag_qc.md +55 −0
@@ -0,0 +1,55 @@
1 +# Image, l'agence immobilière (`image_ag_qc`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://agenceimage.ca
8 +- **Recherche** : https://agenceimage.ca/mes-proprietes/
9 +- **Couverture** : Saguenay–Lac-Saint-Jean (Saguenay, Jonquière, Roberval, Dolbeau)
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> Plateforme Yoamo (ID-3) + photos Centris. /mes-proprietes/ rend tout en SSR : data-filter-* (prix, ville, genre, chambres/sdb) + data-geo-lat/lng. source_id _ag_ = dédup Centris.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/agenceimage.py` — classe `AgenceImageConnector`
18 +- Délai entre requêtes : 0.5 s ; cache détail BD : oui
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/agenceimage.py : Image, l'agence immobilière (agenceimage.ca) —
25 +> Saguenay, Jonquière, Roberval, Dolbeau-Mistassini, Lac-Saint-Jean.
26 +> Plateforme Yoamo (ID-3 Innovations) + photos Centris. La page /mes-proprietes/
27 +> rend TOUT l'inventaire côté serveur : chaque carte porte n° Centris (rel/URL),
28 +> type + ville (dans l'URL et l'alt), coordonnées (data-geo-lat/lng), prix et
29 +> photo (yoamo.immo/ALSPicture.axd?propId={Centris}).
30 +> source_id « image_ag_qc » : infixe _ag_ = dédup Centris (db.refresh_dedup) —
31 +> masque les fiches déjà portées par une bannière couverte au Saguenay–LSJ.
32 +
33 +## Volumétrie & complétude (BD live)
34 +
35 +| Indicateur | Valeur |
36 +|---|---|
37 +| Annonces en base (toutes) | 77 |
38 +| Actives | 77 |
39 +| Visibles (après dédup) | 77 |
40 +| Masquées par la dédup | 0 |
41 +| GPS (lat/lng) | 100.0 % |
42 +| Photos | 100.0 % |
43 +| Prix | 100.0 % |
44 +| CAC (chambres) | 100.0 % |
45 +| SDB (salles de bains) | 100.0 % |
46 +| Année de construction | 0.0 % |
47 +| Taxes / évaluation municipale | 0.0 % |
48 +| Estimation Vrai-Prix (rôle) | 0.0 % |
49 +
50 +## Synchronisation
51 +
52 +- **Dernier sync** : 2026-08-18 02:27 — trouvé 77, +0 / ~0 / -0 — OK
53 +- **Erreurs récentes** : 0 sur les 4 derniers syncs
54 +
55 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/imcha_ag_qc.md +55 −0
@@ -0,0 +1,55 @@
1 +# Les Immeubles Charlevoix (`imcha_ag_qc`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.imcha.com
8 +- **Recherche** : https://www.imcha.com/vente-de-proprietes/page-1
9 +- **Couverture** : Charlevoix (Baie-Saint-Paul, La Malbaie, Les Éboulements) + Côte-de-Beaupré
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> Site custom SSR, liste paginée /vente-de-proprietes/page-N. Carte li.estate-single: type, ville, prix (souvent « Prix sur demande » à Charlevoix), chambres, photo. n° Centris extrait du nom de fichier photo (/uploads/photos/…/{Centris}-…) → dédup. source_id _ag_.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/imcha.py` — classe `ImchaConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/imcha.py : Les Immeubles Charlevoix (imcha.com) — Baie-Saint-Paul,
25 +> La Malbaie, Les Éboulements, Petite-Rivière-Saint-François + Vieux-Québec /
26 +> Côte-de-Beaupré. Seule agence indépendante crédible de Charlevoix. Site
27 +> custom rendu SERVEUR, liste paginée /vente-de-proprietes/page-N. Chaque carte
28 +> (li.estate-single) porte : code interne, type, ville, prix, chambres et
29 +> photo. Le n° Centris est encodé dans le nom de fichier photo
30 +> (/uploads/photos/max/{Centris}-…) → clé de déduplication.
31 +> source_id « imcha_ag_qc » : infixe _ag_ = dédup Centris (db.refresh_dedup).
32 +
33 +## Volumétrie & complétude (BD live)
34 +
35 +| Indicateur | Valeur |
36 +|---|---|
37 +| Annonces en base (toutes) | 111 |
38 +| Actives | 111 |
39 +| Visibles (après dédup) | 107 |
40 +| Masquées par la dédup | 4 |
41 +| GPS (lat/lng) | 0.0 % |
42 +| Photos | 100.0 % |
43 +| Prix | 41.1 % |
44 +| CAC (chambres) | 61.7 % |
45 +| SDB (salles de bains) | 0.0 % |
46 +| Année de construction | 0.0 % |
47 +| Taxes / évaluation municipale | 0.0 % |
48 +| Estimation Vrai-Prix (rôle) | 0.0 % |
49 +
50 +## Synchronisation
51 +
52 +- **Dernier sync** : 2026-08-18 02:40 — trouvé 111, +0 / ~0 / -0 — OK
53 +- **Erreurs récentes** : 0 sur les 3 derniers syncs
54 +
55 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/immodev.md +59 −0
@@ -0,0 +1,59 @@
1 +# Immodev Agence Immobilière (`immodev`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.immodev.ca
8 +- **Recherche** : https://www.immodev.ca/proprietes/
9 +- **Couverture** : Agence indépendante (Québec)
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). 93 propriétés à vendre. Généré par agences_source_immo.py.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/agences_source_immo.py` — classe `AgenceSIImmodev`
18 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme
25 +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC
26 +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à
27 +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique
28 +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences
29 +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES —
30 +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_).
31 +> EXCEPTION : les équipes/agences dont une partie des inscriptions est
32 +> co-listée avec une bannière couverte (co-inscription Centris) portent un id
33 +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%)
34 +> masque leurs doublons tout en gardant leurs fiches uniques visibles.
35 +> Un connecteur par agence est généré depuis data/source_immo_agencies.json.
36 +
37 +## Volumétrie & complétude (BD live)
38 +
39 +| Indicateur | Valeur |
40 +|---|---|
41 +| Annonces en base (toutes) | 93 |
42 +| Actives | 92 |
43 +| Visibles (après dédup) | 92 |
44 +| Masquées par la dédup | 0 |
45 +| GPS (lat/lng) | 100.0 % |
46 +| Photos | 100.0 % |
47 +| Prix | 100.0 % |
48 +| CAC (chambres) | 8.7 % |
49 +| SDB (salles de bains) | 1.1 % |
50 +| Année de construction | 64.1 % (dont rôle : 15.3 %) |
51 +| Taxes / évaluation municipale | 95.7 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 +
54 +## Synchronisation
55 +
56 +- **Dernier sync** : 2026-08-18 02:27 — trouvé 92, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 +
59 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/kijiji.md +50 −0
@@ -0,0 +1,50 @@
1 +# Kijiji Québec (`kijiji`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.kijiji.ca/b-maison-a-vendre/quebec/c35l9001
8 +- **Statut** : actif
9 +
10 +> Petites annonces — catégories immobilier à vendre QC seulement (maisons c35, condos c643, terrains c641), __NEXT_DATA__/Apollo.
11 +
12 +## Mécanique (introspection du code)
13 +
14 +- Module : `immoka/connectors/kijiji.py` — classe `KijijiConnector`
15 +- Délai entre requêtes : 1.2 s ; cache détail BD : oui
16 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_KIJIJI_MAX_PAGES` (défaut 100), `IMMOKA_KIJIJI_DETAIL_LIMIT` (défaut 400)
17 +
18 +**En-tête du module :**
19 +
20 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
21 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
22 +> connectors/kijiji.py : Kijiji (kijiji.ca) — petites annonces immobilières
23 +> UNIQUEMENT les catégories immobilier À VENDRE, UNIQUEMENT le Québec (l9001) :
24 +> c35 maisons à vendre · c643 condos à vendre · c641 terrains à vendre
25 +> Les pages listent 40+ annonces dans __NEXT_DATA__ (Apollo state) avec titre,
26 +> prix, GPS, adresse et vignette — aucune API privée nécessaire.
27 +
28 +## Volumétrie & complétude (BD live)
29 +
30 +| Indicateur | Valeur |
31 +|---|---|
32 +| Annonces en base (toutes) | 8 113 |
33 +| Actives | 7 109 |
34 +| Visibles (après dédup) | 7 104 |
35 +| Masquées par la dédup | 5 |
36 +| GPS (lat/lng) | 100.0 % |
37 +| Photos | 99.8 % |
38 +| Prix | 98.1 % |
39 +| CAC (chambres) | 82.6 % |
40 +| SDB (salles de bains) | 63.7 % |
41 +| Année de construction | 4.2 % (dont rôle : 0.0 %) |
42 +| Taxes / évaluation municipale | 0.0 % |
43 +| Estimation Vrai-Prix (rôle) | 6.4 % |
44 +
45 +## Synchronisation
46 +
47 +- **Dernier sync** : 2026-08-18 02:59 — trouvé 7 107, +0 / ~7107 / -3 — OK
48 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
49 +
50 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/kw_distinction.md +54 −0
@@ -0,0 +1,54 @@
1 +# Keller Williams Distinction (`kw_distinction`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.kwdistinction.com
8 +- **Recherche** : https://www.kwdistinction.com/sitemap.xml
9 +- **Couverture** : Gatineau / Outaouais
10 +- **Type** : franchise
11 +- **Statut** : actif
12 +
13 +> ASP.NET (tonikwebstudio) : grille/fiche en AJAX (prix/photos non rendus statiquement, ni fiablement via Firecrawl). Enumération via sitemap.xml (167 propr.) ; slug d'URL = ville/type/chambres/rue/no-Centris. Champs liste: adresse, ville, secteur, type, chambres, Centris. Prix/photos NON dispo.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/kw_distinction.py` — classe `KwDistinctionConnector`
18 +- Délai entre requêtes : 0.5 s ; cache détail BD : oui
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/kw_distinction.py : Keller Williams Distinction (Gatineau/Outaouais)
25 +> Site ASP.NET (plateforme tonikwebstudio) : la grille de résultats et les
26 +> fiches détail sont rendues via AJAX/UpdatePanel (prix et photos absents du
27 +> HTML statique, et non rendus de façon fiable même par Firecrawl). En revanche
28 +> le sitemap.xml énumère TOUTES les propriétés, et l'URL encode ville, type,
29 +> nombre de chambres, rue et numéro Centris — de quoi bâtir une fiche solide
30 +> au niveau liste. Le numéro Centris sert de clé de déduplication.
31 +
32 +## Volumétrie & complétude (BD live)
33 +
34 +| Indicateur | Valeur |
35 +|---|---|
36 +| Annonces en base (toutes) | 167 |
37 +| Actives | 167 |
38 +| Visibles (après dédup) | 167 |
39 +| Masquées par la dédup | 0 |
40 +| GPS (lat/lng) | 98.8 % |
41 +| Photos | 0.0 % |
42 +| Prix | 0.0 % |
43 +| CAC (chambres) | 94.0 % |
44 +| SDB (salles de bains) | 0.0 % |
45 +| Année de construction | 0.0 % |
46 +| Taxes / évaluation municipale | 0.0 % |
47 +| Estimation Vrai-Prix (rôle) | 100.0 % |
48 +
49 +## Synchronisation
50 +
51 +- **Dernier sync** : 2026-08-18 02:59 — trouvé 167, +0 / ~0 / -0 — OK
52 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
53 +
54 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/kw_prestige.md +54 −0
@@ -0,0 +1,54 @@
1 +# Keller Williams Prestige (`kw_prestige`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.kwprestige.com
8 +- **Recherche** : https://www.kwprestige.com/sitemap.xml
9 +- **Couverture** : Grand Montréal — bannière KW prestige
10 +- **Type** : franchise
11 +- **Statut** : actif
12 +
13 +> Grille/fiche en widget JS (pagination AJAX non exploitable). Enumeration via sitemap.xml (277 fiches a-vendre) ; slug URL = type-a-vendre-ville-secteur-{noCentris}-detail-Fr. Champs liste: type, ville, secteur, n Centris. Prix/photos = widget JS (list cards rendus serveur mais pagination JS ; enrichissement futur via Scrapfly js_scenario).
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/kw_prestige.py` — classe `KwPrestigeConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/kw_prestige.py : Keller Williams Prestige (kwprestige.com)
25 +> Bannière KW du Grand Montréal. La grille /fr/proprietes/ et les fiches détail
26 +> sont rendues par un widget JS (pagination AJAX, pas d'URL exploitable). Mais
27 +> le sitemap.xml expose TOUTES les fiches : URL
28 +> « {type}-a-vendre-{ville-secteur}-{no-centris}-detail-Fr ». On énumère donc
29 +> par le sitemap (rendu serveur, fiable) ; type/ville/secteur/n° Centris depuis
30 +> le slug. external_id = n° Centris → déduplication.
31 +
32 +## Volumétrie & complétude (BD live)
33 +
34 +| Indicateur | Valeur |
35 +|---|---|
36 +| Annonces en base (toutes) | 277 |
37 +| Actives | 277 |
38 +| Visibles (après dédup) | 277 |
39 +| Masquées par la dédup | 0 |
40 +| GPS (lat/lng) | 0.0 % |
41 +| Photos | 0.0 % |
42 +| Prix | 0.0 % |
43 +| CAC (chambres) | 0.0 % |
44 +| SDB (salles de bains) | 0.0 % |
45 +| Année de construction | 0.0 % |
46 +| Taxes / évaluation municipale | 0.0 % |
47 +| Estimation Vrai-Prix (rôle) | 0.0 % |
48 +
49 +## Synchronisation
50 +
51 +- **Dernier sync** : 2026-08-18 02:59 — trouvé 277, +0 / ~0 / -0 — OK
52 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
53 +
54 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/kw_urbain.md +51 −0
@@ -0,0 +1,51 @@
1 +# Keller Williams Urbain (`kw_urbain`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.kwurbain.ca
8 +- **Recherche** : https://www.kwurbain.ca/inscriptions/
9 +- **Couverture** : Grand Montréal + Rive-Sud/Rive-Nord
10 +- **Type** : franchise
11 +- **Statut** : actif
12 +
13 +> Cartes HTML rendues serveur (plateforme realestate.marketingwebsites.ca) — 349 inscriptions sur une page. Champs: adresse, ville, région, prix, chambres, sdb, photo.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/kw_urbain.py` — classe `KwUrbainConnector`
18 +- Délai entre requêtes : 0.6 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_KW_DETAIL_LIMIT` (défaut 400)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/kw_urbain.py : Keller Williams Urbain (kwurbain.ca)
26 +> Page /inscriptions rendue serveur : toutes les inscriptions de l'agence en
27 +> cartes HTML (plateforme marketingwebsites.ca, commune aux bureaux KW Canada).
28 +
29 +## Volumétrie & complétude (BD live)
30 +
31 +| Indicateur | Valeur |
32 +|---|---|
33 +| Annonces en base (toutes) | 362 |
34 +| Actives | 351 |
35 +| Visibles (après dédup) | 351 |
36 +| Masquées par la dédup | 0 |
37 +| GPS (lat/lng) | 93.7 % |
38 +| Photos | 100.0 % |
39 +| Prix | 51.9 % |
40 +| CAC (chambres) | 93.7 % |
41 +| SDB (salles de bains) | 93.7 % |
42 +| Année de construction | 68.7 % (dont rôle : 100.0 %) |
43 +| Taxes / évaluation municipale | 52.7 % |
44 +| Estimation Vrai-Prix (rôle) | 100.0 % |
45 +
46 +## Synchronisation
47 +
48 +- **Dernier sync** : 2026-08-18 02:59 — trouvé 351, +0 / ~0 / -0 — OK
49 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
50 +
51 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/lespac.md +51 −0
@@ -0,0 +1,51 @@
1 +# LesPAC Québec (`lespac`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.lespac.com/quebec/immobilier-achat-vente_b36k1R2.jsa
8 +- **Statut** : actif
9 +
10 +> Petites annonces QC — immobilier achat-vente b37/b38/b39/b40/b41/b42 (pas location ni entreprises), searchResponse embarqué.
11 +
12 +## Mécanique (introspection du code)
13 +
14 +- Module : `immoka/connectors/lespac.py` — classe `LesPacConnector`
15 +- Délai entre requêtes : 0.9 s ; cache détail BD : oui
16 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_LESPAC_DETAIL_LIMIT` (défaut 400)
17 +
18 +**En-tête du module :**
19 +
20 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
21 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
22 +> connectors/lespac.py : LesPAC (lespac.com) — petites annonces du Québec
23 +> UNIQUEMENT l'immobilier ACHAT-VENTE (pas la location, pas les entreprises) :
24 +> b37 résidentiel · b38 terrains · b39 commercial-industriel ·
25 +> b40 chalets · b41 fermes · b42 immeubles à revenus
26 +> Les pages « /quebec/… _b{cat}k{page}R2.jsa » (toute la province) embarquent
27 +> `var searchResponse = {…}` côté serveur : 20 annonces/page + totalPages.
28 +
29 +## Volumétrie & complétude (BD live)
30 +
31 +| Indicateur | Valeur |
32 +|---|---|
33 +| Annonces en base (toutes) | 4 343 |
34 +| Actives | 4 132 |
35 +| Visibles (après dédup) | 2 720 |
36 +| Masquées par la dédup | 1 412 |
37 +| GPS (lat/lng) | 46.3 % |
38 +| Photos | 99.6 % |
39 +| Prix | 97.8 % |
40 +| CAC (chambres) | 54.3 % |
41 +| SDB (salles de bains) | 15.6 % |
42 +| Année de construction | 57.5 % (dont rôle : 0.0 %) |
43 +| Taxes / évaluation municipale | 8.3 % |
44 +| Estimation Vrai-Prix (rôle) | 69.7 % |
45 +
46 +## Synchronisation
47 +
48 +- **Dernier sync** : 2026-08-18 03:10 — trouvé 4 132, +0 / ~4132 / -0 — OK
49 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
50 +
51 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/m_immobilier.md +53 −0
@@ -0,0 +1,53 @@
1 +# M Immobilier (`m_immobilier`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.mimmobilier.com
8 +- **Recherche** : https://www.mimmobilier.com/properties
9 +- **Couverture** : Grand Montréal — indépendante primée (Leading RE)
10 +- **Type** : luxe
11 +- **Statut** : actif
12 +
13 +> Cartes HTML rendues serveur (/properties, PAS /proprietes). ~65 propriétés à vendre (locations filtrées). Champs: ville, adresse, prix, chambres, sdb, photos Centris, no Centris. Type non exposé.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/m_immobilier.py` — classe `MImmobilierConnector`
18 +- Délai entre requêtes : 0.6 s ; cache détail BD : non
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_M_DETAIL_LIMIT` (défaut 300)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/m_immobilier.py : M Immobilier (mimmobilier.com)
26 +> Agence indépendante de prestige (Grand Montréal), inscriptions Centris.
27 +> La page /properties est rendue serveur : chaque carte « cardProperty »
28 +> porte l'URL (avec no Centris), la ville, l'adresse, chambres, salles de
29 +> bains, prix et les photos (/images/centris-slideshow/{id}-N-*.jpg).
30 +
31 +## Volumétrie & complétude (BD live)
32 +
33 +| Indicateur | Valeur |
34 +|---|---|
35 +| Annonces en base (toutes) | 84 |
36 +| Actives | 67 |
37 +| Visibles (après dédup) | 67 |
38 +| Masquées par la dédup | 0 |
39 +| GPS (lat/lng) | 94.0 % |
40 +| Photos | 100.0 % |
41 +| Prix | 98.5 % |
42 +| CAC (chambres) | 94.0 % |
43 +| SDB (salles de bains) | 94.0 % |
44 +| Année de construction | 85.1 % (dont rôle : 100.0 %) |
45 +| Taxes / évaluation municipale | 0.0 % |
46 +| Estimation Vrai-Prix (rôle) | 98.5 % |
47 +
48 +## Synchronisation
49 +
50 +- **Dernier sync** : 2026-08-18 03:13 — trouvé 66, +0 / ~0 / -0 — OK
51 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
52 +
53 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/niddamour.md +46 −0
@@ -0,0 +1,46 @@
1 +# Nid d'Amour Agence Immobilière (`niddamour`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.niddamour.ca
8 +- **Recherche** : https://www.niddamour.ca/proprietes/
9 +- **Couverture** : Agence indépendante (Québec)
10 +- **Type** : agence
11 +- **Statut** : a_faire
12 +
13 +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). 0 propriétés à vendre. Généré par agences_source_immo.py.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/agences_source_immo.py` — classe `AgenceSINiddamour`
18 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme
25 +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC
26 +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à
27 +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique
28 +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences
29 +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES —
30 +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_).
31 +> EXCEPTION : les équipes/agences dont une partie des inscriptions est
32 +> co-listée avec une bannière couverte (co-inscription Centris) portent un id
33 +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%)
34 +> masque leurs doublons tout en gardant leurs fiches uniques visibles.
35 +> Un connecteur par agence est généré depuis data/source_immo_agencies.json.
36 +
37 +## Volumétrie & complétude (BD live)
38 +
39 +_Aucune annonce en base pour cette source (voir la note du registre : couverture assurée ailleurs ou connecteur inactif)._
40 +
41 +## Synchronisation
42 +
43 +- **Dernier sync** : 2026-08-18 02:27 — trouvé 0, +0 / ~0 / -0 — OK
44 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
45 +
46 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/profusion.md +53 −0
@@ -0,0 +1,53 @@
1 +# Profusion Immobilier (Christie's) (`profusion`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.profusion.global
8 +- **Recherche** : https://www.profusion.global/acheter/nos-inscriptions/
9 +- **Couverture** : Grand Montréal + province — luxe, affiliée Christie's
10 +- **Type** : luxe
11 +- **Statut** : actif
12 +
13 +> WordPress DIVI ; nos-inscriptions liste ~357 fiches /propriete/{no-centris}/ (HTML). Fiche = JSON-LD RealEstateListing (adresse, description, prix, courtier) + galerie profusionimmo.ca. Enrichissement cache+plafond (IMMOKA_PROFUSION_DETAIL_LIMIT).
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/profusion.py` — classe `ProfusionConnector`
18 +- Délai entre requêtes : 0.5 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_PROFUSION_DETAIL_LIMIT` (défaut 500)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/profusion.py : Profusion Immobilier (luxe, affilié Forbes/Christie's)
26 +> Énumération : la page « nos-inscriptions » liste toutes les fiches en HTML
27 +> rendu serveur, sous forme /propriete/{no-centris}/. Chaque fiche publie un
28 +> JSON-LD RealEstateListing (adresse, description, prix, courtier) + un bloc
29 +> de specs « Libellé: valeur » + une galerie profusionimmo.ca.
30 +
31 +## Volumétrie & complétude (BD live)
32 +
33 +| Indicateur | Valeur |
34 +|---|---|
35 +| Annonces en base (toutes) | 363 |
36 +| Actives | 351 |
37 +| Visibles (après dédup) | 351 |
38 +| Masquées par la dédup | 0 |
39 +| GPS (lat/lng) | 66.7 % |
40 +| Photos | 70.7 % |
41 +| Prix | 59.3 % |
42 +| CAC (chambres) | 70.7 % |
43 +| SDB (salles de bains) | 13.1 % |
44 +| Année de construction | 61.5 % (dont rôle : 11.6 %) |
45 +| Taxes / évaluation municipale | 0.0 % |
46 +| Estimation Vrai-Prix (rôle) | 70.7 % |
47 +
48 +## Synchronisation
49 +
50 +- **Dernier sync** : 2026-08-18 03:14 — trouvé 351, +0 / ~0 / -0 — OK
51 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
52 +
53 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/proprio_direct.md +53 −0
@@ -0,0 +1,53 @@
1 +# Proprio Direct (`proprio_direct`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://propriodirect.com
8 +- **Recherche** : https://propriodirect.com/propriete-a-vendre/
9 +- **Couverture** : Toute la province — ~746 courtiers, agence unique (Bridgemarq)
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> Feed DDF (CREA) servi par API JSON interne POST propriodirect.com/fr/api/searchListings (corps {from:offset}, 30/page, champ total). ~3201 propriétés à vendre, données complètes + galeries photos. Hôte canonique sans www.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/proprio_direct.py` — classe `ProprioDirectConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : non
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_PD_DETAIL_LIMIT` (défaut 400)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/proprio_direct.py : Proprio Direct (propriodirect.com)
26 +> L'inventaire (alimenté par le feed DDF de CREA) est servi par une API JSON
27 +> interne : POST https://propriodirect.com/fr/api/searchListings
28 +> Corps { "from": <offset> } ; 30 résultats/page, champ `total`. Chaque item
29 +> contient adresse, ville, région, prix, chambres, sdb, galerie photos et slug.
30 +
31 +## Volumétrie & complétude (BD live)
32 +
33 +| Indicateur | Valeur |
34 +|---|---|
35 +| Annonces en base (toutes) | 2 556 |
36 +| Actives | 2 464 |
37 +| Visibles (après dédup) | 2 464 |
38 +| Masquées par la dédup | 0 |
39 +| GPS (lat/lng) | 100.0 % |
40 +| Photos | 100.0 % |
41 +| Prix | 100.0 % |
42 +| CAC (chambres) | 73.4 % |
43 +| SDB (salles de bains) | 72.6 % |
44 +| Année de construction | 67.5 % (dont rôle : 100.0 %) |
45 +| Taxes / évaluation municipale | 90.3 % |
46 +| Estimation Vrai-Prix (rôle) | 100.0 % |
47 +
48 +## Synchronisation
49 +
50 +- **Dernier sync** : 2026-08-18 03:14 — trouvé 2 464, +0 / ~0 / -3 — OK
51 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
52 +
53 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/realta.md +59 −0
@@ -0,0 +1,59 @@
1 +# Réalta Agence Immobilière (`realta`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.realta.ca
8 +- **Recherche** : https://www.realta.ca/proprietes/
9 +- **Couverture** : Agence indépendante (Québec)
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). 83 propriétés à vendre. Généré par agences_source_immo.py.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/agences_source_immo.py` — classe `AgenceSIRealta`
18 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme
25 +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC
26 +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à
27 +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique
28 +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences
29 +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES —
30 +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_).
31 +> EXCEPTION : les équipes/agences dont une partie des inscriptions est
32 +> co-listée avec une bannière couverte (co-inscription Centris) portent un id
33 +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%)
34 +> masque leurs doublons tout en gardant leurs fiches uniques visibles.
35 +> Un connecteur par agence est généré depuis data/source_immo_agencies.json.
36 +
37 +## Volumétrie & complétude (BD live)
38 +
39 +| Indicateur | Valeur |
40 +|---|---|
41 +| Annonces en base (toutes) | 85 |
42 +| Actives | 82 |
43 +| Visibles (après dédup) | 82 |
44 +| Masquées par la dédup | 0 |
45 +| GPS (lat/lng) | 100.0 % |
46 +| Photos | 100.0 % |
47 +| Prix | 100.0 % |
48 +| CAC (chambres) | 80.5 % |
49 +| SDB (salles de bains) | 78.0 % |
50 +| Année de construction | 80.5 % (dont rôle : 3.0 %) |
51 +| Taxes / évaluation municipale | 95.1 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 +
54 +## Synchronisation
55 +
56 +- **Dernier sync** : 2026-08-18 02:27 — trouvé 82, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 +
59 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/remax_quebec.md +57 −0
@@ -0,0 +1,57 @@
1 +# RE/MAX Québec (`remax_quebec`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.remax-quebec.com
8 +- **Recherche** : https://www.remax-quebec.com/fr/maison-a-vendre
9 +- **Couverture** : Toute la province — ~5 000 courtiers, ~119 agences (bannière #1 au Québec)
10 +- **Type** : franchise
11 +- **Statut** : actif
12 +
13 +## Mécanique (introspection du code)
14 +
15 +- Module : `immoka/connectors/remax_quebec.py` — classe `RemaxQuebecConnector`
16 +- Délai entre requêtes : 0.15 s ; cache détail BD : oui
17 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_REMAX_DETAIL_LIMIT` (défaut 3000)
18 +
19 +**En-tête du module :**
20 +
21 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
22 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
23 +> connectors/remax_quebec.py : RE/MAX Québec (remax-quebec.com)
24 +> Le site interroge un index Meilisearch public (search-only key exposée dans
25 +> la config de la page). L'index « inscriptions » couvre toute la province.
26 +> Meilisearch plafonne à 1000 hits par requête (maxTotalHits) : on shard donc
27 +> par région de tri d'acheminement postale (FSA, 3 premiers caractères) et on
28 +> dédoublonne par numéro d'inscription. Couverture validée vs le total global.
29 +
30 +## Mécanismes clés
31 +
32 +- **Clé Meilisearch auto** : le site expose une clé *search-only* dans sa config publique ; le connecteur interroge directement l'index `inscriptions` (plafond 1 000 hits/requête → shard par FSA G/H/J + dédoublonnage par n° d'inscription, couverture validée vs total global).
33 +- **Cache détail v4** : la fiche détail est mise en cache sous la clé `v4|<prix>` — tableau « Libellé | Valeur » + Détails financiers (taxes municipales/scolaires, évaluations municipales) ; re-téléchargée si le prix change.
34 +
35 +## Volumétrie & complétude (BD live)
36 +
37 +| Indicateur | Valeur |
38 +|---|---|
39 +| Annonces en base (toutes) | 26 702 |
40 +| Actives | 25 486 |
41 +| Visibles (après dédup) | 25 348 |
42 +| Masquées par la dédup | 138 |
43 +| GPS (lat/lng) | 100.0 % |
44 +| Photos | 99.7 % |
45 +| Prix | 83.9 % |
46 +| CAC (chambres) | 79.1 % |
47 +| SDB (salles de bains) | 59.9 % |
48 +| Année de construction | 77.0 % (dont rôle : 99.9 %) |
49 +| Taxes / évaluation municipale | 0.4 % |
50 +| Estimation Vrai-Prix (rôle) | 100.0 % |
51 +
52 +## Synchronisation
53 +
54 +- **Dernier sync** : 2026-08-18 01:45 — trouvé 25 486, +0 / ~60 / -177 — OK
55 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
56 +
57 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/royal_lepage.md +57 −0
@@ -0,0 +1,57 @@
1 +# Royal LePage (Québec) (`royal_lepage`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.royallepage.ca
8 +- **Recherche** : https://www.royallepage.ca/fr/search/homes/1/
9 +- **Couverture** : Toute la province — ~2 233 courtiers, ~47 agences (Bridgemarq)
10 +- **Type** : franchise
11 +- **Statut** : actif
12 +
13 +> Recherche par ville filtrable QC : GET /fr/search/homes/{page}/?search_str=<ville>, QC&prov_code=QC&city_name=<ville>&lat=&lng=&search_type=city -> 100% QC (46/page), classé par proximité, cap ~1250/recherche. Sharding par ~28 points d'ancrage QC + dédup MLS (= n° Centris dans /.../mls{no}/). Requêtes directes (pas de Firecrawl). Champs liste: adresse, ville, type, prix, CAC, SDB, coords (data-rlp-key), photo jumplisting, MLS.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/royal_lepage.py` — classe `RoyalLepageConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_RLP_DETAIL_LIMIT` (défaut 500)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/royal_lepage.py : Royal LePage (royallepage.ca) — Québec
26 +> Le portail rend ses résultats côté serveur, mais /fr/search/homes/{page}/
27 +> sans géo renvoie le Canada entier. La recherche par ville EST filtrable :
28 +> /fr/search/homes/{page}/?search_str=...&prov_code=QC&city_name=...&lat=..&
29 +> lng=..&search_type=city renvoie 100 % de propriétés du Québec, classées par
30 +> proximité (46/page). Chaque recherche plafonne à ~1 250 résultats ; on
31 +> SHARD donc par points d'ancrage répartis dans la province et on dédoublonne
32 +> par numéro MLS (= n° Centris, dans l'URL /.../mls{no}/). Aucune dépendance
33 +> Firecrawl : requêtes directes.
34 +
35 +## Volumétrie & complétude (BD live)
36 +
37 +| Indicateur | Valeur |
38 +|---|---|
39 +| Annonces en base (toutes) | 1 461 |
40 +| Actives | 1 012 |
41 +| Visibles (après dédup) | 1 009 |
42 +| Masquées par la dédup | 3 |
43 +| GPS (lat/lng) | 100.0 % |
44 +| Photos | 99.9 % |
45 +| Prix | 80.4 % |
46 +| CAC (chambres) | 81.8 % |
47 +| SDB (salles de bains) | 81.4 % |
48 +| Année de construction | 85.7 % (dont rôle : 99.4 %) |
49 +| Taxes / évaluation municipale | 0.4 % |
50 +| Estimation Vrai-Prix (rôle) | 100.0 % |
51 +
52 +## Synchronisation
53 +
54 +- **Dernier sync** : 2026-08-18 02:20 — trouvé 1 010, +0 / ~7 / -18 — OK
55 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
56 +
57 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/si_ag_theagency.md +59 −0
@@ -0,0 +1,59 @@
1 +# The Agency Montréal (`si_ag_theagency`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://theagencymontreal.com
8 +- **Recherche** : https://theagencymontreal.com/fr/proprietes
9 +- **Couverture** : Grand Montréal — boutique luxe (indépendant)
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). Généré par agences_source_immo.py. source_id _ag_ = dédup Centris (co-listings luxe avec Sotheby's/E&V).
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/agences_source_immo.py` — classe `AgenceSISiAgTheagency`
18 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/agences_source_immo.py : agences INDÉPENDANTES sur la plateforme
25 +> source.immo (plugin WordPress). Beaucoup de petites/moyennes agences QC
26 +> l'utilisent (liste sur source.immo). Chacune expose sa config publique à
27 +> /wp-content/uploads/_sourceimmo/_configs.json → on lit l'API publique
28 +> api-v1.source.immo (voir SourceImmoConnector). Ce sont des agences
29 +> autonomes : leurs inscriptions (leur propre n° Centris) sont ADDITIVES —
30 +> pas de sous-agence d'une bannière déjà couverte → source_id normal (pas _ag_).
31 +> EXCEPTION : les équipes/agences dont une partie des inscriptions est
32 +> co-listée avec une bannière couverte (co-inscription Centris) portent un id
33 +> « si_ag_<slug> » : la dédup Centris (db.refresh_dedup, sources %_ag_%)
34 +> masque leurs doublons tout en gardant leurs fiches uniques visibles.
35 +> Un connecteur par agence est généré depuis data/source_immo_agencies.json.
36 +
37 +## Volumétrie & complétude (BD live)
38 +
39 +| Indicateur | Valeur |
40 +|---|---|
41 +| Annonces en base (toutes) | 308 |
42 +| Actives | 304 |
43 +| Visibles (après dédup) | 245 |
44 +| Masquées par la dédup | 59 |
45 +| GPS (lat/lng) | 100.0 % |
46 +| Photos | 100.0 % |
47 +| Prix | 100.0 % |
48 +| CAC (chambres) | 77.6 % |
49 +| SDB (salles de bains) | 75.5 % |
50 +| Année de construction | 88.6 % (dont rôle : 6.5 %) |
51 +| Taxes / évaluation municipale | 83.7 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 +
54 +## Synchronisation
55 +
56 +- **Dernier sync** : 2026-08-18 02:27 — trouvé 304, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 4 derniers syncs
58 +
59 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/sothebys_quebec.md +54 −0
@@ -0,0 +1,54 @@
1 +# Sotheby's International Realty Québec (`sothebys_quebec`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://sothebysrealty.ca
8 +- **Recherche** : https://sothebysrealty.ca/en/search-results/province-quebec-real-estate/
9 +- **Couverture** : Toute la province — luxe
10 +- **Type** : luxe
11 +- **Statut** : actif
12 +
13 +> Recherche rendue côté client. Fiches enumérées via pages de résultats (grid public plafonné ~40 fiches province-wide ; pagination AJAX non exposée en URL). Chaque fiche enrichie via son JSON-LD Product : prix, galerie S3 complète (35-75 photos), description, MLS (sku), type. Limite : couverture = set public courant (~40) ; coverage complète nécessiterait l'endpoint AJAX de pagination.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/sothebys_quebec.py` — classe `SothebysQuebecConnector`
18 +- Délai entre requêtes : 1.0 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_SOTHEBYS_DETAIL_LIMIT` (défaut 400)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/sothebys_quebec.py : Sotheby's International Realty Québec
26 +> Recherche rendue côté client : le grid public est plafonné (~40/page) et la
27 +> pagination passe par du JS (pas d'URL). On SHARD donc par région
28 +> administrative du Québec (chaque page « region-{slug}-real-estate » renvoie
29 +> son lot), on dédoublonne par id, puis on enrichit chaque fiche via son
30 +> JSON-LD `Product` (prix, galerie S3 complète, description, n° MLS = sku).
31 +
32 +## Volumétrie & complétude (BD live)
33 +
34 +| Indicateur | Valeur |
35 +|---|---|
36 +| Annonces en base (toutes) | 58 |
37 +| Actives | 42 |
38 +| Visibles (après dédup) | 42 |
39 +| Masquées par la dédup | 0 |
40 +| GPS (lat/lng) | 88.1 % |
41 +| Photos | 100.0 % |
42 +| Prix | 100.0 % |
43 +| CAC (chambres) | 45.2 % |
44 +| SDB (salles de bains) | 14.3 % |
45 +| Année de construction | 71.4 % (dont rôle : 100.0 %) |
46 +| Taxes / évaluation municipale | 0.0 % |
47 +| Estimation Vrai-Prix (rôle) | 100.0 % |
48 +
49 +## Synchronisation
50 +
51 +- **Dernier sync** : 2026-08-18 00:21 — trouvé 40, +2 / ~0 / -0 — OK
52 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
53 +
54 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/sutton.md +50 −0
@@ -0,0 +1,50 @@
1 +# Groupe Sutton Québec (`sutton`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://suttonquebec.com
8 +- **Recherche** : https://suttonquebec.com/maisons-a-vendre.html
9 +- **Couverture** : Toute la province — ~1 300-1 500 courtiers, ~20 agences
10 +- **Type** : franchise
11 +- **Statut** : actif
12 +
13 +## Mécanique (introspection du code)
14 +
15 +- Module : `immoka/connectors/sutton.py` — classe `SuttonConnector`
16 +- Délai entre requêtes : 0.5 s ; cache détail BD : oui
17 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_SUTTON_DETAIL_LIMIT` (défaut 400)
18 +
19 +**En-tête du module :**
20 +
21 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
22 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
23 +> connectors/sutton.py : Groupe Sutton Québec (suttonquebec.com)
24 +> Site rendu serveur : chaque page de résultats publie 10 propriétés en
25 +> JSON-LD schema.org (ItemList), avec prix, chambres, salles de bains,
26 +> superficie et adresse. Les photos suivent le motif immo.vrtx.co/pic450/{id}.
27 +
28 +## Volumétrie & complétude (BD live)
29 +
30 +| Indicateur | Valeur |
31 +|---|---|
32 +| Annonces en base (toutes) | 4 751 |
33 +| Actives | 4 525 |
34 +| Visibles (après dédup) | 4 515 |
35 +| Masquées par la dédup | 10 |
36 +| GPS (lat/lng) | 94.2 % |
37 +| Photos | 69.3 % |
38 +| Prix | 69.3 % |
39 +| CAC (chambres) | 71.4 % |
40 +| SDB (salles de bains) | 68.4 % |
41 +| Année de construction | 65.4 % (dont rôle : 98.6 %) |
42 +| Taxes / évaluation municipale | 68.3 % |
43 +| Estimation Vrai-Prix (rôle) | 100.0 % |
44 +
45 +## Synchronisation
46 +
47 +- **Dernier sync** : 2026-08-18 02:17 — trouvé 4 525, +0 / ~49 / -0 — OK
48 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
49 +
50 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/ubee.md +49 −0
@@ -0,0 +1,49 @@
1 +# Ubee (`ubee`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://ubee.com/carte/a-vendre
8 +- **Statut** : actif
9 +
10 +> Plateforme QC — API anonyme api.ubee.ca SearchProperties (Seller, résidentiel+commercial), galerie complète.
11 +
12 +## Mécanique (introspection du code)
13 +
14 +- Module : `immoka/connectors/ubee.py` — classe `UbeeConnector`
15 +- Délai entre requêtes : 0.5 s ; cache détail BD : oui
16 +
17 +**En-tête du module :**
18 +
19 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
20 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
21 +> connectors/ubee.py : Ubee (ubee.com) — plateforme immobilière québécoise
22 +> API publique anonyme : POST api.ubee.ca/api/anonymous/Search/SearchProperties
23 +> (pageIndex=N, 24 résultats/page, JSON riche : adresse, GPS, prix, pièces,
24 +> superficies m², année, galerie Cloudinary complète).
25 +> Deux volets À VENDRE (listingType=Seller) : résidentiel + commercial.
26 +
27 +## Volumétrie & complétude (BD live)
28 +
29 +| Indicateur | Valeur |
30 +|---|---|
31 +| Annonces en base (toutes) | 1 220 |
32 +| Actives | 1 200 |
33 +| Visibles (après dédup) | 1 176 |
34 +| Masquées par la dédup | 24 |
35 +| GPS (lat/lng) | 100.0 % |
36 +| Photos | 100.0 % |
37 +| Prix | 100.0 % |
38 +| CAC (chambres) | 100.0 % |
39 +| SDB (salles de bains) | 100.0 % |
40 +| Année de construction | 100.0 % (dont rôle : 0.0 %) |
41 +| Taxes / évaluation municipale | 0.0 % |
42 +| Estimation Vrai-Prix (rôle) | 100.0 % |
43 +
44 +## Synchronisation
45 +
46 +- **Dernier sync** : 2026-08-18 00:23 — trouvé 1 200, +0 / ~0 / -2 — OK
47 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
48 +
49 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/vendirect.md +52 −0
@@ -0,0 +1,52 @@
1 +# Vendirect (`vendirect`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://vendirect.ca
8 +- **Recherche** : https://vendirect.ca/proprietes/
9 +- **Couverture** : Toute la province — ~609 courtiers, commission réduite
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> WordPress + plugin source-immo. API publique api-v1.source.immo (en-têtes x-si-account/api/appId depuis _configs.json), pagination next_token. ~64 propriétés à vendre, données complètes (prix, ch., sdb, pi², année, coords, photo).
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/vendirect.py` — classe `VendirectConnector`
18 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
19 +
20 +**En-tête du module :**
21 +
22 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
23 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
24 +> connectors/vendirect.py : Vendirect (vendirect.ca)
25 +> Site WordPress + plugin source-immo. On lit directement l'API publique
26 +> source.immo (voir SourceImmoConnector). Les identifiants proviennent de la
27 +> config publique du site :
28 +> vendirect.ca/wp-content/uploads/_sourceimmo/_configs.json
29 +
30 +## Volumétrie & complétude (BD live)
31 +
32 +| Indicateur | Valeur |
33 +|---|---|
34 +| Annonces en base (toutes) | 1 198 |
35 +| Actives | 1 170 |
36 +| Visibles (après dédup) | 1 170 |
37 +| Masquées par la dédup | 0 |
38 +| GPS (lat/lng) | 97.7 % |
39 +| Photos | 100.0 % |
40 +| Prix | 100.0 % |
41 +| CAC (chambres) | 74.2 % |
42 +| SDB (salles de bains) | 73.7 % |
43 +| Année de construction | 79.4 % (dont rôle : 6.9 %) |
44 +| Taxes / évaluation municipale | 80.3 % |
45 +| Estimation Vrai-Prix (rôle) | 100.0 % |
46 +
47 +## Synchronisation
48 +
49 +- **Dernier sync** : 2026-08-18 00:23 — trouvé 1 168, +3 / ~2 / -2 — OK
50 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
51 +
52 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/via_ag_acces.md +57 −0
@@ -0,0 +1,57 @@
1 +# Via Capitale Acces (`via_ag_acces`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://viacapitaleacces.com
8 +- **Recherche** : https://viacapitaleacces.com/proprietes/
9 +- **Couverture** : Sous-agence Via Capitale (source.immo)
10 +- **Type** : franchise
11 +- **Rôle** : backup
12 +- **Statut** : actif
13 +
14 +## Mécanique (introspection du code)
15 +
16 +- Module : `immoka/connectors/via_capitale_agences.py` — classe `ViaAgAcces`
17 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
18 +
19 +**En-tête du module :**
20 +
21 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
22 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
23 +> connectors/via_capitale_agences.py : Via Capitale par SOUS-AGENCES (robuste)
24 +> Le portail central viacapitalevendu.com est derrière Cloudflare (scrape
25 +> fragile, 1 page). Les sous-agences Via Capitale (Élite, Sélect, du Mont-Royal,
26 +> Accès…) tournent chacune sur la plateforme source.immo (plugin WordPress),
27 +> dont l'API publique (api-v1.source.immo) est stable et paginée — même
28 +> mécanique que Vendirect (voir sourceimmo.py). On génère une classe par
29 +> sous-agence depuis data/via_capitale_agencies.json ; le n° Centris
30 +> (ref_number) sert de clé de déduplication (voir web.py, sources « %_ag_% »).
31 +> La config publique de chaque site est à
32 +> /wp-content/uploads/_sourceimmo/_configs.json (account_id/api_key/app_id +
33 +> default_view). Le registre est régénérable par scripts/refresh_via_capitale.
34 +
35 +## Volumétrie & complétude (BD live)
36 +
37 +| Indicateur | Valeur |
38 +|---|---|
39 +| Annonces en base (toutes) | 186 |
40 +| Actives | 181 |
41 +| Visibles (après dédup) | 31 |
42 +| Masquées par la dédup | 150 |
43 +| GPS (lat/lng) | 100.0 % |
44 +| Photos | 100.0 % |
45 +| Prix | 100.0 % |
46 +| CAC (chambres) | 77.4 % |
47 +| SDB (salles de bains) | 74.2 % |
48 +| Année de construction | 96.8 % (dont rôle : 10.0 %) |
49 +| Taxes / évaluation municipale | 93.5 % |
50 +| Estimation Vrai-Prix (rôle) | 100.0 % |
51 +
52 +## Synchronisation
53 +
54 +- **Dernier sync** : 2026-08-18 00:27 — trouvé 181, +0 / ~0 / -0 — OK
55 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
56 +
57 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/via_ag_dumontroyal.md +29 −0
@@ -0,0 +1,29 @@
1 +# Via Capitale Dumontroyal (`via_ag_dumontroyal`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://viacapitaledumontroyal.com
8 +- **Recherche** : https://viacapitaledumontroyal.com/proprietes/
9 +- **Couverture** : Sous-agence Via Capitale (source.immo)
10 +- **Type** : franchise
11 +- **Rôle** : backup
12 +- **Statut** : inactif
13 +
14 +> Désactivé 2026-08-18 : 0 inscription via l’API source.immo (agence sans inventaire publié). Voir data/via_capitale_agencies.json.
15 +
16 +## Mécanique (introspection du code)
17 +
18 +_Pas de classe connecteur dédiée (voir la note du registre)._
19 +
20 +## Volumétrie & complétude (BD live)
21 +
22 +_Aucune annonce en base pour cette source (voir la note du registre : couverture assurée ailleurs ou connecteur inactif)._
23 +
24 +## Synchronisation
25 +
26 +- **Dernier sync** : 2026-08-18 00:27 — trouvé 0, +0 / ~0 / -0 — OK
27 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
28 +
29 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/via_ag_elite.md +57 −0
@@ -0,0 +1,57 @@
1 +# Via Capitale Elite (`via_ag_elite`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://viacapitaleelite.immo
8 +- **Recherche** : https://viacapitaleelite.immo/proprietes/
9 +- **Couverture** : Sous-agence Via Capitale (source.immo)
10 +- **Type** : franchise
11 +- **Rôle** : backup
12 +- **Statut** : actif
13 +
14 +## Mécanique (introspection du code)
15 +
16 +- Module : `immoka/connectors/via_capitale_agences.py` — classe `ViaAgElite`
17 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
18 +
19 +**En-tête du module :**
20 +
21 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
22 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
23 +> connectors/via_capitale_agences.py : Via Capitale par SOUS-AGENCES (robuste)
24 +> Le portail central viacapitalevendu.com est derrière Cloudflare (scrape
25 +> fragile, 1 page). Les sous-agences Via Capitale (Élite, Sélect, du Mont-Royal,
26 +> Accès…) tournent chacune sur la plateforme source.immo (plugin WordPress),
27 +> dont l'API publique (api-v1.source.immo) est stable et paginée — même
28 +> mécanique que Vendirect (voir sourceimmo.py). On génère une classe par
29 +> sous-agence depuis data/via_capitale_agencies.json ; le n° Centris
30 +> (ref_number) sert de clé de déduplication (voir web.py, sources « %_ag_% »).
31 +> La config publique de chaque site est à
32 +> /wp-content/uploads/_sourceimmo/_configs.json (account_id/api_key/app_id +
33 +> default_view). Le registre est régénérable par scripts/refresh_via_capitale.
34 +
35 +## Volumétrie & complétude (BD live)
36 +
37 +| Indicateur | Valeur |
38 +|---|---|
39 +| Annonces en base (toutes) | 327 |
40 +| Actives | 319 |
41 +| Visibles (après dédup) | 11 |
42 +| Masquées par la dédup | 308 |
43 +| GPS (lat/lng) | 100.0 % |
44 +| Photos | 100.0 % |
45 +| Prix | 100.0 % |
46 +| CAC (chambres) | 63.6 % |
47 +| SDB (salles de bains) | 54.5 % |
48 +| Année de construction | 81.8 % (dont rôle : 22.2 %) |
49 +| Taxes / évaluation municipale | 81.8 % |
50 +| Estimation Vrai-Prix (rôle) | 100.0 % |
51 +
52 +## Synchronisation
53 +
54 +- **Dernier sync** : 2026-08-18 00:28 — trouvé 317, +0 / ~0 / -1 — OK
55 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
56 +
57 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/via_ag_select.md +57 −0
@@ -0,0 +1,57 @@
1 +# Via Capitale Select (`via_ag_select`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://viacapitaleselect.com
8 +- **Recherche** : https://viacapitaleselect.com/proprietes/
9 +- **Couverture** : Sous-agence Via Capitale (source.immo)
10 +- **Type** : franchise
11 +- **Rôle** : backup
12 +- **Statut** : actif
13 +
14 +## Mécanique (introspection du code)
15 +
16 +- Module : `immoka/connectors/via_capitale_agences.py` — classe `ViaAgSelect`
17 +- Délai entre requêtes : 0.25 s ; cache détail BD : non
18 +
19 +**En-tête du module :**
20 +
21 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
22 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
23 +> connectors/via_capitale_agences.py : Via Capitale par SOUS-AGENCES (robuste)
24 +> Le portail central viacapitalevendu.com est derrière Cloudflare (scrape
25 +> fragile, 1 page). Les sous-agences Via Capitale (Élite, Sélect, du Mont-Royal,
26 +> Accès…) tournent chacune sur la plateforme source.immo (plugin WordPress),
27 +> dont l'API publique (api-v1.source.immo) est stable et paginée — même
28 +> mécanique que Vendirect (voir sourceimmo.py). On génère une classe par
29 +> sous-agence depuis data/via_capitale_agencies.json ; le n° Centris
30 +> (ref_number) sert de clé de déduplication (voir web.py, sources « %_ag_% »).
31 +> La config publique de chaque site est à
32 +> /wp-content/uploads/_sourceimmo/_configs.json (account_id/api_key/app_id +
33 +> default_view). Le registre est régénérable par scripts/refresh_via_capitale.
34 +
35 +## Volumétrie & complétude (BD live)
36 +
37 +| Indicateur | Valeur |
38 +|---|---|
39 +| Annonces en base (toutes) | 611 |
40 +| Actives | 580 |
41 +| Visibles (après dédup) | 17 |
42 +| Masquées par la dédup | 563 |
43 +| GPS (lat/lng) | 100.0 % |
44 +| Photos | 100.0 % |
45 +| Prix | 100.0 % |
46 +| CAC (chambres) | 70.6 % |
47 +| SDB (salles de bains) | 70.6 % |
48 +| Année de construction | 100.0 % (dont rôle : 0.0 %) |
49 +| Taxes / évaluation municipale | 94.1 % |
50 +| Estimation Vrai-Prix (rôle) | 100.0 % |
51 +
52 +## Synchronisation
53 +
54 +- **Dernier sync** : 2026-08-18 00:28 — trouvé 580, +3 / ~5 / -8 — OK
55 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
56 +
57 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added docs/connecteurs/via_capitale.md +54 −0
@@ -0,0 +1,54 @@
1 +# Via Capitale (`via_capitale`)
2 +
3 +*Généré le 2026-08-18 03:27 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://www.viacapitalevendu.com
8 +- **Recherche** : https://www.viacapitalevendu.com/recherche/residentiel/
9 +- **Couverture** : Toute la province — ~5 300 propriétés, ~900-1 000 courtiers (québécoise, Bridgemarq)
10 +- **Type** : franchise
11 +- **Statut** : actif
12 +
13 +> ASP.NET rendu serveur derrière Cloudflare : accès via Firecrawl proxy=stealth. Résultats paginés ?page=N (34/page, ~155 pages). Parse: adresse, ville, secteur, région, type, prix, photos (images.viacapitale.info). CAC/SDB non captés à ce stade (icônes).
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/via_capitale.py` — classe `ViaCapitaleConnector`
18 +- Délai entre requêtes : 0.6 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_VIACAP_DETAIL_LIMIT` (défaut 200)
20 +
21 +**En-tête du module :**
22 +
23 +> Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
24 +> Auteur : Simon-Pierre Boucher — contact@spboucher.ai
25 +> connectors/via_capitale.py : Via Capitale (viacapitalevendu.com)
26 +> Bannière 100 % québécoise (Bridgemarq). Le site est rendu serveur (ASP.NET)
27 +> mais protégé par Cloudflare : on passe donc par Firecrawl (get_rendered) qui
28 +> franchit le challenge. Les résultats résidentiels sont paginés (34/page,
29 +> ~5 300 propriétés). On parse les cartes HTML et on dédoublonne par code
30 +> d'inscription. Photos : images.viacapitale.info/images/inscriptions/{id}/…
31 +
32 +## Volumétrie & complétude (BD live)
33 +
34 +| Indicateur | Valeur |
35 +|---|---|
36 +| Annonces en base (toutes) | 5 474 |
37 +| Actives | 5 200 |
38 +| Visibles (après dédup) | 5 153 |
39 +| Masquées par la dédup | 47 |
40 +| GPS (lat/lng) | 97.0 % |
41 +| Photos | 100.0 % |
42 +| Prix | 78.7 % |
43 +| CAC (chambres) | 19.6 % |
44 +| SDB (salles de bains) | 3.6 % |
45 +| Année de construction | 68.9 % (dont rôle : 100.0 %) |
46 +| Taxes / évaluation municipale | 87.1 % |
47 +| Estimation Vrai-Prix (rôle) | 100.0 % |
48 +
49 +## Synchronisation
50 +
51 +- **Dernier sync** : 2026-08-18 00:27 — trouvé 5 200, +0 / ~0 / -61 — OK
52 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
53 +
54 +Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) (budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db).
added scripts/gen_connector_docs.py +427 −0
@@ -0,0 +1,427 @@
1 +#!/usr/bin/env python3
2 +# -----------------------------------------------------------------------------
3 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
4 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
5 +# scripts/gen_connector_docs.py : documentation STANDARDISÉE des connecteurs.
6 +#
7 +# Génère docs/connecteurs/INDEX.md + une fiche par connecteur nommé
8 +# (data/sources.json) + UNE fiche par famille dynamique (remax_ag_*,
9 +# via_ag_*, c21_ag_*, source.immo), en croisant trois sources de vérité :
10 +# 1. les registres JSON : data/sources.json + data/*_agencies.json
11 +# 2. l'introspection code : immoka/connectors/* (registre CONNECTORS,
12 +# en-têtes de modules, budgets env IMMOKA_*_DETAIL_LIMIT, délais)
13 +# 3. la base vivante : data/immoka.db (listings, sync_log)
14 +#
15 +# REJOUABLE : ré-exécuter le script régénère tout docs/connecteurs/.
16 +# Usage : python3 scripts/gen_connector_docs.py
17 +# -----------------------------------------------------------------------------
18 +from __future__ import annotations
19 +
20 +import datetime
21 +import json
22 +import re
23 +import sqlite3
24 +import sys
25 +from pathlib import Path
26 +
27 +ROOT = Path(__file__).resolve().parent.parent
28 +sys.path.insert(0, str(ROOT))
29 +
30 +DATA = ROOT / "data"
31 +OUT = ROOT / "docs" / "connecteurs"
32 +DB = DATA / "immoka.db"
33 +
34 +from immoka.connectors import CONNECTORS # noqa: E402 (auto-découverte)
35 +
36 +NOW = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
37 +GEN_NOTE = ("*Généré le {} par `scripts/gen_connector_docs.py` — fichier "
38 + "produit automatiquement, ne pas éditer à la main.*".format(NOW))
39 +
40 +# --- mécanismes clés à mentionner dans les fiches concernées ------------------
41 +MECANISMES: dict[str, list[str]] = {
42 + "remax_quebec": [
43 + "**Clé Meilisearch auto** : le site expose une clé *search-only* dans sa "
44 + "config publique ; le connecteur interroge directement l'index "
45 + "`inscriptions` (plafond 1 000 hits/requête → shard par FSA G/H/J + "
46 + "dédoublonnage par n° d'inscription, couverture validée vs total global).",
47 + "**Cache détail v4** : la fiche détail est mise en cache sous la clé "
48 + "`v4|<prix>` — tableau « Libellé | Valeur » + Détails financiers "
49 + "(taxes municipales/scolaires, évaluations municipales) ; re-téléchargée "
50 + "si le prix change.",
51 + ],
52 + "barnes_quebec": [
53 + "**Clé Algolia auto-extraite** : App ID / admin key / préfixe d'index "
54 + "lus dans les PHPVars du plugin `barnes-algolia` (wp_localize_script), "
55 + "avec cache et repli sur les derniers identifiants connus — la clé a "
56 + "déjà été rotée (403 le 2026-08-15) et le connecteur s'auto-répare.",
57 + "Algolia ne contient pas les photos : elles sont récupérées sur la "
58 + "fiche détail.",
59 + ],
60 + "remax_ag": [
61 + "**Backup du flux central** : plan B si la clé Meilisearch de "
62 + "remax-quebec.com est rotée/bloquée. Énumération par sitemap "
63 + "(1 requête → tout le parc) sur les plateformes « nos-proprietes » et "
64 + "« centris-other ».",
65 + "**Dédup Centris** : le n° Centris (dans l'URL) sert de clé de "
66 + "déduplication contre le flux central — les doublons sont masqués "
67 + "(`dup_hidden=1`), aucun double-comptage.",
68 + ],
69 +}
70 +
71 +TRANSVERSES = """## Mécanismes transverses (tous connecteurs)
72 +
73 +- **Enrichissements détail budgétés** : chaque connecteur qui visite les pages
74 + détail plafonne le nombre de fiches par exécution via une variable
75 + d'environnement `IMMOKA_*_DETAIL_LIMIT` (défauts dans le tableau des fiches).
76 + Les fiches déjà en cache BD (`detail_cache`) sont réutilisées gratuitement ;
77 + sur plusieurs cycles, tout le parc finit enrichi.
78 +- **Dédup Centris + adresse** (`immoka/db.py`) : les doublons inter-sources
79 + (même n° Centris via les sous-agences, ou même adresse normalisée) sont
80 + marqués `dup_hidden=1` — {dup_total} annonces masquées actuellement — et la
81 + lecture filtre en `AND dup_hidden=0`.
82 +- **Jointure rôle d'évaluation** (`immoka/vraiprix_local.py`) : appariement
83 + local FTS par adresse contre `data/vraiprix.db` (3,7 M unités d'évaluation).
84 + Remplit lat/lng manquants, l'estimation Vrai-Prix (P10-P90 + lien) et les
85 + champs du rôle (année de construction, superficies, évaluations). Impact :
86 + **year_built rempli à {yb_pct:.0f} %** des annonces visibles, dont
87 + {yb_role_pct:.0f} % proviennent du rôle (`year_built_source: role`).
88 +- **Historique — vagues du 2026-08-18** :
89 + - `7911d58` Vague 1 : clé Algolia auto-extraite (Barnes), taxes/éval RE/MAX
90 + (cache détail v4), specs Via Capitale, Kijiji étendu.
91 + - `e9bc9d7` Vague 2 : jointure au rôle d'évaluation, fiches
92 + Sutton/Royal LePage/LesPAC enrichies, days_on_market, dédup par adresse.
93 +"""
94 +
95 +
96 +# --- helpers ------------------------------------------------------------------
97 +def module_header(path: Path) -> str:
98 + """Bloc de commentaires d'en-tête (#) ou docstring d'un module."""
99 + try:
100 + text = path.read_text(encoding="utf-8")
101 + except OSError:
102 + return ""
103 + lines = []
104 + for line in text.splitlines():
105 + if line.startswith("#!"):
106 + continue
107 + if line.startswith("#"):
108 + s = line.lstrip("#").rstrip()
109 + if s.startswith(" "):
110 + s = s[1:]
111 + if set(s) <= {"-", " "}:
112 + continue
113 + lines.append(s)
114 + elif lines:
115 + break
116 + elif line.strip():
117 + break
118 + if not lines:
119 + m = re.match(r'\s*(?:"""|\'\'\')(.*?)(?:"""|\'\'\')', text, re.S)
120 + if m:
121 + lines = [ln.rstrip() for ln in m.group(1).strip().splitlines()]
122 + return "\n".join("> " + (ln or "") for ln in lines)
123 +
124 +
125 +def env_budgets(path: Path) -> list[tuple[str, str]]:
126 + try:
127 + src = path.read_text(encoding="utf-8")
128 + except OSError:
129 + return []
130 + return re.findall(r'os\.environ\.get\(\s*"(IMMOKA_[A-Z0-9_]+)"\s*,\s*"([^"]*)"', src)
131 +
132 +
133 +def fmt_ts(ts) -> str:
134 + if not ts:
135 + return "—"
136 + return datetime.datetime.fromtimestamp(ts).strftime("%Y-%m-%d %H:%M")
137 +
138 +
139 +def pct(part, whole) -> str:
140 + if not whole:
141 + return "—"
142 + return f"{100.0 * (part or 0) / whole:.1f} %"
143 +
144 +
145 +def nfr(n) -> str:
146 + return f"{n:,}".replace(",", " ") if isinstance(n, int) else str(n)
147 +
148 +
149 +# --- collecte BD ----------------------------------------------------------------
150 +def db_stats() -> tuple[dict, dict]:
151 + con = sqlite3.connect(f"file:{DB}?mode=ro", uri=True)
152 + con.row_factory = sqlite3.Row
153 + V = "active=1 AND dup_hidden=0"
154 + rows = con.execute(f"""
155 + SELECT source,
156 + COUNT(*) AS total,
157 + SUM(active=1) AS actives,
158 + SUM({V}) AS vis,
159 + SUM(active=1 AND dup_hidden=1) AS dups,
160 + SUM({V} AND lat IS NOT NULL AND lng IS NOT NULL) AS gps,
161 + SUM({V} AND images IS NOT NULL AND images NOT IN ('','[]')) AS photos,
162 + SUM({V} AND price IS NOT NULL) AS prix,
163 + SUM({V} AND bedrooms IS NOT NULL) AS cac,
164 + SUM({V} AND bathrooms IS NOT NULL) AS sdb,
165 + SUM({V} AND year_built IS NOT NULL) AS annee,
166 + SUM({V} AND details LIKE '%year_built_source%') AS annee_role,
167 + SUM({V} AND (details LIKE '%Taxes municipales%'
168 + OR details LIKE '%Taxes scolaires%'
169 + OR details LIKE '%valuation municipale%')) AS taxes,
170 + SUM({V} AND vraiprix IS NOT NULL) AS vp
171 + FROM listings GROUP BY source""").fetchall()
172 + stats = {r["source"]: dict(r) for r in rows}
173 +
174 + syncs: dict[str, list] = {}
175 + for r in con.execute("SELECT source, ts, found, added, updated, removed,"
176 + " ok, message FROM sync_log ORDER BY ts"):
177 + syncs.setdefault(r["source"], []).append(dict(r))
178 + con.close()
179 + return stats, syncs
180 +
181 +
182 +def agg(stats: dict, ids: list[str]) -> dict:
183 + keys = ("total", "actives", "vis", "dups", "gps", "photos", "prix", "cac",
184 + "sdb", "annee", "annee_role", "taxes", "vp")
185 + out = {k: 0 for k in keys}
186 + for i in ids:
187 + s = stats.get(i)
188 + if s:
189 + for k in keys:
190 + out[k] += s[k] or 0
191 + return out
192 +
193 +
194 +def completude_md(s: dict) -> str:
195 + v = s["vis"] or 0
196 + rows = [
197 + ("Annonces en base (toutes)", nfr(s["total"])),
198 + ("Actives", nfr(s["actives"] or 0)),
199 + ("Visibles (après dédup)", nfr(v)),
200 + ("Masquées par la dédup", nfr(s["dups"] or 0)),
201 + ("GPS (lat/lng)", pct(s["gps"], v)),
202 + ("Photos", pct(s["photos"], v)),
203 + ("Prix", pct(s["prix"], v)),
204 + ("CAC (chambres)", pct(s["cac"], v)),
205 + ("SDB (salles de bains)", pct(s["sdb"], v)),
206 + ("Année de construction", pct(s["annee"], v)
207 + + (f" (dont rôle : {pct(s['annee_role'], s['annee'])})" if s["annee"] else "")),
208 + ("Taxes / évaluation municipale", pct(s["taxes"], v)),
209 + ("Estimation Vrai-Prix (rôle)", pct(s["vp"], v)),
210 + ]
211 + md = "| Indicateur | Valeur |\n|---|---|\n"
212 + md += "\n".join(f"| {k} | {val} |" for k, val in rows)
213 + return md
214 +
215 +
216 +def sync_md(syncs: dict, sid: str) -> str:
217 + hist = syncs.get(sid) or []
218 + if not hist:
219 + return "Aucune entrée `sync_log` pour cette source."
220 + last = hist[-1]
221 + recent = hist[-10:]
222 + errs = [h for h in recent if not h["ok"]]
223 + md = (f"- **Dernier sync** : {fmt_ts(last['ts'])} — trouvé {nfr(last['found'] or 0)}, "
224 + f"+{last['added'] or 0} / ~{last['updated'] or 0} / -{last['removed'] or 0} — "
225 + f"{'OK' if last['ok'] else 'ÉCHEC'}"
226 + + (f" ({last['message']})" if last["message"] and last["message"] != "ok" else ""))
227 + md += f"\n- **Erreurs récentes** : {len(errs)} sur les {len(recent)} derniers syncs"
228 + if errs:
229 + e = errs[-1]
230 + md += f" — dernière : {fmt_ts(e['ts'])} « {e['message']} »"
231 + return md
232 +
233 +
234 +def mecanique_md(cls) -> str:
235 + if cls is None:
236 + return "_Pas de classe connecteur dédiée (voir la note du registre)._"
237 + mod = sys.modules[cls.__module__]
238 + path = Path(mod.__file__)
239 + md = f"- Module : `immoka/connectors/{path.name}` — classe `{cls.__name__}`\n"
240 + md += f"- Délai entre requêtes : {getattr(cls, 'request_delay', '—')} s ; "
241 + md += ("cache détail BD : oui" if getattr(cls, "use_detail_cache", False)
242 + else "cache détail BD : non")
243 + budgets = env_budgets(path)
244 + if budgets:
245 + md += "\n- Budgets env (enrichissement détail plafonné/exécution) : "
246 + md += ", ".join(f"`{k}` (défaut {v})" for k, v in budgets)
247 + hdr = module_header(path)
248 + if hdr:
249 + md += "\n\n**En-tête du module :**\n\n" + hdr
250 + return md
251 +
252 +
253 +# --- familles dynamiques ---------------------------------------------------------
254 +FAMILLES = [
255 + dict(slug="famille-remax-ag", prefix="remax_ag_", registry="remax_agencies.json",
256 + module="remax_agences",
257 + titre="Famille RE/MAX sous-agences (`remax_ag_*`)",
258 + desc="Un connecteur par sous-agence RE/MAX (sites propres, indépendants du "
259 + "portail central), généré dynamiquement depuis `data/remax_agencies.json`."),
260 + dict(slug="famille-via-ag", prefix="via_ag_", registry="via_capitale_agencies.json",
261 + module="via_capitale_agences",
262 + titre="Famille Via Capitale agences (`via_ag_*`)",
263 + desc="Connecteurs par bannière Via Capitale, générés depuis "
264 + "`data/via_capitale_agencies.json` (comptes API source.immo par agence)."),
265 + dict(slug="famille-c21-ag", prefix="c21_ag_", registry="century21_agencies.json",
266 + module="century21_agences",
267 + titre="Famille Century 21 (`c21_ag_*`)",
268 + desc="Connecteurs par compte Century 21, générés depuis "
269 + "`data/century21_agencies.json` (plateforme source.immo)."),
270 + dict(slug="famille-source-immo", prefix=None, registry="source_immo_agencies.json",
271 + module="agences_source_immo",
272 + titre="Famille source.immo (agences indépendantes)",
273 + desc="Agences indépendantes servies par la plateforme source.immo "
274 + "(comptes/API dans `data/source_immo_agencies.json`)."),
275 +]
276 +
277 +
278 +def famille_members(fam: dict) -> list[str]:
279 + """source_ids des membres instanciés (registre CONNECTORS)."""
280 + return sorted(sid for sid, cls in CONNECTORS.items()
281 + if cls.__module__.endswith("." + fam["module"]))
282 +
283 +
284 +def write_famille(fam: dict, stats: dict, syncs: dict, named_ids: set) -> None:
285 + members = famille_members(fam)
286 + reg_path = DATA / fam["registry"]
287 + registry = json.loads(reg_path.read_text(encoding="utf-8"))
288 + mod_path = ROOT / "immoka" / "connectors" / (fam["module"] + ".py")
289 +
290 + md = [f"# {fam['titre']}", "", GEN_NOTE, "", fam["desc"], ""]
291 + md += [f"- Registre : `data/{fam['registry']}` — **{len(registry)} entrées**",
292 + f"- Connecteurs instanciés : **{len(members)}**",
293 + f"- Module : `immoka/connectors/{fam['module']}.py`", ""]
294 + hdr = module_header(mod_path)
295 + if hdr:
296 + md += ["**En-tête du module :**", "", hdr, ""]
297 + for key, notes in MECANISMES.items():
298 + if fam["slug"].startswith("famille-remax") and key == "remax_ag":
299 + md += ["## Mécanismes clés", ""]
300 + md += [f"- {n}" for n in notes] + [""]
301 + budgets = env_budgets(mod_path)
302 + if budgets:
303 + md += ["Budgets env : " + ", ".join(f"`{k}` (défaut {v})" for k, v in budgets), ""]
304 +
305 + md += ["## Membres et statuts", "",
306 + "| source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK |",
307 + "|---|---|---|---|---|---|---|---|"]
308 + for sid in members:
309 + cls = CONNECTORS[sid]
310 + s = stats.get(sid) or {}
311 + hist = syncs.get(sid) or []
312 + last = hist[-1] if hist else None
313 + dom = getattr(cls, "domain", "") or getattr(cls, "site", "") or "—"
314 + plat = getattr(cls, "platform", "") or "source.immo"
315 + link = f"[`{sid}`]({sid}.md)" if sid in named_ids else f"`{sid}`"
316 + md.append("| {} | {} | {} | {} | {} | {} | {} | {} |".format(
317 + link, dom, plat, nfr(s.get("vis", 0) or 0), nfr(s.get("actives", 0) or 0),
318 + nfr(s.get("dups", 0) or 0), fmt_ts(last["ts"]) if last else "—",
319 + ("✅" if last["ok"] else "❌") if last else "—"))
320 + # entrées de registre sans classe instanciée
321 + inst_doms = {getattr(CONNECTORS[sid], "domain", "").replace("https://", "")
322 + .replace("http://", "").strip("/") for sid in members}
323 + orphans = []
324 + for entry in registry:
325 + dom = (entry.get("domain") or "").replace("https://", "").replace("http://", "").strip("/")
326 + if dom and dom not in inst_doms and ("www." + dom) not in inst_doms \
327 + and dom.removeprefix("www.") not in {d.removeprefix("www.") for d in inst_doms}:
328 + orphans.append(dom)
329 + if orphans:
330 + md += ["", f"Entrées du registre sans connecteur instancié ({len(orphans)}) : "
331 + + ", ".join(f"`{d}`" for d in orphans)]
332 +
333 + a = agg(stats, members)
334 + md += ["", "## Volumétrie & complétude agrégées (famille, BD live)", "",
335 + completude_md(a), ""]
336 + (OUT / f"{fam['slug']}.md").write_text("\n".join(md) + "\n", encoding="utf-8")
337 +
338 +
339 +# --- fiches nommées ---------------------------------------------------------------
340 +def write_named(entry: dict, stats: dict, syncs: dict) -> None:
341 + sid = entry["id"]
342 + cls = CONNECTORS.get(entry.get("connector") or sid) or CONNECTORS.get(sid)
343 + md = [f"# {entry.get('name', sid)} (`{sid}`)", "", GEN_NOTE, "",
344 + "## Registre (`data/sources.json`)", ""]
345 + for k, label in (("url", "Site"), ("listing_url", "Recherche"),
346 + ("coverage", "Couverture"), ("type", "Type"),
347 + ("platform", "Plateforme"), ("role", "Rôle"),
348 + ("status", "Statut")):
349 + if entry.get(k):
350 + md.append(f"- **{label}** : {entry[k]}")
351 + note = entry.get("note") or entry.get("notes")
352 + if note:
353 + md += ["", f"> {note}"]
354 + md += ["", "## Mécanique (introspection du code)", "", mecanique_md(cls), ""]
355 + if sid in MECANISMES or (entry.get("connector") or "") in MECANISMES:
356 + md += ["## Mécanismes clés", ""]
357 + md += [f"- {n}" for n in MECANISMES.get(sid) or MECANISMES[entry["connector"]]]
358 + md += [""]
359 + s = stats.get(sid)
360 + md += ["## Volumétrie & complétude (BD live)", ""]
361 + if s:
362 + md += [completude_md(s), ""]
363 + else:
364 + md += ["_Aucune annonce en base pour cette source (voir la note du "
365 + "registre : couverture assurée ailleurs ou connecteur inactif)._", ""]
366 + md += ["## Synchronisation", "", sync_md(syncs, sid), "",
367 + "Voir aussi les [mécanismes transverses](INDEX.md#mécanismes-transverses-tous-connecteurs) "
368 + "(budgets détail, dédup Centris+adresse, jointure rôle vraiprix.db)."]
369 + (OUT / f"{sid}.md").write_text("\n".join(md) + "\n", encoding="utf-8")
370 +
371 +
372 +# --- INDEX ------------------------------------------------------------------------
373 +def write_index(sources: list, stats: dict, syncs: dict) -> None:
374 + tot = agg(stats, list(stats.keys()))
375 + md = ["# Immo-Ka — Connecteurs (documentation standardisée)", "", GEN_NOTE, "",
376 + f"**{len(CONNECTORS)} connecteurs** enregistrés (auto-découverte "
377 + f"`immoka/connectors/__init__.py`) : {len(sources)} connecteurs nommés "
378 + f"(`data/sources.json`) + 4 familles dynamiques (RE/MAX sous-agences, "
379 + f"Via Capitale, Century 21, source.immo).", "",
380 + f"Base vivante `data/immoka.db` : {nfr(tot['total'])} annonces, "
381 + f"{nfr(tot['actives'])} actives, {nfr(tot['vis'])} visibles après dédup "
382 + f"({nfr(tot['dups'])} masquées).", "",
383 + TRANSVERSES.format(dup_total=nfr(tot["dups"]),
384 + yb_pct=100.0 * tot["annee"] / max(tot["vis"], 1),
385 + yb_role_pct=100.0 * tot["annee_role"] / max(tot["annee"], 1)),
386 + "## Familles dynamiques", "",
387 + "| Famille | Fiche | Membres | Visibles |", "|---|---|---|---|"]
388 + for fam in FAMILLES:
389 + members = famille_members(fam)
390 + a = agg(stats, members)
391 + md.append(f"| {fam['titre'].split('(')[0].strip()} | "
392 + f"[{fam['slug']}]({fam['slug']}.md) | {len(members)} | {nfr(a['vis'])} |")
393 + md += ["", "## Connecteurs nommés", "",
394 + "| id | Nom | Type | Statut | Visibles | Année (dont rôle) | Dernier sync | OK |",
395 + "|---|---|---|---|---|---|---|---|"]
396 + for e in sorted(sources, key=lambda x: -(stats.get(x["id"], {}).get("vis") or 0)):
397 + sid = e["id"]
398 + s = stats.get(sid) or {}
399 + hist = syncs.get(sid) or []
400 + last = hist[-1] if hist else None
401 + annee = pct(s.get("annee"), s.get("vis")) if s else "—"
402 + md.append("| [`{}`]({}.md) | {} | {} | {} | {} | {} | {} | {} |".format(
403 + sid, sid, e.get("name", ""), e.get("type", "—"), e.get("status", "—"),
404 + nfr(s.get("vis", 0) or 0), annee,
405 + fmt_ts(last["ts"]) if last else "—",
406 + ("✅" if last["ok"] else "❌") if last else "—"))
407 + (OUT / "INDEX.md").write_text("\n".join(md) + "\n", encoding="utf-8")
408 +
409 +
410 +def main() -> None:
411 + OUT.mkdir(parents=True, exist_ok=True)
412 + for old in OUT.glob("*.md"):
413 + old.unlink()
414 + sources = json.loads((DATA / "sources.json").read_text(encoding="utf-8"))["sources"]
415 + stats, syncs = db_stats()
416 + named_ids = {e["id"] for e in sources}
417 + for e in sources:
418 + write_named(e, stats, syncs)
419 + for fam in FAMILLES:
420 + write_famille(fam, stats, syncs, named_ids)
421 + write_index(sources, stats, syncs)
422 + print(f"[gen_connector_docs] {len(sources)} fiches nommées + {len(FAMILLES)} "
423 + f"familles + INDEX → {OUT}")
424 +
425 +
426 +if __name__ == "__main__":
427 + main()
428