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>
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 | ||