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%

connecteurs : fb_marketplace (acteur Apify ka-fb-immo), PMML, Stuart, Duque Simms + registre

- fb_marketplace : acteur maison gorgeous_thistle/ka-fb-immo (scraping public
  déconnecté, proxy Oxylabs CA), re-vérification tournante des actives,
  throttle 3 h par replay BD — 762 fiches, 597 publiées au premier run
- pmml : API JSON interne /api/proprietes/avendre (485 en vente, 388 publiées,
  GPS + courtier) — plus grande agence commerciale/multi indépendante du QC
- stuart : plateforme Ma Clé, JSON-LD mc:* très riche — 54/54 publiées
- duquesimms : sitemap + JSON-LD proprius/e-mmobilier, GPS — 18/18 publiées
- tremblantrealestate.ca écrit puis RETIRÉ : 159/159 fiches déjà couvertes
  première main par domicilia (documenté au registre pour ne pas refaire)
- sources.json : +8 entrées (3 actives, MTRE inactif documenté, 4 prospects
  a_faire : vistoo, deakin, versants, annuaire RCIIQ) ; docs régénérées

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Simon-Pierre Boucher committed 1 mo ago (Aug 23, 2026) parent 8242d21

72 changed files +2,101 −602

modified data/sources.json +133 −1
@@ -295,7 +295,7 @@
295 295 "connector": "niddamour",
296 296 "status": "a_faire",
297 297 "type": "agence",
298 − "note": "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."
298 + "note": "Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). Inventaire = locations seulement (20 fiches lease/rent, 0 à vendre — vérifié 2026-08-23) ; le connecteur sale-only retourne 0. Généré par agences_source_immo.py."
299 299 },
300 300 {
301 301 "id": "kw_prestige",
@@ -333,6 +333,17 @@
333 333 "status": "actif",
334 334 "notes": "Petites annonces QC — immobilier achat-vente b37/b38/b39/b40/b41/b42 (pas location ni entreprises), searchResponse embarqué."
335 335 },
336 + {
337 + "id": "fb_marketplace",
338 + "name": "Facebook Marketplace",
339 + "url": "https://www.facebook.com/marketplace",
340 + "listing_url": "https://www.facebook.com/marketplace/quebec/propertyforsale",
341 + "coverage": "Toute la province — 33 villes (rayon ~65 km) × tranches de prix",
342 + "connector": "fb_marketplace",
343 + "status": "actif",
344 + "type": "petites annonces",
345 + "note": "Acteur Apify maison gorgeous_thistle/ka-fb-immo (jumeau vente de ka-fb-marketplace de Lou-Ka) : scraping public déconnecté du JSON préchargé, proxy résidentiel Oxylabs CA. Re-vérification tournante des fiches actives (flux trié par création). Run Apify max aux 3 h (replay BD entre). Loi 25 : vendeur non extrait."
346 + },
336 347 {
337 348 "id": "ubee",
338 349 "name": "Ubee",
@@ -537,6 +548,127 @@
537 548 "status": "actif",
538 549 "type": "équipe",
539 550 "note": "Plateforme source.immo. ~30 fiches à vendre (2026-08-18). Équipe co-listée (remax_ag_lespace couvert) → si_ag_ (dédup Centris). Généré par agences_source_immo.py."
551 + },
552 + {
553 + "id": "vendre_ag_ca",
554 + "name": "Vendre.ca",
555 + "url": "https://vendre.ca",
556 + "listing_url": "https://vendre.ca/fr",
557 + "coverage": "Tout le Québec — portail hybride courtiers + vendeurs privés (~9 500 fiches)",
558 + "connector": "vendre_ca",
559 + "status": "actif",
560 + "type": "portail",
561 + "note": "Énumération exhaustive via 4 sitemaps de catégorie (res/mpx/com/lnd) ; fiche = JSON-LD (adresse, géoloc, MLS, courtier). source_id _ag_ = dédup Centris : fiches de courtiers couverts masquées, vendeurs privés (VID) toujours visibles."
562 + },
563 + {
564 + "id": "publimaison_ag_qc",
565 + "name": "Publimaison.ca",
566 + "url": "https://www.publimaison.ca",
567 + "listing_url": "https://www.publimaison.ca/fr/recherche/",
568 + "coverage": "Tout le Québec — 2e plateforme FSBO (~5 400 annonces, transferts Centris acceptés)",
569 + "connector": "publimaison",
570 + "status": "actif",
571 + "type": "fsbo",
572 + "note": "Recherche SSR par pseudo-hash d'URL (8 cartes/page) ; détail HTML (galerie, code postal, taxes) via cache. source_id _ag_ = dédup Centris sur les transferts de courtiers ; annonces de particuliers toujours visibles."
573 + },
574 + {
575 + "id": "logis_ag_quebec",
576 + "name": "LogisQuébec (à vendre)",
577 + "url": "https://www.logisquebec.com",
578 + "listing_url": "https://www.logisquebec.com/a-vendre/",
579 + "coverage": "Tout le Québec — section vente du portail (~4 200 propriétés, particuliers + agences)",
580 + "connector": "logisquebec",
581 + "status": "actif",
582 + "type": "portail",
583 + "note": "Pagination SSR /a-vendre/{page} (10 cartes/page) ; détail JSON-LD (adresse, géoloc, MLS). source_id _ag_ = dédup Centris : annonces d'agences couvertes masquées, particuliers (vNNNNNN) visibles."
584 + },
585 + {
586 + "id": "pmml",
587 + "name": "PMML",
588 + "url": "https://pmml.ca",
589 + "listing_url": "https://pmml.ca/proprietes-a-vendre/",
590 + "coverage": "Toute la province — LA grande agence commerciale/multilogements indépendante (~485 inscriptions vente : plex, multis, terrains, industriel, bureaux)",
591 + "connector": "pmml",
592 + "status": "actif",
593 + "type": "agence",
594 + "note": "SPA Svelte derrière Cloudflare mais API JSON interne ouverte (GET /api/proprietes/avendre?limit=1000 = tout l'inventaire en un appel, GPS + courtier inclus). Chaîne anti-bot BaseConnector pour le 403. Pas de description dans le flux → caractéristiques synthétiques. IDs internes (pas de n° Centris) → pas d'infixe _ag_."
595 + },
596 + {
597 + "id": "stuart",
598 + "name": "Les Immeubles Stuart",
599 + "url": "https://immeublesstuart.ca",
600 + "listing_url": "https://immeublesstuart.ca/proprietes/",
601 + "coverage": "Rive-Sud de Montréal (Saint-Lambert, Brossard, Longueuil…) — ~54 inscriptions vente",
602 + "connector": "immeubles_stuart",
603 + "status": "actif",
604 + "type": "agence",
605 + "note": "Plateforme « Ma Clé » (photos S3 maclebrokers) : liste SSR une page + JSON-LD RealEstateListing très riche (extensions mc:* — caractéristiques, taxes, évaluations, agent). N° Centris exposés mais agence première main → pas d'infixe _ag_ (ses fiches battent les copies portails)."
606 + },
607 + {
608 + "id": "duquesimms",
609 + "name": "Duque Simms",
610 + "url": "https://duquesimms.com",
611 + "listing_url": "https://duquesimms.com/nos-proprietes/",
612 + "coverage": "Montréal (NDG, Côte-des-Neiges, Ouest-de-l'Île) — ~20 inscriptions vente",
613 + "connector": "duquesimms",
614 + "status": "actif",
615 + "type": "agence",
616 + "note": "WordPress/Elementor sur plateforme proprius/e-mmobilier. Découverte par property-sitemap.xml (URLs fr /property/{Centris}/), tout vient de la fiche (JSON-LD + blocs property-characteristic/expense/evaluation, GPS inclus). Locations écartées par seuil de prix. Première main → pas d'infixe _ag_."
617 + },
618 + {
619 + "id": "imt_tremblant",
620 + "name": "Les Immeubles Mont-Tremblant (MTRE)",
621 + "url": "https://www.tremblantrealestate.ca",
622 + "listing_url": "https://www.tremblantrealestate.ca/page/proprietes",
623 + "coverage": "Laurentides (Mont-Tremblant et environs) — ~159 inscriptions",
624 + "connector": "",
625 + "status": "inactif",
626 + "type": "agence",
627 + "note": "Connecteur écrit puis RETIRÉ le 2026-08-23 : les 159 fiches (n° Centris, photos cdn.propriodirect.com) sont TOUTES déjà couvertes première main par domicilia (157 publiées) — redondance pure, la dédup Centris masquait 159/159. Ne pas refaire."
628 + },
629 + {
630 + "id": "vistoo",
631 + "name": "Vistoo",
632 + "url": "https://vistoo.com",
633 + "listing_url": "https://vistoo.com/fr/achat-vente",
634 + "coverage": "Portail pancanadien (QC minoritaire)",
635 + "connector": "",
636 + "status": "a_faire",
637 + "type": "portail",
638 + "note": "Sondé 2026-08-23 : le sitemap fr/achat-vente ne liste que des pages catégories/villes (incl. Alberta/Ontario), pas de fiches — il faudrait cracker leur API de recherche. Dépriorisé."
639 + },
640 + {
641 + "id": "deakin",
642 + "name": "Immeubles Deakin Realties",
643 + "url": "https://deakinrealties.com",
644 + "listing_url": "https://deakinrealties.com/proprietes/",
645 + "coverage": "Ouest-de-l'Île de Montréal (Beaconsfield, Pointe-Claire…)",
646 + "connector": "",
647 + "status": "a_faire",
648 + "type": "agence",
649 + "note": "Sondé 2026-08-23 : liste SSR custom sans JSON-LD ni plateforme connue — parsing HTML maison à écrire, inventaire modeste. Dépriorisé au profit de PMML/Stuart/Duque."
650 + },
651 + {
652 + "id": "versants",
653 + "name": "Les Versants Mont-Tremblant",
654 + "url": "https://lesversants.com",
655 + "listing_url": "https://lesversants.com/recherche-de-propriete/",
656 + "coverage": "Mont-Tremblant et Laurentides",
657 + "connector": "",
658 + "status": "a_faire",
659 + "type": "agence",
660 + "note": "Sondé 2026-08-23 : page recherche lourde (500 Ko) sans JSON-LD. ⚠️ Vérifier d'abord le recoupement Centris avec domicilia/vendre_ag_ca (même leçon que MTRE : probablement redondant)."
661 + },
662 + {
663 + "id": "rciiq",
664 + "name": "Annuaire RCIIQ (courtiers indépendants)",
665 + "url": "https://rciiq.ca",
666 + "listing_url": "https://rciiq.ca",
667 + "coverage": "Regroupement des courtiers immobiliers indépendants du Québec",
668 + "connector": "",
669 + "status": "a_faire",
670 + "type": "annuaire",
671 + "note": "Pas une source d'annonces : annuaire à prospecter pour découvrir de futures agences indépendantes (campagne connecteurs 2026-08-23)."
540 672 }
541 673 ]
542 674 }
modified docs/connecteurs/INDEX.md +68 −56
@@ -1,10 +1,10 @@
1 1 # Immo-Ka — Connecteurs (documentation standardisée)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 −**101 connecteurs** enregistrés (auto-découverte `immoka/connectors/__init__.py`) : 50 connecteurs nommés (`data/sources.json`) + 4 familles dynamiques (RE/MAX sous-agences, Via Capitale, Century 21, source.immo).
5 +**105 connecteurs** enregistrés (auto-découverte `immoka/connectors/__init__.py`) : 62 connecteurs nommés (`data/sources.json`) + 4 familles dynamiques (RE/MAX sous-agences, Via Capitale, Century 21, source.immo).
6 6
7 −Base vivante `data/immoka.db` : 147 488 annonces, 131 312 actives, 79 953 visibles après dédup (51 359 masquées).
7 +Base vivante `data/immoka.db` : 157 085 annonces, 129 952 actives, 80 765 visibles après dédup (49 187 masquées).
8 8
9 9 ## Mécanismes transverses (tous connecteurs)
10 10
@@ -15,14 +15,14 @@ Base vivante `data/immoka.db` : 147 488 annonces, 131 312 actives, 79 953 visibl
15 15 sur plusieurs cycles, tout le parc finit enrichi.
16 16 - **Dédup Centris + adresse** (`immoka/db.py`) : les doublons inter-sources
17 17 (même n° Centris via les sous-agences, ou même adresse normalisée) sont
18 − marqués `dup_hidden=1` — 51 359 annonces masquées actuellement — et la
18 + marqués `dup_hidden=1` — 49 187 annonces masquées actuellement — et la
19 19 lecture filtre en `AND dup_hidden=0`.
20 20 - **Jointure rôle d'évaluation** (`immoka/vraiprix_local.py`) : appariement
21 21 local FTS par adresse contre `data/vraiprix.db` (3,7 M unités d'évaluation).
22 22 Remplit lat/lng manquants, l'estimation Vrai-Prix (P10-P90 + lien) et les
23 23 champs du rôle (année de construction, superficies, évaluations). Impact :
24 24 **year_built rempli à 71 %** des annonces visibles, dont
25 − 18 % proviennent du rôle (`year_built_source: role`).
25 + 6 % proviennent du rôle (`year_built_source: role`).
26 26 - **Historique — vagues du 2026-08-18** :
27 27 - `7911d58` Vague 1 : clé Algolia auto-extraite (Barnes), taxes/éval RE/MAX
28 28 (cache détail v4), specs Via Capitale, Kijiji étendu.
@@ -33,62 +33,74 @@ Base vivante `data/immoka.db` : 147 488 annonces, 131 312 actives, 79 953 visibl
33 33
34 34 | Famille | Fiche | Membres | Visibles |
35 35 |---|---|---|---|
36 −| Famille RE/MAX sous-agences | [famille-remax-ag](famille-remax-ag.md) | 50 | 3 171 |
37 −| Famille Via Capitale agences | [famille-via-ag](famille-via-ag.md) | 4 | 50 |
38 −| Famille Century 21 | [famille-c21-ag](famille-c21-ag.md) | 2 | 1 566 |
39 −| Famille source.immo | [famille-source-immo](famille-source-immo.md) | 13 | 3 315 |
36 +| Famille RE/MAX sous-agences | [famille-remax-ag](famille-remax-ag.md) | 50 | 3 240 |
37 +| Famille Via Capitale agences | [famille-via-ag](famille-via-ag.md) | 4 | 66 |
38 +| Famille Century 21 | [famille-c21-ag](famille-c21-ag.md) | 2 | 1 585 |
39 +| Famille source.immo | [famille-source-immo](famille-source-immo.md) | 13 | 3 348 |
40 40
41 41 ## Connecteurs nommés
42 42
43 43 | id | Nom | Type | Statut | Visibles | Année (dont rôle) | Dernier sync | OK |
44 44 |---|---|---|---|---|---|---|---|
45 −| [`remax_quebec`](remax_quebec.md) | RE/MAX Québec | franchise | actif | 25 368 | 82.8 % | 2026-08-18 13:20 | ✅ |
46 −| [`duproprio`](duproprio.md) | DuProprio (sans courtier) | fsbo | actif | 7 402 | 79.4 % | 2026-08-18 17:49 | ✅ |
47 −| [`kijiji`](kijiji.md) | Kijiji Québec | — | actif | 7 141 | 4.2 % | 2026-08-18 12:36 | ✅ |
48 −| [`via_capitale`](via_capitale.md) | Via Capitale | franchise | actif | 5 145 | 69.4 % | 2026-08-18 13:37 | ✅ |
49 −| [`sutton`](sutton.md) | Groupe Sutton Québec | franchise | actif | 4 572 | 77.1 % | 2026-08-18 13:32 | ✅ |
50 −| [`lespac`](lespac.md) | LesPAC Québec | — | actif | 2 688 | 57.5 % | 2026-08-18 12:47 | ✅ |
51 −| [`proprio_direct`](proprio_direct.md) | Proprio Direct | agence | actif | 2 468 | 67.6 % | 2026-08-18 12:51 | ✅ |
52 −| [`c21_ag_quebec`](c21_ag_quebec.md) | Century 21 Québec (All Quebec) | — | actif | 1 566 | 75.6 % | 2026-08-18 18:56 | ✅ |
53 −| [`domicilia`](domicilia.md) | Domicilia Agence Immobilière | agence | actif | 1 449 | 73.4 % | 2026-08-19 00:47 | ✅ |
54 −| [`cio_ag_outaouais`](cio_ag_outaouais.md) | Chambre immobilière de l'Outaouais | portail | actif | 1 241 | 74.4 % | 2026-08-18 19:41 | ✅ |
55 −| [`engel_volkers`](engel_volkers.md) | Engel & Völkers Montréal / Québec | luxe | actif | 1 232 | 70.0 % | 2026-08-18 17:49 | ✅ |
56 −| [`ubee`](ubee.md) | Ubee | — | actif | 1 187 | 100.0 % | 2026-08-18 20:56 | ✅ |
57 −| [`si_ag_ciemcq`](si_ag_ciemcq.md) | Chambre immobilière Estrie–Mauricie–Centre-du-Québec (Mon-Toit) | chambre | actif | 1 164 | 69.2 % | 2026-08-19 00:47 | ✅ |
58 −| [`vendirect`](vendirect.md) | Vendirect | agence | actif | 1 144 | 79.0 % | 2026-08-18 19:05 | ✅ |
59 −| [`kw_prestige`](kw_prestige.md) | Keller Williams Prestige | franchise | actif | 1 059 | 66.3 % | 2026-08-18 23:57 | ✅ |
60 −| [`royal_lepage`](royal_lepage.md) | Royal LePage (Québec) | franchise | actif | 976 | 92.1 % | 2026-08-18 13:21 | ✅ |
61 −| [`exp_ag_qc`](exp_ag_qc.md) | eXp Agence immobilière (Québec) | agence | actif | 893 | 68.1 % | 2026-08-18 19:54 | ✅ |
62 −| [`sothebys_quebec`](sothebys_quebec.md) | Sotheby's International Realty Québec | luxe | actif | 869 | 60.6 % | 2026-08-18 13:26 | ✅ |
63 −| [`charisma_ag_qc`](charisma_ag_qc.md) | Les Immeubles Charisma | agence | actif | 698 | 93.4 % | 2026-08-18 18:49 | ✅ |
64 −| [`realtor_ag_ca`](realtor_ag_ca.md) | Realtor.ca (MLS Québec) | agrégateur | actif | 420 | 82.4 % | 2026-08-18 23:52 | ❌ |
65 −| [`kw_distinction`](kw_distinction.md) | Keller Williams Distinction | franchise | actif | 364 | 39.8 % | 2026-08-19 00:02 | ✅ |
66 −| [`profusion`](profusion.md) | Profusion Immobilier (Christie's) | luxe | actif | 353 | 61.5 % | 2026-08-18 12:51 | ✅ |
67 −| [`kw_urbain`](kw_urbain.md) | Keller Williams Urbain | franchise | actif | 351 | 68.7 % | 2026-08-18 12:36 | ✅ |
68 −| [`barnes_quebec`](barnes_quebec.md) | BARNES Québec | luxe | actif | 338 | 81.1 % | 2026-08-18 23:42 | ✅ |
69 −| [`si_ag_theagency`](si_ag_theagency.md) | The Agency Montréal | agence | actif | 236 | 90.3 % | 2026-08-19 00:47 | ✅ |
70 −| [`glmc_ag_qc`](glmc_ag_qc.md) | Les Immeubles GLMC | agence | actif | 176 | 36.4 % | 2026-08-18 23:45 | ✅ |
71 −| [`imcha_ag_qc`](imcha_ag_qc.md) | Les Immeubles Charlevoix | agence | actif | 106 | 54.7 % | 2026-08-18 23:52 | ✅ |
72 −| [`guidehabitation`](guidehabitation.md) | Guide Habitation (projets neufs) | répertoire | actif | 94 | 27.7 % | 2026-08-18 23:47 | ✅ |
73 −| [`bhhs_ag_qc`](bhhs_ag_qc.md) | Berkshire Hathaway HomeServices Québec | franchise | actif | 93 | 94.6 % | 2026-08-18 23:50 | ✅ |
74 −| [`immodev`](immodev.md) | Immodev Agence Immobilière | agence | actif | 92 | 64.1 % | 2026-08-19 00:47 | ✅ |
75 −| [`realta`](realta.md) | Réalta Agence Immobilière | agence | actif | 83 | 80.7 % | 2026-08-19 00:47 | ✅ |
76 −| [`provad`](provad.md) | Proulx Vadnais & Associés | agence | actif | 81 | 43.2 % | 2026-08-19 00:47 | ✅ |
77 −| [`image_ag_qc`](image_ag_qc.md) | Image, l'agence immobilière | agence | actif | 76 | 77.6 % | 2026-08-19 00:47 | ✅ |
78 −| [`m_immobilier`](m_immobilier.md) | M Immobilier | luxe | actif | 66 | 86.4 % | 2026-08-18 12:51 | ✅ |
79 −| [`si_ag_jga`](si_ag_jga.md) | JGA Équipe Commerciale (Royal LePage) | équipe | actif | 59 | 37.3 % | 2026-08-19 00:47 | ✅ |
80 −| [`peladeau`](peladeau.md) | Péladeau Agence Immobilière | agence | actif | 47 | 93.6 % | 2026-08-19 00:47 | ✅ |
81 −| [`contact_ag_qc`](contact_ag_qc.md) | Les Immeubles Contact | agence | actif | 43 | 86.0 % | 2026-08-19 00:05 | ✅ |
82 −| [`avenue`](avenue.md) | Avenue Immobilier | agence | actif | 43 | 97.7 % | 2026-08-19 00:47 | ✅ |
83 −| [`si_ag_katiasamson`](si_ag_katiasamson.md) | Katia Samson (RE/MAX L'Espace) | équipe | actif | 26 | 100.0 % | 2026-08-19 00:47 | ✅ |
84 −| [`ferri`](ferri.md) | Ferri Services Immobiliers | agence | actif | 22 | 95.5 % | 2026-08-19 00:47 | ✅ |
85 −| [`via_ag_select`](via_ag_select.md) | Via Capitale Select | franchise | actif | 14 | 100.0 % | 2026-08-18 19:15 | ✅ |
86 −| [`gaillardetz`](gaillardetz.md) | Gaillardetz Agence Immobilière | agence | actif | 13 | 92.3 % | 2026-08-19 00:47 | ✅ |
87 −| [`expert_immobilier_pm`](expert_immobilier_pm.md) | L'Expert Immobilier P.M. | agence | actif | 9 | 88.9 % | 2026-08-18 17:52 | ✅ |
88 −| [`via_ag_elite`](via_ag_elite.md) | Via Capitale Elite | franchise | actif | 9 | 77.8 % | 2026-08-18 19:08 | ✅ |
89 −| [`via_ag_acces`](via_ag_acces.md) | Via Capitale Acces | franchise | actif | 7 | 100.0 % | 2026-08-18 19:06 | ✅ |
45 +| [`remax_quebec`](remax_quebec.md) | RE/MAX Québec | franchise | actif | 25 538 | 82.8 % | 2026-08-22 20:40 | ✅ |
46 +| [`duproprio`](duproprio.md) | DuProprio (sans courtier) | fsbo | actif | 7 422 | 79.3 % | 2026-08-22 19:49 | ✅ |
47 +| [`kijiji`](kijiji.md) | Kijiji Québec | — | actif | 7 143 | 4.1 % | 2026-08-22 19:59 | ✅ |
48 +| [`via_capitale`](via_capitale.md) | Via Capitale | franchise | actif | 5 045 | 73.8 % | 2026-08-22 20:48 | ✅ |
49 +| [`sutton`](sutton.md) | Groupe Sutton Québec | franchise | actif | 4 559 | 77.4 % | 2026-08-22 20:43 | ✅ |
50 +| [`lespac`](lespac.md) | LesPAC Québec | — | actif | 2 710 | 57.6 % | 2026-08-22 20:06 | ✅ |
51 +| [`vendre_ag_ca`](vendre_ag_ca.md) | Vendre.ca | portail | actif | 2 674 | 76.2 % | 2026-08-22 20:44 | ✅ |
52 +| [`proprio_direct`](proprio_direct.md) | Proprio Direct | agence | actif | 2 494 | 68.0 % | 2026-08-22 20:11 | ✅ |
53 +| [`c21_ag_quebec`](c21_ag_quebec.md) | Century 21 Québec (All Quebec) | — | actif | 1 585 | 75.8 % | 2026-08-22 19:47 | ✅ |
54 +| [`domicilia`](domicilia.md) | Domicilia Agence Immobilière | agence | actif | 1 468 | 73.4 % | 2026-08-23 00:49 | ✅ |
55 +| [`publimaison_ag_qc`](publimaison_ag_qc.md) | Publimaison.ca | fsbo | actif | 1 383 | 85.3 % | 2026-08-22 20:26 | ✅ |
56 +| [`cio_ag_outaouais`](cio_ag_outaouais.md) | Chambre immobilière de l'Outaouais | portail | actif | 1 253 | 74.8 % | 2026-08-22 19:47 | ✅ |
57 +| [`engel_volkers`](engel_volkers.md) | Engel & Völkers Montréal / Québec | luxe | actif | 1 235 | 70.0 % | 2026-08-22 19:49 | ✅ |
58 +| [`si_ag_ciemcq`](si_ag_ciemcq.md) | Chambre immobilière Estrie–Mauricie–Centre-du-Québec (Mon-Toit) | chambre | actif | 1 172 | 69.5 % | 2026-08-23 00:52 | ✅ |
59 +| [`logis_ag_quebec`](logis_ag_quebec.md) | LogisQuébec (à vendre) | portail | actif | 1 172 | 55.1 % | 2026-08-22 20:10 | ✅ |
60 +| [`ubee`](ubee.md) | Ubee | — | actif | 1 161 | 100.0 % | 2026-08-22 20:44 | ✅ |
61 +| [`vendirect`](vendirect.md) | Vendirect | agence | actif | 1 146 | 78.8 % | 2026-08-22 20:44 | ✅ |
62 +| [`royal_lepage`](royal_lepage.md) | Royal LePage (Québec) | franchise | actif | 944 | 90.5 % | 2026-08-22 20:41 | ✅ |
63 +| [`exp_ag_qc`](exp_ag_qc.md) | eXp Agence immobilière (Québec) | agence | actif | 888 | 90.4 % | 2026-08-22 19:52 | ✅ |
64 +| [`sothebys_quebec`](sothebys_quebec.md) | Sotheby's International Realty Québec | luxe | actif | 870 | 60.5 % | 2026-08-22 20:42 | ✅ |
65 +| [`kw_prestige`](kw_prestige.md) | Keller Williams Prestige | franchise | actif | 799 | 91.0 % | 2026-08-22 20:02 | ✅ |
66 +| [`fb_marketplace`](fb_marketplace.md) | Facebook Marketplace | petites annonces | actif | 750 | 11.1 % | 2026-08-23 00:28 | ✅ |
67 +| [`charisma_ag_qc`](charisma_ag_qc.md) | Les Immeubles Charisma | agence | actif | 706 | 93.5 % | 2026-08-22 19:49 | ✅ |
68 +| [`pmml`](pmml.md) | PMML | agence | actif | 461 | 76.4 % | 2026-08-23 00:41 | ✅ |
69 +| [`profusion`](profusion.md) | Profusion Immobilier (Christie's) | luxe | actif | 355 | 61.1 % | 2026-08-22 20:10 | ✅ |
70 +| [`kw_urbain`](kw_urbain.md) | Keller Williams Urbain | franchise | actif | 342 | 81.6 % | 2026-08-22 20:02 | ✅ |
71 +| [`realtor_ag_ca`](realtor_ag_ca.md) | Realtor.ca (MLS Québec) | agrégateur | actif | 298 | 82.9 % | 2026-08-22 20:36 | ✅ |
72 +| [`si_ag_theagency`](si_ag_theagency.md) | The Agency Montréal | agence | actif | 239 | 88.7 % | 2026-08-23 00:50 | ✅ |
73 +| [`barnes_quebec`](barnes_quebec.md) | BARNES Québec | luxe | actif | 232 | 75.9 % | 2026-08-22 19:47 | ✅ |
74 +| [`kw_distinction`](kw_distinction.md) | Keller Williams Distinction | franchise | actif | 200 | 73.5 % | 2026-08-22 20:01 | ✅ |
75 +| [`glmc_ag_qc`](glmc_ag_qc.md) | Les Immeubles GLMC | agence | actif | 179 | 36.3 % | 2026-08-22 19:52 | ✅ |
76 +| [`imcha_ag_qc`](imcha_ag_qc.md) | Les Immeubles Charlevoix | agence | actif | 106 | 54.7 % | 2026-08-22 19:52 | ✅ |
77 +| [`guidehabitation`](guidehabitation.md) | Guide Habitation (projets neufs) | répertoire | actif | 94 | 27.7 % | 2026-08-22 19:52 | ✅ |
78 +| [`immodev`](immodev.md) | Immodev Agence Immobilière | agence | actif | 93 | 64.5 % | 2026-08-23 00:49 | ✅ |
79 +| [`bhhs_ag_qc`](bhhs_ag_qc.md) | Berkshire Hathaway HomeServices Québec | franchise | actif | 90 | 94.4 % | 2026-08-22 19:47 | ✅ |
80 +| [`realta`](realta.md) | Réalta Agence Immobilière | agence | actif | 87 | 81.6 % | 2026-08-23 00:49 | ✅ |
81 +| [`provad`](provad.md) | Proulx Vadnais & Associés | agence | actif | 81 | 43.2 % | 2026-08-23 00:52 | ✅ |
82 +| [`image_ag_qc`](image_ag_qc.md) | Image, l'agence immobilière | agence | actif | 77 | 77.9 % | 2026-08-23 00:49 | ✅ |
83 +| [`m_immobilier`](m_immobilier.md) | M Immobilier | luxe | actif | 72 | 86.1 % | 2026-08-22 20:10 | ✅ |
84 +| [`si_ag_jga`](si_ag_jga.md) | JGA Équipe Commerciale (Royal LePage) | équipe | actif | 59 | 37.3 % | 2026-08-23 00:52 | ✅ |
85 +| [`stuart`](stuart.md) | Les Immeubles Stuart | agence | actif | 53 | 98.1 % | 2026-08-23 00:46 | ✅ |
86 +| [`contact_ag_qc`](contact_ag_qc.md) | Les Immeubles Contact | agence | actif | 45 | 86.7 % | 2026-08-22 19:52 | ✅ |
87 +| [`peladeau`](peladeau.md) | Péladeau Agence Immobilière | agence | actif | 45 | 93.3 % | 2026-08-23 00:52 | ✅ |
88 +| [`avenue`](avenue.md) | Avenue Immobilier | agence | actif | 44 | 97.7 % | 2026-08-23 00:52 | ✅ |
89 +| [`si_ag_katiasamson`](si_ag_katiasamson.md) | Katia Samson (RE/MAX L'Espace) | équipe | actif | 25 | 100.0 % | 2026-08-23 00:52 | ✅ |
90 +| [`ferri`](ferri.md) | Ferri Services Immobiliers | agence | actif | 22 | 95.5 % | 2026-08-23 00:52 | ✅ |
91 +| [`duquesimms`](duquesimms.md) | Duque Simms | agence | actif | 18 | 0.0 % | 2026-08-23 00:48 | ✅ |
92 +| [`via_ag_elite`](via_ag_elite.md) | Via Capitale Elite | franchise | actif | 15 | 46.7 % | 2026-08-22 20:48 | ✅ |
93 +| [`via_ag_select`](via_ag_select.md) | Via Capitale Select | franchise | actif | 15 | 86.7 % | 2026-08-22 20:49 | ✅ |
94 +| [`gaillardetz`](gaillardetz.md) | Gaillardetz Agence Immobilière | agence | actif | 13 | 92.3 % | 2026-08-23 00:49 | ✅ |
95 +| [`expert_immobilier_pm`](expert_immobilier_pm.md) | L'Expert Immobilier P.M. | agence | actif | 12 | 91.7 % | 2026-08-22 19:52 | ✅ |
96 +| [`via_ag_acces`](via_ag_acces.md) | Via Capitale Acces | franchise | actif | 7 | 100.0 % | 2026-08-22 20:48 | ✅ |
90 97 | [`century21`](century21.md) | Century 21 (Québec) | franchise | actif | 0 | — | — | — |
91 98 | [`via_ag_dumontroyal`](via_ag_dumontroyal.md) | Via Capitale Dumontroyal | franchise | inactif | 0 | — | 2026-08-18 00:27 | ✅ |
92 −| [`c21_ag_vision`](c21_ag_vision.md) | Century 21 Vision (Outaouais) | — | actif | 0 | — | 2026-08-18 18:58 | ✅ |
93 −| [`niddamour`](niddamour.md) | Nid d'Amour Agence Immobilière | agence | a_faire | 0 | — | 2026-08-19 00:47 | ✅ |
99 +| [`c21_ag_vision`](c21_ag_vision.md) | Century 21 Vision (Outaouais) | — | actif | 0 | — | 2026-08-22 19:47 | ✅ |
100 +| [`niddamour`](niddamour.md) | Nid d'Amour Agence Immobilière | agence | a_faire | 0 | — | 2026-08-23 00:49 | ✅ |
94 101 | [`coldwell_banker`](coldwell_banker.md) | Coldwell Banker Québec | franchise | a_faire | 0 | — | — | — |
102 +| [`imt_tremblant`](imt_tremblant.md) | Les Immeubles Mont-Tremblant (MTRE) | agence | inactif | 0 | — | — | — |
103 +| [`vistoo`](vistoo.md) | Vistoo | portail | a_faire | 0 | — | — | — |
104 +| [`deakin`](deakin.md) | Immeubles Deakin Realties | agence | a_faire | 0 | — | — | — |
105 +| [`versants`](versants.md) | Les Versants Mont-Tremblant | agence | a_faire | 0 | — | — | — |
106 +| [`rciiq`](rciiq.md) | Annuaire RCIIQ (courtiers indépendants) | annuaire | a_faire | 0 | — | — | — |
modified docs/connecteurs/avenue.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Avenue Immobilier (`avenue`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,22 +38,22 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 43 |
42 −| Actives | 43 |
43 −| Visibles (après dédup) | 43 |
41 +| Annonces en base (toutes) | 45 |
42 +| Actives | 44 |
43 +| Visibles (après dédup) | 44 |
44 44 | Masquées par la dédup | 0 |
45 45 | GPS (lat/lng) | 100.0 % |
46 46 | Photos | 100.0 % |
47 47 | Prix | 100.0 % |
48 −| CAC (chambres) | 88.4 % |
49 −| SDB (salles de bains) | 88.4 % |
48 +| CAC (chambres) | 88.6 % |
49 +| SDB (salles de bains) | 88.6 % |
50 50 | Année de construction | 97.7 % (dont rôle : 0.0 %) |
51 −| Taxes / évaluation municipale | 95.3 % |
52 −| Estimation Vrai-Prix (rôle) | 97.7 % |
51 +| Taxes / évaluation municipale | 95.5 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 42, +1 / ~41 / -0 — OK
57 −- **Erreurs récentes** : 0 sur les 6 derniers syncs
56 +- **Dernier sync** : 2026-08-23 00:52 — trouvé 44, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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).
modified docs/connecteurs/barnes_quebec.md +12 −12
@@ -1,6 +1,6 @@
1 1 # BARNES Québec (`barnes_quebec`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -50,22 +50,22 @@
50 50
51 51 | Indicateur | Valeur |
52 52 |---|---|
53 −| Annonces en base (toutes) | 353 |
54 −| Actives | 338 |
55 −| Visibles (après dédup) | 338 |
53 +| Annonces en base (toutes) | 368 |
54 +| Actives | 232 |
55 +| Visibles (après dédup) | 232 |
56 56 | Masquées par la dédup | 0 |
57 −| GPS (lat/lng) | 98.8 % |
58 −| Photos | 68.6 % |
59 −| Prix | 99.1 % |
60 −| CAC (chambres) | 92.0 % |
61 −| SDB (salles de bains) | 90.8 % |
62 −| Année de construction | 81.1 % (dont rôle : 36.9 %) |
63 −| Taxes / évaluation municipale | 49.7 % |
57 +| GPS (lat/lng) | 100.0 % |
58 +| Photos | 100.0 % |
59 +| Prix | 100.0 % |
60 +| CAC (chambres) | 91.8 % |
61 +| SDB (salles de bains) | 90.1 % |
62 +| Année de construction | 75.9 % (dont rôle : 7.4 %) |
63 +| Taxes / évaluation municipale | 72.4 % |
64 64 | Estimation Vrai-Prix (rôle) | 100.0 % |
65 65
66 66 ## Synchronisation
67 67
68 −- **Dernier sync** : 2026-08-18 23:42 — trouvé 228, +0 / ~228 / -0 — OK
68 +- **Dernier sync** : 2026-08-22 19:47 — trouvé 232, +0 / ~0 / -0 — OK
69 69 - **Erreurs récentes** : 0 sur les 10 derniers syncs
70 70
71 71 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).
modified docs/connecteurs/bhhs_ag_qc.md +11 −11
@@ -1,6 +1,6 @@
1 1 # Berkshire Hathaway HomeServices Québec (`bhhs_ag_qc`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -42,22 +42,22 @@
42 42
43 43 | Indicateur | Valeur |
44 44 |---|---|
45 −| Annonces en base (toutes) | 99 |
46 −| Actives | 95 |
47 −| Visibles (après dédup) | 93 |
48 −| Masquées par la dédup | 2 |
45 +| Annonces en base (toutes) | 102 |
46 +| Actives | 90 |
47 +| Visibles (après dédup) | 90 |
48 +| Masquées par la dédup | 0 |
49 49 | GPS (lat/lng) | 100.0 % |
50 50 | Photos | 100.0 % |
51 −| Prix | 65.6 % |
52 −| CAC (chambres) | 93.5 % |
53 −| SDB (salles de bains) | 94.6 % |
54 −| Année de construction | 94.6 % (dont rôle : 3.4 %) |
51 +| Prix | 63.3 % |
52 +| CAC (chambres) | 93.3 % |
53 +| SDB (salles de bains) | 94.4 % |
54 +| Année de construction | 94.4 % (dont rôle : 1.2 %) |
55 55 | Taxes / évaluation municipale | 0.0 % |
56 56 | Estimation Vrai-Prix (rôle) | 100.0 % |
57 57
58 58 ## Synchronisation
59 59
60 −- **Dernier sync** : 2026-08-18 23:50 — trouvé 95, +2 / ~93 / -0 — OK
61 −- **Erreurs récentes** : 0 sur les 7 derniers syncs
60 +- **Dernier sync** : 2026-08-22 19:47 — trouvé 90, +0 / ~0 / -0 — OK
61 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
62 62
63 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).
modified docs/connecteurs/c21_ag_quebec.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Century 21 Québec (All Quebec) (`c21_ag_quebec`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,22 +38,22 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 1 674 |
42 −| Actives | 1 603 |
43 −| Visibles (après dédup) | 1 566 |
44 −| Masquées par la dédup | 37 |
41 +| Annonces en base (toutes) | 1 728 |
42 +| Actives | 1 624 |
43 +| Visibles (après dédup) | 1 585 |
44 +| Masquées par la dédup | 39 |
45 45 | GPS (lat/lng) | 99.9 % |
46 46 | Photos | 100.0 % |
47 47 | Prix | 100.0 % |
48 −| CAC (chambres) | 75.9 % |
49 −| SDB (salles de bains) | 72.9 % |
50 −| Année de construction | 75.6 % (dont rôle : 0.2 %) |
51 −| Taxes / évaluation municipale | 85.8 % |
48 +| CAC (chambres) | 76.1 % |
49 +| SDB (salles de bains) | 73.1 % |
50 +| Année de construction | 75.8 % (dont rôle : 0.2 %) |
51 +| Taxes / évaluation municipale | 85.9 % |
52 52 | Estimation Vrai-Prix (rôle) | 100.0 % |
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-18 18:56 — trouvé 1 603, +0 / ~1603 / -9 — OK
56 +- **Dernier sync** : 2026-08-22 19:47 — trouvé 1 623, +0 / ~1 / -0 — OK
57 57 - **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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).
modified docs/connecteurs/c21_ag_vision.md +3 −3
@@ -1,6 +1,6 @@
1 1 # Century 21 Vision (Outaouais) (`c21_ag_vision`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,7 +38,7 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 143 |
41 +| Annonces en base (toutes) | 144 |
42 42 | Actives | 139 |
43 43 | Visibles (après dédup) | 0 |
44 44 | Masquées par la dédup | 139 |
@@ -53,7 +53,7 @@
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-18 18:58 — trouvé 139, +0 / ~139 / -0 — OK
56 +- **Dernier sync** : 2026-08-22 19:47 — trouvé 139, +0 / ~0 / -0 — OK
57 57 - **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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).
modified docs/connecteurs/century21.md +1 −1
@@ -1,6 +1,6 @@
1 1 # Century 21 (Québec) (`century21`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
modified docs/connecteurs/charisma_ag_qc.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Les Immeubles Charisma (`charisma_ag_qc`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -45,22 +45,22 @@
45 45
46 46 | Indicateur | Valeur |
47 47 |---|---|
48 −| Annonces en base (toutes) | 763 |
49 −| Actives | 757 |
50 −| Visibles (après dédup) | 698 |
51 −| Masquées par la dédup | 59 |
48 +| Annonces en base (toutes) | 781 |
49 +| Actives | 761 |
50 +| Visibles (après dédup) | 706 |
51 +| Masquées par la dédup | 55 |
52 52 | GPS (lat/lng) | 99.7 % |
53 53 | Photos | 100.0 % |
54 −| Prix | 53.0 % |
54 +| Prix | 53.7 % |
55 55 | CAC (chambres) | 100.0 % |
56 56 | SDB (salles de bains) | 100.0 % |
57 −| Année de construction | 93.4 % (dont rôle : 2.5 %) |
58 −| Taxes / évaluation municipale | 53.2 % |
57 +| Année de construction | 93.5 % (dont rôle : 0.5 %) |
58 +| Taxes / évaluation municipale | 54.0 % |
59 59 | Estimation Vrai-Prix (rôle) | 100.0 % |
60 60
61 61 ## Synchronisation
62 62
63 −- **Dernier sync** : 2026-08-18 18:49 — trouvé 754, +2 / ~752 / -0 — OK
64 −- **Erreurs récentes** : 0 sur les 7 derniers syncs
63 +- **Dernier sync** : 2026-08-22 19:49 — trouvé 756, +2 / ~0 / -0 — OK
64 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
65 65
66 66 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).
modified docs/connecteurs/cio_ag_outaouais.md +12 −12
@@ -1,6 +1,6 @@
1 1 # Chambre immobilière de l'Outaouais (`cio_ag_outaouais`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -47,22 +47,22 @@
47 47
48 48 | Indicateur | Valeur |
49 49 |---|---|
50 −| Annonces en base (toutes) | 4 180 |
51 −| Actives | 4 096 |
52 −| Visibles (après dédup) | 1 241 |
53 −| Masquées par la dédup | 2 855 |
50 +| Annonces en base (toutes) | 4 355 |
51 +| Actives | 4 135 |
52 +| Visibles (après dédup) | 1 253 |
53 +| Masquées par la dédup | 2 882 |
54 54 | GPS (lat/lng) | 100.0 % |
55 −| Photos | 99.7 % |
55 +| Photos | 100.0 % |
56 56 | Prix | 99.9 % |
57 −| CAC (chambres) | 80.7 % |
58 −| SDB (salles de bains) | 70.3 % |
59 −| Année de construction | 74.4 % (dont rôle : 0.5 %) |
60 −| Taxes / évaluation municipale | 93.7 % |
57 +| CAC (chambres) | 80.8 % |
58 +| SDB (salles de bains) | 70.6 % |
59 +| Année de construction | 74.8 % (dont rôle : 0.1 %) |
60 +| Taxes / évaluation municipale | 93.8 % |
61 61 | Estimation Vrai-Prix (rôle) | 100.0 % |
62 62
63 63 ## Synchronisation
64 64
65 −- **Dernier sync** : 2026-08-18 19:41 — trouvé 4 095, +3 / ~4092 / -17 — OK
66 −- **Erreurs récentes** : 0 sur les 7 derniers syncs
65 +- **Dernier sync** : 2026-08-22 19:47 — trouvé 4 133, +0 / ~0 / -1 — OK
66 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
67 67
68 68 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).
modified docs/connecteurs/coldwell_banker.md +1 −1
@@ -1,6 +1,6 @@
1 1 # Coldwell Banker Québec (`coldwell_banker`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
modified docs/connecteurs/contact_ag_qc.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Les Immeubles Contact (`contact_ag_qc`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -44,22 +44,22 @@
44 44
45 45 | Indicateur | Valeur |
46 46 |---|---|
47 −| Annonces en base (toutes) | 44 |
48 −| Actives | 43 |
49 −| Visibles (après dédup) | 43 |
47 +| Annonces en base (toutes) | 46 |
48 +| Actives | 45 |
49 +| Visibles (après dédup) | 45 |
50 50 | Masquées par la dédup | 0 |
51 −| GPS (lat/lng) | 97.7 % |
51 +| GPS (lat/lng) | 97.8 % |
52 52 | Photos | 100.0 % |
53 53 | Prix | 100.0 % |
54 −| CAC (chambres) | 83.7 % |
55 −| SDB (salles de bains) | 81.4 % |
56 −| Année de construction | 86.0 % (dont rôle : 0.0 %) |
54 +| CAC (chambres) | 84.4 % |
55 +| SDB (salles de bains) | 82.2 % |
56 +| Année de construction | 86.7 % (dont rôle : 5.1 %) |
57 57 | Taxes / évaluation municipale | 100.0 % |
58 58 | Estimation Vrai-Prix (rôle) | 100.0 % |
59 59
60 60 ## Synchronisation
61 61
62 −- **Dernier sync** : 2026-08-19 00:05 — trouvé 43, +0 / ~43 / -0 — OK
63 −- **Erreurs récentes** : 0 sur les 7 derniers syncs
62 +- **Dernier sync** : 2026-08-22 19:52 — trouvé 45, +0 / ~0 / -0 — OK
63 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
64 64
65 65 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/deakin.md +27 −0
@@ -0,0 +1,27 @@
1 +# Immeubles Deakin Realties (`deakin`)
2 +
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://deakinrealties.com
8 +- **Recherche** : https://deakinrealties.com/proprietes/
9 +- **Couverture** : Ouest-de-l'Île de Montréal (Beaconsfield, Pointe-Claire…)
10 +- **Type** : agence
11 +- **Statut** : a_faire
12 +
13 +> Sondé 2026-08-23 : liste SSR custom sans JSON-LD ni plateforme connue — parsing HTML maison à écrire, inventaire modeste. Dépriorisé au profit de PMML/Stuart/Duque.
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).
modified docs/connecteurs/domicilia.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Domicilia Agence Immobilière (`domicilia`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,22 +38,22 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 1 495 |
42 −| Actives | 1 449 |
43 −| Visibles (après dédup) | 1 449 |
41 +| Annonces en base (toutes) | 1 539 |
42 +| Actives | 1 468 |
43 +| Visibles (après dédup) | 1 468 |
44 44 | Masquées par la dédup | 0 |
45 45 | GPS (lat/lng) | 99.9 % |
46 46 | Photos | 100.0 % |
47 47 | Prix | 100.0 % |
48 −| CAC (chambres) | 69.4 % |
49 −| SDB (salles de bains) | 66.8 % |
50 −| Année de construction | 73.4 % (dont rôle : 0.0 %) |
51 −| Taxes / évaluation municipale | 92.1 % |
52 −| Estimation Vrai-Prix (rôle) | 99.8 % |
48 +| CAC (chambres) | 69.7 % |
49 +| SDB (salles de bains) | 67.0 % |
50 +| Année de construction | 73.4 % (dont rôle : 0.2 %) |
51 +| Taxes / évaluation municipale | 91.9 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 1 447, +3 / ~1444 / -0 — OK
56 +- **Dernier sync** : 2026-08-23 00:49 — trouvé 1 468, +0 / ~0 / -1 — OK
57 57 - **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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).
modified docs/connecteurs/duproprio.md +13 −13
@@ -1,6 +1,6 @@
1 1 # DuProprio (sans courtier) (`duproprio`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -36,22 +36,22 @@
36 36
37 37 | Indicateur | Valeur |
38 38 |---|---|
39 −| Annonces en base (toutes) | 7 586 |
40 −| Actives | 7 411 |
41 −| Visibles (après dédup) | 7 402 |
42 −| Masquées par la dédup | 9 |
43 −| GPS (lat/lng) | 91.0 % |
44 −| Photos | 94.0 % |
45 −| Prix | 98.6 % |
46 −| CAC (chambres) | 80.5 % |
47 −| SDB (salles de bains) | 79.8 % |
48 −| Année de construction | 79.4 % (dont rôle : 9.0 %) |
49 −| Taxes / évaluation municipale | 52.7 % |
39 +| Annonces en base (toutes) | 7 762 |
40 +| Actives | 7 432 |
41 +| Visibles (après dédup) | 7 422 |
42 +| Masquées par la dédup | 10 |
43 +| GPS (lat/lng) | 91.1 % |
44 +| Photos | 100.0 % |
45 +| Prix | 98.5 % |
46 +| CAC (chambres) | 80.6 % |
47 +| SDB (salles de bains) | 79.9 % |
48 +| Année de construction | 79.3 % (dont rôle : 0.1 %) |
49 +| Taxes / évaluation municipale | 52.9 % |
50 50 | Estimation Vrai-Prix (rôle) | 100.0 % |
51 51
52 52 ## Synchronisation
53 53
54 −- **Dernier sync** : 2026-08-18 17:49 — trouvé 7 395, +17 / ~4 / -0 — OK
54 +- **Dernier sync** : 2026-08-22 19:49 — trouvé 7 432, +0 / ~0 / -8 — OK
55 55 - **Erreurs récentes** : 0 sur les 10 derniers syncs
56 56
57 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/duquesimms.md +63 −0
@@ -0,0 +1,63 @@
1 +# Duque Simms (`duquesimms`)
2 +
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://duquesimms.com
8 +- **Recherche** : https://duquesimms.com/nos-proprietes/
9 +- **Couverture** : Montréal (NDG, Côte-des-Neiges, Ouest-de-l'Île) — ~20 inscriptions vente
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> WordPress/Elementor sur plateforme proprius/e-mmobilier. Découverte par property-sitemap.xml (URLs fr /property/{Centris}/), tout vient de la fiche (JSON-LD + blocs property-characteristic/expense/evaluation, GPS inclus). Locations écartées par seuil de prix. Première main → pas d'infixe _ag_.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/duquesimms.py` — classe `DuqueSimmsConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_DUQUESIMMS_DETAIL_LIMIT` (défaut 80)
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/duquesimms.py : Duque Simms (duquesimms.com) — agence indépendante
26 +> de Montréal (NDG, Côte-des-Neiges, Ouest-de-l'Île), ~25 inscriptions.
27 +> Site WordPress/Elementor (plateforme proprius/e-mmobilier, photos sur
28 +> cdn.proprius.e-mmobilier.ca). Découverte par property-sitemap.xml : URLs
29 +> fr /property/{n° Centris}/ (les /en/ sont des doublons de langue).
30 +> TOUT vient de la fiche détail (du.enrich) : JSON-LD RealEstateListing
31 +> (description, contentLocation adresse complète + GPS, offers[].price avec
32 +> businessFunction Sell, keywords = type, seller = courtier nom/téléphone)
33 +> + blocs HTML property-characteristic (libellé/valeurs), property-expense
34 +> (taxes, énergie), property-evaluation, compteurs chambres/salles de bain
35 +> (icônes bedroom.svg/bathroom.svg suivies du nombre), galerie swiper
36 +> cdn …-pi.jpg (les -c.jpg sont des portraits). Les locations (prix de
37 +> loyer) sont écartées par le seuil de prix vente.
38 +> Agence première main (pas d'infixe _ag_) : ses fiches battent les copies
39 +> portails au même n° Centris dans la dédup.
40 +
41 +## Volumétrie & complétude (BD live)
42 +
43 +| Indicateur | Valeur |
44 +|---|---|
45 +| Annonces en base (toutes) | 18 |
46 +| Actives | 18 |
47 +| Visibles (après dédup) | 18 |
48 +| Masquées par la dédup | 0 |
49 +| GPS (lat/lng) | 100.0 % |
50 +| Photos | 100.0 % |
51 +| Prix | 100.0 % |
52 +| CAC (chambres) | 100.0 % |
53 +| SDB (salles de bains) | 100.0 % |
54 +| Année de construction | 0.0 % |
55 +| Taxes / évaluation municipale | 100.0 % |
56 +| Estimation Vrai-Prix (rôle) | 0.0 % |
57 +
58 +## Synchronisation
59 +
60 +- **Dernier sync** : 2026-08-23 00:48 — trouvé 18, +18 / ~0 / -0 — OK
61 +- **Erreurs récentes** : 0 sur les 1 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).
modified docs/connecteurs/engel_volkers.md +11 −11
@@ -1,6 +1,6 @@
1 1 # Engel & Völkers Montréal / Québec (`engel_volkers`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -32,22 +32,22 @@
32 32
33 33 | Indicateur | Valeur |
34 34 |---|---|
35 −| Annonces en base (toutes) | 1 289 |
36 −| Actives | 1 232 |
37 −| Visibles (après dédup) | 1 232 |
35 +| Annonces en base (toutes) | 1 316 |
36 +| Actives | 1 235 |
37 +| Visibles (après dédup) | 1 235 |
38 38 | Masquées par la dédup | 0 |
39 −| GPS (lat/lng) | 87.3 % |
39 +| GPS (lat/lng) | 87.5 % |
40 40 | Photos | 98.9 % |
41 −| Prix | 89.9 % |
42 −| CAC (chambres) | 35.4 % |
43 −| SDB (salles de bains) | 20.5 % |
44 −| Année de construction | 70.0 % (dont rôle : 100.0 %) |
41 +| Prix | 90.0 % |
42 +| CAC (chambres) | 35.8 % |
43 +| SDB (salles de bains) | 20.7 % |
44 +| Année de construction | 70.0 % (dont rôle : 3.6 %) |
45 45 | Taxes / évaluation municipale | 0.0 % |
46 −| Estimation Vrai-Prix (rôle) | 89.4 % |
46 +| Estimation Vrai-Prix (rôle) | 89.6 % |
47 47
48 48 ## Synchronisation
49 49
50 −- **Dernier sync** : 2026-08-18 17:49 — trouvé 1 232, +0 / ~0 / -3 — OK
50 +- **Dernier sync** : 2026-08-22 19:49 — trouvé 1 235, +0 / ~0 / -2 — OK
51 51 - **Erreurs récentes** : 0 sur les 10 derniers syncs
52 52
53 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).
modified docs/connecteurs/exp_ag_qc.md +11 −11
@@ -1,6 +1,6 @@
1 1 # eXp Agence immobilière (Québec) (`exp_ag_qc`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -52,22 +52,22 @@
52 52
53 53 | Indicateur | Valeur |
54 54 |---|---|
55 −| Annonces en base (toutes) | 1 032 |
55 +| Annonces en base (toutes) | 1 083 |
56 56 | Actives | 1 009 |
57 −| Visibles (après dédup) | 893 |
58 −| Masquées par la dédup | 116 |
59 −| GPS (lat/lng) | 78.9 % |
57 +| Visibles (après dédup) | 888 |
58 +| Masquées par la dédup | 121 |
59 +| GPS (lat/lng) | 99.9 % |
60 60 | Photos | 100.0 % |
61 61 | Prix | 99.8 % |
62 −| CAC (chambres) | 45.5 % |
63 −| SDB (salles de bains) | 36.5 % |
64 −| Année de construction | 68.1 % (dont rôle : 1.6 %) |
65 −| Taxes / évaluation municipale | 40.6 % |
62 +| CAC (chambres) | 90.4 % |
63 +| SDB (salles de bains) | 89.1 % |
64 +| Année de construction | 90.4 % (dont rôle : 2.4 %) |
65 +| Taxes / évaluation municipale | 100.0 % |
66 66 | Estimation Vrai-Prix (rôle) | 100.0 % |
67 67
68 68 ## Synchronisation
69 69
70 −- **Dernier sync** : 2026-08-18 19:54 — trouvé 1 000, +9 / ~991 / -0 — OK
71 −- **Erreurs récentes** : 0 sur les 7 derniers syncs
70 +- **Dernier sync** : 2026-08-22 19:52 — trouvé 1 000, +2 / ~1 / -0 — OK
71 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
72 72
73 73 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).
modified docs/connecteurs/expert_immobilier_pm.md +8 −8
@@ -1,6 +1,6 @@
1 1 # L'Expert Immobilier P.M. (`expert_immobilier_pm`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -33,22 +33,22 @@
33 33
34 34 | Indicateur | Valeur |
35 35 |---|---|
36 −| Annonces en base (toutes) | 27 |
37 −| Actives | 9 |
38 −| Visibles (après dédup) | 9 |
36 +| Annonces en base (toutes) | 48 |
37 +| Actives | 12 |
38 +| Visibles (après dédup) | 12 |
39 39 | Masquées par la dédup | 0 |
40 −| GPS (lat/lng) | 88.9 % |
40 +| GPS (lat/lng) | 100.0 % |
41 41 | Photos | 100.0 % |
42 −| Prix | 77.8 % |
42 +| Prix | 83.3 % |
43 43 | CAC (chambres) | 100.0 % |
44 44 | SDB (salles de bains) | 100.0 % |
45 −| Année de construction | 88.9 % (dont rôle : 100.0 %) |
45 +| Année de construction | 91.7 % (dont rôle : 90.9 %) |
46 46 | Taxes / évaluation municipale | 0.0 % |
47 47 | Estimation Vrai-Prix (rôle) | 100.0 % |
48 48
49 49 ## Synchronisation
50 50
51 −- **Dernier sync** : 2026-08-18 17:52 — trouvé 9, +0 / ~0 / -0 — OK
51 +- **Dernier sync** : 2026-08-22 19:52 — trouvé 9, +3 / ~0 / -0 — OK
52 52 - **Erreurs récentes** : 0 sur les 10 derniers syncs
53 53
54 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).
modified docs/connecteurs/famille-c21-ag.md +11 −11
@@ -1,6 +1,6 @@
1 1 # Famille Century 21 (`c21_ag_*`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 Connecteurs par compte Century 21, générés depuis `data/century21_agencies.json` (plateforme source.immo).
6 6
@@ -29,8 +29,8 @@ Connecteurs par compte Century 21, générés depuis `data/century21_agencies.js
29 29
30 30 | source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK |
31 31 |---|---|---|---|---|---|---|---|
32 −| [`c21_ag_quebec`](c21_ag_quebec.md) | — | source.immo | 1 566 | 1 603 | 37 | 2026-08-18 18:56 | ✅ |
33 −| [`c21_ag_vision`](c21_ag_vision.md) | — | source.immo | 0 | 139 | 139 | 2026-08-18 18:58 | ✅ |
32 +| [`c21_ag_quebec`](c21_ag_quebec.md) | — | source.immo | 1 585 | 1 624 | 39 | 2026-08-22 19:47 | ✅ |
33 +| [`c21_ag_vision`](c21_ag_vision.md) | — | source.immo | 0 | 139 | 139 | 2026-08-22 19:47 | ✅ |
34 34
35 35 Entrées du registre sans connecteur instancié (2) : `quebec.c21.ca`, `vision.c21.ca`
36 36
@@ -38,16 +38,16 @@ Entrées du registre sans connecteur instancié (2) : `quebec.c21.ca`, `vision.c
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 1 817 |
42 −| Actives | 1 742 |
43 −| Visibles (après dédup) | 1 566 |
44 −| Masquées par la dédup | 176 |
41 +| Annonces en base (toutes) | 1 872 |
42 +| Actives | 1 763 |
43 +| Visibles (après dédup) | 1 585 |
44 +| Masquées par la dédup | 178 |
45 45 | GPS (lat/lng) | 99.9 % |
46 46 | Photos | 100.0 % |
47 47 | Prix | 100.0 % |
48 −| CAC (chambres) | 75.9 % |
49 −| SDB (salles de bains) | 72.9 % |
50 −| Année de construction | 75.6 % (dont rôle : 0.2 %) |
51 −| Taxes / évaluation municipale | 85.8 % |
48 +| CAC (chambres) | 76.1 % |
49 +| SDB (salles de bains) | 73.1 % |
50 +| Année de construction | 75.8 % (dont rôle : 0.2 %) |
51 +| Taxes / évaluation municipale | 85.9 % |
52 52 | Estimation Vrai-Prix (rôle) | 100.0 % |
53 53
modified docs/connecteurs/famille-remax-ag.md +58 −58
@@ -1,6 +1,6 @@
1 1 # Famille RE/MAX sous-agences (`remax_ag_*`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 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 6
@@ -36,56 +36,56 @@ Budgets env : `IMMOKA_AGENCE_DETAIL_LIMIT` (défaut 0)
36 36
37 37 | source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK |
38 38 |---|---|---|---|---|---|---|---|
39 −| `remax_ag_1erchoix` | www.remax1erchoix.com | nos-proprietes | 203 | 1 059 | 856 | 2026-08-18 13:15 | ✅ |
40 −| `remax_ag_2000` | www.remax-2000.com | centris-other | 65 | 728 | 663 | 2026-08-18 13:16 | ✅ |
41 −| `remax_ag_2001` | www.remax2001.com | nos-proprietes | 37 | 368 | 331 | 2026-08-18 13:16 | ✅ |
42 −| `remax_ag_3000` | remax3000.com | nos-proprietes | 47 | 777 | 730 | 2026-08-18 13:16 | ✅ |
43 −| `remax_ag_acces` | www.remaxacces.com | nos-proprietes | 134 | 616 | 482 | 2026-08-18 13:16 | ✅ |
44 −| `remax_ag_action` | remax-action.ca | nos-proprietes | 79 | 1 357 | 1 278 | 2026-08-18 13:16 | ✅ |
45 −| `remax_ag_alliance` | www.remax-alliance.ca | nos-proprietes | 170 | 1 241 | 1 071 | 2026-08-18 13:16 | ✅ |
46 −| `remax_ag_avantages` | www.remax-avantages.com | nos-proprietes | 169 | 769 | 600 | 2026-08-18 13:16 | ✅ |
47 −| `remax_ag_avanttout` | www.remaxavanttout.com | nos-proprietes | 35 | 402 | 367 | 2026-08-18 13:16 | ✅ |
48 −| `remax_ag_cite` | remax-cite.com | nos-proprietes | 12 | 116 | 104 | 2026-08-18 13:16 | ✅ |
49 −| `remax_ag_crystal` | remaxcrystal.com | nos-proprietes | 163 | 1 303 | 1 140 | 2026-08-18 13:16 | ✅ |
50 −| `remax_ag_d_ici` | remaxdici.com | nos-proprietes | 128 | 869 | 741 | 2026-08-18 13:16 | ✅ |
51 −| `remax_ag_dabord` | www.remax-dabord.com | centris-other | 116 | 786 | 670 | 2026-08-18 13:16 | ✅ |
52 −| `remax_ag_defi` | remax-defi1996.com | nos-proprietes | 26 | 349 | 323 | 2026-08-18 13:16 | ✅ |
53 −| `remax_ag_defrancheville` | remaxdefrancheville.com | nos-proprietes | 164 | 1 459 | 1 295 | 2026-08-18 13:16 | ✅ |
54 −| `remax_ag_direct` | remax-direct.com | nos-proprietes | 26 | 1 060 | 1 034 | 2026-08-18 13:16 | ✅ |
55 −| `remax_ag_distinction` | remaxdistinction.com | nos-proprietes | 27 | 149 | 122 | 2026-08-18 13:16 | ✅ |
56 −| `remax_ag_ducartier` | www.remaxducartier.com | centris-other | 215 | 1 838 | 1 623 | 2026-08-18 13:16 | ✅ |
57 −| `remax_ag_ducartieractif` | www.remaxactif.com | centris-other | 25 | 119 | 94 | 2026-08-18 13:16 | ✅ |
58 −| `remax_ag_ducartierbonjour` | remaxbonjour.com | centris-other | 112 | 1 538 | 1 426 | 2026-08-18 13:16 | ✅ |
59 −| `remax_ag_dynamique` | remaxdynamique.com | nos-proprietes | 2 | 151 | 149 | 2026-08-18 13:16 | ✅ |
60 −| `remax_ag_dynastie` | remax-dynastie.com | centris-other | 5 | 236 | 231 | 2026-08-18 13:16 | ✅ |
61 −| `remax_ag_elegance` | remax-elegance.ca | nos-proprietes | 12 | 86 | 74 | 2026-08-18 13:16 | ✅ |
62 −| `remax_ag_elite` | remax-elite.ca | nos-proprietes | 80 | 853 | 773 | 2026-08-18 13:16 | ✅ |
63 −| `remax_ag_energie` | remax-energie.com | nos-proprietes | 8 | 173 | 165 | 2026-08-18 13:16 | ✅ |
64 −| `remax_ag_evolution` | remax-evolution.com | centris-other | 39 | 494 | 455 | 2026-08-18 13:16 | ✅ |
65 −| `remax_ag_excellence` | remax-excellence.ca | nos-proprietes | 1 | 283 | 282 | 2026-08-18 13:16 | ✅ |
66 −| `remax_ag_extra` | remax-extra.ca | centris-other | 123 | 672 | 549 | 2026-08-18 13:16 | ✅ |
67 −| `remax_ag_fortindelage` | remaxfortindelage.com | nos-proprietes | 65 | 408 | 343 | 2026-08-18 13:16 | ✅ |
68 −| `remax_ag_futur` | remax-futur.ca | centris-other | 3 | 195 | 192 | 2026-08-18 13:16 | ✅ |
69 −| `remax_ag_harmonie` | remaxharmonie.com | nos-proprietes | 55 | 375 | 320 | 2026-08-18 13:16 | ✅ |
70 −| `remax_ag_harricana` | remax-harricana.com | nos-proprietes | 6 | 155 | 149 | 2026-08-18 13:16 | ✅ |
71 −| `remax_ag_horizon` | remax-horizon.ca | nos-proprietes | 91 | 463 | 372 | 2026-08-18 13:16 | ✅ |
72 −| `remax_ag_imagine` | remax-imagineprivilege.com | nos-proprietes | 59 | 454 | 395 | 2026-08-18 13:16 | ✅ |
73 −| `remax_ag_immobilia` | remaximmobilia.ca | nos-proprietes | 0 | 7 | 7 | 2026-08-18 13:16 | ✅ |
74 −| `remax_ag_immobilierplus` | remax-immobilierplus.com | nos-proprietes | 5 | 56 | 51 | 2026-08-18 13:16 | ✅ |
75 −| `remax_ag_infinite` | remax-infinite.com | nos-proprietes | 0 | 59 | 59 | 2026-08-18 13:16 | ✅ |
76 −| `remax_ag_invest` | remaxinvest.ca | nos-proprietes | 0 | 1 | 1 | 2026-08-18 13:16 | ✅ |
77 −| `remax_ag_lespace` | www.remaxlespace.com | nos-proprietes | 38 | 469 | 431 | 2026-08-18 13:16 | ✅ |
78 −| `remax_ag_lespace_commercial` | remaxlespace.com | nos-proprietes | 0 | 469 | 469 | 2026-08-18 13:16 | ✅ |
79 −| `remax_ag_performance` | remaxperformance.net | nos-proprietes | 19 | 203 | 184 | 2026-08-18 13:16 | ✅ |
80 −| `remax_ag_platine` | www.remax-platine.com | nos-proprietes | 99 | 1 308 | 1 209 | 2026-08-18 13:16 | ✅ |
81 −| `remax_ag_plus` | remaxplus.ca | nos-proprietes | 70 | 349 | 279 | 2026-08-18 13:16 | ✅ |
82 −| `remax_ag_prestige` | remaxprestige.ca | nos-proprietes | 88 | 476 | 388 | 2026-08-18 13:17 | ✅ |
83 −| `remax_ag_privilege` | remax-imagineprivilege.com | nos-proprietes | 0 | 454 | 454 | 2026-08-18 13:17 | ✅ |
84 −| `remax_ag_professionnel` | www.remax-professionnel.com | nos-proprietes | 73 | 720 | 647 | 2026-08-18 13:17 | ✅ |
85 −| `remax_ag_renaissance` | remax-renaissance.ca | nos-proprietes | 34 | 300 | 266 | 2026-08-18 13:17 | ✅ |
86 −| `remax_ag_royaljordan` | remax-royaljordan.com | nos-proprietes | 130 | 1 305 | 1 175 | 2026-08-18 13:17 | ✅ |
87 −| `remax_ag_signature` | remaxsignature.ca | nos-proprietes | 82 | 564 | 482 | 2026-08-18 13:17 | ✅ |
88 −| `remax_ag_vision` | remaxvision.ca | nos-proprietes | 31 | 1 070 | 1 039 | 2026-08-18 13:17 | ✅ |
39 +| `remax_ag_1erchoix` | www.remax1erchoix.com | nos-proprietes | 216 | 1 105 | 889 | 2026-08-22 20:36 | ✅ |
40 +| `remax_ag_2000` | www.remax-2000.com | centris-other | 66 | 743 | 677 | 2026-08-22 20:36 | ✅ |
41 +| `remax_ag_2001` | www.remax2001.com | nos-proprietes | 41 | 374 | 333 | 2026-08-22 20:36 | ✅ |
42 +| `remax_ag_3000` | remax3000.com | nos-proprietes | 50 | 767 | 717 | 2026-08-22 20:36 | ✅ |
43 +| `remax_ag_acces` | www.remaxacces.com | nos-proprietes | 145 | 629 | 484 | 2026-08-22 20:36 | ✅ |
44 +| `remax_ag_action` | remax-action.ca | nos-proprietes | 84 | 1 362 | 1 278 | 2026-08-22 20:36 | ✅ |
45 +| `remax_ag_alliance` | www.remax-alliance.ca | nos-proprietes | 170 | 1 242 | 1 072 | 2026-08-22 20:36 | ✅ |
46 +| `remax_ag_avantages` | www.remax-avantages.com | nos-proprietes | 172 | 784 | 612 | 2026-08-22 20:36 | ✅ |
47 +| `remax_ag_avanttout` | www.remaxavanttout.com | nos-proprietes | 39 | 400 | 361 | 2026-08-22 20:36 | ✅ |
48 +| `remax_ag_cite` | remax-cite.com | nos-proprietes | 15 | 121 | 106 | 2026-08-22 20:36 | ✅ |
49 +| `remax_ag_crystal` | remaxcrystal.com | nos-proprietes | 175 | 1 322 | 1 147 | 2026-08-22 20:36 | ✅ |
50 +| `remax_ag_d_ici` | remaxdici.com | nos-proprietes | 134 | 877 | 743 | 2026-08-22 20:36 | ✅ |
51 +| `remax_ag_dabord` | www.remax-dabord.com | centris-other | 129 | 803 | 674 | 2026-08-22 20:36 | ✅ |
52 +| `remax_ag_defi` | remax-defi1996.com | nos-proprietes | 26 | 351 | 325 | 2026-08-22 20:36 | ✅ |
53 +| `remax_ag_defrancheville` | remaxdefrancheville.com | nos-proprietes | 173 | 1 471 | 1 298 | 2026-08-22 20:36 | ✅ |
54 +| `remax_ag_direct` | remax-direct.com | nos-proprietes | 29 | 1 079 | 1 050 | 2026-08-22 20:37 | ✅ |
55 +| `remax_ag_distinction` | remaxdistinction.com | nos-proprietes | 26 | 150 | 124 | 2026-08-22 20:37 | ✅ |
56 +| `remax_ag_ducartier` | www.remaxducartier.com | centris-other | 219 | 1 842 | 1 623 | 2026-08-22 20:37 | ✅ |
57 +| `remax_ag_ducartieractif` | www.remaxactif.com | centris-other | 25 | 116 | 91 | 2026-08-22 20:37 | ✅ |
58 +| `remax_ag_ducartierbonjour` | remaxbonjour.com | centris-other | 108 | 1 548 | 1 440 | 2026-08-22 20:37 | ✅ |
59 +| `remax_ag_dynamique` | remaxdynamique.com | nos-proprietes | 3 | 157 | 154 | 2026-08-22 20:37 | ✅ |
60 +| `remax_ag_dynastie` | remax-dynastie.com | centris-other | 6 | 248 | 242 | 2026-08-22 20:37 | ✅ |
61 +| `remax_ag_elegance` | remax-elegance.ca | nos-proprietes | 14 | 86 | 72 | 2026-08-22 20:37 | ✅ |
62 +| `remax_ag_elite` | remax-elite.ca | nos-proprietes | 77 | 866 | 789 | 2026-08-22 20:37 | ✅ |
63 +| `remax_ag_energie` | remax-energie.com | nos-proprietes | 10 | 176 | 166 | 2026-08-22 20:37 | ✅ |
64 +| `remax_ag_evolution` | remax-evolution.com | centris-other | 38 | 510 | 472 | 2026-08-22 20:37 | ✅ |
65 +| `remax_ag_excellence` | remax-excellence.ca | nos-proprietes | 2 | 282 | 280 | 2026-08-22 20:37 | ✅ |
66 +| `remax_ag_extra` | remax-extra.ca | centris-other | 116 | 690 | 574 | 2026-08-22 20:37 | ✅ |
67 +| `remax_ag_fortindelage` | remaxfortindelage.com | nos-proprietes | 72 | 407 | 335 | 2026-08-22 20:37 | ✅ |
68 +| `remax_ag_futur` | remax-futur.ca | centris-other | 3 | 199 | 196 | 2026-08-22 20:37 | ✅ |
69 +| `remax_ag_harmonie` | remaxharmonie.com | nos-proprietes | 52 | 377 | 325 | 2026-08-22 20:37 | ✅ |
70 +| `remax_ag_harricana` | remax-harricana.com | nos-proprietes | 7 | 158 | 151 | 2026-08-22 20:37 | ✅ |
71 +| `remax_ag_horizon` | remax-horizon.ca | nos-proprietes | 91 | 460 | 369 | 2026-08-22 20:37 | ✅ |
72 +| `remax_ag_imagine` | remax-imagineprivilege.com | nos-proprietes | 60 | 473 | 413 | 2026-08-22 20:37 | ✅ |
73 +| `remax_ag_immobilia` | remaximmobilia.ca | nos-proprietes | 0 | 7 | 7 | 2026-08-22 20:37 | ✅ |
74 +| `remax_ag_immobilierplus` | remax-immobilierplus.com | nos-proprietes | 5 | 56 | 51 | 2026-08-22 20:37 | ✅ |
75 +| `remax_ag_infinite` | remax-infinite.com | nos-proprietes | 0 | 56 | 56 | 2026-08-22 20:37 | ✅ |
76 +| `remax_ag_invest` | remaxinvest.ca | nos-proprietes | 0 | 1 | 1 | 2026-08-22 20:37 | ✅ |
77 +| `remax_ag_lespace` | www.remaxlespace.com | nos-proprietes | 38 | 480 | 442 | 2026-08-22 20:37 | ✅ |
78 +| `remax_ag_lespace_commercial` | remaxlespace.com | nos-proprietes | 0 | 480 | 480 | 2026-08-22 20:37 | ✅ |
79 +| `remax_ag_performance` | remaxperformance.net | nos-proprietes | 17 | 200 | 183 | 2026-08-22 20:37 | ✅ |
80 +| `remax_ag_platine` | www.remax-platine.com | nos-proprietes | 98 | 1 306 | 1 208 | 2026-08-22 20:37 | ✅ |
81 +| `remax_ag_plus` | remaxplus.ca | nos-proprietes | 69 | 354 | 285 | 2026-08-22 20:37 | ✅ |
82 +| `remax_ag_prestige` | remaxprestige.ca | nos-proprietes | 85 | 473 | 388 | 2026-08-22 20:37 | ✅ |
83 +| `remax_ag_privilege` | remax-imagineprivilege.com | nos-proprietes | 0 | 473 | 473 | 2026-08-22 20:37 | ✅ |
84 +| `remax_ag_professionnel` | www.remax-professionnel.com | nos-proprietes | 75 | 718 | 643 | 2026-08-22 20:37 | ✅ |
85 +| `remax_ag_renaissance` | remax-renaissance.ca | nos-proprietes | 36 | 307 | 271 | 2026-08-22 20:37 | ✅ |
86 +| `remax_ag_royaljordan` | remax-royaljordan.com | nos-proprietes | 129 | 1 298 | 1 169 | 2026-08-22 20:37 | ✅ |
87 +| `remax_ag_signature` | remaxsignature.ca | nos-proprietes | 68 | 574 | 506 | 2026-08-22 20:37 | ✅ |
88 +| `remax_ag_vision` | remaxvision.ca | nos-proprietes | 27 | 1 080 | 1 053 | 2026-08-22 20:37 | ✅ |
89 89
90 90 Entrées du registre sans connecteur instancié (2) : `remax-pro-commercial.ca`, `nancyforlini.com`
91 91
@@ -93,16 +93,16 @@ Entrées du registre sans connecteur instancié (2) : `remax-pro-commercial.ca`,
93 93
94 94 | Indicateur | Valeur |
95 95 |---|---|
96 −| Annonces en base (toutes) | 31 221 |
97 −| Actives | 29 711 |
98 −| Visibles (après dédup) | 3 171 |
99 −| Masquées par la dédup | 26 540 |
100 −| GPS (lat/lng) | 97.1 % |
96 +| Annonces en base (toutes) | 32 613 |
97 +| Actives | 30 038 |
98 +| Visibles (après dédup) | 3 240 |
99 +| Masquées par la dédup | 26 798 |
100 +| GPS (lat/lng) | 95.6 % |
101 101 | Photos | 0.0 % |
102 102 | Prix | 0.0 % |
103 −| CAC (chambres) | 7.9 % |
103 +| CAC (chambres) | 8.2 % |
104 104 | SDB (salles de bains) | 0.0 % |
105 −| Année de construction | 87.1 % (dont rôle : 100.0 %) |
105 +| Année de construction | 82.6 % (dont rôle : 100.0 %) |
106 106 | Taxes / évaluation municipale | 0.0 % |
107 107 | Estimation Vrai-Prix (rôle) | 100.0 % |
108 108
modified docs/connecteurs/famille-source-immo.md +23 −23
@@ -1,6 +1,6 @@
1 1 # Famille source.immo (agences indépendantes)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 Agences indépendantes servies par la plateforme source.immo (comptes/API dans `data/source_immo_agencies.json`).
6 6
@@ -29,19 +29,19 @@ Agences indépendantes servies par la plateforme source.immo (comptes/API dans `
29 29
30 30 | source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK |
31 31 |---|---|---|---|---|---|---|---|
32 −| [`avenue`](avenue.md) | — | source.immo | 43 | 43 | 0 | 2026-08-19 00:47 | ✅ |
33 −| [`domicilia`](domicilia.md) | — | source.immo | 1 449 | 1 449 | 0 | 2026-08-19 00:47 | ✅ |
34 −| [`ferri`](ferri.md) | — | source.immo | 22 | 22 | 0 | 2026-08-19 00:47 | ✅ |
35 −| [`gaillardetz`](gaillardetz.md) | — | source.immo | 13 | 13 | 0 | 2026-08-19 00:47 | ✅ |
36 −| [`immodev`](immodev.md) | — | source.immo | 92 | 92 | 0 | 2026-08-19 00:47 | ✅ |
37 −| [`niddamour`](niddamour.md) | — | source.immo | 0 | 0 | 0 | 2026-08-19 00:47 | ✅ |
38 −| [`peladeau`](peladeau.md) | — | source.immo | 47 | 47 | 0 | 2026-08-19 00:47 | ✅ |
39 −| [`provad`](provad.md) | — | source.immo | 81 | 81 | 0 | 2026-08-19 00:47 | ✅ |
40 −| [`realta`](realta.md) | — | source.immo | 83 | 83 | 0 | 2026-08-19 00:47 | ✅ |
41 −| [`si_ag_ciemcq`](si_ag_ciemcq.md) | — | source.immo | 1 164 | 3 919 | 2 755 | 2026-08-19 00:47 | ✅ |
42 −| [`si_ag_jga`](si_ag_jga.md) | — | source.immo | 59 | 64 | 5 | 2026-08-19 00:47 | ✅ |
43 −| [`si_ag_katiasamson`](si_ag_katiasamson.md) | — | source.immo | 26 | 31 | 5 | 2026-08-19 00:47 | ✅ |
44 −| [`si_ag_theagency`](si_ag_theagency.md) | — | source.immo | 236 | 306 | 70 | 2026-08-19 00:47 | ✅ |
32 +| [`avenue`](avenue.md) | — | source.immo | 44 | 44 | 0 | 2026-08-23 00:52 | ✅ |
33 +| [`domicilia`](domicilia.md) | — | source.immo | 1 468 | 1 468 | 0 | 2026-08-23 00:49 | ✅ |
34 +| [`ferri`](ferri.md) | — | source.immo | 22 | 22 | 0 | 2026-08-23 00:52 | ✅ |
35 +| [`gaillardetz`](gaillardetz.md) | — | source.immo | 13 | 13 | 0 | 2026-08-23 00:49 | ✅ |
36 +| [`immodev`](immodev.md) | — | source.immo | 93 | 93 | 0 | 2026-08-23 00:49 | ✅ |
37 +| [`niddamour`](niddamour.md) | — | source.immo | 0 | 0 | 0 | 2026-08-23 00:49 | ✅ |
38 +| [`peladeau`](peladeau.md) | — | source.immo | 45 | 45 | 0 | 2026-08-23 00:52 | ✅ |
39 +| [`provad`](provad.md) | — | source.immo | 81 | 81 | 0 | 2026-08-23 00:52 | ✅ |
40 +| [`realta`](realta.md) | — | source.immo | 87 | 87 | 0 | 2026-08-23 00:49 | ✅ |
41 +| [`si_ag_ciemcq`](si_ag_ciemcq.md) | — | source.immo | 1 172 | 3 962 | 2 790 | 2026-08-23 00:52 | ✅ |
42 +| [`si_ag_jga`](si_ag_jga.md) | — | source.immo | 59 | 64 | 5 | 2026-08-23 00:52 | ✅ |
43 +| [`si_ag_katiasamson`](si_ag_katiasamson.md) | — | source.immo | 25 | 31 | 6 | 2026-08-23 00:52 | ✅ |
44 +| [`si_ag_theagency`](si_ag_theagency.md) | — | source.immo | 239 | 308 | 69 | 2026-08-23 00:50 | ✅ |
45 45
46 46 Entrées du registre sans connecteur instancié (13) : `www.realta.ca`, `www.immodev.ca`, `www.gaillardetz.ca`, `www.domicilia.com`, `www.niddamour.ca`, `theagencymontreal.com`, `www.mon-toit.net`, `avenueimmo.com`, `provad.ca`, `www.epeladeau.com`, `www.ferri.ca`, `jgacommercial.com`, `www.katiasamson.com`
47 47
@@ -49,16 +49,16 @@ Entrées du registre sans connecteur instancié (13) : `www.realta.ca`, `www.imm
49 49
50 50 | Indicateur | Valeur |
51 51 |---|---|
52 −| Annonces en base (toutes) | 6 230 |
53 −| Actives | 6 150 |
54 −| Visibles (après dédup) | 3 315 |
55 −| Masquées par la dédup | 2 835 |
52 +| Annonces en base (toutes) | 6 474 |
53 +| Actives | 6 218 |
54 +| Visibles (après dédup) | 3 348 |
55 +| Masquées par la dédup | 2 870 |
56 56 | GPS (lat/lng) | 99.9 % |
57 57 | Photos | 100.0 % |
58 58 | Prix | 100.0 % |
59 −| CAC (chambres) | 66.9 % |
60 −| SDB (salles de bains) | 62.1 % |
61 −| Année de construction | 72.7 % (dont rôle : 0.0 %) |
62 −| Taxes / évaluation municipale | 88.5 % |
63 −| Estimation Vrai-Prix (rôle) | 99.8 % |
59 +| CAC (chambres) | 67.2 % |
60 +| SDB (salles de bains) | 62.5 % |
61 +| Année de construction | 72.7 % (dont rôle : 0.2 %) |
62 +| Taxes / évaluation municipale | 88.4 % |
63 +| Estimation Vrai-Prix (rôle) | 100.0 % |
64 64
modified docs/connecteurs/famille-via-ag.md +13 −13
@@ -1,6 +1,6 @@
1 1 # Famille Via Capitale agences (`via_ag_*`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 Connecteurs par bannière Via Capitale, générés depuis `data/via_capitale_agencies.json` (comptes API source.immo par agence).
6 6
@@ -28,10 +28,10 @@ Connecteurs par bannière Via Capitale, générés depuis `data/via_capitale_age
28 28
29 29 | source_id | Domaine | Plateforme | Visibles | Actives | Masquées dédup | Dernier sync | OK |
30 30 |---|---|---|---|---|---|---|---|
31 −| [`via_ag_acces`](via_ag_acces.md) | — | source.immo | 7 | 182 | 175 | 2026-08-18 19:06 | ✅ |
32 −| [`via_ag_elite`](via_ag_elite.md) | — | source.immo | 9 | 316 | 307 | 2026-08-18 19:08 | ✅ |
33 −| `via_ag_partenaires` | — | source.immo | 20 | 444 | 424 | 2026-08-18 19:11 | ✅ |
34 −| [`via_ag_select`](via_ag_select.md) | — | source.immo | 14 | 585 | 571 | 2026-08-18 19:15 | ✅ |
31 +| [`via_ag_acces`](via_ag_acces.md) | — | source.immo | 7 | 181 | 174 | 2026-08-22 20:48 | ✅ |
32 +| [`via_ag_elite`](via_ag_elite.md) | — | source.immo | 15 | 313 | 298 | 2026-08-22 20:48 | ✅ |
33 +| `via_ag_partenaires` | — | source.immo | 29 | 448 | 419 | 2026-08-22 20:49 | ✅ |
34 +| [`via_ag_select`](via_ag_select.md) | — | source.immo | 15 | 597 | 582 | 2026-08-22 20:49 | ✅ |
35 35
36 36 Entrées du registre sans connecteur instancié (5) : `viacapitaleacces.com`, `viacapitaledumontroyal.com`, `viacapitaleelite.immo`, `viacapitalepartenaires.com`, `viacapitaleselect.com`
37 37
@@ -39,16 +39,16 @@ Entrées du registre sans connecteur instancié (5) : `viacapitaleacces.com`, `v
39 39
40 40 | Indicateur | Valeur |
41 41 |---|---|
42 −| Annonces en base (toutes) | 1 589 |
43 −| Actives | 1 527 |
44 −| Visibles (après dédup) | 50 |
45 −| Masquées par la dédup | 1 477 |
42 +| Annonces en base (toutes) | 1 664 |
43 +| Actives | 1 539 |
44 +| Visibles (après dédup) | 66 |
45 +| Masquées par la dédup | 1 473 |
46 46 | GPS (lat/lng) | 100.0 % |
47 47 | Photos | 100.0 % |
48 48 | Prix | 100.0 % |
49 −| CAC (chambres) | 60.0 % |
50 −| SDB (salles de bains) | 52.0 % |
51 −| Année de construction | 92.0 % (dont rôle : 0.0 %) |
52 −| Taxes / évaluation municipale | 92.0 % |
49 +| CAC (chambres) | 51.5 % |
50 +| SDB (salles de bains) | 45.5 % |
51 +| Année de construction | 75.8 % (dont rôle : 0.0 %) |
52 +| Taxes / évaluation municipale | 86.4 % |
53 53 | Estimation Vrai-Prix (rôle) | 100.0 % |
54 54
added docs/connecteurs/fb_marketplace.md +61 −0
@@ -0,0 +1,61 @@
1 +# Facebook Marketplace (`fb_marketplace`)
2 +
3 +*Généré le 2026-08-23 00:54 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.facebook.com/marketplace
8 +- **Recherche** : https://www.facebook.com/marketplace/quebec/propertyforsale
9 +- **Couverture** : Toute la province — 33 villes (rayon ~65 km) × tranches de prix
10 +- **Type** : petites annonces
11 +- **Statut** : actif
12 +
13 +> Acteur Apify maison gorgeous_thistle/ka-fb-immo (jumeau vente de ka-fb-marketplace de Lou-Ka) : scraping public déconnecté du JSON préchargé, proxy résidentiel Oxylabs CA. Re-vérification tournante des fiches actives (flux trié par création). Run Apify max aux 3 h (replay BD entre). Loi 25 : vendeur non extrait.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/fb_marketplace.py` — classe `FbMarketplaceConnector`
18 +- Délai entre requêtes : 0.6 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/fb_marketplace.py : Facebook Marketplace (propriétés à vendre)
25 +> via l'acteur Apify maison gorgeous_thistle/ka-fb-immo (jumeau « vente »
26 +> de ka-fb-marketplace utilisé par Lou-Ka pour les locations).
27 +> L'acteur scrape le Marketplace public DÉCONNECTÉ (JSON préchargé du HTML,
28 +> proxy résidentiel CA) : phase recherche (33 villes × tranches de prix)
29 +> puis fiches détail (GPS, adresse civique, description, galerie complète,
30 +> statut vendu/retiré). Particularité de la source : le flux de recherche est
31 +> trié par date de création (~25 annonces/URL), une annonce en disparaît donc
32 +> en quelques jours alors qu'elle est toujours en vente. Le connecteur
33 +> maintient donc les fiches actives par RE-VÉRIFICATION tournante
34 +> (extraDetailIds, rotation par ancienneté du cache) : toujours en vente →
35 +> conservée, vendue/retirée → disparaît (délai de grâce standard).
36 +> ⚠️ Loi 25 : l'acteur n'extrait PAS le vendeur (nom/téléphone) — les champs
37 +> broker_* restent vides pour cette source.
38 +
39 +## Volumétrie & complétude (BD live)
40 +
41 +| Indicateur | Valeur |
42 +|---|---|
43 +| Annonces en base (toutes) | 762 |
44 +| Actives | 762 |
45 +| Visibles (après dédup) | 750 |
46 +| Masquées par la dédup | 12 |
47 +| GPS (lat/lng) | 78.3 % |
48 +| Photos | 100.0 % |
49 +| Prix | 100.0 % |
50 +| CAC (chambres) | 95.3 % |
51 +| SDB (salles de bains) | 99.2 % |
52 +| Année de construction | 11.1 % (dont rôle : 0.0 %) |
53 +| Taxes / évaluation municipale | 0.0 % |
54 +| Estimation Vrai-Prix (rôle) | 0.0 % |
55 +
56 +## Synchronisation
57 +
58 +- **Dernier sync** : 2026-08-23 00:28 — trouvé 762, +762 / ~0 / -0 — OK
59 +- **Erreurs récentes** : 0 sur les 1 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).
modified docs/connecteurs/ferri.md +4 −4
@@ -1,6 +1,6 @@
1 1 # Ferri Services Immobiliers (`ferri`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,7 +38,7 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 22 |
41 +| Annonces en base (toutes) | 24 |
42 42 | Actives | 22 |
43 43 | Visibles (après dédup) | 22 |
44 44 | Masquées par la dédup | 0 |
@@ -53,7 +53,7 @@
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 22, +0 / ~22 / -0 — OK
57 −- **Erreurs récentes** : 0 sur les 6 derniers syncs
56 +- **Dernier sync** : 2026-08-23 00:52 — trouvé 21, +0 / ~1 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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).
modified docs/connecteurs/gaillardetz.md +2 −2
@@ -1,6 +1,6 @@
1 1 # Gaillardetz Agence Immobilière (`gaillardetz`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -53,7 +53,7 @@
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 13, +0 / ~13 / -0 — OK
56 +- **Dernier sync** : 2026-08-23 00:49 — trouvé 13, +0 / ~0 / -0 — OK
57 57 - **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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).
modified docs/connecteurs/glmc_ag_qc.md +11 −11
@@ -1,6 +1,6 @@
1 1 # Les Immeubles GLMC (`glmc_ag_qc`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -48,22 +48,22 @@
48 48
49 49 | Indicateur | Valeur |
50 50 |---|---|
51 −| Annonces en base (toutes) | 177 |
52 −| Actives | 176 |
53 −| Visibles (après dédup) | 176 |
51 +| Annonces en base (toutes) | 182 |
52 +| Actives | 179 |
53 +| Visibles (après dédup) | 179 |
54 54 | Masquées par la dédup | 0 |
55 −| GPS (lat/lng) | 63.1 % |
55 +| GPS (lat/lng) | 62.0 % |
56 56 | Photos | 100.0 % |
57 57 | Prix | 99.4 % |
58 −| CAC (chambres) | 40.3 % |
59 −| SDB (salles de bains) | 39.8 % |
60 −| Année de construction | 36.4 % (dont rôle : 0.0 %) |
61 −| Taxes / évaluation municipale | 52.8 % |
58 +| CAC (chambres) | 41.3 % |
59 +| SDB (salles de bains) | 40.8 % |
60 +| Année de construction | 36.3 % (dont rôle : 1.5 %) |
61 +| Taxes / évaluation municipale | 53.6 % |
62 62 | Estimation Vrai-Prix (rôle) | 100.0 % |
63 63
64 64 ## Synchronisation
65 65
66 −- **Dernier sync** : 2026-08-18 23:45 — trouvé 176, +0 / ~176 / -0 — OK
67 −- **Erreurs récentes** : 0 sur les 8 derniers syncs
66 +- **Dernier sync** : 2026-08-22 19:52 — trouvé 179, +0 / ~0 / -0 — OK
67 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
68 68
69 69 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).
modified docs/connecteurs/guidehabitation.md +4 −4
@@ -1,6 +1,6 @@
1 1 # Guide Habitation (projets neufs) (`guidehabitation`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -51,13 +51,13 @@
51 51 | Prix | 100.0 % |
52 52 | CAC (chambres) | 100.0 % |
53 53 | SDB (salles de bains) | 7.4 % |
54 −| Année de construction | 27.7 % (dont rôle : 3.8 %) |
54 +| Année de construction | 27.7 % (dont rôle : 0.0 %) |
55 55 | Taxes / évaluation municipale | 0.0 % |
56 56 | Estimation Vrai-Prix (rôle) | 100.0 % |
57 57
58 58 ## Synchronisation
59 59
60 −- **Dernier sync** : 2026-08-18 23:47 — trouvé 95, +0 / ~90 / -0 — OK
61 −- **Erreurs récentes** : 0 sur les 5 derniers syncs
60 +- **Dernier sync** : 2026-08-22 19:52 — trouvé 95, +0 / ~0 / -0 — OK
61 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
62 62
63 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).
modified docs/connecteurs/image_ag_qc.md +9 −9
@@ -1,6 +1,6 @@
1 1 # Image, l'agence immobilière (`image_ag_qc`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -43,22 +43,22 @@
43 43
44 44 | Indicateur | Valeur |
45 45 |---|---|
46 −| Annonces en base (toutes) | 78 |
47 −| Actives | 76 |
48 −| Visibles (après dédup) | 76 |
46 +| Annonces en base (toutes) | 81 |
47 +| Actives | 77 |
48 +| Visibles (après dédup) | 77 |
49 49 | Masquées par la dédup | 0 |
50 50 | GPS (lat/lng) | 100.0 % |
51 51 | Photos | 100.0 % |
52 52 | Prix | 100.0 % |
53 53 | CAC (chambres) | 100.0 % |
54 54 | SDB (salles de bains) | 100.0 % |
55 −| Année de construction | 77.6 % (dont rôle : 0.0 %) |
56 −| Taxes / évaluation municipale | 75.0 % |
57 −| Estimation Vrai-Prix (rôle) | 96.1 % |
55 +| Année de construction | 77.9 % (dont rôle : 1.7 %) |
56 +| Taxes / évaluation municipale | 76.6 % |
57 +| Estimation Vrai-Prix (rôle) | 94.8 % |
58 58
59 59 ## Synchronisation
60 60
61 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 76, +0 / ~76 / -2 — OK
62 −- **Erreurs récentes** : 0 sur les 9 derniers syncs
61 +- **Dernier sync** : 2026-08-23 00:49 — trouvé 77, +0 / ~0 / -0 — OK
62 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
63 63
64 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).
modified docs/connecteurs/imcha_ag_qc.md +4 −4
@@ -1,6 +1,6 @@
1 1 # Les Immeubles Charlevoix (`imcha_ag_qc`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -45,7 +45,7 @@
45 45
46 46 | Indicateur | Valeur |
47 47 |---|---|
48 −| Annonces en base (toutes) | 112 |
48 +| Annonces en base (toutes) | 113 |
49 49 | Actives | 110 |
50 50 | Visibles (après dédup) | 106 |
51 51 | Masquées par la dédup | 4 |
@@ -60,7 +60,7 @@
60 60
61 61 ## Synchronisation
62 62
63 −- **Dernier sync** : 2026-08-18 23:52 — trouvé 110, +0 / ~110 / -0 — OK
64 −- **Erreurs récentes** : 0 sur les 7 derniers syncs
63 +- **Dernier sync** : 2026-08-22 19:52 — trouvé 110, +0 / ~0 / -0 — OK
64 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
65 65
66 66 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).
modified docs/connecteurs/immodev.md +8 −8
@@ -1,6 +1,6 @@
1 1 # Immodev Agence Immobilière (`immodev`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,22 +38,22 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 93 |
42 −| Actives | 92 |
43 −| Visibles (après dédup) | 92 |
41 +| Annonces en base (toutes) | 94 |
42 +| Actives | 93 |
43 +| Visibles (après dédup) | 93 |
44 44 | Masquées par la dédup | 0 |
45 45 | GPS (lat/lng) | 100.0 % |
46 46 | Photos | 100.0 % |
47 47 | Prix | 100.0 % |
48 −| CAC (chambres) | 12.0 % |
48 +| CAC (chambres) | 11.8 % |
49 49 | SDB (salles de bains) | 1.1 % |
50 −| Année de construction | 64.1 % (dont rôle : 0.0 %) |
51 −| Taxes / évaluation municipale | 96.7 % |
50 +| Année de construction | 64.5 % (dont rôle : 1.7 %) |
51 +| Taxes / évaluation municipale | 96.8 % |
52 52 | Estimation Vrai-Prix (rôle) | 100.0 % |
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 92, +0 / ~92 / -0 — OK
56 +- **Dernier sync** : 2026-08-23 00:49 — trouvé 93, +0 / ~0 / -0 — OK
57 57 - **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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/imt_tremblant.md +27 −0
@@ -0,0 +1,27 @@
1 +# Les Immeubles Mont-Tremblant (MTRE) (`imt_tremblant`)
2 +
3 +*Généré le 2026-08-23 00:54 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.tremblantrealestate.ca
8 +- **Recherche** : https://www.tremblantrealestate.ca/page/proprietes
9 +- **Couverture** : Laurentides (Mont-Tremblant et environs) — ~159 inscriptions
10 +- **Type** : agence
11 +- **Statut** : inactif
12 +
13 +> Connecteur écrit puis RETIRÉ le 2026-08-23 : les 159 fiches (n° Centris, photos cdn.propriodirect.com) sont TOUTES déjà couvertes première main par domicilia (157 publiées) — redondance pure, la dédup Centris masquait 159/159. Ne pas refaire.
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).
modified docs/connecteurs/kijiji.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Kijiji Québec (`kijiji`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -29,22 +29,22 @@
29 29
30 30 | Indicateur | Valeur |
31 31 |---|---|
32 −| Annonces en base (toutes) | 8 148 |
33 −| Actives | 7 147 |
34 −| Visibles (après dédup) | 7 141 |
35 −| Masquées par la dédup | 6 |
32 +| Annonces en base (toutes) | 8 923 |
33 +| Actives | 7 155 |
34 +| Visibles (après dédup) | 7 143 |
35 +| Masquées par la dédup | 12 |
36 36 | GPS (lat/lng) | 100.0 % |
37 37 | Photos | 99.8 % |
38 38 | Prix | 98.1 % |
39 −| CAC (chambres) | 82.6 % |
40 −| SDB (salles de bains) | 67.3 % |
41 −| Année de construction | 4.2 % (dont rôle : 1.0 %) |
39 +| CAC (chambres) | 82.7 % |
40 +| SDB (salles de bains) | 82.8 % |
41 +| Année de construction | 4.1 % (dont rôle : 13.4 %) |
42 42 | Taxes / évaluation municipale | 0.0 % |
43 −| Estimation Vrai-Prix (rôle) | 6.4 % |
43 +| Estimation Vrai-Prix (rôle) | 6.3 % |
44 44
45 45 ## Synchronisation
46 46
47 −- **Dernier sync** : 2026-08-18 12:36 — trouvé 7 116, +34 / ~190 / -0 — OK
47 +- **Dernier sync** : 2026-08-22 19:59 — trouvé 7 148, +4 / ~0 / -6 — OK
48 48 - **Erreurs récentes** : 0 sur les 10 derniers syncs
49 49
50 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).
modified docs/connecteurs/kw_distinction.md +12 −12
@@ -1,6 +1,6 @@
1 1 # Keller Williams Distinction (`kw_distinction`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -37,22 +37,22 @@
37 37
38 38 | Indicateur | Valeur |
39 39 |---|---|
40 −| Annonces en base (toutes) | 364 |
41 −| Actives | 364 |
42 −| Visibles (après dédup) | 364 |
40 +| Annonces en base (toutes) | 370 |
41 +| Actives | 200 |
42 +| Visibles (après dédup) | 200 |
43 43 | Masquées par la dédup | 0 |
44 −| GPS (lat/lng) | 68.1 % |
45 −| Photos | 54.1 % |
46 −| Prix | 39.6 % |
47 −| CAC (chambres) | 97.3 % |
48 −| SDB (salles de bains) | 54.1 % |
49 −| Année de construction | 39.8 % (dont rôle : 1.4 %) |
50 −| Taxes / évaluation municipale | 54.1 % |
44 +| GPS (lat/lng) | 41.0 % |
45 +| Photos | 100.0 % |
46 +| Prix | 74.0 % |
47 +| CAC (chambres) | 100.0 % |
48 +| SDB (salles de bains) | 100.0 % |
49 +| Année de construction | 73.5 % (dont rôle : 0.0 %) |
50 +| Taxes / évaluation municipale | 100.0 % |
51 51 | Estimation Vrai-Prix (rôle) | 100.0 % |
52 52
53 53 ## Synchronisation
54 54
55 −- **Dernier sync** : 2026-08-19 00:02 — trouvé 197, +197 / ~0 / -0 — OK
55 +- **Dernier sync** : 2026-08-22 20:01 — trouvé 200, +0 / ~1 / -0 — OK
56 56 - **Erreurs récentes** : 0 sur les 10 derniers syncs
57 57
58 58 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).
modified docs/connecteurs/kw_prestige.md +14 −14
@@ -1,6 +1,6 @@
1 1 # Keller Williams Prestige (`kw_prestige`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,22 +38,22 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 1 063 |
42 −| Actives | 1 063 |
43 −| Visibles (après dédup) | 1 059 |
44 −| Masquées par la dédup | 4 |
45 −| GPS (lat/lng) | 73.0 % |
46 −| Photos | 40.6 % |
47 −| Prix | 27.2 % |
48 −| CAC (chambres) | 44.7 % |
49 −| SDB (salles de bains) | 42.3 % |
50 −| Année de construction | 66.3 % (dont rôle : 61.3 %) |
51 −| Taxes / évaluation municipale | 16.3 % |
52 −| Estimation Vrai-Prix (rôle) | 75.3 % |
41 +| Annonces en base (toutes) | 1 092 |
42 +| Actives | 804 |
43 +| Visibles (après dédup) | 799 |
44 +| Masquées par la dédup | 5 |
45 +| GPS (lat/lng) | 99.1 % |
46 +| Photos | 100.0 % |
47 +| Prix | 36.3 % |
48 +| CAC (chambres) | 59.3 % |
49 +| SDB (salles de bains) | 56.4 % |
50 +| Année de construction | 91.0 % (dont rôle : 3.2 %) |
51 +| Taxes / évaluation municipale | 29.4 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-18 23:57 — trouvé 801, +786 / ~15 / -0 — OK
56 +- **Dernier sync** : 2026-08-22 20:02 — trouvé 796, +0 / ~0 / -0 — OK
57 57 - **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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).
modified docs/connecteurs/kw_urbain.md +27 −13
@@ -1,6 +1,6 @@
1 1 # Keller Williams Urbain (`kw_urbain`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -16,7 +16,7 @@
16 16
17 17 - Module : `immoka/connectors/kw_urbain.py` — classe `KwUrbainConnector`
18 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)
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_DETAIL_LIMIT` (défaut 400)
20 20
21 21 **En-tête du module :**
22 22
@@ -25,27 +25,41 @@
25 25 > connectors/kw_urbain.py : Keller Williams Urbain (kwurbain.ca)
26 26 > Page /inscriptions rendue serveur : toutes les inscriptions de l'agence en
27 27 > cartes HTML (plateforme marketingwebsites.ca, commune aux bureaux KW Canada).
28 +> ENRICHISSEMENT DÉTAIL (v3) : fiche /inscriptions/inscription/{id}/ rendue
29 +> serveur, thème « canvas » (différent du thème Charisma mais mêmes données
30 +> MW Properties). Structure réelle vérifiée (2026-08) :
31 +> - tableaux <tr><th>Libellé</th><td>Valeur</td> : Sommaire (superficie,
32 +> pièces, chambres, sdb, salles d'eau, année), Bâtiment (Type, Style,
33 +> Dimensions, terrain), Dépenses (taxes/coûts « $ 4857 / année »),
34 +> Caractéristiques (<th width="20%">) ;
35 +> - pièces : <td data-title="Pièce|Dimensions|Niveau|Revêtement"> ;
36 +> - description : <h3 class=title><span>Aperçu</span> + <div class=prop>
37 +> (p descriptif, p#addendum, p « Inclus :/Exclus : ») ;
38 +> - courtier : cartes .broker-card (h4 nom, h5 titre, lien tel:) ;
39 +> - GPS : initGoogleMap("streetMap", lat, lng) inline (commenté mais présent).
40 +> → property_type (« Type » du bloc Bâtiment) désormais rempli : c'est le
41 +> champ qui conditionne la publication (sinon quarantaine).
28 42
29 43 ## Volumétrie & complétude (BD live)
30 44
31 45 | Indicateur | Valeur |
32 46 |---|---|
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 % |
47 +| Annonces en base (toutes) | 369 |
48 +| Actives | 344 |
49 +| Visibles (après dédup) | 342 |
50 +| Masquées par la dédup | 2 |
51 +| GPS (lat/lng) | 99.7 % |
38 52 | 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 % |
53 +| Prix | 51.5 % |
54 +| CAC (chambres) | 93.6 % |
55 +| SDB (salles de bains) | 93.6 % |
56 +| Année de construction | 81.6 % (dont rôle : 0.4 %) |
57 +| Taxes / évaluation municipale | 54.7 % |
44 58 | Estimation Vrai-Prix (rôle) | 100.0 % |
45 59
46 60 ## Synchronisation
47 61
48 −- **Dernier sync** : 2026-08-18 12:36 — trouvé 351, +0 / ~0 / -0 — OK
62 +- **Dernier sync** : 2026-08-22 20:02 — trouvé 344, +0 / ~0 / -0 — OK
49 63 - **Erreurs récentes** : 0 sur les 10 derniers syncs
50 64
51 65 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).
modified docs/connecteurs/lespac.md +13 −13
@@ -1,6 +1,6 @@
1 1 # LesPAC Québec (`lespac`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -30,22 +30,22 @@
30 30
31 31 | Indicateur | Valeur |
32 32 |---|---|
33 −| Annonces en base (toutes) | 4 350 |
34 −| Actives | 4 138 |
35 −| Visibles (après dédup) | 2 688 |
36 −| Masquées par la dédup | 1 450 |
37 −| GPS (lat/lng) | 45.9 % |
33 +| Annonces en base (toutes) | 4 518 |
34 +| Actives | 4 159 |
35 +| Visibles (après dédup) | 2 710 |
36 +| Masquées par la dédup | 1 449 |
37 +| GPS (lat/lng) | 46.0 % |
38 38 | Photos | 99.6 % |
39 −| Prix | 97.8 % |
40 −| CAC (chambres) | 54.1 % |
41 −| SDB (salles de bains) | 26.2 % |
42 −| Année de construction | 57.5 % (dont rôle : 0.1 %) |
43 −| Taxes / évaluation municipale | 22.6 % |
44 −| Estimation Vrai-Prix (rôle) | 69.3 % |
39 +| Prix | 97.9 % |
40 +| CAC (chambres) | 55.4 % |
41 +| SDB (salles de bains) | 41.5 % |
42 +| Année de construction | 57.6 % (dont rôle : 0.5 %) |
43 +| Taxes / évaluation municipale | 85.5 % |
44 +| Estimation Vrai-Prix (rôle) | 69.5 % |
45 45
46 46 ## Synchronisation
47 47
48 −- **Dernier sync** : 2026-08-18 12:47 — trouvé 4 136, +3 / ~432 / -4 — OK
48 +- **Dernier sync** : 2026-08-22 20:06 — trouvé 4 146, +10 / ~17 / -1 — OK
49 49 - **Erreurs récentes** : 0 sur les 10 derniers syncs
50 50
51 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/logis_ag_quebec.md +59 −0
@@ -0,0 +1,59 @@
1 +# LogisQuébec (à vendre) (`logis_ag_quebec`)
2 +
3 +*Généré le 2026-08-23 00:54 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.logisquebec.com
8 +- **Recherche** : https://www.logisquebec.com/a-vendre/
9 +- **Couverture** : Tout le Québec — section vente du portail (~4 200 propriétés, particuliers + agences)
10 +- **Type** : portail
11 +- **Statut** : actif
12 +
13 +> Pagination SSR /a-vendre/{page} (10 cartes/page) ; détail JSON-LD (adresse, géoloc, MLS). source_id _ag_ = dédup Centris : annonces d'agences couvertes masquées, particuliers (vNNNNNN) visibles.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/logisquebec.py` — classe `LogisQuebecConnector`
18 +- Délai entre requêtes : 0.3 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_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/logisquebec.py : LogisQuébec (section « à vendre » seulement)
26 +> Portail québécois surtout connu pour la location, mais avec ~4 200
27 +> propriétés À VENDRE (particuliers + agences syndiquées, ex. Proprio Direct).
28 +> Pagination serveur classique /a-vendre/{page} (10 cartes/page, ~420 pages),
29 +> cartes riches (type, prix, rue, ville, extrait, photo). La fiche détail
30 +> (JSON-LD SingleFamilyResidence + Product) fournit adresse exacte, code
31 +> postal, géoloc, description et le n° MLS/Centris quand l'annonce vient
32 +> d'une agence ; galerie i.logisquebec.com séquentielle.
33 +> source_id « logis_ag_quebec » : l'infixe _ag_ active la dédup Centris —
34 +> les annonces d'agences déjà couvertes (même n° MLS) sont masquées, les
35 +> annonces de particuliers (id interne vNNNNNN) restent toujours visibles.
36 +
37 +## Volumétrie & complétude (BD live)
38 +
39 +| Indicateur | Valeur |
40 +|---|---|
41 +| Annonces en base (toutes) | 7 372 |
42 +| Actives | 4 150 |
43 +| Visibles (après dédup) | 1 172 |
44 +| Masquées par la dédup | 2 978 |
45 +| GPS (lat/lng) | 83.4 % |
46 +| Photos | 100.0 % |
47 +| Prix | 100.0 % |
48 +| CAC (chambres) | 60.2 % |
49 +| SDB (salles de bains) | 53.1 % |
50 +| Année de construction | 55.1 % (dont rôle : 0.2 %) |
51 +| Taxes / évaluation municipale | 0.0 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 +
54 +## Synchronisation
55 +
56 +- **Dernier sync** : 2026-08-22 20:10 — trouvé 4 147, +11 / ~23 / -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).
modified docs/connecteurs/m_immobilier.md +11 −11
@@ -1,6 +1,6 @@
1 1 # M Immobilier (`m_immobilier`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -32,22 +32,22 @@
32 32
33 33 | Indicateur | Valeur |
34 34 |---|---|
35 −| Annonces en base (toutes) | 84 |
36 −| Actives | 66 |
37 −| Visibles (après dédup) | 66 |
35 +| Annonces en base (toutes) | 106 |
36 +| Actives | 72 |
37 +| Visibles (après dédup) | 72 |
38 38 | Masquées par la dédup | 0 |
39 −| GPS (lat/lng) | 93.9 % |
39 +| GPS (lat/lng) | 95.8 % |
40 40 | Photos | 100.0 % |
41 −| Prix | 98.5 % |
42 −| CAC (chambres) | 93.9 % |
43 −| SDB (salles de bains) | 93.9 % |
44 −| Année de construction | 86.4 % (dont rôle : 100.0 %) |
41 +| Prix | 100.0 % |
42 +| CAC (chambres) | 95.8 % |
43 +| SDB (salles de bains) | 94.4 % |
44 +| Année de construction | 86.1 % (dont rôle : 30.6 %) |
45 45 | Taxes / évaluation municipale | 0.0 % |
46 −| Estimation Vrai-Prix (rôle) | 98.5 % |
46 +| Estimation Vrai-Prix (rôle) | 100.0 % |
47 47
48 48 ## Synchronisation
49 49
50 −- **Dernier sync** : 2026-08-18 12:51 — trouvé 66, +0 / ~0 / -0 — OK
50 +- **Dernier sync** : 2026-08-22 20:10 — trouvé 72, +0 / ~1 / -0 — OK
51 51 - **Erreurs récentes** : 0 sur les 10 derniers syncs
52 52
53 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).
modified docs/connecteurs/niddamour.md +3 −3
@@ -1,6 +1,6 @@
1 1 # Nid d'Amour Agence Immobilière (`niddamour`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -10,7 +10,7 @@
10 10 - **Type** : agence
11 11 - **Statut** : a_faire
12 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.
13 +> Plateforme source.immo (API publique api-v1.source.immo, config auto _configs.json). Inventaire = locations seulement (20 fiches lease/rent, 0 à vendre — vérifié 2026-08-23) ; le connecteur sale-only retourne 0. Généré par agences_source_immo.py.
14 14
15 15 ## Mécanique (introspection du code)
16 16
@@ -40,7 +40,7 @@ _Aucune annonce en base pour cette source (voir la note du registre : couverture
40 40
41 41 ## Synchronisation
42 42
43 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 0, +0 / ~0 / -0 — OK
43 +- **Dernier sync** : 2026-08-23 00:49 — trouvé 0, +0 / ~0 / -0 — OK
44 44 - **Erreurs récentes** : 0 sur les 10 derniers syncs
45 45
46 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).
modified docs/connecteurs/peladeau.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Péladeau Agence Immobilière (`peladeau`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,22 +38,22 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 47 |
42 −| Actives | 47 |
43 −| Visibles (après dédup) | 47 |
41 +| Annonces en base (toutes) | 49 |
42 +| Actives | 45 |
43 +| Visibles (après dédup) | 45 |
44 44 | Masquées par la dédup | 0 |
45 45 | GPS (lat/lng) | 100.0 % |
46 46 | Photos | 100.0 % |
47 47 | Prix | 100.0 % |
48 −| CAC (chambres) | 93.6 % |
49 −| SDB (salles de bains) | 95.7 % |
50 −| Année de construction | 93.6 % (dont rôle : 0.0 %) |
51 −| Taxes / évaluation municipale | 80.9 % |
48 +| CAC (chambres) | 93.3 % |
49 +| SDB (salles de bains) | 95.6 % |
50 +| Année de construction | 93.3 % (dont rôle : 0.0 %) |
51 +| Taxes / évaluation municipale | 82.2 % |
52 52 | Estimation Vrai-Prix (rôle) | 100.0 % |
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 47, +0 / ~47 / -0 — OK
57 −- **Erreurs récentes** : 0 sur les 6 derniers syncs
56 +- **Dernier sync** : 2026-08-23 00:52 — trouvé 45, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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/pmml.md +60 −0
@@ -0,0 +1,60 @@
1 +# PMML (`pmml`)
2 +
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://pmml.ca
8 +- **Recherche** : https://pmml.ca/proprietes-a-vendre/
9 +- **Couverture** : Toute la province — LA grande agence commerciale/multilogements indépendante (~485 inscriptions vente : plex, multis, terrains, industriel, bureaux)
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> SPA Svelte derrière Cloudflare mais API JSON interne ouverte (GET /api/proprietes/avendre?limit=1000 = tout l'inventaire en un appel, GPS + courtier inclus). Chaîne anti-bot BaseConnector pour le 403. Pas de description dans le flux → caractéristiques synthétiques. IDs internes (pas de n° Centris) → pas d'infixe _ag_.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/pmml.py` — classe `PmmlConnector`
18 +- Délai entre requêtes : 0.6 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/pmml.py : PMML (pmml.ca) — LA grande agence commerciale/
25 +> multilogements indépendante du Québec (plex, multis, terrains, industriel,
26 +> bureaux — ~550 inscriptions actives, toutes régions).
27 +> Le site est une SPA (Svelte + Mapbox) derrière Cloudflare, mais son API
28 +> JSON interne est ouverte : GET /api/proprietes/avendre?limit=1000 retourne
29 +> TOUT l'inventaire à vendre en un appel (prix demandé, GPS, adresse civique,
30 +> ville/région, unités rés./comm., superficies, année, courtier inscripteur,
31 +> slug de fiche, photo principale). La chaîne anti-bot de BaseConnector
32 +> (Oxylabs → Scrapfly → Bright Data) encaisse le 403 Cloudflare du direct.
33 +> Pas de description dans le flux → on synthétise ≥3 caractéristiques
34 +> structurées (unités, superficie, prix/logement…) pour la publication.
35 +> IDPropriete est interne (pas de n° Centris exposé) → pas d'infixe _ag_ ;
36 +> la dédup par adresse (inter-sources) couvre les recoupements éventuels.
37 +
38 +## Volumétrie & complétude (BD live)
39 +
40 +| Indicateur | Valeur |
41 +|---|---|
42 +| Annonces en base (toutes) | 461 |
43 +| Actives | 461 |
44 +| Visibles (après dédup) | 461 |
45 +| Masquées par la dédup | 0 |
46 +| GPS (lat/lng) | 98.3 % |
47 +| Photos | 100.0 % |
48 +| Prix | 97.8 % |
49 +| CAC (chambres) | 0.0 % |
50 +| SDB (salles de bains) | 0.0 % |
51 +| Année de construction | 76.4 % (dont rôle : 0.0 %) |
52 +| Taxes / évaluation municipale | 0.0 % |
53 +| Estimation Vrai-Prix (rôle) | 0.0 % |
54 +
55 +## Synchronisation
56 +
57 +- **Dernier sync** : 2026-08-23 00:41 — trouvé 485, +461 / ~24 / -0 — OK
58 +- **Erreurs récentes** : 0 sur les 1 derniers syncs
59 +
60 +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).
modified docs/connecteurs/profusion.md +12 −12
@@ -1,6 +1,6 @@
1 1 # Profusion Immobilier (Christie's) (`profusion`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -32,22 +32,22 @@
32 32
33 33 | Indicateur | Valeur |
34 34 |---|---|
35 −| Annonces en base (toutes) | 365 |
36 −| Actives | 353 |
37 −| Visibles (après dédup) | 353 |
35 +| Annonces en base (toutes) | 373 |
36 +| Actives | 355 |
37 +| Visibles (après dédup) | 355 |
38 38 | Masquées par la dédup | 0 |
39 −| GPS (lat/lng) | 66.9 % |
40 −| Photos | 70.8 % |
41 −| Prix | 59.5 % |
42 −| CAC (chambres) | 70.8 % |
43 −| SDB (salles de bains) | 13.0 % |
44 −| Année de construction | 61.5 % (dont rôle : 11.5 %) |
39 +| GPS (lat/lng) | 66.5 % |
40 +| Photos | 71.0 % |
41 +| Prix | 59.4 % |
42 +| CAC (chambres) | 71.0 % |
43 +| SDB (salles de bains) | 13.2 % |
44 +| Année de construction | 61.1 % (dont rôle : 0.0 %) |
45 45 | Taxes / évaluation municipale | 0.0 % |
46 −| Estimation Vrai-Prix (rôle) | 70.8 % |
46 +| Estimation Vrai-Prix (rôle) | 71.0 % |
47 47
48 48 ## Synchronisation
49 49
50 −- **Dernier sync** : 2026-08-18 12:51 — trouvé 353, +0 / ~0 / -0 — OK
50 +- **Dernier sync** : 2026-08-22 20:10 — trouvé 355, +0 / ~0 / -0 — OK
51 51 - **Erreurs récentes** : 0 sur les 10 derniers syncs
52 52
53 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).
modified docs/connecteurs/proprio_direct.md +8 −8
@@ -1,6 +1,6 @@
1 1 # Proprio Direct (`proprio_direct`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -32,22 +32,22 @@
32 32
33 33 | Indicateur | Valeur |
34 34 |---|---|
35 −| Annonces en base (toutes) | 2 561 |
36 −| Actives | 2 468 |
37 −| Visibles (après dédup) | 2 468 |
35 +| Annonces en base (toutes) | 2 668 |
36 +| Actives | 2 494 |
37 +| Visibles (après dédup) | 2 494 |
38 38 | Masquées par la dédup | 0 |
39 39 | GPS (lat/lng) | 100.0 % |
40 40 | Photos | 100.0 % |
41 41 | Prix | 100.0 % |
42 −| CAC (chambres) | 73.4 % |
43 −| SDB (salles de bains) | 72.6 % |
44 −| Année de construction | 67.6 % (dont rôle : 99.0 %) |
42 +| CAC (chambres) | 73.5 % |
43 +| SDB (salles de bains) | 72.8 % |
44 +| Année de construction | 68.0 % (dont rôle : 0.4 %) |
45 45 | Taxes / évaluation municipale | 90.3 % |
46 46 | Estimation Vrai-Prix (rôle) | 100.0 % |
47 47
48 48 ## Synchronisation
49 49
50 −- **Dernier sync** : 2026-08-18 12:51 — trouvé 2 465, +3 / ~5 / -1 — OK
50 +- **Dernier sync** : 2026-08-22 20:11 — trouvé 2 490, +2 / ~1 / -6 — OK
51 51 - **Erreurs récentes** : 0 sur les 10 derniers syncs
52 52
53 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).
modified docs/connecteurs/provad.md +3 −3
@@ -1,6 +1,6 @@
1 1 # Proulx Vadnais & Associés (`provad`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -53,7 +53,7 @@
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 81, +0 / ~81 / -0 — OK
57 −- **Erreurs récentes** : 0 sur les 6 derniers syncs
56 +- **Dernier sync** : 2026-08-23 00:52 — trouvé 81, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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/publimaison_ag_qc.md +61 −0
@@ -0,0 +1,61 @@
1 +# Publimaison.ca (`publimaison_ag_qc`)
2 +
3 +*Généré le 2026-08-23 00:54 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.publimaison.ca
8 +- **Recherche** : https://www.publimaison.ca/fr/recherche/
9 +- **Couverture** : Tout le Québec — 2e plateforme FSBO (~5 400 annonces, transferts Centris acceptés)
10 +- **Type** : fsbo
11 +- **Statut** : actif
12 +
13 +> Recherche SSR par pseudo-hash d'URL (8 cartes/page) ; détail HTML (galerie, code postal, taxes) via cache. source_id _ag_ = dédup Centris sur les transferts de courtiers ; annonces de particuliers toujours visibles.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/publimaison.py` — classe `PublimaisonConnector`
18 +- Délai entre requêtes : 0.25 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_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/publimaison.py : Publimaison.ca (FSBO + transferts Centris)
26 +> 2e plateforme « vente par le propriétaire » du Québec (~5 400 annonces),
27 +> qui accepte aussi les transferts Centris de courtiers (« No. MLS » affiché).
28 +> Recherche rendue SERVEUR pilotée par le pseudo-hash d'URL
29 +> (/fr/recherche/?hash=/…/nbr_item=8/page=N, page 0-indexée, 8 cartes/page,
30 +> total « Résultats de 1 à 8 sur NNNN »). Chaque carte porte déjà : réf MLS,
31 +> type, ville, prix, chambres, adresse, description et photo extralarge.
32 +> La fiche détail (HTML, sans JSON-LD) ajoute galerie complète, code postal,
33 +> pièces et dimensions, taxes et évaluation — enrichissement cache + plafond.
34 +> source_id « publimaison_ag_qc » : l'infixe _ag_ active la dédup Centris —
35 +> quand la réf de la carte est un n° MLS déjà porté par la bannière du
36 +> courtier, la fiche est masquée ; les annonces de particuliers (réf interne)
37 +> restent toujours visibles. Aucun double-comptage.
38 +
39 +## Volumétrie & complétude (BD live)
40 +
41 +| Indicateur | Valeur |
42 +|---|---|
43 +| Annonces en base (toutes) | 5 294 |
44 +| Actives | 5 080 |
45 +| Visibles (après dédup) | 1 383 |
46 +| Masquées par la dédup | 3 697 |
47 +| GPS (lat/lng) | 100.0 % |
48 +| Photos | 100.0 % |
49 +| Prix | 87.1 % |
50 +| CAC (chambres) | 99.4 % |
51 +| SDB (salles de bains) | 81.2 % |
52 +| Année de construction | 85.3 % (dont rôle : 0.3 %) |
53 +| Taxes / évaluation municipale | 92.0 % |
54 +| Estimation Vrai-Prix (rôle) | 100.0 % |
55 +
56 +## Synchronisation
57 +
58 +- **Dernier sync** : 2026-08-22 20:26 — trouvé 4 997, +0 / ~0 / -34 — OK
59 +- **Erreurs récentes** : 0 sur les 10 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/rciiq.md +27 −0
@@ -0,0 +1,27 @@
1 +# Annuaire RCIIQ (courtiers indépendants) (`rciiq`)
2 +
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://rciiq.ca
8 +- **Recherche** : https://rciiq.ca
9 +- **Couverture** : Regroupement des courtiers immobiliers indépendants du Québec
10 +- **Type** : annuaire
11 +- **Statut** : a_faire
12 +
13 +> Pas une source d'annonces : annuaire à prospecter pour découvrir de futures agences indépendantes (campagne connecteurs 2026-08-23).
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).
modified docs/connecteurs/realta.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Réalta Agence Immobilière (`realta`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,22 +38,22 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 86 |
42 −| Actives | 83 |
43 −| Visibles (après dédup) | 83 |
41 +| Annonces en base (toutes) | 92 |
42 +| Actives | 87 |
43 +| Visibles (après dédup) | 87 |
44 44 | Masquées par la dédup | 0 |
45 45 | GPS (lat/lng) | 100.0 % |
46 46 | Photos | 100.0 % |
47 47 | Prix | 100.0 % |
48 −| CAC (chambres) | 80.7 % |
49 −| SDB (salles de bains) | 78.3 % |
50 −| Année de construction | 80.7 % (dont rôle : 0.0 %) |
51 −| Taxes / évaluation municipale | 95.2 % |
52 −| Estimation Vrai-Prix (rôle) | 98.8 % |
48 +| CAC (chambres) | 81.6 % |
49 +| SDB (salles de bains) | 79.3 % |
50 +| Année de construction | 81.6 % (dont rôle : 0.0 %) |
51 +| Taxes / évaluation municipale | 93.1 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 83, +1 / ~82 / -0 — OK
56 +- **Dernier sync** : 2026-08-23 00:49 — trouvé 87, +0 / ~0 / -0 — OK
57 57 - **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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).
modified docs/connecteurs/realtor_ag_ca.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Realtor.ca (MLS Québec) (`realtor_ag_ca`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -54,22 +54,22 @@
54 54
55 55 | Indicateur | Valeur |
56 56 |---|---|
57 −| Annonces en base (toutes) | 2 344 |
58 −| Actives | 2 344 |
59 −| Visibles (après dédup) | 420 |
60 −| Masquées par la dédup | 1 924 |
57 +| Annonces en base (toutes) | 4 524 |
58 +| Actives | 2 187 |
59 +| Visibles (après dédup) | 298 |
60 +| Masquées par la dédup | 1 889 |
61 61 | GPS (lat/lng) | 100.0 % |
62 62 | Photos | 100.0 % |
63 63 | Prix | 100.0 % |
64 −| CAC (chambres) | 86.9 % |
65 −| SDB (salles de bains) | 86.9 % |
66 −| Année de construction | 82.4 % (dont rôle : 98.0 %) |
64 +| CAC (chambres) | 86.6 % |
65 +| SDB (salles de bains) | 86.6 % |
66 +| Année de construction | 82.9 % (dont rôle : 29.1 %) |
67 67 | Taxes / évaluation municipale | 0.0 % |
68 68 | Estimation Vrai-Prix (rôle) | 100.0 % |
69 69
70 70 ## Synchronisation
71 71
72 −- **Dernier sync** : 2026-08-18 23:52 — trouvé 0, +0 / ~0 / -0 — ÉCHEC (SCRAPFLY_KEY manquant (voir .env))
73 −- **Erreurs récentes** : 1 sur les 4 derniers syncs — dernière : 2026-08-18 23:52 « SCRAPFLY_KEY manquant (voir .env) »
72 +- **Dernier sync** : 2026-08-22 20:36 — trouvé 2 146, +40 / ~77 / -49 — OK
73 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
74 74
75 75 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).
modified docs/connecteurs/remax_quebec.md +11 −11
@@ -1,6 +1,6 @@
1 1 # RE/MAX Québec (`remax_quebec`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -36,22 +36,22 @@
36 36
37 37 | Indicateur | Valeur |
38 38 |---|---|
39 −| Annonces en base (toutes) | 26 753 |
40 −| Actives | 25 524 |
41 −| Visibles (après dédup) | 25 368 |
42 −| Masquées par la dédup | 156 |
39 +| Annonces en base (toutes) | 28 025 |
40 +| Actives | 25 738 |
41 +| Visibles (après dédup) | 25 538 |
42 +| Masquées par la dédup | 200 |
43 43 | GPS (lat/lng) | 100.0 % |
44 −| Photos | 100.0 % |
45 −| Prix | 83.9 % |
44 +| Photos | 99.8 % |
45 +| Prix | 84.0 % |
46 46 | CAC (chambres) | 79.1 % |
47 −| SDB (salles de bains) | 60.1 % |
48 −| Année de construction | 82.8 % (dont rôle : 0.0 %) |
49 −| Taxes / évaluation municipale | 77.2 % |
47 +| SDB (salles de bains) | 60.2 % |
48 +| Année de construction | 82.8 % (dont rôle : 0.4 %) |
49 +| Taxes / évaluation municipale | 77.4 % |
50 50 | Estimation Vrai-Prix (rôle) | 100.0 % |
51 51
52 52 ## Synchronisation
53 53
54 −- **Dernier sync** : 2026-08-18 13:20 — trouvé 25 504, +19 / ~23 / -16 — OK
54 +- **Dernier sync** : 2026-08-22 20:40 — trouvé 25 726, +34 / ~13 / -34 — OK
55 55 - **Erreurs récentes** : 0 sur les 10 derniers syncs
56 56
57 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).
modified docs/connecteurs/royal_lepage.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Royal LePage (Québec) (`royal_lepage`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -36,22 +36,22 @@
36 36
37 37 | Indicateur | Valeur |
38 38 |---|---|
39 −| Annonces en base (toutes) | 1 508 |
40 −| Actives | 1 055 |
41 −| Visibles (après dédup) | 976 |
42 −| Masquées par la dédup | 79 |
39 +| Annonces en base (toutes) | 1 914 |
40 +| Actives | 1 018 |
41 +| Visibles (après dédup) | 944 |
42 +| Masquées par la dédup | 74 |
43 43 | GPS (lat/lng) | 100.0 % |
44 44 | Photos | 100.0 % |
45 −| Prix | 78.4 % |
45 +| Prix | 77.6 % |
46 46 | CAC (chambres) | 88.0 % |
47 −| SDB (salles de bains) | 86.8 % |
48 −| Année de construction | 92.1 % (dont rôle : 0.9 %) |
49 −| Taxes / évaluation municipale | 73.5 % |
47 +| SDB (salles de bains) | 86.4 % |
48 +| Année de construction | 90.5 % (dont rôle : 3.9 %) |
49 +| Taxes / évaluation municipale | 73.1 % |
50 50 | Estimation Vrai-Prix (rôle) | 100.0 % |
51 51
52 52 ## Synchronisation
53 53
54 −- **Dernier sync** : 2026-08-18 13:21 — trouvé 1 011, +43 / ~17 / -4 — OK
54 +- **Dernier sync** : 2026-08-22 20:41 — trouvé 1 011, +6 / ~20 / -11 — OK
55 55 - **Erreurs récentes** : 0 sur les 10 derniers syncs
56 56
57 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).
modified docs/connecteurs/si_ag_ciemcq.md +12 −12
@@ -1,6 +1,6 @@
1 1 # Chambre immobilière Estrie–Mauricie–Centre-du-Québec (Mon-Toit) (`si_ag_ciemcq`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,22 +38,22 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 3 944 |
42 −| Actives | 3 919 |
43 −| Visibles (après dédup) | 1 164 |
44 −| Masquées par la dédup | 2 755 |
41 +| Annonces en base (toutes) | 4 117 |
42 +| Actives | 3 962 |
43 +| Visibles (après dédup) | 1 172 |
44 +| Masquées par la dédup | 2 790 |
45 45 | GPS (lat/lng) | 100.0 % |
46 46 | Photos | 100.0 % |
47 47 | Prix | 100.0 % |
48 −| CAC (chambres) | 69.1 % |
49 −| SDB (salles de bains) | 60.3 % |
50 −| Année de construction | 69.2 % (dont rôle : 0.0 %) |
51 −| Taxes / évaluation municipale | 84.5 % |
52 −| Estimation Vrai-Prix (rôle) | 100.0 % |
48 +| CAC (chambres) | 69.7 % |
49 +| SDB (salles de bains) | 61.5 % |
50 +| Année de construction | 69.5 % (dont rôle : 0.0 %) |
51 +| Taxes / évaluation municipale | 84.6 % |
52 +| Estimation Vrai-Prix (rôle) | 99.9 % |
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 3 919, +0 / ~1164 / -12 — OK
57 −- **Erreurs récentes** : 0 sur les 6 derniers syncs
56 +- **Dernier sync** : 2026-08-23 00:52 — trouvé 3 960, +2 / ~399 / -2 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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).
modified docs/connecteurs/si_ag_jga.md +4 −4
@@ -1,6 +1,6 @@
1 1 # JGA Équipe Commerciale (Royal LePage) (`si_ag_jga`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,7 +38,7 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 64 |
41 +| Annonces en base (toutes) | 65 |
42 42 | Actives | 64 |
43 43 | Visibles (après dédup) | 59 |
44 44 | Masquées par la dédup | 5 |
@@ -53,7 +53,7 @@
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 64, +0 / ~60 / -0 — OK
57 −- **Erreurs récentes** : 0 sur les 6 derniers syncs
56 +- **Dernier sync** : 2026-08-23 00:52 — trouvé 64, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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).
modified docs/connecteurs/si_ag_katiasamson.md +9 −9
@@ -1,6 +1,6 @@
1 1 # Katia Samson (RE/MAX L'Espace) (`si_ag_katiasamson`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,22 +38,22 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 31 |
41 +| Annonces en base (toutes) | 32 |
42 42 | Actives | 31 |
43 −| Visibles (après dédup) | 26 |
44 −| Masquées par la dédup | 5 |
43 +| Visibles (après dédup) | 25 |
44 +| Masquées par la dédup | 6 |
45 45 | GPS (lat/lng) | 100.0 % |
46 46 | Photos | 100.0 % |
47 47 | Prix | 100.0 % |
48 −| CAC (chambres) | 96.2 % |
49 −| SDB (salles de bains) | 96.2 % |
48 +| CAC (chambres) | 96.0 % |
49 +| SDB (salles de bains) | 96.0 % |
50 50 | Année de construction | 100.0 % (dont rôle : 0.0 %) |
51 −| Taxes / évaluation municipale | 96.2 % |
51 +| Taxes / évaluation municipale | 96.0 % |
52 52 | Estimation Vrai-Prix (rôle) | 100.0 % |
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 31, +0 / ~26 / -0 — OK
57 −- **Erreurs récentes** : 0 sur les 6 derniers syncs
56 +- **Dernier sync** : 2026-08-23 00:52 — trouvé 31, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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).
modified docs/connecteurs/si_ag_theagency.md +12 −12
@@ -1,6 +1,6 @@
1 1 # The Agency Montréal (`si_ag_theagency`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -38,22 +38,22 @@
38 38
39 39 | Indicateur | Valeur |
40 40 |---|---|
41 −| Annonces en base (toutes) | 311 |
42 −| Actives | 306 |
43 −| Visibles (après dédup) | 236 |
44 −| Masquées par la dédup | 70 |
41 +| Annonces en base (toutes) | 323 |
42 +| Actives | 308 |
43 +| Visibles (après dédup) | 239 |
44 +| Masquées par la dédup | 69 |
45 45 | GPS (lat/lng) | 100.0 % |
46 46 | Photos | 100.0 % |
47 47 | Prix | 100.0 % |
48 −| CAC (chambres) | 81.8 % |
49 −| SDB (salles de bains) | 77.5 % |
50 −| Année de construction | 90.3 % (dont rôle : 0.0 %) |
51 −| Taxes / évaluation municipale | 92.8 % |
52 −| Estimation Vrai-Prix (rôle) | 99.6 % |
48 +| CAC (chambres) | 80.3 % |
49 +| SDB (salles de bains) | 76.2 % |
50 +| Année de construction | 88.7 % (dont rôle : 0.5 %) |
51 +| Taxes / évaluation municipale | 91.6 % |
52 +| Estimation Vrai-Prix (rôle) | 100.0 % |
53 53
54 54 ## Synchronisation
55 55
56 −- **Dernier sync** : 2026-08-19 00:47 — trouvé 305, +1 / ~235 / -0 — OK
57 −- **Erreurs récentes** : 0 sur les 9 derniers syncs
56 +- **Dernier sync** : 2026-08-23 00:50 — trouvé 308, +0 / ~0 / -0 — OK
57 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
58 58
59 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).
modified docs/connecteurs/sothebys_quebec.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Sotheby's International Realty Québec (`sothebys_quebec`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -41,22 +41,22 @@
41 41
42 42 | Indicateur | Valeur |
43 43 |---|---|
44 −| Annonces en base (toutes) | 869 |
45 −| Actives | 869 |
46 −| Visibles (après dédup) | 869 |
47 −| Masquées par la dédup | 0 |
44 +| Annonces en base (toutes) | 898 |
45 +| Actives | 871 |
46 +| Visibles (après dédup) | 870 |
47 +| Masquées par la dédup | 1 |
48 48 | GPS (lat/lng) | 99.8 % |
49 −| Photos | 96.4 % |
49 +| Photos | 100.0 % |
50 50 | Prix | 100.0 % |
51 −| CAC (chambres) | 77.7 % |
52 −| SDB (salles de bains) | 74.6 % |
53 −| Année de construction | 60.6 % (dont rôle : 76.1 %) |
51 +| CAC (chambres) | 77.8 % |
52 +| SDB (salles de bains) | 74.5 % |
53 +| Année de construction | 60.5 % (dont rôle : 2.1 %) |
54 54 | Taxes / évaluation municipale | 0.0 % |
55 55 | Estimation Vrai-Prix (rôle) | 100.0 % |
56 56
57 57 ## Synchronisation
58 58
59 −- **Dernier sync** : 2026-08-18 13:26 — trouvé 869, +0 / ~199 / -0 — OK
59 +- **Dernier sync** : 2026-08-22 20:42 — trouvé 869, +1 / ~2 / -0 — OK
60 60 - **Erreurs récentes** : 0 sur les 10 derniers syncs
61 61
62 62 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/stuart.md +62 −0
@@ -0,0 +1,62 @@
1 +# Les Immeubles Stuart (`stuart`)
2 +
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://immeublesstuart.ca
8 +- **Recherche** : https://immeublesstuart.ca/proprietes/
9 +- **Couverture** : Rive-Sud de Montréal (Saint-Lambert, Brossard, Longueuil…) — ~54 inscriptions vente
10 +- **Type** : agence
11 +- **Statut** : actif
12 +
13 +> Plateforme « Ma Clé » (photos S3 maclebrokers) : liste SSR une page + JSON-LD RealEstateListing très riche (extensions mc:* — caractéristiques, taxes, évaluations, agent). N° Centris exposés mais agence première main → pas d'infixe _ag_ (ses fiches battent les copies portails).
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/immeubles_stuart.py` — classe `ImmeublesStuartConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_STUART_DETAIL_LIMIT` (défaut 120)
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/immeubles_stuart.py : Les Immeubles Stuart (immeublesstuart.ca) —
26 +> agence indépendante de la Rive-Sud de Montréal (Saint-Lambert, Brossard,
27 +> Longueuil…), ~50 inscriptions en vente.
28 +> Site WordPress propulsé par la plateforme « Ma Clé » (photos sur
29 +> maclebrokers-photos.s3.amazonaws.com). Liste /proprietes/ rendue serveur,
30 +> une seule page : cartes <article class="propriete-card"> (data-ville,
31 +> data-prix, adresse, MLS Centris, chambres/salles de bain). On ne garde que
32 +> les URLs « -a-vendre » (les « -a-louer » sont des locations).
33 +> Fiche détail : JSON-LD RealEstateListing très riche avec extensions mc:*
34 +> (caractéristiques, taxes, évaluations, inclusions/exclusions, addenda,
35 +> agent nom/téléphone) + galerie S3 ({mls}{n}.jpg — exclure photo_membre).
36 +> Pas de GPS sur la fiche (code postal seulement). Enrichissement du.enrich.
37 +> Agence première main (pas d'infixe _ag_) : ses fiches battent les copies
38 +> portails au même n° Centris dans la dédup.
39 +
40 +## Volumétrie & complétude (BD live)
41 +
42 +| Indicateur | Valeur |
43 +|---|---|
44 +| Annonces en base (toutes) | 54 |
45 +| Actives | 54 |
46 +| Visibles (après dédup) | 53 |
47 +| Masquées par la dédup | 1 |
48 +| GPS (lat/lng) | 7.5 % |
49 +| Photos | 100.0 % |
50 +| Prix | 100.0 % |
51 +| CAC (chambres) | 90.6 % |
52 +| SDB (salles de bains) | 88.7 % |
53 +| Année de construction | 98.1 % (dont rôle : 0.0 %) |
54 +| Taxes / évaluation municipale | 94.3 % |
55 +| Estimation Vrai-Prix (rôle) | 0.0 % |
56 +
57 +## Synchronisation
58 +
59 +- **Dernier sync** : 2026-08-23 00:46 — trouvé 54, +54 / ~0 / -0 — OK
60 +- **Erreurs récentes** : 0 sur les 1 derniers syncs
61 +
62 +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).
modified docs/connecteurs/sutton.md +12 −12
@@ -1,6 +1,6 @@
1 1 # Groupe Sutton Québec (`sutton`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -29,22 +29,22 @@
29 29
30 30 | Indicateur | Valeur |
31 31 |---|---|
32 −| Annonces en base (toutes) | 4 765 |
33 −| Actives | 4 585 |
34 −| Visibles (après dédup) | 4 572 |
35 −| Masquées par la dédup | 13 |
32 +| Annonces en base (toutes) | 4 940 |
33 +| Actives | 4 574 |
34 +| Visibles (après dédup) | 4 559 |
35 +| Masquées par la dédup | 15 |
36 36 | GPS (lat/lng) | 94.4 % |
37 −| Photos | 91.3 % |
38 −| Prix | 91.3 % |
39 −| CAC (chambres) | 91.5 % |
40 −| SDB (salles de bains) | 90.6 % |
41 −| Année de construction | 77.1 % (dont rôle : 9.5 %) |
42 −| Taxes / évaluation municipale | 90.0 % |
37 +| Photos | 91.1 % |
38 +| Prix | 91.1 % |
39 +| CAC (chambres) | 91.3 % |
40 +| SDB (salles de bains) | 90.3 % |
41 +| Année de construction | 77.4 % (dont rôle : 5.9 %) |
42 +| Taxes / évaluation municipale | 89.8 % |
43 43 | Estimation Vrai-Prix (rôle) | 100.0 % |
44 44
45 45 ## Synchronisation
46 46
47 −- **Dernier sync** : 2026-08-18 13:32 — trouvé 4 575, +1 / ~379 / -10 — OK
47 +- **Dernier sync** : 2026-08-22 20:43 — trouvé 4 535, +13 / ~232 / -0 — OK
48 48 - **Erreurs récentes** : 0 sur les 10 derniers syncs
49 49
50 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).
modified docs/connecteurs/ubee.md +8 −8
@@ -1,6 +1,6 @@
1 1 # Ubee (`ubee`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -40,22 +40,22 @@
40 40
41 41 | Indicateur | Valeur |
42 42 |---|---|
43 −| Annonces en base (toutes) | 1 236 |
44 −| Actives | 1 211 |
45 −| Visibles (après dédup) | 1 187 |
46 −| Masquées par la dédup | 24 |
43 +| Annonces en base (toutes) | 1 264 |
44 +| Actives | 1 186 |
45 +| Visibles (après dédup) | 1 161 |
46 +| Masquées par la dédup | 25 |
47 47 | GPS (lat/lng) | 100.0 % |
48 −| Photos | 99.9 % |
48 +| Photos | 100.0 % |
49 49 | Prix | 100.0 % |
50 50 | CAC (chambres) | 100.0 % |
51 51 | SDB (salles de bains) | 100.0 % |
52 52 | Année de construction | 100.0 % (dont rôle : 0.0 %) |
53 −| Taxes / évaluation municipale | 92.2 % |
53 +| Taxes / évaluation municipale | 91.9 % |
54 54 | Estimation Vrai-Prix (rôle) | 100.0 % |
55 55
56 56 ## Synchronisation
57 57
58 −- **Dernier sync** : 2026-08-18 20:56 — trouvé 1 210, +3 / ~1207 / -4 — OK
58 +- **Dernier sync** : 2026-08-22 20:44 — trouvé 1 186, +2 / ~0 / -0 — OK
59 59 - **Erreurs récentes** : 0 sur les 10 derniers syncs
60 60
61 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).
modified docs/connecteurs/vendirect.md +11 −11
@@ -1,6 +1,6 @@
1 1 # Vendirect (`vendirect`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -31,22 +31,22 @@
31 31
32 32 | Indicateur | Valeur |
33 33 |---|---|
34 −| Annonces en base (toutes) | 1 206 |
35 −| Actives | 1 173 |
36 −| Visibles (après dédup) | 1 144 |
37 −| Masquées par la dédup | 29 |
34 +| Annonces en base (toutes) | 1 249 |
35 +| Actives | 1 177 |
36 +| Visibles (après dédup) | 1 146 |
37 +| Masquées par la dédup | 31 |
38 38 | GPS (lat/lng) | 97.6 % |
39 −| Photos | 99.9 % |
39 +| Photos | 100.0 % |
40 40 | Prix | 100.0 % |
41 −| CAC (chambres) | 75.2 % |
42 −| SDB (salles de bains) | 73.3 % |
43 −| Année de construction | 79.0 % (dont rôle : 0.0 %) |
44 −| Taxes / évaluation municipale | 83.9 % |
41 +| CAC (chambres) | 75.0 % |
42 +| SDB (salles de bains) | 73.2 % |
43 +| Année de construction | 78.8 % (dont rôle : 0.2 %) |
44 +| Taxes / évaluation municipale | 84.1 % |
45 45 | Estimation Vrai-Prix (rôle) | 100.0 % |
46 46
47 47 ## Synchronisation
48 48
49 −- **Dernier sync** : 2026-08-18 19:05 — trouvé 1 173, +0 / ~1173 / -1 — OK
49 +- **Dernier sync** : 2026-08-22 20:44 — trouvé 1 177, +2 / ~4 / -2 — OK
50 50 - **Erreurs récentes** : 0 sur les 10 derniers syncs
51 51
52 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/vendre_ag_ca.md +60 −0
@@ -0,0 +1,60 @@
1 +# Vendre.ca (`vendre_ag_ca`)
2 +
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://vendre.ca
8 +- **Recherche** : https://vendre.ca/fr
9 +- **Couverture** : Tout le Québec — portail hybride courtiers + vendeurs privés (~9 500 fiches)
10 +- **Type** : portail
11 +- **Statut** : actif
12 +
13 +> Énumération exhaustive via 4 sitemaps de catégorie (res/mpx/com/lnd) ; fiche = JSON-LD (adresse, géoloc, MLS, courtier). source_id _ag_ = dédup Centris : fiches de courtiers couverts masquées, vendeurs privés (VID) toujours visibles.
14 +
15 +## Mécanique (introspection du code)
16 +
17 +- Module : `immoka/connectors/vendre_ca.py` — classe `VendreCaConnector`
18 +- Délai entre requêtes : 0.4 s ; cache détail BD : oui
19 +- Budgets env (enrichissement détail plafonné/exécution) : `IMMOKA_VENDRE_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/vendre_ca.py : Vendre.ca (portail hybride courtiers + vendeurs privés)
26 +> Portail québécois (~9 500 fiches) mêlant inscriptions de courtiers (avec
27 +> n° MLS/Centris) et vendeurs privés. Énumération EXHAUSTIVE via les 4
28 +> sitemaps de catégorie (res/mpx/com/lnd) : l'URL FR encode type, ville,
29 +> adresse et le VID (identifiant Vendre.ca). La fiche détail (JSON-LD
30 +> Place + RealEstateListing + Offer) fournit adresse exacte, géoloc, prix,
31 +> année, courtier, description et le n° MLS ; galerie cloud.vendre.ca (_lrg).
32 +> source_id « vendre_ag_ca » : l'infixe _ag_ active la déduplication Centris
33 +> (db.refresh_dedup). Quand le n° MLS est connu, il devient l'external_id —
34 +> les fiches déjà portées par la bannière du courtier (RE/MAX, Royal LePage…)
35 +> sont masquées ; les fiches uniques (vendeurs privés = VID, courtiers non
36 +> couverts) restent visibles. Aucun double-comptage.
37 +
38 +## Volumétrie & complétude (BD live)
39 +
40 +| Indicateur | Valeur |
41 +|---|---|
42 +| Annonces en base (toutes) | 17 213 |
43 +| Actives | 7 011 |
44 +| Visibles (après dédup) | 2 674 |
45 +| Masquées par la dédup | 4 337 |
46 +| GPS (lat/lng) | 83.9 % |
47 +| Photos | 93.0 % |
48 +| Prix | 99.9 % |
49 +| CAC (chambres) | 69.0 % |
50 +| SDB (salles de bains) | 61.7 % |
51 +| Année de construction | 76.2 % (dont rôle : 1.1 %) |
52 +| Taxes / évaluation municipale | 0.0 % |
53 +| Estimation Vrai-Prix (rôle) | 100.0 % |
54 +
55 +## Synchronisation
56 +
57 +- **Dernier sync** : 2026-08-22 20:44 — trouvé 7 011, +0 / ~0 / -0 — OK
58 +- **Erreurs récentes** : 0 sur les 10 derniers syncs
59 +
60 +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/versants.md +27 −0
@@ -0,0 +1,27 @@
1 +# Les Versants Mont-Tremblant (`versants`)
2 +
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://lesversants.com
8 +- **Recherche** : https://lesversants.com/recherche-de-propriete/
9 +- **Couverture** : Mont-Tremblant et Laurentides
10 +- **Type** : agence
11 +- **Statut** : a_faire
12 +
13 +> Sondé 2026-08-23 : page recherche lourde (500 Ko) sans JSON-LD. ⚠️ Vérifier d'abord le recoupement Centris avec domicilia/vendre_ag_ca (même leçon que MTRE : probablement redondant).
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).
modified docs/connecteurs/via_ag_acces.md +5 −5
@@ -1,6 +1,6 @@
1 1 # Via Capitale Acces (`via_ag_acces`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -36,10 +36,10 @@
36 36
37 37 | Indicateur | Valeur |
38 38 |---|---|
39 −| Annonces en base (toutes) | 187 |
40 −| Actives | 182 |
39 +| Annonces en base (toutes) | 193 |
40 +| Actives | 181 |
41 41 | Visibles (après dédup) | 7 |
42 −| Masquées par la dédup | 175 |
42 +| Masquées par la dédup | 174 |
43 43 | GPS (lat/lng) | 100.0 % |
44 44 | Photos | 100.0 % |
45 45 | Prix | 100.0 % |
@@ -51,7 +51,7 @@
51 51
52 52 ## Synchronisation
53 53
54 −- **Dernier sync** : 2026-08-18 19:06 — trouvé 181, +0 / ~181 / -0 — OK
54 +- **Dernier sync** : 2026-08-22 20:48 — trouvé 181, +0 / ~0 / -0 — OK
55 55 - **Erreurs récentes** : 0 sur les 10 derniers syncs
56 56
57 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).
modified docs/connecteurs/via_ag_dumontroyal.md +1 −1
@@ -1,6 +1,6 @@
1 1 # Via Capitale Dumontroyal (`via_ag_dumontroyal`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
modified docs/connecteurs/via_ag_elite.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Via Capitale Elite (`via_ag_elite`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -36,22 +36,22 @@
36 36
37 37 | Indicateur | Valeur |
38 38 |---|---|
39 −| Annonces en base (toutes) | 327 |
40 −| Actives | 316 |
41 −| Visibles (après dédup) | 9 |
42 −| Masquées par la dédup | 307 |
39 +| Annonces en base (toutes) | 341 |
40 +| Actives | 313 |
41 +| Visibles (après dédup) | 15 |
42 +| Masquées par la dédup | 298 |
43 43 | GPS (lat/lng) | 100.0 % |
44 44 | Photos | 100.0 % |
45 45 | Prix | 100.0 % |
46 −| CAC (chambres) | 66.7 % |
47 −| SDB (salles de bains) | 55.6 % |
48 −| Année de construction | 77.8 % (dont rôle : 0.0 %) |
49 −| Taxes / évaluation municipale | 88.9 % |
46 +| CAC (chambres) | 40.0 % |
47 +| SDB (salles de bains) | 33.3 % |
48 +| Année de construction | 46.7 % (dont rôle : 0.0 %) |
49 +| Taxes / évaluation municipale | 66.7 % |
50 50 | Estimation Vrai-Prix (rôle) | 100.0 % |
51 51
52 52 ## Synchronisation
53 53
54 −- **Dernier sync** : 2026-08-18 19:08 — trouvé 316, +0 / ~316 / -1 — OK
54 +- **Dernier sync** : 2026-08-22 20:48 — trouvé 313, +1 / ~0 / -1 — OK
55 55 - **Erreurs récentes** : 0 sur les 10 derniers syncs
56 56
57 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).
modified docs/connecteurs/via_ag_select.md +10 −10
@@ -1,6 +1,6 @@
1 1 # Via Capitale Select (`via_ag_select`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -36,22 +36,22 @@
36 36
37 37 | Indicateur | Valeur |
38 38 |---|---|
39 −| Annonces en base (toutes) | 619 |
40 −| Actives | 585 |
41 −| Visibles (après dédup) | 14 |
42 −| Masquées par la dédup | 571 |
39 +| Annonces en base (toutes) | 660 |
40 +| Actives | 597 |
41 +| Visibles (après dédup) | 15 |
42 +| Masquées par la dédup | 582 |
43 43 | GPS (lat/lng) | 100.0 % |
44 44 | Photos | 100.0 % |
45 45 | Prix | 100.0 % |
46 −| CAC (chambres) | 78.6 % |
47 −| SDB (salles de bains) | 71.4 % |
48 −| Année de construction | 100.0 % (dont rôle : 0.0 %) |
49 −| Taxes / évaluation municipale | 92.9 % |
46 +| CAC (chambres) | 66.7 % |
47 +| SDB (salles de bains) | 60.0 % |
48 +| Année de construction | 86.7 % (dont rôle : 0.0 %) |
49 +| Taxes / évaluation municipale | 86.7 % |
50 50 | Estimation Vrai-Prix (rôle) | 100.0 % |
51 51
52 52 ## Synchronisation
53 53
54 −- **Dernier sync** : 2026-08-18 19:15 — trouvé 580, +3 / ~577 / -2 — OK
54 +- **Dernier sync** : 2026-08-22 20:49 — trouvé 597, +1 / ~0 / -2 — OK
55 55 - **Erreurs récentes** : 0 sur les 10 derniers syncs
56 56
57 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).
modified docs/connecteurs/via_capitale.md +11 −11
@@ -1,6 +1,6 @@
1 1 # Via Capitale (`via_capitale`)
2 2
3 −*Généré le 2026-08-19 00:49 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 4
5 5 ## Registre (`data/sources.json`)
6 6
@@ -33,22 +33,22 @@
33 33
34 34 | Indicateur | Valeur |
35 35 |---|---|
36 −| Annonces en base (toutes) | 5 474 |
37 −| Actives | 5 200 |
38 −| Visibles (après dédup) | 5 145 |
39 −| Masquées par la dédup | 55 |
36 +| Annonces en base (toutes) | 5 723 |
37 +| Actives | 5 112 |
38 +| Visibles (après dédup) | 5 045 |
39 +| Masquées par la dédup | 67 |
40 40 | GPS (lat/lng) | 96.9 % |
41 41 | Photos | 99.9 % |
42 −| Prix | 78.7 % |
43 −| CAC (chambres) | 26.8 % |
44 −| SDB (salles de bains) | 11.2 % |
45 −| Année de construction | 69.4 % (dont rôle : 66.7 %) |
46 −| Taxes / évaluation municipale | 87.2 % |
42 +| Prix | 78.6 % |
43 +| CAC (chambres) | 79.8 % |
44 +| SDB (salles de bains) | 76.1 % |
45 +| Année de construction | 73.8 % (dont rôle : 0.2 %) |
46 +| Taxes / évaluation municipale | 87.1 % |
47 47 | Estimation Vrai-Prix (rôle) | 100.0 % |
48 48
49 49 ## Synchronisation
50 50
51 −- **Dernier sync** : 2026-08-18 13:37 — trouvé 5 200, +0 / ~200 / -0 — OK
51 +- **Dernier sync** : 2026-08-22 20:48 — trouvé 5 112, +0 / ~200 / -0 — OK
52 52 - **Erreurs récentes** : 0 sur les 10 derniers syncs
53 53
54 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/vistoo.md +27 −0
@@ -0,0 +1,27 @@
1 +# Vistoo (`vistoo`)
2 +
3 +*Généré le 2026-08-23 00:54 par `scripts/gen_connector_docs.py` — fichier produit automatiquement, ne pas éditer à la main.*
4 +
5 +## Registre (`data/sources.json`)
6 +
7 +- **Site** : https://vistoo.com
8 +- **Recherche** : https://vistoo.com/fr/achat-vente
9 +- **Couverture** : Portail pancanadien (QC minoritaire)
10 +- **Type** : portail
11 +- **Statut** : a_faire
12 +
13 +> Sondé 2026-08-23 : le sitemap fr/achat-vente ne liste que des pages catégories/villes (incl. Alberta/Ontario), pas de fiches — il faudrait cracker leur API de recherche. Dépriorisé.
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 immoka/connectors/duquesimms.py +184 −0
@@ -0,0 +1,184 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# connectors/duquesimms.py : Duque Simms (duquesimms.com) — agence indépendante
5 +# de Montréal (NDG, Côte-des-Neiges, Ouest-de-l'Île), ~25 inscriptions.
6 +#
7 +# Site WordPress/Elementor (plateforme proprius/e-mmobilier, photos sur
8 +# cdn.proprius.e-mmobilier.ca). Découverte par property-sitemap.xml : URLs
9 +# fr /property/{n° Centris}/ (les /en/ sont des doublons de langue).
10 +#
11 +# TOUT vient de la fiche détail (du.enrich) : JSON-LD RealEstateListing
12 +# (description, contentLocation adresse complète + GPS, offers[].price avec
13 +# businessFunction Sell, keywords = type, seller = courtier nom/téléphone)
14 +# + blocs HTML property-characteristic (libellé/valeurs), property-expense
15 +# (taxes, énergie), property-evaluation, compteurs chambres/salles de bain
16 +# (icônes bedroom.svg/bathroom.svg suivies du nombre), galerie swiper
17 +# cdn …-pi.jpg (les -c.jpg sont des portraits). Les locations (prix de
18 +# loyer) sont écartées par le seuil de prix vente.
19 +#
20 +# Agence première main (pas d'infixe _ag_) : ses fiches battent les copies
21 +# portails au même n° Centris dans la dédup.
22 +# -----------------------------------------------------------------------------
23 +from __future__ import annotations
24 +
25 +import html as _html
26 +import os
27 +import re
28 +
29 +from .base import BaseConnector
30 +from . import _detailutil as du
31 +from ..schema import PropertyListing
32 +
33 +SITE = "https://duquesimms.com"
34 +SITEMAP = SITE + "/property-sitemap.xml"
35 +AGENCY = "Duque Simms"
36 +DETAIL_LIMIT = int(os.environ.get("IMMOKA_DUQUESIMMS_DETAIL_LIMIT", "80"))
37 +MIN_SALE_PRICE = 20000 # sous ce prix : loyer mensuel (location) → écarté
38 +
39 +_LOC_RE = re.compile(r"<loc>\s*(https://duquesimms\.com/property/(\d{6,10})/?)\s*</loc>")
40 +_ADDR_RE = re.compile(r"^(.*?),\s*(.+?)\s*([A-Z]\d[A-Z]\s?\d[A-Z]\d)?$")
41 +_CHAR_RE = re.compile(r'property-characteristic-type">(.*?)</span>(.*?)</div>', re.S)
42 +_SUBVAL_RE = re.compile(r'property-subcharacteristic-value">(.*?)</span>', re.S)
43 +_EXP_RE = re.compile(r'property-expense-label">(.*?)</span>.*?property-money-amount">'
44 + r'([\d\s ,]+)</span>', re.S)
45 +_EVAL_RE = re.compile(r'property-evaluation-label">(.*?)</span>.*?property-money-amount">'
46 + r'([\d\s ,]+)</span>', re.S)
47 +_BEDS_RE = re.compile(r'bedroom\.svg.{0,900}?elementor-widget-container">\s*(\d+)\s*<', re.S)
48 +_BATHS_RE = re.compile(r'bathroom\.svg.{0,900}?elementor-widget-container">\s*(\d+)\s*<', re.S)
49 +_IMG_RE = re.compile(r'https://cdn\.proprius\.e-mmobilier\.ca/([A-Z0-9]+-pi)\.jpe?g', re.I)
50 +
51 +
52 +class DuqueSimmsConnector(BaseConnector):
53 + source_id = "duquesimms"
54 + request_delay = 0.4
55 +
56 + def fetch(self) -> list[PropertyListing]:
57 + xml = self.get(SITEMAP).text
58 + by_id: dict[str, PropertyListing] = {}
59 + for url, mls in _LOC_RE.findall(xml):
60 + by_id.setdefault(mls, PropertyListing(
61 + source=self.source_id, external_id=mls,
62 + url=url if url.endswith("/") else url + "/",
63 + title="", mls=mls, agency=AGENCY, broker_name=AGENCY,
64 + ))
65 + listings = list(by_id.values())
66 + du.enrich(self, listings, DETAIL_LIMIT, _parse_detail, key="v1")
67 + out = []
68 + for lst in listings:
69 + if not lst.price or lst.price < MIN_SALE_PRICE:
70 + continue # location (loyer) ou fiche vide
71 + if not lst.title:
72 + lst.title = f"{lst.property_type or 'Propriété'} à vendre — " \
73 + f"{lst.address or lst.city}".strip(" —")
74 + if lst.price and not lst.price_label:
75 + lst.price_label = f"{int(lst.price):,} $".replace(",", " ")
76 + out.append(lst)
77 + return out
78 +
79 +
80 +def _txt(s: str) -> str:
81 + return re.sub(r"\s+", " ", _html.unescape(re.sub(r"<[^>]+>", " ", s))).strip()
82 +
83 +
84 +def _parse_detail(html: str) -> dict:
85 + node = None
86 + for n in du.ld_nodes(html):
87 + if n.get("@type") == "RealEstateListing":
88 + node = n
89 + break
90 + if node is None:
91 + return {}
92 + out: dict = {}
93 + details: dict = {}
94 + features: list[str] = []
95 +
96 + desc = _html.unescape(str(node.get("description") or "")).strip()
97 + if desc:
98 + out["description"] = desc
99 +
100 + kw = node.get("keywords") or []
101 + if isinstance(kw, str):
102 + kw = [kw]
103 + if kw:
104 + out["property_type"] = str(kw[0]).strip()
105 + details["Type de propriété"] = out["property_type"]
106 + if len(kw) > 1:
107 + details["Catégorie"] = str(kw[1]).strip()
108 +
109 + loc = node.get("contentLocation") or {}
110 + if isinstance(loc, dict):
111 + full = _html.unescape(str(loc.get("address") or "")).strip()
112 + m = _ADDR_RE.match(full)
113 + if m:
114 + out["address"] = m.group(1).strip()
115 + out["city"] = m.group(2).strip()
116 + if m.group(3):
117 + details["Code postal"] = m.group(3)
118 + elif full:
119 + out["address"] = full
120 + try:
121 + out["lat"], out["lng"] = float(loc["latitude"]), float(loc["longitude"])
122 + except (KeyError, TypeError, ValueError):
123 + pass
124 +
125 + offers = node.get("offers") or []
126 + if isinstance(offers, dict):
127 + offers = [offers]
128 + sellers: list[str] = []
129 + for off in offers:
130 + if not isinstance(off, dict):
131 + continue
132 + if "Sell" not in str(off.get("businessFunction") or "Sell"):
133 + continue
134 + if out.get("price") is None and off.get("price"):
135 + try:
136 + out["price"] = float(str(off["price"]).replace(" ", ""))
137 + except ValueError:
138 + pass
139 + seller = off.get("seller") or {}
140 + if isinstance(seller, dict) and seller.get("name"):
141 + name = str(seller["name"]).strip()
142 + if name not in sellers:
143 + sellers.append(name)
144 + if "broker_phone" not in out:
145 + tel = str(seller.get("telephone") or "").strip()
146 + if re.fullmatch(r"\d{10}", tel):
147 + out["broker_phone"] = f"{tel[:3]} {tel[3:6]}-{tel[6:]}"
148 + if sellers:
149 + out["broker_name"] = " et ".join(sellers[:2])
150 +
151 + bm, tm = _BEDS_RE.search(html), _BATHS_RE.search(html)
152 + if bm:
153 + out["bedrooms"] = int(bm.group(1))
154 + if tm:
155 + out["bathrooms"] = int(tm.group(1))
156 +
157 + for label, blob in _CHAR_RE.findall(html):
158 + label = _txt(label)
159 + vals = [_txt(v) for v in _SUBVAL_RE.findall(blob)]
160 + vals = [v for v in vals if v]
161 + if label and vals:
162 + details[label] = ", ".join(vals)
163 + features.append(f"{label} : {details[label]}"
164 + if len(details[label]) < 40 else label)
165 +
166 + for rx in (_EXP_RE, _EVAL_RE):
167 + for label, amount in rx.findall(html):
168 + label, amount = _txt(label), _txt(amount).replace(" ", " ")
169 + if label and amount:
170 + details[label] = f"{amount} $"
171 +
172 + imgs, seen = [], set()
173 + for base in _IMG_RE.findall(html):
174 + if base not in seen:
175 + seen.add(base)
176 + imgs.append(f"https://cdn.proprius.e-mmobilier.ca/{base}.jpg")
177 + if imgs:
178 + out["images"] = imgs
179 +
180 + if details:
181 + out["details"] = details
182 + if features:
183 + out["features"] = features
184 + return out
added immoka/connectors/fb_marketplace.py +261 −0
@@ -0,0 +1,261 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# connectors/fb_marketplace.py : Facebook Marketplace (propriétés à vendre)
5 +# via l'acteur Apify maison gorgeous_thistle/ka-fb-immo (jumeau « vente »
6 +# de ka-fb-marketplace utilisé par Lou-Ka pour les locations).
7 +#
8 +# L'acteur scrape le Marketplace public DÉCONNECTÉ (JSON préchargé du HTML,
9 +# proxy résidentiel CA) : phase recherche (33 villes × tranches de prix)
10 +# puis fiches détail (GPS, adresse civique, description, galerie complète,
11 +# statut vendu/retiré). Particularité de la source : le flux de recherche est
12 +# trié par date de création (~25 annonces/URL), une annonce en disparaît donc
13 +# en quelques jours alors qu'elle est toujours en vente. Le connecteur
14 +# maintient donc les fiches actives par RE-VÉRIFICATION tournante
15 +# (extraDetailIds, rotation par ancienneté du cache) : toujours en vente →
16 +# conservée, vendue/retirée → disparaît (délai de grâce standard).
17 +#
18 +# ⚠️ Loi 25 : l'acteur n'extrait PAS le vendeur (nom/téléphone) — les champs
19 +# broker_* restent vides pour cette source.
20 +# -----------------------------------------------------------------------------
21 +from __future__ import annotations
22 +
23 +import json
24 +import re
25 +import time
26 +from urllib.parse import quote
27 +
28 +import requests
29 +
30 +from .base import BaseConnector
31 +from ._resilient import _secret
32 +from ..schema import PropertyListing
33 +
34 +APIFY_API = "https://api.apify.com/v2"
35 +ACTOR = "gorgeous_thistle~ka-fb-immo"
36 +
37 +DETAIL_KEY = "v1" # bump = re-parse de toutes les fiches
38 +MAX_DETAILS = 600 # budget fiches détail par run (nouveautés + recheck)
39 +RECHECK_BUDGET = 300 # dont : re-vérifications d'annonces actives
40 +MIN_INTERVAL_S = 3 * 3600 # entre deux runs Apify : rejouer la BD (annonces FB
41 + # peu volatiles ; épargne compute + bande passante)
42 +RUN_TIMEOUT_S = 45 * 60
43 +MIN_PRICE = 20000 # sous ce prix : appâts « contactez-moi » / loyers
44 +
45 +_MLS_RE = re.compile(r"(?:centris|mls)\D{0,12}(\d{7,10})", re.I)
46 +_DIGIT_RE = re.compile(r"\d")
47 +
48 +
49 +class FbMarketplaceConnector(BaseConnector):
50 + source_id = "fb_marketplace"
51 + use_detail_cache = False # cache géré manuellement (batch via l'acteur)
52 +
53 + # -- API Apify (accès direct : pas la chaîne anti-bot des sites cibles) ---
54 + def _apify(self, method: str, path: str, token: str, **kw):
55 + r = requests.request(method, f"{APIFY_API}{path}",
56 + headers={"Authorization": f"Bearer {token}"},
57 + timeout=120, **kw)
58 + r.raise_for_status()
59 + return r.json()
60 +
61 + def _proxy_template(self) -> str | None:
62 + """Gabarit Oxylabs résidentiel CA ({session} = session collante) —
63 + même mécanique que les runs de prod de ka-fb-marketplace (le proxy
64 + Apify se fait servir le mur de login sur les fiches détail)."""
65 + endpoint = _secret("OXYLABS_PROXY")
66 + user = _secret("OXYLABS_PROXY_USER")
67 + pwd = _secret("OXYLABS_PROXY_PASS")
68 + if not (endpoint and user and pwd):
69 + return None
70 + endpoint = endpoint.replace("http://", "")
71 + return (f"http://{user}-cc-CA-sessid-{{session}}:"
72 + f"{quote(pwd, safe='')}@{endpoint}")
73 +
74 + def _run_actor(self, token: str, run_input: dict) -> list[dict]:
75 + """Démarre un run, attend la fin, retourne les items du dataset."""
76 + run = self._apify(
77 + "POST", f"/acts/{ACTOR}/runs?memory=2048&timeout=3000",
78 + token, json=run_input)["data"]
79 + run_id = run["id"]
80 + t0 = time.time()
81 + status = run["status"]
82 + while status in ("READY", "RUNNING"):
83 + if time.time() - t0 > RUN_TIMEOUT_S:
84 + self._apify("POST", f"/actor-runs/{run_id}/abort", token)
85 + raise RuntimeError(f"run Apify {run_id} : délai dépassé")
86 + time.sleep(20)
87 + run = self._apify("GET", f"/actor-runs/{run_id}", token)["data"]
88 + status = run["status"]
89 + if status != "SUCCEEDED":
90 + raise RuntimeError(f"run Apify {run_id} : statut {status}")
91 + ds = run["defaultDatasetId"]
92 + items, offset = [], 0
93 + while True:
94 + page = self._apify(
95 + "GET", f"/datasets/{ds}/items?clean=true&format=json"
96 + f"&limit=1000&offset={offset}", token)
97 + items.extend(page)
98 + if len(page) < 1000:
99 + return items
100 + offset += 1000
101 +
102 + # -- reconstruction depuis la BD (replay/rechecks) -------------------------
103 + def _row_to_listing(self, row) -> PropertyListing:
104 + return PropertyListing(
105 + source=self.source_id, external_id=row["external_id"],
106 + url=row["url"] or "", title=row["title"] or "",
107 + address=row["address"] or "", sector=row["sector"] or "",
108 + city=row["city"] or "", region=row["region"] or "",
109 + property_type=row["property_type"] or "", price=row["price"],
110 + price_label=row["price_label"] or "", bedrooms=row["bedrooms"],
111 + bathrooms=row["bathrooms"], powder_rooms=row["powder_rooms"],
112 + area_sqft=row["area_sqft"], lot_sqft=row["lot_sqft"],
113 + year_built=row["year_built"], mls=row["mls"] or "",
114 + status=row["status"] or "a-vendre",
115 + description=row["description"] or "",
116 + features=json.loads(row["features"] or "[]"),
117 + details=json.loads(row["details"] or "{}"),
118 + images=json.loads(row["images"] or "[]"),
119 + lat=row["lat"], lng=row["lng"])
120 +
121 + # -- mapping recherche + détail -> PropertyListing --------------------------
122 + def _make_listing(self, lid: str, obj: dict, det: dict) -> PropertyListing:
123 + unit = det.get("unit_fields") or []
124 + addr = (det.get("address") or "").strip()
125 + if not _DIGIT_RE.search(addr):
126 + addr = "" # « Sainte-Claire, QC » n'est pas civique
127 + desc = det.get("description") or ""
128 + mls = ""
129 + m = _MLS_RE.search(desc)
130 + if m:
131 + mls = m.group(1)
132 + details: dict = {}
133 + for k_src, k_dst in (("category_name", "Catégorie Marketplace"),
134 + ("listed_text", "Publication"),
135 + ("external_url", "Lien externe"),
136 + ("virtual_tour_url", "Visite virtuelle"),
137 + ("postal_code", "Code postal (RTA)"),
138 + ("walk_score", "Walk Score"),
139 + ("transit_score", "Transit Score"),
140 + ("bike_score", "Bike Score")):
141 + if det.get(k_src) not in (None, ""):
142 + details[k_dst] = det[k_src]
143 + images = det.get("images") or []
144 + if not images and obj.get("primary_photo"):
145 + images = [obj["primary_photo"]]
146 + city = (det.get("city") or obj.get("city") or "").strip()
147 + return PropertyListing(
148 + source=self.source_id, external_id=lid,
149 + url=obj.get("url") or f"https://www.facebook.com/marketplace/item/{lid}/",
150 + title=obj.get("title") or "",
151 + address=addr, city=city,
152 + property_type=(unit[0] if unit else obj.get("title") or ""),
153 + price=obj.get("price"),
154 + price_label=(f"{int(obj['price']):,} $".replace(",", " ")
155 + if obj.get("price") else ""),
156 + mls=mls, description=desc,
157 + features=[f.replace("\xa0", " ") for f in unit],
158 + details=details, images=images,
159 + lat=det.get("lat"), lng=det.get("lng"))
160 +
161 + # -- contrat ----------------------------------------------------------------
162 + def fetch(self) -> list[PropertyListing]:
163 + from .. import db
164 + con = db.connect()
165 +
166 + active = {r["external_id"]: r for r in con.execute(
167 + "SELECT * FROM listings WHERE source=? AND active=1",
168 + (self.source_id,)).fetchall()}
169 +
170 + # throttle : entre deux runs Apify, rejouer l'état connu (aucun réseau).
171 + # La date du dernier VRAI run = MAX(fetched_at) du cache détail (les
172 + # replays n'y écrivent pas, contrairement à sync_log).
173 + last = con.execute(
174 + "SELECT MAX(fetched_at) ts FROM detail_cache WHERE source=?",
175 + (self.source_id,)).fetchone()
176 + if last and last["ts"] and time.time() - last["ts"] < MIN_INTERVAL_S \
177 + and active:
178 + print(f"[immo-ka] fb_marketplace: replay BD "
179 + f"({len(active)} actives, prochain run Apify dans "
180 + f"{(MIN_INTERVAL_S - time.time() + last['ts']) / 60:.0f} min)")
181 + return [self._row_to_listing(r) for r in active.values()]
182 +
183 + token = _secret("APIFY_TOKEN")
184 + if not token:
185 + raise RuntimeError("APIFY_TOKEN manquant (voir ~/.claude/.env)")
186 +
187 + cache = {r["external_id"]: r for r in con.execute(
188 + "SELECT external_id, key, fetched_at FROM detail_cache WHERE source=?",
189 + (self.source_id,)).fetchall()}
190 +
191 + # re-vérification tournante des annonces actives : les plus anciennes
192 + # au cache d'abord (fetched_at) — vivantes → conservées, parties → non
193 + recheck = sorted(
194 + (i for i in active if i in cache),
195 + key=lambda i: cache[i]["fetched_at"] or 0)[:RECHECK_BUDGET]
196 + recheck_set = set(recheck)
197 + skip = [i for i, r in cache.items()
198 + if r["key"] == DETAIL_KEY and i not in recheck_set]
199 +
200 + run_input: dict = {
201 + "getDetails": True, "maxDetails": MAX_DETAILS,
202 + "skipDetailIds": skip, "extraDetailIds": recheck,
203 + }
204 + tpl = self._proxy_template()
205 + if tpl:
206 + run_input["proxyUrlTemplate"] = tpl
207 +
208 + items = self._run_actor(token, run_input)
209 + search = {i["id"]: i for i in items if i.get("kind") == "listing"}
210 + fresh = {i["id"]: {k: v for k, v in i.items()
211 + if k not in ("kind", "id", "ok")}
212 + for i in items if i.get("kind") == "detail" and i.get("ok")}
213 + print(f"[immo-ka] fb_marketplace: {len(search)} en recherche, "
214 + f"{len(fresh)} fiches détail, {len(recheck)} re-vérifications")
215 +
216 + for lid, payload in fresh.items(): # mémoriser (nopdp inclus)
217 + db.put_cached_detail(con, self.source_id, lid, DETAIL_KEY, payload)
218 +
219 + out: list[PropertyListing] = []
220 + emitted: set[str] = set()
221 +
222 + # 1) flux de recherche (nouveautés + annonces récentes)
223 + for lid, obj in search.items():
224 + st = (obj.get("state") or "").strip().lower()
225 + if st and st not in ("qc", "quebec", "québec"):
226 + continue
227 + if obj.get("is_sold") or obj.get("is_pending"):
228 + continue
229 + price = obj.get("price")
230 + if not price or price < MIN_PRICE:
231 + continue
232 + det = fresh.get(lid)
233 + if det is None:
234 + det = db.get_stale_detail(con, self.source_id, lid) or {}
235 + elif det.get("gone"):
236 + continue # verdict frais : vendue/retirée
237 + out.append(self._make_listing(lid, obj, det))
238 + emitted.add(lid)
239 +
240 + # 2) annonces actives sorties du flux de recherche (tri par création) :
241 + # re-vérifiées ce run → verdict frais ; sinon rejouées telles quelles
242 + # en attendant leur tour de rotation
243 + for lid, row in active.items():
244 + if lid in emitted:
245 + continue
246 + det = fresh.get(lid)
247 + if det is not None and det.get("gone"):
248 + continue # vendue/retirée : délai de grâce puis retrait
249 + if det is not None and det.get("nopdp"):
250 + continue # fiche supprimée (mur permanent)
251 + lst = self._row_to_listing(row)
252 + if det: # rafraîchir les champs riches
253 + if det.get("description"):
254 + lst.description = det["description"]
255 + if det.get("images"):
256 + lst.images = det["images"]
257 + if det.get("lat") and det.get("lng"):
258 + lst.lat, lst.lng = det["lat"], det["lng"]
259 + out.append(lst)
260 + emitted.add(lid)
261 + return out
added immoka/connectors/immeubles_stuart.py +199 −0
@@ -0,0 +1,199 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# connectors/immeubles_stuart.py : Les Immeubles Stuart (immeublesstuart.ca) —
5 +# agence indépendante de la Rive-Sud de Montréal (Saint-Lambert, Brossard,
6 +# Longueuil…), ~50 inscriptions en vente.
7 +#
8 +# Site WordPress propulsé par la plateforme « Ma Clé » (photos sur
9 +# maclebrokers-photos.s3.amazonaws.com). Liste /proprietes/ rendue serveur,
10 +# une seule page : cartes <article class="propriete-card"> (data-ville,
11 +# data-prix, adresse, MLS Centris, chambres/salles de bain). On ne garde que
12 +# les URLs « -a-vendre » (les « -a-louer » sont des locations).
13 +#
14 +# Fiche détail : JSON-LD RealEstateListing très riche avec extensions mc:*
15 +# (caractéristiques, taxes, évaluations, inclusions/exclusions, addenda,
16 +# agent nom/téléphone) + galerie S3 ({mls}{n}.jpg — exclure photo_membre).
17 +# Pas de GPS sur la fiche (code postal seulement). Enrichissement du.enrich.
18 +#
19 +# Agence première main (pas d'infixe _ag_) : ses fiches battent les copies
20 +# portails au même n° Centris dans la dédup.
21 +# -----------------------------------------------------------------------------
22 +from __future__ import annotations
23 +
24 +import html as _html
25 +import json
26 +import os
27 +import re
28 +
29 +from .base import BaseConnector
30 +from . import _detailutil as du
31 +from ..normalize import parse_price
32 +from ..schema import PropertyListing
33 +
34 +SITE = "https://immeublesstuart.ca"
35 +LIST_URL = SITE + "/proprietes/"
36 +AGENCY = "Les Immeubles Stuart"
37 +DETAIL_LIMIT = int(os.environ.get("IMMOKA_STUART_DETAIL_LIMIT", "120"))
38 +
39 +_CARD_SPLIT = re.compile(r'<article class="propriete-card')
40 +_HREF_RE = re.compile(r'href="(https?://immeublesstuart\.ca/proprietes/[^"]*--(\d{6,10})/?)"')
41 +_VILLE_RE = re.compile(r'data-ville="([^"]*)"')
42 +_PRIX_RE = re.compile(r'data-prix="(\d+)"')
43 +_ADRESSE_RE = re.compile(r'propriete-card-adresse">([^<]+)<')
44 +_META_RE = re.compile(r'<li>\s*(\d+)\s+(chambre|salle)', re.I)
45 +_IMG_RE = re.compile(r'src="(https://maclebrokers-photos\.s3\.amazonaws\.com/[^"]+)"')
46 +_S3_RE = re.compile(r'https://maclebrokers-photos\.s3\.amazonaws\.com/(?:large_)?photo/[^"\'\s]+\.jpe?g', re.I)
47 +
48 +
49 +class ImmeublesStuartConnector(BaseConnector):
50 + source_id = "stuart"
51 + request_delay = 0.4
52 +
53 + def fetch(self) -> list[PropertyListing]:
54 + html = self.get(LIST_URL).text
55 + by_id: dict[str, PropertyListing] = {}
56 + for blk in _CARD_SPLIT.split(html)[1:]:
57 + blk = blk[:4000]
58 + hm = _HREF_RE.search(blk)
59 + if not hm or "-a-vendre" not in hm.group(1):
60 + continue
61 + mls = hm.group(2)
62 + city = _html.unescape((_VILLE_RE.search(blk) or [None, ""])[1]).strip()
63 + am = _ADRESSE_RE.search(blk)
64 + address = _html.unescape(am.group(1)).strip() if am else ""
65 + pm = _PRIX_RE.search(blk)
66 + price = int(pm.group(1)) if pm else None
67 + beds = baths = None
68 + for n, kind in _META_RE.findall(blk):
69 + if kind.lower() == "chambre":
70 + beds = int(n)
71 + else:
72 + baths = int(n)
73 + im = _IMG_RE.search(blk)
74 + by_id.setdefault(mls, PropertyListing(
75 + source=self.source_id, external_id=mls,
76 + url=hm.group(1),
77 + title=f"Propriété à vendre — {address or city}".strip(" —"),
78 + address=address, city=city,
79 + price=price,
80 + price_label=(f"{price:,} $".replace(",", " ") if price else ""),
81 + bedrooms=beds, bathrooms=baths, mls=mls,
82 + images=[im.group(1)] if im else [],
83 + agency=AGENCY, broker_name=AGENCY,
84 + ))
85 + listings = list(by_id.values())
86 + du.enrich(self, listings, DETAIL_LIMIT, _parse_detail, key="v1")
87 + for lst in listings: # titre enrichi une fois le type connu
88 + if lst.property_type and lst.title.startswith("Propriété à vendre"):
89 + lst.title = f"{lst.property_type} à vendre — {lst.address or lst.city}".strip(" —")
90 + return listings
91 +
92 +
93 +def _parse_detail(html: str) -> dict:
94 + """Fiche Ma Clé : JSON-LD RealEstateListing + extensions mc:* + galerie S3."""
95 + node = None
96 + for n in du.ld_nodes(html):
97 + if n.get("@type") == "RealEstateListing":
98 + node = n
99 + break
100 + if node is None:
101 + return {}
102 + out: dict = {}
103 + details: dict = {}
104 + features: list[str] = []
105 +
106 + desc = _html.unescape(str(node.get("description") or "")).strip()
107 + addenda = _html.unescape(str(node.get("mc:addenda") or "")).strip()
108 + if addenda and addenda not in desc:
109 + desc = (desc + "\n\n" + addenda).strip()
110 + if desc:
111 + out["description"] = desc
112 +
113 + addr = node.get("address") or {}
114 + if isinstance(addr, dict):
115 + if addr.get("streetAddress"):
116 + out["address"] = str(addr["streetAddress"]).strip()
117 + if addr.get("addressLocality"):
118 + out["city"] = str(addr["addressLocality"]).strip()
119 + if addr.get("postalCode"):
120 + details["Code postal"] = str(addr["postalCode"]).strip()
121 +
122 + offers = node.get("offers") or {}
123 + if isinstance(offers, dict) and offers.get("price"):
124 + try:
125 + out["price"] = float(offers["price"])
126 + except (TypeError, ValueError):
127 + pass
128 +
129 + if node.get("yearBuilt"):
130 + ym = re.search(r"\b(1[6-9]\d{2}|20\d{2})\b", str(node["yearBuilt"]))
131 + if ym:
132 + out["year_built"] = int(ym.group(1))
133 + details["Année de construction"] = ym.group(1)
134 +
135 + lot = node.get("lotSize") or {}
136 + if isinstance(lot, dict) and lot.get("value"):
137 + try:
138 + sq = float(lot["value"])
139 + if str(lot.get("unitCode") or "FTK").upper() == "MTK":
140 + sq *= 10.7639
141 + out["lot_sqft"] = round(sq, 1)
142 + except (TypeError, ValueError):
143 + pass
144 +
145 + if node.get("mc:type"):
146 + out["property_type"] = str(node["mc:type"]).strip()
147 + details["Type de propriété"] = out["property_type"]
148 +
149 + car = node.get("mc:caracteristiques")
150 + if isinstance(car, dict):
151 + for k, v in car.items():
152 + k, v = str(k).strip(), str(v).strip()
153 + if k and v:
154 + details[k] = v
155 + features.append(f"{k} : {v}" if len(v) < 40 else k)
156 +
157 + for src, dst in (("mc:inclusions", "Inclusions"),
158 + ("mc:exclusions", "Exclusions"),
159 + ("mc:eval_batiment", "Évaluation municipale (bâtiment)"),
160 + ("mc:eval_terrain", "Évaluation municipale (terrain)"),
161 + ("mc:eval_annee", "Évaluation municipale (année)")):
162 + v = node.get(src)
163 + if v not in (None, ""):
164 + v = str(v).strip()
165 + if dst.startswith("Évaluation") and v.isdigit():
166 + v = f"{int(v):,} $".replace(",", " ")
167 + details[dst] = v
168 + taxes = node.get("mc:taxes")
169 + if isinstance(taxes, list) and taxes:
170 + details["Taxes"] = " ; ".join(str(t).strip() for t in taxes if t)
171 +
172 + agent = node.get("agent") or {}
173 + if isinstance(agent, dict):
174 + if agent.get("name"):
175 + out["broker_name"] = str(agent["name"]).strip()
176 + tel = str(agent.get("telephone") or "").strip()
177 + if re.fullmatch(r"\d{10}", tel):
178 + tel = f"{tel[:3]} {tel[3:6]}-{tel[6:]}"
179 + if tel:
180 + out["broker_phone"] = tel
181 +
182 + # galerie S3 : {mls}{n}.jpg (large_photo + photo), photo_membre = portraits
183 + mls = str(node.get("mc:no_inscription") or "")
184 + imgs, seen = [], set()
185 + for u in _S3_RE.findall(html):
186 + name = u.rsplit("/", 1)[-1]
187 + if mls and not name.startswith(mls):
188 + continue
189 + if name not in seen:
190 + seen.add(name)
191 + imgs.append(u)
192 + if imgs:
193 + out["images"] = imgs
194 +
195 + if details:
196 + out["details"] = details
197 + if features:
198 + out["features"] = features
199 + return out
added immoka/connectors/pmml.py +136 −0
@@ -0,0 +1,136 @@
1 +# -----------------------------------------------------------------------------
2 +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# connectors/pmml.py : PMML (pmml.ca) — LA grande agence commerciale/
5 +# multilogements indépendante du Québec (plex, multis, terrains, industriel,
6 +# bureaux — ~550 inscriptions actives, toutes régions).
7 +#
8 +# Le site est une SPA (Svelte + Mapbox) derrière Cloudflare, mais son API
9 +# JSON interne est ouverte : GET /api/proprietes/avendre?limit=1000 retourne
10 +# TOUT l'inventaire à vendre en un appel (prix demandé, GPS, adresse civique,
11 +# ville/région, unités rés./comm., superficies, année, courtier inscripteur,
12 +# slug de fiche, photo principale). La chaîne anti-bot de BaseConnector
13 +# (Oxylabs → Scrapfly → Bright Data) encaisse le 403 Cloudflare du direct.
14 +# Pas de description dans le flux → on synthétise ≥3 caractéristiques
15 +# structurées (unités, superficie, prix/logement…) pour la publication.
16 +#
17 +# IDPropriete est interne (pas de n° Centris exposé) → pas d'infixe _ag_ ;
18 +# la dédup par adresse (inter-sources) couvre les recoupements éventuels.
19 +# -----------------------------------------------------------------------------
20 +from __future__ import annotations
21 +
22 +import json
23 +import re
24 +
25 +from .base import BaseConnector
26 +from ..schema import PropertyListing
27 +
28 +API = "https://pmml.ca/api/proprietes/avendre?limit=1000"
29 +SITE = "https://pmml.ca"
30 +AGENCY = "PMML"
31 +
32 +_TYPES = {
33 + "multilogement": "Multilogement", "terrain": "Terrain",
34 + "commerceDetail": "Commerce de détail", "industriel": "Industriel",
35 + "bureaux": "Bureaux", "rpa": "Résidence pour aînés (RPA)",
36 + "hotel": "Hôtel", "commercialGeneral": "Commercial",
37 + "fondCommerce": "Fonds de commerce",
38 + "portfolioRes": "Portefeuille résidentiel",
39 + "portfolioComm": "Portefeuille commercial",
40 +}
41 +_YEAR_RE = re.compile(r"\b(1[6-9]\d{2}|20\d{2})\b")
42 +
43 +
44 +def _fmt_money(v) -> str:
45 + return f"{int(round(float(v))):,} $".replace(",", " ")
46 +
47 +
48 +class PmmlConnector(BaseConnector):
49 + source_id = "pmml"
50 +
51 + def fetch(self) -> list[PropertyListing]:
52 + rows = self.get(API).json()
53 + out: list[PropertyListing] = []
54 + for r in rows:
55 + if r.get("iLocation") or (r.get("sType") or "vente") != "vente":
56 + continue
57 + lid = r.get("IDPropriete")
58 + slug = r.get("slugFr") or ""
59 + if not lid or not slug:
60 + continue
61 + ptype = _TYPES.get(r.get("IDType") or "", r.get("IDType") or "")
62 + civic, street = (r.get("sNumeroCivique") or "").strip(), (r.get("sRue") or "").strip()
63 + address = f"{civic}, {street}".strip(", ") if street else ""
64 + city = (r.get("sNomVille") or "").strip()
65 +
66 + price = r.get("fPrixDemande") if not r.get("iMasquerPrix") else None
67 + price_label = (_fmt_money(price) if price
68 + else (r.get("TextePourPrixFr") or "Prix sur demande"))
69 +
70 + year = None
71 + ym = _YEAR_RE.search(str(r.get("iAnneeConstruction") or ""))
72 + if ym:
73 + year = int(ym.group(1))
74 +
75 + # caractéristiques synthétiques (le flux n'a pas de description) :
76 + # ≥3 items = seuil de publication du module qualité
77 + features: list[str] = [ptype] if ptype else []
78 + details: dict = {"Type de propriété": ptype} if ptype else {}
79 + if r.get("iUnitesTotal"):
80 + features.append(f"{r['iUnitesTotal']} unités")
81 + details["Nombre d'unités"] = str(r["iUnitesTotal"])
82 + if r.get("iUnitesResidentiel"):
83 + details["Unités résidentielles"] = str(r["iUnitesResidentiel"])
84 + if r.get("iUnitesCommercial"):
85 + details["Unités commerciales"] = str(r["iUnitesCommercial"])
86 + if r.get("iAnneeConstruction"):
87 + features.append(f"Construction {r['iAnneeConstruction']}")
88 + details["Année de construction"] = str(r["iAnneeConstruction"])
89 + if r.get("iPiedsCarreTotal"):
90 + features.append(f"{r['iPiedsCarreTotal']:,} pi² (bâtiment)".replace(",", " "))
91 + details["Superficie du bâtiment"] = f"{r['iPiedsCarreTotal']:,} pi²".replace(",", " ")
92 + if r.get("iPiedsCarreTerrain"):
93 + features.append(f"{r['iPiedsCarreTerrain']:,} pi² (terrain)".replace(",", " "))
94 + details["Superficie du terrain"] = f"{r['iPiedsCarreTerrain']:,} pi²".replace(",", " ")
95 + if r.get("fCPL") and price:
96 + try:
97 + details["Prix par logement"] = _fmt_money(r["fCPL"])
98 + features.append(f"{_fmt_money(r['fCPL'])} / logement")
99 + except (TypeError, ValueError):
100 + pass
101 + if r.get("sNomSecteur"):
102 + details["Secteur PMML"] = r["sNomSecteur"]
103 + if r.get("plusTaxes"):
104 + details["Prix"] = "Plus taxes"
105 + if r.get("NoteApresPrixFr"):
106 + details["Note sur le prix"] = r["NoteApresPrixFr"]
107 +
108 + broker = (r.get("sNomInscripteur") or "").strip()
109 + if r.get("sNomCoInscripteur"):
110 + broker = f"{broker} et {r['sNomCoInscripteur']}".strip(" et")
111 +
112 + images = []
113 + try:
114 + images = [u for u in json.loads(r.get("Photos") or "[]") if u]
115 + except ValueError:
116 + pass
117 + if not images and r.get("sImagePrincipale"):
118 + images = [r["sImagePrincipale"]]
119 +
120 + title = (r.get("TitreAltFr") or "").strip() or \
121 + f"{ptype or 'Propriété'} à vendre — {address or city}".strip(" —")
122 +
123 + out.append(PropertyListing(
124 + source=self.source_id, external_id=str(lid),
125 + url=SITE + slug, title=title,
126 + address=address, city=city,
127 + region=(r.get("sNomRegion") or "").strip(),
128 + property_type=ptype, price=price, price_label=price_label,
129 + year_built=year,
130 + area_sqft=r.get("iPiedsCarreTotal"),
131 + lot_sqft=r.get("iPiedsCarreTerrain"),
132 + features=features, details=details, images=images,
133 + lat=r.get("dPosLat"), lng=r.get("dPosLong"),
134 + agency=AGENCY, broker_name=broker or AGENCY,
135 + ))
136 + return out
137