Auto·Ka
Les voitures usagées du Québec
Les pastilles de la deuxième rangée sont dynamiques : elles interrogent
/api/statsen direct.
Auto-Ka est un agrégateur indépendant de véhicules usagés couvrant la province de Québec. Chercher une auto usagée, c'est normalement ouvrir des dizaines de sites de concessionnaires — chacun avec sa navigation, ses filtres, son format. Auto-Ka retourne le problème : un connecteur dédié par commerce visite chaque site à la source (aucune plateforme d'annonces revendue), normalise chaque véhicule vers un schéma unique et détecte les changements en continu.
Les sites de concessionnaires n'offrent pas de webhooks ; Auto-Ka en reproduit l'équivalent : synchronisation périodique + hash de contenu → arrivages, baisses de prix et ventes détectés automatiquement. Un véhicule qui disparaît du site source est marqué vendu — et sa page renvoie alors un vrai 410 Gone aux moteurs de recherche. Au 2026-08-28, le parc compte 46 687 véhicules (dont 624 motos et 28 scooters) provenant de 138 concessionnaires (129 sources livrant actuellement, sur un registre de 143 sources) répartis dans les 18 régions du Québec — prix moyen ≈ 30 001 $, ≈ 89 626 km, année moyenne ≈ 2020 — avec 16 969 rappels de sécurité croisés et 12 445 doublons VIN masqués.
Visite guidée
Le tour du site en production en 10 captures — 2026-08-28, www.auto-ka.com (desktop, DA v3 « magazine automobile »).
Parcours mobile & desktop (DA v3, 2026-08-25)
Mobile 390×844 · desktop 1440×900.
Mobile
![]() Accueil — masthead encre, KA Tabbar |
![]() Résultats — barre compacte + bottom sheet de filtres |
![]() Fiche véhicule v2 — badge marché |
Desktop
![]() Accueil — hero éditorial, filtres pupitre sans boîte |
![]() Résultats — cartes sans cadre, spec-line mono |
![]() Fiche v2 — prix vs marché, caractéristiques, KA Score |
![]() Fiche v2 — analyse marché, fiche VIN (NHTSA), historique de prix |
![]() Statistiques — 46 600+ véhicules, gros chiffres tabulaires |
|
Nouveautés front-end (2026-08-25)
- DA v3 « magazine automobile » — masthead encre, hero éditorial, filtres pupitre sans boîte, cartes véhicules sans cadre (spec-line mono), fiche à filets.
- Fiche véhicule v2 — analyse marché (nuage de points prix/km), KA Score composite, fiche VIN décodée (NHTSA), rappels, lightbox photos.
- Refonte UX des filtres — barre compacte (« N véhicules · Trier · Filtres »), bottom sheet mobile / tiroir desktop, sliders min-max prix/année/km, chips actifs supprimables, CTA sticky avec compteur en direct.
- KA Tabbar v1 — barre de navigation mobile commune Groupe KA.
- Widget ka-agent v4 — cartes de véhicules cliquables et choix en boutons.
🗄️ Les captures d'époque sont conservées dans
docs/archive/.
Fonctionnalités
- Recherche unifiée — filtres marque / modèle / année / prix / km / carburant / motricité / carrosserie / région / ville / concessionnaire, facettes dynamiques et tris multiples.
- Fiches véhicule complètes — galerie photos, caractéristiques standardisées, VIN, équipements, historique de prix, véhicules similaires toutes sources confondues, et lien direct vers l'annonce originale du concessionnaire, toujours.
- Trois verticales, un moteur — le champ
kind(auto/moto/scooter) traverse tout le pipeline ; motos et scooters ont leurs onglets dédiés. - Suivi des baisses de prix — le diff engine (upsert par hash de contenu) détecte nouveau / modifié / vendu, avec délai de grâce et détection de dérive.
- Rappels de sécurité — croisement avec les rappels constructeurs (
autoka/recalls.py), 16 969 rappels référencés (au 2026-08-28). - Déduplication par VIN — les annonces multi-sites d'un même véhicule sont détectées et masquées (
autoka/dedup.py). - Statistiques du marché en direct — tuiles de synthèse, distributions de prix, répartitions par région / marque / carrosserie, et rapports PDF personnalisés (stats v3 : catalogue, rendu au choix, ReportBuilder —
autoka/pdfgen.py,kapdf.py). - SEO programmatique massif — rendu serveur complet (
autoka/seo.py) : title/meta uniques, canonical, Open Graph, hreflangfr-CA, JSON-LDCar/Motorcycle+Offer+BreadcrumbList, pages programmatiques (/usagees/{marque},/region/…,/ville/…,/carrosserie/…,/motos/…), sitemaps dynamiques aveclastmodréels, vendu → 410, inconnu → 404. - Compte KA ID — SSO « Se connecter avec KA ID » via le hub groupe-ka.com : même compte partout, page profil, favoris « Mon univers Ka » centralisés.
- Connecteurs auto-découvrants — ajouter un concessionnaire = une sous-classe de
BaseConnector(~6 lignes) déposée dansautoka/connectors/(familles D2C Media, SM360, AMVOQ/AutoUsagee, EvalAuto, Convertus, PowerGo, HGrégoire…). - Fidélité — aucun prix inventé : si la source n'affiche pas de prix,
price = null(« Prix sur demande ») ; politesse de crawl (délai entre requêtes, backoff, User-Agent identifié).
Démarrage rapide
ssh M4M64b && cd ~/auto-ka # source de vérité : le nœud (aucune copie laptop)
# Backend
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python run.py sync # synchroniser toutes les sources
.venv/bin/python run.py sync desmeules kijiji # ...ou seulement certaines (id du registre data/sources.json)
.venv/bin/python run.py serve 8080 # API + frontend + SSR en local
# Frontend (build servi ensuite par FastAPI)
cd frontend && npm install && npm run build && cd ..
cd frontend && npm run dev # ...ou serveur de dev Vite
# Boucle de synchronisation continue (ce que fait PM2 en prod)
.venv/bin/python run.py watch 120 # re-parcourt les sources, cycle ≈ 2 hrun.py est le seul point d'entrée : sync [source ...] · watch [minutes] (défaut 120) · serve [port] (défaut 8080).
Variables d'environnement
Noms seulement — les valeurs vivent dans .env sur le nœud (jamais versionnées).
| Variable | Rôle |
|---|---|
AUTOKA_BASE_URL |
URL publique canonique (SEO, sitemaps, SSO) |
SESSION_SECRET |
Secret de session (cookies signés) |
KA_SSO_SECRET · KA_HUB_URL |
SSO KA ID via le hub groupe-ka.com |
FIRECRAWL_API_KEY · SCRAPFLY_API_KEY |
Escalade anti-bot des connecteurs (_resilient.py) |
AUTOKA_MAX_PAGES · AUTOKA_MAX_DETAILS |
Bornes générales de crawl (optionnelles) |
AUTOKA_AUTOTRADER_MAX · AUTOKA_CARGURUS_MAX · AUTOKA_OTOGO_MAX · AUTOKA_AUTOUSAGEE_MAX |
Bornes par portail (optionnelles) |
Architecture
| Composant | Technologie | Rôle |
|---|---|---|
| Backend | Python 3.14 · FastAPI · Uvicorn | API /api/*, rendu serveur SEO, service du frontend (autoka/web.py, autoka/seo.py) |
| Base de données | SQLite (data/autoka.db) |
Diff engine : hash de contenu, historique de prix, cycle de vie des annonces, rappels, dédup VIN |
| Connecteurs | requests · BeautifulSoup · Firecrawl/Scrapfly (sites derrière anti-bot) | 1 adaptateur par plateforme de concessionnaires, 1 sous-classe par commerce |
| Frontend | React 18 · Vite · TypeScript | Design « éditorial sharp », accent orange racing — filtres, fiches, stats (build → frontend/dist/) |
| reportlab · fpdf2 | Rapports « Le marché de l'occasion » personnalisables |
Processus PM2
| Processus | Commande de démarrage | Rôle |
|---|---|---|
auto-ka-web |
pm2 start .venv/bin/python --name auto-ka-web -- run.py serve 8095 |
Sert l'API /api/*, le frontend buildé et le rendu serveur SEO — le seul processus exposé (via ngrok) |
auto-ka-sync |
pm2 start .venv/bin/python --name auto-ka-sync -- run.py watch 120 |
Watcher de resynchronisation : reparcourt les sources actives en boucle, cycle complet ≈ 2 h, alimente le diff engine |
auto-ka-ngrok |
pm2 start ~/bin/ngrok --name auto-ka-ngrok -- http --url=www.auto-ka.com 8095 |
Tunnel public vers le domaine www.auto-ka.com |
API principale
| Méthode | Endpoint | Rôle |
|---|---|---|
| GET | /api/vehicles |
Recherche paginée : filtres marque/modèle/année/prix/km/carburant/motricité/carrosserie/région/ville/concessionnaire + tris |
| GET | /api/vehicles/{uid} |
Fiche complète d'un véhicule (photos, VIN, équipements, historique de prix, similaires) |
| GET | /api/vehicles/{uid}/recalls |
Rappels de sécurité croisés pour ce véhicule |
| GET | /api/facets |
Facettes dynamiques (compteurs par marque, région, carrosserie…) pour les filtres |
| GET | /api/dealers · /api/sources |
Registre des concessionnaires / état des sources |
| GET | /api/stats |
Tuiles de synthèse JSON (total, sources, régions, prix/km/année moyens, rappels, doublons VIN, répartitions) — alimente les pastilles dynamiques ci-dessus |
| GET | /api/stats/dashboard · /api/stats/detailed |
Tableau de bord analytique (distributions, ajouts, fraîcheur, fenêtre ?syncs_since_h pour la supervision api-ka) |
| GET | /api/stats/catalog · /api/stats/report · /api/stats/rapport.pdf |
Catalogue stats v3 + rapports PDF |
| POST | /api/stats/report/custom |
Rapport PDF personnalisé (ReportBuilder) |
| POST | /api/sync |
Déclencher une synchronisation |
| GET | /ka/login · /ka/callback · /me · POST /logout |
SSO KA ID (hub groupe-ka.com) |
S'y ajoutent les routes SSR SEO (/vehicule/{uid}/{slug}, /usagees/{marque}[/{modèle}], /region/…, /ville/…, /carrosserie/…, /motos/…, /scooters/…, sitemaps, robots.txt) et les pages /stats, /sources, /doc, /contact, /profil.
Connecteurs et sources
31 modules dans autoka/connectors/ (+ socle base.py / _resilient.py) couvrent le registre data/sources.json : 143 sources au 2026-08-28 — 142 actives, 1 en pause (albioccasion, rate-limit 429, connecteur prêt) — soit 138 concessionnaires géolocalisés et 129 sources livrant actuellement des véhicules. Un module = soit un commerce, soit une famille de plateforme dont chaque concessionnaire est une sous-classe (~6 lignes).
| Type | Modules (nombre de sources couvertes) |
|---|---|
| Familles multi-concessionnaires | d2c_dealers (D2C Media, 65), sm360_dealers (SM360, 15), moto_dealers (motos/scooters, 13), central_dealers (AMVOQ theme_central, 9), gatsby_dealers (EvalAuto/autoroot, 6), magnetis_dealers (SyncAuto, 5), vvu_dealers (4), convertus_fc (Convertus, 3) |
| Regroupements & bannières (1 source chacun) | autousagee (AMVOQ/AutoUsagée), hgregoire, automobileendirect, leprixdugros, megacentre, clubautozone |
| Portails & inventaires (1 source chacun) | autotrader, cargurus, kijiji, otogo, okaze, classeauto, ototr |
| Commerces individuels (1 source chacun) | desmeules, dupontford, stefoychrysler, montjolichrysler, albioccasion, occasionbeaucage, occasioncharlevoix, jlkauto, yannicklaberge, autodurocher |
Infrastructure commune : base.py (classe BaseConnector, normalisation, politesse de crawl) et _resilient.py (retries/backoff, escalade anti-bot Oxylabs → Scrapfly → Bright Data). La documentation générée des connecteurs vit dans docs/ (scripts/gen_connector_docs.py).
Diff engine & déduplication VIN
- Chaque annonce normalisée reçoit un hash de contenu ; l'upsert dans SQLite classe le véhicule nouveau / modifié / inchangé.
- Tout changement de prix est journalisé → l'historique de prix affiché sur la fiche.
- Une annonce absente du site source est marquée vendue après un délai de grâce (tolère les ratés de crawl), avec détection de dérive pour éviter les faux positifs quand une source change de structure ; sa page publique renvoie alors
410 Gone. - La déduplication par VIN (
autoka/dedup.py) détecte le même véhicule annoncé sur plusieurs sites et masque les doublons (12 445 masqués au 2026-08-28) — le VIN sert aussi au croisement des rappels (autoka/recalls.py).
Données & conformité
- Provenance — chaque véhicule est lu directement sur le site du concessionnaire (ou du portail), jamais via une plateforme d'annonces revendue ; le lien vers l'annonce originale est toujours affiché sur la fiche.
- Cadence — le watcher
auto-ka-syncreparcourt les sources actives en continu, cycle complet ≈ 2 heures ; chaque passage est horodaté (fraîcheur visible sur/sourceset via?syncs_since_h). - Fidélité — aucun prix inventé (
price = null→ « Prix sur demande »), aucun champ deviné ; un véhicule disparu de la source est marqué vendu, jamais falsifié. - Politesse de crawl — délai entre requêtes, retries avec backoff, User-Agent identifié ; l'escalade anti-bot (
_resilient.py) n'est utilisée que là où le site le rend nécessaire. - Avertissement — Auto-Ka est un index indépendant, sans affiliation avec les concessionnaires référencés ; les prix et disponibilités sont indicatifs et font foi chez le commerçant. Les rappels proviennent des données publiques de Transports Canada.
Structure du repo
| Répertoire / fichier | Rôle |
|---|---|
run.py |
Point d'entrée CLI : sync · watch · serve |
requirements.txt |
Dépendances backend (FastAPI, uvicorn, requests, bs4, reportlab, fpdf2, pillow) |
autoka/ |
Backend Python : schéma, normalisation, ingestion, db, web, seo, auth KA ID, favoris, stats, PDF, rappels, dédup + connectors/ |
frontend/ |
SPA React 18 + Vite + TypeScript (build servi par FastAPI) — inclut la page /doc (frontend/public/doc/) |
data/ |
autoka.db (SQLite), sources.json (registre des 143 sources), villes_gps.json |
docs/ |
Visite guidée (screenshots/ — 10 captures 2026-08-28 + parcours mobile/desktop), archives (archive/) et documentation générée des connecteurs (connecteurs/) |
scripts/ |
Outillage (gen_connector_docs.py) |
Documentation
- Guide d'utilisation en ligne : www.auto-ka.com/doc — visite guidée pas à pas (accueil, recherche, fiche, historique de prix) avec captures d'écran.
- Guide PDF téléchargeable : auto-ka-documentation.pdf.
- Le guide est aussi lié depuis le pied de page du site ; ses captures vivent dans
frontend/public/doc/img/.
Historique
| Date | Commit | Jalon |
|---|---|---|
| 2026-08-12 | f840db2 |
Naissance d'Auto-Ka — agrégateur de voitures usagées du Québec |
| 2026-08-12 | a41549d |
Verticales motos et scooters : onglets dédiés + 13 concessionnaires |
| 2026-08-18 | bbc070b |
Vague 2 : dédup VIN inter-sources, Kijiji particuliers, rappels Transports Canada |
| 2026-08-18 | 4a7b276 |
Vague 3 : grands portails — AutoTrader.ca/AutoHebdo, Otogo.ca, CarGurus.ca |
| 2026-08-23 | 19b54a5 |
Connecteur AutoUsagee.ca (portail AMVOQ) : +11 924 annonces (367 marchands, 157 villes) |
| 2026-08-23 | dab7d55 |
Stats v3 : rapports PDF personnalisés (catalogue, ReportBuilder) |
| 2026-08-24 | c1f8843 |
Page documentation /doc (guide + captures) + PDF téléchargeable |
| 2026-08-26 | 4243c4b→b32324e |
KA ID v2 : recommandations personnalisées (modèle collaboratif ALS, pilules « Sauvegarder cette recherche » / « Pas pour moi ») |
| 2026-08-27 | 4937c46 |
Gardien ka4 : migration du connecteur groupepaquin D2C Media → SyncAuto (magnetis_dealers) après refonte du site source |
Développement (remote-first)
La source de vérité est le repo git sur le nœud M4M64b (~/auto-ka) — il n'existe aucune copie laptop. Toute modification se fait sur le nœud via SSH ; le remote origin = spbgit (git perso https://git.spboucher.ai), via l'alias SSH gitsrv configuré sur le nœud → gitsrv:srv/git/auto-ka.git (bare repos hébergés sur M3U96a). Pas GitHub.
ssh M4M64b
cd ~/auto-ka
# Backend
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
.venv/bin/python run.py sync # synchroniser toutes les sources (ou : run.py sync <source_id>)
.venv/bin/python run.py serve 8080 # servir en local
# Frontend
cd frontend && npm install && npm run build && cd ..
# Après un changement en production
pm2 restart auto-ka-web # (ou auto-ka-sync selon le changement)
# Versionner depuis le nœud (agent forwarding actif)
git add <fichiers> && git commit -m "..." && git push origin mainDéploiement
- Nœud : M4M64b (Mac Studio, cluster MacLustr) — répertoire
~/auto-ka - Port local : 8095
- Processus PM2 :
auto-ka-web(API + frontend + SSR),auto-ka-sync(watcher de synchronisation, cycle ≈ 2 h),auto-ka-ngrok(tunnel) - Exposition publique : tunnel ngrok → https://www.auto-ka.com
Philosophie d'exploitation : on ne pousse que le code — le serveur maintient ses données lui-même.
Écosystème Groupe KA
| Plateforme | Rôle |
|---|---|
| groupe-ka.com | Portail |
| lou-ka.com | Logements à louer |
| immo-ka.com | Propriétés à vendre |
| vrai-prix.com | Estimation immobilière |
| auto-ka.com | Véhicules |
| fabri-ka.com | Produits québécois |
| food-ka.com | Épicerie / alimentation |
| resto-ka.com | Restaurants |
| sorti-ka.com | Sorties et événements |
| job-ka.com | Emplois |
| crea-ka.com | Créateurs |
| trouve-ka.com | Petites annonces |
| api-ka.com | API de données |
Contact
Simon-Pierre Boucher — fondateur, Groupe KA 📧 contact@spboucher.ai
© Groupe KA — Simon-Pierre Boucher · contact@spboucher.ai
Ce repo vit sur spbgit (git.spboucher.ai) — la source de vérité est le clone sur le nœud M4M64b.


















