Sorti·Ka
Toutes les sorties, dans les 17 régions
Sorti·Ka est un agrégateur indépendant de sorties et d'événements couvrant les 17 régions administratives du Québec : 18 186 événements actifs (au 2026-08-24) dans 332 villes, avec dates, lieux, gratuité (3 614 événements gratuits à venir), fiche par événement et lien direct vers la billetterie ou la source originale. Mise à jour horaire, automatiquement.
Trouver quoi faire au Québec, c'est normalement ouvrir dix sites : les billetteries ne montrent que leurs propres spectacles, les calendriers municipaux que leur ville, les sites touristiques que leurs membres. Sorti·Ka retourne le problème : un connecteur dédié par source (30 connecteurs actifs, 44 sources au registre — les 14 restantes sont documentées comme abandonnées ou mortes à la source, avec preuves) visite chaque calendrier, normalise chaque événement vers un schéma unique, déduplique les doublons inter-sources et détecte les changements en continu. Sorti·Ka n'est pas une billetterie : c'est un index fidèle — aucun prix inventé, aucune date devinée, chaque fiche est attribuée à sa source. Pour qui ? Quiconque cherche quoi faire, ce soir ou cet été, n'importe où au Québec.
Chiffres clés (live sur /api/stats, vérifiés au 2026-08-24)
| Métrique | Valeur |
|---|---|
| Événements actifs | 18 186 (dont 18 170 à venir) |
| Gratuits à venir | 3 614 |
| Villes couvertes | 332 — rattachées aux 17/17 régions administratives |
| Sources actives / au registre | 30 / 44 (13 abandonnées documentées + 1 morte à la source) |
| Catégories canoniques | 14 |
| En quarantaine qualité | 2 |
| Top régions | Montréal 6 703 · Capitale-Nationale 3 185 · Montérégie 1 067 · Estrie 918 |
| Top catégories | arts-scène 3 031 · musique 2 893 · sport 1 079 · plein-air 749 |
Visite guidée
Captures du 2026-08-25 — frontend v2 « guide culturel » (mobile 390×844 · desktop 1440×900).
Mobile
![]() Accueil — hero mosaïque, accès rapides, timeline de jours |
![]() Résultats par région — cartes image-first |
![]() Fiche événement — CTA billetterie sticky |
![]() Catégorie — musique |
![]() Tableau de bord /stats |
![]() Nav v2 — panneau plein écran |
Desktop
![]() Accueil — sections « À la une », carrousels, ticker |
![]() Fiche événement — date, lieu, prix, lien billetterie |
![]() Page région — Montréal |
![]() Page catégorie — pages SEO indexables |
![]() Répertoire des 17 régions |
![]() Statistiques — 22 900+ événements, 61 sources |
Nouveautés front-end (2026-08-25)
- Frontend v2 « guide culturel » — refonte majeure mobile-first : hero éditorial avec mosaïque d'images réelles et compteurs en phrase, recherche centrale, accès rapides (Ce soir / Fin de semaine / Gratuit / Près de moi), timeline de jours, accueil par sections dédoublonnées (À la une, carrousels, grille), fiches image-first, résultats Liste|Carte (Leaflet à la demande), pilules de filtres actifs, bottom sheet de filtres, CTA sticky sur mobile.
- Filtre géographique
near=lat,lng+ tri par distance côté API. - KA Tabbar v1 — barre de navigation mobile commune Groupe KA (Découvrir · Recherche · Carte · Favoris).
- Vague connecteurs 2026-08-25 — +26 sources actives (ATR, municipales, billetteries) : 61 sources, 22 900+ événements actifs.
- Widget ka-agent v4 — cartes d'événements cliquables et choix en boutons.
🗄️ Les captures d'époque (v1) sont conservées dans
docs/archive/.
Guide pas à pas (« Utiliser le site en 4 étapes », depuis /doc)
![]() Étape 1 — Arriver sur l'accueil |
![]() Étape 2 — Filtrer la liste |
![]() Étape 3 — Ouvrir la fiche d'un événement |
![]() Étape 4 — Consulter les statistiques |
Fonctionnalités
- Recherche filtrée — région, ville, catégorie (14 catégories canoniques), période, gratuité, texte libre, tri et pagination (
GET /api/events). - Fiche par événement — dates, heure locale, artistes, lieu, prix (avec
price_labeloriginal), carte, événements similaires ; SSR + JSON-LD Event (/evenement/{uid}) pour le SEO, sitemaps et robots.txt. - 30 connecteurs actifs (31 modules dans
sortika/connectors/, dont Ticketmaster prêt) couvrant billetteries, données ouvertes, diffuseurs et portails régionaux (tableau ci-dessous). - Déduplication inter-sources — empreinte titre + ville + date : un même concert publié par 3 sources = une seule carte, la fiche la plus riche gagne.
- Répertoire des municipalités MAMH — 1 250 villes + arrondissements + alias, homonymes résolus par population ; rattachement automatique aux 17 régions.
- Persistance robuste — upsert par hash de contenu, délai de grâce de 2 syncs avant retrait, alerte de dérive quand une source casse, quarantaine qualité, historique des synchronisations.
- SEO programmatique — SSR de l'accueil (title avec stats live, JSON-LD WebSite/Organization), pages régions + catégories rendues en HTML, hreflang/BreadcrumbList sur les fiches.
- Page /stats — tableau de bord analytique + rapports PDF Groupe-KA (kit kacharts/kapdf v3, rapports personnalisés par catalogue de blocs).
- Widget KA Agent (v3, bulle déplaçable) + favoris « Mon univers Ka » (KA ID, hub groupe-ka.com).
- Tests sur fixtures réelles, zéro réseau — 69 tests pytest (connecteurs, normalisation, DB, auth, expansion).
Connecteurs & sources
30 connecteurs actifs / 44 sources au registre (data/sources.json : 30 actives, 13 abandonnées avec preuves, 1 morte à la source) — 45 fiches de conformité générées dans docs/connecteurs/.
| Famille | Sources | Accès |
|---|---|---|
| Billetteries | Le point de vente, evenko (Algolia), Ticketpro (API multi-tenants : St-Denis, Fun Nation, ExpoCité…), Ticket Accès, Tuxedo Billet (acteur Apify ka-tuxedo), Réseau Ovation, Eventbrite | API/JSON publics des billetteries |
| Données ouvertes officielles | SIT Québec / Tourinsoft (licence CC 4.0), Ville de Montréal (CKAN, CC BY 4.0), Laval, Sherbrooke, Brossard, Longueuil | portails de données ouvertes |
| Diffuseurs & salles | La Vitrine, Place des Arts, salles via JSON-LD (dont Odyscène) | pages publiques structurées |
| Portails régionaux | Montérégie, Outaouais, Lanaudière, Cantons-de-l'Est, Chaudière-Appalaches, Bas-Saint-Laurent, Gaspésie, Centre-du-Québec, Saguenay… | calendriers régionaux publics |
| Autres | Atuvu.ca (via Scrapfly), Bandsintown, LHJMQ, Québec animée | HTML/JSON publics |
| Prêt (clé requise) | Ticketmaster (TICKETMASTER_API_KEY) |
API officielle |
| Sondées et écartées (avec preuves) | Zeffy, Showpass, Weezevent, Accès culture… (13 abandonnées + 1 morte à la source) | documentées au registre |
Cadence de resync : horaire — le watcher PM2 sorti-ka-sync (run.py watch --interval 3600) visite les sources en continu ; chaque événement passe par la normalisation (schema.py + normalize.py), l'upsert par hash, le délai de grâce (2 syncs) et l'alerte de dérive. Les connecteurs fragiles passent par une chaîne de fetch anti-bot résiliente (Oxylabs → Scrapfly → Bright Data).
Architecture
connecteurs (1 module / source) normalisation (Event) SQLite (diff + grâce)
sortika/connectors/*.py → schema.py + normalize.py → db.py
▲ auto-découverts + regions.py (MAMH) │
│ ▼
watcher horaire (PM2) frontend SPA + fiches ← API FastAPI + SSR SEO
run.py watch frontend/index.html web.py + seo.py- Backend : Python 3.14 + FastAPI (uvicorn) — API JSON, SSR SEO des fiches, stats, PDF (fpdf2), SSO/favoris KA ID (
auth.py,hubfav.py). - Base de données : SQLite — événements, diff par hash, délai de grâce, quarantaine, historique de syncs, géocodage (
geocode.py,venues.py— annuaire de salles appris/OSM/Nominatim). - Frontend : SPA sans build (HTML/JS, routeur History API), design system Groupe KA « éditorial sharp » (ka-ui), widget KA Agent.
- Anti-bot : chaîne résiliente Oxylabs → Scrapfly → Bright Data (Atuvu via
SCRAPFLY_API_KEY).
API — endpoints principaux
| Endpoint | Méthode | Rôle |
|---|---|---|
/api/events |
GET | recherche filtrée : région, ville, catégorie, période, gratuité, texte, tri, pagination |
/api/events/{uid} |
GET | fiche complète d'un événement (+ SSR SEO sur /evenement/{uid}) |
/api/regions · /api/categories |
GET | référentiels (17 régions, 14 catégories canoniques) |
/api/sources |
GET | registre des sources, état et santé des connecteurs (44 entrées) |
/api/stats |
GET | agrégats publics (source des pastilles dynamiques ci-dessus) |
/api/stats/catalog · /api/stats/dashboard |
GET | catalogue de blocs + tableau de bord (kit stats v3 Groupe KA) |
/api/stats/report · /api/stats/report/custom |
GET/POST | rapports PDF Groupe-KA (modèles + personnalisés) |
/api/favorites · /api/favorites/toggle |
GET/POST | favoris « Mon univers Ka » (KA ID) |
/api/health · /healthz |
GET | santé du service |
Données & conformité
- Provenance : uniquement des sources publiques — API de billetteries, données ouvertes officielles (SIT Québec CC 4.0, Montréal CC BY 4.0…), pages publiques structurées (JSON-LD). Chaque fiche cite et lie sa source originale.
- Cadence : resync horaire (watcher
run.py watch --interval 3600) ; retrait doux après 2 syncs d'absence, alerte de dérive par source. - Index fidèle, pas une billetterie : aucun prix inventé, aucune date devinée ;
price_labeloriginal conservé ; la billetterie encaisse, Sorti·Ka référence. - Registre auditable :
data/sources.json— 44 sources dont 30 actives ; chaque abandon est documenté avec preuves (Zeffy, Showpass, Weezevent, Accès culture, laval…). - Fiches de conformité :
docs/CONFORMITE.md+ 45 fiches générées dansdocs/connecteurs/(base d'accès légale, extraction, cadence par source).
Structure du repo
| Répertoire / fichier | Rôle |
|---|---|
sortika/ |
paquet Python : connecteurs, schéma Event, normalisation, régions MAMH, DB, web/SSR, stats, PDF, auth KA ID |
sortika/connectors/ |
un module par source (auto-découverts), base commune + _resilient.py (chaîne anti-bot) — 31 modules |
frontend/ |
SPA sans build (index.html, ka-agent.js, assets) + guide /doc (page, images, PDF) |
data/ |
base SQLite + villes_regions.json (répertoire MAMH) + sources.json (registre) — la BD n'est pas versionnée |
tests/ |
pytest sur fixtures réelles, zéro réseau — 69 tests (test_connectors, test_normalize, test_db, test_auth, test_expansion, test_phase4) |
scripts/ |
utilitaires (génération de docs, maintenance) |
docs/ |
CONFORMITE.md, fiches connecteurs/ (45), captures d'écran |
apify/ |
acteurs/outils d'appoint pour l'ingestion (ka-tuxedo…) |
run.py |
point d'entrée CLI : sync · web · watch |
requirements.txt |
fastapi, uvicorn, requests, fpdf2, pytest |
Démarrage rapide
ssh M3U96a && cd ~/apps/sorti-ka
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt # au besoin
.venv/bin/python -m pytest tests/ -q # 69 tests — fixtures réelles, zéro réseau
.venv/bin/python run.py sync # ingestion des sources
.venv/bin/python run.py web --port 8120 # API + frontend + SSR
.venv/bin/python run.py watch --interval 3600 # watcher horaire (en prod : PM2)Développement (remote-first)
⚠️ La source de vérité est le repo git sur le nœud M3U96a (~/apps/sorti-ka) — on n'édite jamais les copies laptop. Toute modification se fait sur le nœud via SSH : édition, tests, redémarrage PM2, puis commit + push depuis le nœud.
- Remote
origin= spbgit (git perso, https://git.spboucher.ai) — sur M3U96a, l'origin est le chemin local/Users/simon-pierreboucher/srv/git/sorti-ka.git(bare repo).
cd ~/apps/sorti-ka
.venv/bin/python -m pytest tests/ -q # avant de pousser
pm2 restart sorti-ka-web # après changement
git add <fichiers> && git commit -m "…" && git push origin mainVariables d'environnement
Noms seulement — aucun secret n'est versionné (gabarit : .env.example).
| Variable | Rôle |
|---|---|
SCRAPFLY_API_KEY |
anti-bot pour le connecteur Atuvu.ca (et repli de la chaîne résiliente) |
TICKETMASTER_API_KEY |
active le connecteur Ticketmaster (prêt, en attente de clé) |
SESSION_SECRET |
signature des sessions |
KA_SSO_SECRET · KA_HUB_URL |
SSO KA ID (hub groupe-ka.com) |
SORTIKA_BASE_URL |
URL canonique du site (SEO, liens absolus) |
Déploiement
| Nœud | M3U96a (cluster MacLustr) — ~/apps/sorti-ka |
| Port | 8120 |
| Domaine | www.sorti-ka.com via tunnel ngrok |
| Processus PM2 | Commande réelle | Rôle |
|---|---|---|
sorti-ka-web |
run.py web --host 0.0.0.0 --port 8120 |
API + frontend + SSR SEO |
sorti-ka-sync |
run.py watch --interval 3600 |
watcher horaire — ingestion continue des sources |
sorti-ka-ngrok |
ngrok http --url=www.sorti-ka.com 8120 |
tunnel vers www.sorti-ka.com |
Documentation
- Guide utilisateur en ligne : www.sorti-ka.com/doc/ — à quoi sert le site, utilisation en 4 étapes, provenance des données, FAQ.
- Guide PDF téléchargeable : sorti-ka-documentation.pdf.
- Conformité & connecteurs :
docs/CONFORMITE.md+ une fiche par connecteur dansdocs/connecteurs/(45 fiches).
Historique
| Date | Jalon |
|---|---|
| 2026-08-17 | Sorti·Ka v1 — agrégateur de sorties & événements du Québec + connexion KA ID |
| 2026-08-18 | vagues 2-3 d'enrichissement : heure précise, artistes, géocodage des salles, Ticketmaster/Eventbrite/Longueuil/Cantons-de-l'Est, docs standardisées |
| 2026-08-19 | phases 2-3 : archivage des passés, statut/end_time, quarantaine, séances, villes MAMH, annuaire de salles (venues), registre 34 sources + conformité |
| 2026-08-21/22 | phases 4-5 : 7 connecteurs régions + billetteries QC (Ticket Accès, Ovation, Tuxedo, Ticketpro), chaîne anti-bot résiliente, SSR SEO de l'accueil, 4 billetteries écartées avec preuves |
| 2026-08-23 | SEO programmatique (régions + catégories en HTML), stats v3 (rapports PDF personnalisés), favoris « Mon univers Ka » |
| 2026-08-24 | page /doc (guide + captures + PDF), README v3 |
Écosystème Groupe KA
| Site | Univers |
|---|---|
| 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 dépôt vit sur spbgit (git perso — https://git.spboucher.ai).
















