SPB Git forge

spb/api-ka

Public

API-KA — plateforme centrale : collecte quotidienne des 8 services KA, historisation append-only et API publique sur www.api-ka.com

48commits 1branches 0releases
5.9 MBsize
maindefault branch
19 days agolast push
Python 60.9% HTML 21% TypeScript 7.3% JavaScript 5.2% CSS 4.8% Shell 0.8%
26.5 KB · 308 lines markdown
Rendered Raw Blame History
1<!-- Auteur : Simon-Pierre Boucher — contact@spboucher.ai -->23<p align="center">4  <a href="https://www.api-ka.com"><img src="https://www.api-ka.com/og.png" width="760" alt="API·Ka — La donnée de l'écosystème, par API"></a>5</p>6<h1 align="center">API·Ka</h1>7<p align="center"><b>La donnée de l'écosystème, par API</b></p>89<div align="center">1011[![Site](https://img.shields.io/website?url=https%3A%2F%2Fwww.api-ka.com&style=flat-square&label=www.api-ka.com&up_color=3b5bdb&up_message=en%20ligne)](https://www.api-ka.com)12[![Documentation](https://img.shields.io/badge/📖_documentation-%2Fdoc-3b5bdb?style=flat-square)](https://www.api-ka.com/doc/)13[![PDF](https://img.shields.io/badge/guide-PDF-3b5bdb?style=flat-square)](https://www.api-ka.com/doc/api-ka-documentation.pdf)14[![Swagger](https://img.shields.io/badge/Swagger-%2Fdocs-3b5bdb?style=flat-square)](https://www.api-ka.com/docs)15![Nœud](https://img.shields.io/badge/n%C5%93ud-M3U96b-1f6feb?style=flat-square)16![Port](https://img.shields.io/badge/port-8000-141814?style=flat-square)17![PM2](https://img.shields.io/badge/PM2-3_processus-2b037a?style=flat-square)1819[![Collectes 7 j](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fapi%2Fstats&query=%24.data.runs_7d.ok&label=collectes%207%20j%20OK&color=3b5bdb&style=flat-square)](https://www.api-ka.com/api/stats)20[![Enregistrements 7 j](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fapi%2Fstats&query=%24.data.runs_7d.records&label=enregistrements%207%20j&color=3b5bdb&style=flat-square)](https://www.api-ka.com/api/stats)21[![Appels API 7 j](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fapi%2Fstats&query=%24.data.api.calls_7d&label=appels%20API%207%20j&color=3b5bdb&style=flat-square)](https://www.api-ka.com/api/stats)22[![Connecteurs OK](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fapi%2Fstats&query=%24.data.connectors.ok&label=connecteurs%20OK&color=2f9e44&style=flat-square)](https://www.api-ka.com/stats)23[![Connecteurs en panne](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fapi%2Fstats&query=%24.data.connectors.broken&label=connecteurs%20en%20panne&color=e03131&style=flat-square)](https://www.api-ka.com/stats)24[![PostgreSQL](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fhealth&query=%24.data.database&label=PostgreSQL&color=3b5bdb&style=flat-square)](https://www.api-ka.com/health)25[![Dernière collecte](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fhealth&query=%24.data.last_collections.louka.date_key&label=derni%C3%A8re%20collecte&color=3b5bdb&style=flat-square)](https://www.api-ka.com/health)2627![Python](https://img.shields.io/badge/Python-3.11+-3776AB?style=flat-square&logo=python&logoColor=white)28![FastAPI](https://img.shields.io/badge/FastAPI-Uvicorn-009688?style=flat-square&logo=fastapi&logoColor=white)29![PostgreSQL](https://img.shields.io/badge/PostgreSQL-SQLAlchemy_2-4169E1?style=flat-square&logo=postgresql&logoColor=white)30![APScheduler](https://img.shields.io/badge/APScheduler-job_02%3A00-1c5c41?style=flat-square)31![Claude](https://img.shields.io/badge/KA_Agent-Claude_Haiku_4.5-cc785c?style=flat-square&logo=anthropic&logoColor=white)32![pytest](https://img.shields.io/badge/tests-pytest-0A9EDC?style=flat-square&logo=pytest&logoColor=white)33![PM2](https://img.shields.io/badge/process-PM2-2B037A?style=flat-square&logo=pm2&logoColor=white)34![ngrok](https://img.shields.io/badge/tunnel-ngrok-1F1E37?style=flat-square&logo=ngrok&logoColor=white)35![Groupe KA](https://img.shields.io/badge/Groupe-KA-3b5bdb?style=flat-square)36![spbgit](https://img.shields.io/badge/remote--first-spbgit-141814?style=flat-square&logo=git&logoColor=white)3738</div>3940**API·Ka** ([www.api-ka.com](https://www.api-ka.com)) est la **plateforme de données centrale de l'écosystème Groupe KA**. Chaque jour, **11 collecteurs** (lou-ka, immo-ka, food-ka, auto-ka, fabri-ka, resto-ka, sorti-ka, crea-ka, job-ka, house-ka, rent-ka) sauvegardent les données des plateformes dans une base **PostgreSQL** unifiée (fetch → validation → checksum → insertion → backup → journal de run, retry 3× avec backoff 30 s → 2 min → 10 min), puis les exposent via une **API FastAPI publique** : données paginées, historiques par date, statistiques, rapports PDF.4142Elle héberge aussi le **KA Agent** — l'assistant IA central du groupe (Claude Haiku 4.5, SSE, boucle de **34 outils** branchés sur les API publiques des plateformes) servi en widget (`/ka-agent.js`) aux 13 domaines de l'écosystème — et sert de **superviseur des connecteurs** (~4 460 connecteurs suivis au 2026-08-28 : historique des collectes `/api/v1/runs`, santé par service, alertes). L'accès à l'API produit exige une authentification : session **KA ID** ou **jeton personnel** (`kapi_`, généré sur groupe-ka.com/compte).4344## Chiffres live (au 2026-08-28)4546Instantané de `GET /api/stats` et `GET /health` — les pastilles dynamiques ci-dessus restent à jour en continu.4748| Métrique | Valeur |49|---|---|50| Collectes sur 7 jours | **70 / 74 réussies** (4 échecs, rattrapées par le backfill) |51| Enregistrements collectés sur 7 jours | **4 522 761** |52| Appels API sur 7 jours | **5 680** |53| Services collectés | **11** (house-ka et rent-ka intégrés les 2026-08-27/28) |54| Connecteurs supervisés (écosystème) | **4 458** — 4 179 OK · 133 dégradés · 3 en panne · 85 périmés · 58 retirés |5556Dernière collecte par service (2026-08-28) :5758| Service | Enregistrements | | Service | Enregistrements |59|---|---|---|---|---|60| fabrika | 384 574 | | jobka | 2 297 |61| rentka | 55 241 | | immoka | 36 |62| sortika | 17 168 | | autres* | 0 |63| louka | 7 365 | | **Total du jour** | **466 681** |6465<sub>* creaka, restoka, autoka, foodka et houseka rapportaient 0 enregistrement pour la date du jour au moment de la capture (collectes différentielles / heure de passage) — le statut du run restait `success`. Les valeurs live sont sur [/health](https://www.api-ka.com/health).</sub>6667## Visite guidée6869*10 captures du 2026-08-28 (desktop 1440×900 · mobile 390×844), versionnées dans [`docs/screenshots/`](docs/screenshots/).*7071<table>72  <tr>73    <td align="center" colspan="2"><img src="docs/screenshots/01-accueil.jpg" width="720" alt="Accueil API·Ka"><br><sub><b>Accueil — « Toutes les données KA, centralisées chaque jour »</b><br>Le héros de <a href="https://www.api-ka.com">www.api-ka.com</a> : badge « API opérationnelle · M3U96B », réponse live de <code>GET /health</code> (nœud, base, dernières collectes) et compteurs en direct.</sub></td>74  </tr>75  <tr>76    <td align="center"><img src="docs/screenshots/07-accueil-section-1.jpg" width="420" alt="Accueil — section Sources"><br><sub><b>Accueil · 01 — Sources</b><br>Les services collectés en cartes : vocation, route <code>/api/v1/{service}</code>, enregistrements historisés et lien vers chaque plateforme Ka.</sub></td>77    <td align="center"><img src="docs/screenshots/08-accueil-section-2.jpg" width="420" alt="Accueil — section Endpoints"><br><sub><b>Accueil · 02 — Référence des endpoints</b><br>Chaque endpoint documenté en place : description, paramètres, extraits <code>curl</code> / Python / JavaScript copiables et bouton « Essayer ».</sub></td>78  </tr>79  <tr>80    <td align="center"><img src="docs/screenshots/09-accueil-section-3.jpg" width="420" alt="Accueil — endpoints historiques"><br><sub><b>Accueil — les endpoints d'historique</b><br><code>/api/v1/{service}/latest</code> et <code>/api/v1/{service}/date/{YYYY-MM-DD}</code> : paramètres requis/optionnels, pagination (limit max 500).</sub></td>81    <td align="center"><img src="docs/screenshots/03-stats.jpg" width="420" alt="Page /stats"><br><sub><b>/stats — la supervision de la plateforme</b><br>Appels API, latences moyenne et p95, taux d'erreur, collectes réussies/échouées, enregistrements — filtres de période et rapports PDF (complet, personnalisés).</sub></td>82  </tr>83  <tr>84    <td align="center"><img src="docs/screenshots/04-docs.jpg" width="420" alt="Swagger /docs"><br><sub><b>/docs — l'API interactive (Swagger, OpenAPI 3.1)</b><br>Tous les routeurs (health, auth, runs, monitoring, stats, services, agent…) avec schémas et essais en direct.</sub></td>85    <td align="center"><img src="docs/screenshots/05-doc.jpg" width="420" alt="Guide /doc"><br><sub><b>/doc — « Comment fonctionne API·Ka »</b><br>Le guide public : vue d'ensemble (collecteurs quotidiens, retry 3× + backfill, backups 90 jours, KA Agent), téléchargeable en PDF.</sub></td>86  </tr>87  <tr>88    <td align="center"><img src="docs/screenshots/06-doc.jpg" width="420" alt="Guide /doc (route directe)"><br><sub><b>/doc — la même page servie sur la route sans barre oblique finale</b><br>Le guide reste accessible aux deux chemins (<code>/doc</code> et <code>/doc/</code>).</sub></td>89    <td align="center"><img src="docs/screenshots/02-contact.jpg" width="420" alt="Page /contact"><br><sub><b>/contact — « Nous joindre »</b><br>Les trois courriels officiels du Groupe KA (projets/partenariats, médias, légal & Loi 25) et le rappel que la connexion « Se connecter avec KA » est déléguée au hub KA ID.</sub></td>90  </tr>91  <tr>92    <td align="center" colspan="2"><img src="docs/screenshots/10-accueil-mobile.jpg" width="220" alt="Accueil mobile"><br><sub><b>Accueil — version mobile (390×844)</b><br>Le même héros et le statut <code>/health</code> live, en colonne unique avec la nav mobile v2.</sub></td>93  </tr>94</table>9596> 🗄️ Les captures du guide et du Swagger en WebP restent dans [`docs/screenshots/desktop/`](docs/screenshots/desktop/) et [`docs/screenshots/mobile/`](docs/screenshots/mobile/) ; les captures d'époque sont conservées dans [`docs/archive/`](docs/archive/).9798### Nouveautés99100- **2026-08-28 — Rent-Ka devient le 11ᵉ service** : collecteur `rentka` (pagination offset/2000 comme lou-ka), table `rentka_data`, supervision des ~680 sources du connecteur au premier run (`6c64acd`).101- **2026-08-27 — House-Ka devient le 10ᵉ service** : collecteur + modèle + CORS + supervision (17 sources) (`eb543c9`).102- **KA Agent v3.2** — **34 outils** (recherche fédérée, annuaires déménageurs/inspecteurs, agences immobilières, historique/coût réel/TAL logement, ValoPlex, KA Scores) ; cartes d'annonces construites **côté serveur** (`afficher_cartes`), lien public `lien_fiche` sur chaque résultat, reprise automatique après coupure `max_tokens`.103- **Widget ka-agent v4** servi aux 13 domaines — cartes cliquables (`ka-card`) et choix en boutons (`ka-choix`).104- **Monitoring des connecteurs** — statut `retired` pour les sources désactivées ou disparues.105- **Nav mobile v2** sur les pages web.106107## Rôle central dans l'écosystème108109API·Ka est le **système nerveux du Groupe KA**, avec trois missions :1101111. **API unifiée des plateformes** — un seul point d'entrée versionné (`/api/v1/{service}`) pour les données quotidiennes historisées des 11 services : mêmes conventions de pagination, mêmes enveloppes JSON, mêmes checksums, quel que soit le service interrogé. C'est ce qui alimente l'app iOS KA, Ka·Stats, les rapports PDF et les intégrations internes.1122. **Superviseur des connecteurs** — la santé des ~4 460 connecteurs de collecte de tout l'écosystème (les sources de lou-ka, immo-ka, rent-ka, etc.) est agrégée ici (`/api/v1/monitoring/connectors`), avec statuts `ok / degraded / broken / stale / retired`, fenêtres de fraîcheur par service et alertes journalisées.1133. **Agent conversationnel central** — le KA Agent répond en langage naturel sur les 13 sites via un seul backend (SSE), en s'appuyant sur les données live des plateformes plutôt que sur la base historisée : ce que l'agent dit est ce que les sites affichent.114115## Fonctionnalités116117- **11 collecteurs quotidiens** — un par plateforme Ka (Job-Ka intégré le 2026-08-18, House-Ka le 2026-08-27, Rent-Ka le 2026-08-28), avec validation, checksum, retry 3× (backoff exponentiel) et journal de run ; tout échec après 3 tentatives est loggé (`collection_runs`, `logs/alerts.log`).118- **Scheduler APScheduler** — job quotidien à 02:00 (collecteurs en parallèle et indépendants) + **backfill automatique** des dates manquées (7 derniers jours).119- **API publique de données** — `GET /api/v1/{service}` (pagination, limit max 500), `/latest`, `/date/{YYYY-MM-DD}`, `/stats`, `/api/v1/runs` (historique des collectes), pour `{service}` ∈ louka, immoka, foodka, autoka, fabrika, restoka, sortika, creaka, jobka, houseka, rentka.120- **Authentification obligatoire sur l'API produit** — session KA ID ou jeton Bearer `kapi_` ; monitoring, stats et agent restent ouverts.121- **KA Agent (IA)** — `POST /api/agent/chat` en SSE (Claude Haiku 4.5, boucle de **34 outils** sur les données live des plateformes : logements, propriétés, véhicules, rappels, emplois, épicerie et comparateur de prix, produits et boutiques QC, restos, plats, menus, inspections MAPAQ, sorties, créateurs, recherche web Québec, recherche globale fédérée, suggestions, facettes, fiches détail, estimateurs Vrai-Prix et ValoPlex, annuaires déménageurs/inspecteurs, agences immobilières, historique/coût réel/TAL logement, KA Scores, cartes d'annonces serveur, stats et état des services) + recherche floue en cascade + widget embarquable `GET /ka-agent.js` (v4 : bulle déplaçable, position mémorisée par site, cartes cliquables et boutons de choix), CORS ouvert aux 13 domaines.122- **SSO KA ID** — `GET /api/auth/ka/{login,callback}`, session `/api/auth/me`, et échange de jeton pour les apps natives (`POST /api/ios/auth/exchange`, vérification HS256, `aud` ∈ ka-ios, ka-android).123- **Stats & rapports** — tableau de bord `/stats`, `GET /api/stats` (KPI compact JSON), `GET /api/stats/report` (PDF de la plateforme) et `GET /api/stats/ecosystem-report` (rapport PDF consolidé de l'écosystème, liste dynamique via `ecosystem.json`) + rapports PDF personnalisés (catalogue + constructeur).124- **Recherche transversale** — `GET /api/v1/search` + `GET /api/v1/suggest` (proxy du moteur Trouve-Ka, pivot moteur de recherche Groupe KA).125- **Backups quotidiens** horodatés par service (`data/backups/YYYY-MM-DD/`, rétention 90 jours).126- **Santé & supervision** — `GET /health` (nœud, état DB, dernière collecte par service, compteurs de connecteurs) ; chaque service vérifie le hostname au démarrage et refuse de tourner en production ailleurs que sur `m3u96b`.127- **SEO du site de doc** — robots.txt, sitemap.xml, canonical/hreflang/JSON-LD.128129## Authentification130131Deux façons d'accéder à l'API produit — **aucun secret n'est stocké dans ce repo** :132133- **Session KA ID (SSO)** — le bouton « Se connecter avec KA » délègue au hub [groupe-ka.com](https://www.groupe-ka.com) (compte unique de l'écosystème) : `GET /api/auth/ka/login` → callback → session serveur, introspectable via `GET /api/auth/me`.134- **Jeton personnel `kapi_`** — généré (et révocable) sur [groupe-ka.com/compte](https://www.groupe-ka.com/compte), passé en en-tête `Authorization: Bearer kapi_…`. C'est la voie recommandée pour les scripts et intégrations.135- **Endpoints exemptés** (publics sans authentification) : `GET /health`, `GET /api/stats`, la supervision (`/api/v1/runs`, `/api/v1/monitoring/*`), les pages web et le KA Agent (`/api/agent/chat`, `/ka-agent.js`).136- **Apps natives** : `POST /api/ios/auth/exchange` échange le jeton du hub contre une session API (HS256, `aud` ka-ios / ka-android).137- Rate-limit global : 120 req/min.138139## API (endpoints principaux)140141Référence interactive complète : **Swagger sur [/docs](https://www.api-ka.com/docs)**. 🔒 = session KA ID ou jeton Bearer `kapi_` requis.142143| Méthode & endpoint | Description |144|---|---|145| `GET /health` | santé : nœud, état DB, dernière collecte par service, compteurs de connecteurs |146| `GET /api/stats` | KPI compact JSON : collectes 7 j, enregistrements, appels API, connecteurs (alimente les pastilles ci-dessus) |147| 🔒 `GET /api/v1/{service}` | données paginées (limit max 500) — service ∈ louka, immoka, foodka, autoka, fabrika, restoka, sortika, creaka, jobka, houseka, rentka |148| 🔒 `GET /api/v1/{service}/latest` | dernière collecte du service |149| 🔒 `GET /api/v1/{service}/date/{YYYY-MM-DD}` | collecte d'une date précise |150| 🔒 `GET /api/v1/{service}/stats` | statistiques du service |151| 🔒 `GET /api/v1/louka/fairvalue/{uid}` | juste prix d'une annonce Lou·Ka (proxy live, utilisé par l'app iOS KA) |152| `GET /api/v1/runs` | historique des runs de collecte (supervision) |153| `GET /api/v1/monitoring/connectors` · `/connectors/{service}` | santé des connecteurs de l'écosystème (~4 460 suivis, statuts ok/degraded/broken/stale/retired) |154| `GET /api/stats/dashboard` · `/report` · `/catalog` · `POST /api/stats/report/custom` | tableau de bord + rapports PDF (catalogue, personnalisés) |155| `GET /api/stats/ecosystem-report` | rapport PDF consolidé des 13 plateformes |156| `POST /api/agent/chat` (SSE) · `GET /ka-agent.js` | KA Agent (Claude Haiku 4.5 + 34 outils live) et son widget embarquable |157| `GET /api/v1/search` · `GET /api/v1/suggest` | recherche transversale (incl. recherche floue) et suggestions — proxy Trouve-Ka |158| `GET /api/auth/config` · `/ka/login` · `/ka/callback` · `/me` · `POST /api/auth/logout` | SSO KA ID |159| `POST /api/ios/auth/exchange` | échange de jeton pour les apps natives (`aud` ka-ios / ka-android) |160161## Architecture162163- **FastAPI + Uvicorn** (`src/api/`) : 9 routeurs (health, auth, runs, monitoring, stats, search, services, agent, iosauth) + pages web et PDF (fpdf2).164- **PostgreSQL** via **SQLAlchemy 2** (+ **Alembic** pour les migrations, `psycopg2`) : une table de données par service (`{service}_data`) + journal `collection_runs`.165- **Collecteurs** (`src/collectors/`) : classe abstraite `base_collector` (fetch, validate, save, retry) + 11 collecteurs concrets, httpx.166- **Scheduler** (`src/scheduler/`) : `daily_job.py` (02:00) + `backfill.py`.167- **Utils** (`src/utils/`) : backups quotidiens, rétention 90 jours ; `src/monitoring/` pour la supervision (`connector_health` sonde les 11 apps).168- **anthropic** SDK pour le KA Agent.169170Collecteurs et cadence :171172| Collecteur | Source | Cadence |173|---|---|---|174| `louka` · `immoka` · `foodka` · `autoka` · `fabrika` · `restoka` · `sortika` · `creaka` · `jobka` · `houseka` · `rentka` | API publique de chaque plateforme Ka (`{SERVICE}_SOURCE_URL`) | quotidien 02:00 (parallèle, indépendants) |175| backfill | dates manquées des 7 derniers jours | au démarrage du job quotidien |176| backups | dump horodaté par service (`data/backups/YYYY-MM-DD/`) | quotidien, rétention 90 jours |177178Processus PM2 sur le nœud (commandes de start réelles) :179180| Processus | Commande | Rôle |181|---|---|---|182| `apika-api` | `venv/bin/uvicorn src.api.main:app --host 127.0.0.1 --port 8000` | l'API FastAPI/Uvicorn sur le port **8000** (liée à 127.0.0.1) |183| `apika-scheduler` | `venv/bin/python -m src.scheduler.daily_job` | le job quotidien 02:00 + backfill |184| `apika-ngrok` | `ngrok http --domain=www.api-ka.com 8000 --log stdout` | tunnel vers **www.api-ka.com** |185186## Démarrage rapide187188```bash189git clone gitsrv:api-ka.git && cd api-ka190python3 -m venv venv && source venv/bin/activate191pip install -r requirements.txt192cp .env.example .env                             # puis remplir les valeurs193194python -m src.database.db --init                 # initialiser la base PostgreSQL195uvicorn src.api.main:app --reload --port 8000    # API en dev → http://127.0.0.1:8000196python -m src.scheduler.daily_job --now          # collecte manuelle immédiate197python -m src.scheduler.backfill --date 2026-08-15198pytest tests/ -v                                 # modules de tests (api, collectors, retry, backfill, search, stats, connector_health)199```200201## Variables d'environnement202203Déclarées dans `.env.example` (copier vers `.env`, jamais commité — aucun secret dans le repo) :204205| Variable | Rôle |206|---|---|207| `APP_ENV` · `NODE_NAME` | environnement + garde-fou de hostname (`m3u96b` en prod) |208| `DATABASE_URL` | connexion PostgreSQL (SQLAlchemy) |209| `API_PORT` · `RATE_LIMIT_PER_MINUTE` | port de l'API (8000) et rate-limit |210| `DAILY_RUN_HOUR` · `BACKUP_RETENTION_DAYS` | heure du job quotidien (02) et rétention des backups (90) |211| `NGROK_AUTHTOKEN` · `NGROK_DOMAIN` | tunnel ngrok (www.api-ka.com) |212| `LOUKA_SOURCE_URL` … `RENTKA_SOURCE_URL` (×11) | URL source de chaque collecteur |213| `TROUVEKA_SEARCH_URL` · `TROUVEKA_SUGGEST_URL` | proxy du moteur de recherche Trouve-Ka |214| `KA_HUB_URL` · `KA_SSO_SECRET` · `KA_IOS_SSO_SECRET` · `SESSION_SECRET` | SSO KA ID (hub groupe-ka.com) + sessions |215| `ANTHROPIC_API_KEY` | clé du KA Agent (lue par le SDK anthropic) |216| `APIKA_BASE_URL` | base URL publique de l'API |217218## Données & conformité219220- **Provenance** : les données proviennent exclusivement des **API publiques des 11 plateformes Ka** (aucun scraping tiers dans ce repo) ; chaque enregistrement passe par validation + checksum avant insertion.221- **Cadence** : resynchronisation **quotidienne à 02:00** (collecteurs parallèles) + backfill automatique des 7 derniers jours ; backups quotidiens horodatés, rétention 90 jours.222- **Accès** : l'API produit exige une authentification (session KA ID ou jeton `kapi_` révocable sur groupe-ka.com/compte) ; monitoring, stats et agent restent publics ; rate-limit 120 req/min.223- **Traçabilité** : chaque run de collecte est journalisé (`collection_runs`, exposé via `/api/v1/runs`) ; alertes dans `logs/alerts.log`.224225## Structure du repo226227```228/opt/api-ka229├── src/          # api/ (routes, web, PDF), collectors/ (11), scheduler/, database/, monitoring/, utils/, config.py230├── scripts/      # deploy_m3u96b.sh, healthcheck.sh, run_daily_backup.sh, start_ngrok.sh…231├── systemd/      # unités historiques (le déploiement actuel utilise PM2)232├── tests/        # pytest (api, backfill, collectors, connector_health, retry, search, stats)233├── data/         # backups/YYYY-MM-DD/ (rétention 90 jours)234├── logs/         # logs centralisés + alerts.log235├── docs/         # screenshots/ (visite guidée + desktop/mobile WebP) · archive/236└── alembic.ini · pyproject.toml · requirements.txt · CLAUDE.md237```238239## Documentation240241- **Guide en ligne** : [www.api-ka.com/doc/](https://www.api-ka.com/doc/) — à quoi sert la plateforme, le parcours en 3 étapes (site de doc → Swagger `/docs` → supervision `/stats`), d'où viennent les données, FAQ.242- **Guide PDF** : [api-ka-documentation.pdf](https://www.api-ka.com/doc/api-ka-documentation.pdf) — la même documentation, téléchargeable.243- **Swagger interactif** : [www.api-ka.com/docs](https://www.api-ka.com/docs) — tous les endpoints, schémas et essais en direct.244- Les captures du guide sont versionnées dans `src/api/web/doc/img/` (etape1 → etape3).245246## Historique247248| Date | Jalon |249|---|---|250| 2026-08-17 | naissance de la plateforme : collecte quotidienne des 8 services KA + API publique (`d8b3b82`), design Groupe KA + SSO KA ID, page `/stats`, rapport écosystème PDF, **KA Agent v1** (Claude Haiku, SSE, 12 outils, CORS 13 domaines) |251| 2026-08-18 | **Job-Ka devient le 9ᵉ service** (collecteur + supervision, `609d6bb`) ; supervision centralisée des connecteurs de l'écosystème ; auth mobile ka-ios/ka-android |252| 2026-08-19 | **KA Agent v2** : 24 outils + recherche floue en cascade + widget v2 (`e548e0d`) ; socle mobile (anti-zoom 16 px) |253| 2026-08-22 | ka-agent v3 : bulle déplaçable, position mémorisée par site ; standard header KA |254| 2026-08-23 | **authentification obligatoire** sur l'API produit (KA ID / jeton `kapi_`, `99ebb9e`) ; stats v3 (rapports PDF personnalisés) ; recherche `/api/v1/search` (proxy Trouve-Ka) ; SEO complet ; monitoring affiné (fenêtre 6 h, sources vides ≠ pannes) |255| 2026-08-24 | page documentation `/doc` + guide PDF ; README v2 puis **v3** (chiffres live, pastilles dynamiques) |256| 2026-08-25 | **KA Agent v3.2** (33 → 34 outils, cartes serveur `afficher_cartes`, reprise après `max_tokens`) ; widget **ka-agent v4** ; statut `retired` au monitoring ; nav mobile v2 |257| 2026-08-27 | **House-Ka devient le 10ᵉ service** (`eb543c9`) — collecteur, modèle, CORS, supervision (17 sources) |258| 2026-08-28 | **Rent-Ka devient le 11ᵉ service** (`6c64acd`) — collecteur offset/2000, supervision (~680 sources) ; **README v4** + visite guidée en 10 captures |259260## Développement (remote-first)261262**La source de vérité est le repo git sur le nœud M3U96b** (`/opt/api-ka`) — on n'édite jamais les copies laptop. Toute modification se fait sur le nœud via SSH : édition, tests, `pm2 restart`, puis commit/push depuis le nœud.263264- Remote `origin` = **spbgit** (git perso [git.spboucher.ai](https://git.spboucher.ai), bare repos sur M3U96a). **Pas GitHub.**265- L'agent forwarding SSH est actif : le `git push origin main` fonctionne pendant une session SSH depuis le laptop.266- Chaque fichier du dépôt porte l'en-tête d'auteur obligatoire (voir `CLAUDE.md`).267268```bash269pm2 restart apika-api                            # après un changement en production270```271272## Déploiement273274- **Nœud** : M3U96b (Mac Studio, cluster MacLustr) — répertoire `/opt/api-ka` (hostname vérifié au démarrage)275- **Port** : **8000** (API liée à 127.0.0.1, exposée uniquement via le tunnel)276- **Processus PM2** : `apika-api` (API) + `apika-scheduler` (collectes) + `apika-ngrok` (tunnel)277- **Domaine** : **https://www.api-ka.com** (tunnel ngrok)278279## Écosystème Groupe KA280281| Plateforme | Vocation |282|---|---|283| [groupe-ka.com](https://www.groupe-ka.com) | portail du groupe et compte unique KA ID |284| [lou-ka.com](https://www.lou-ka.com) | logements à louer (Québec) |285| [immo-ka.com](https://www.immo-ka.com) | propriétés à vendre (Québec) |286| [vrai-prix.com](https://www.vrai-prix.com) | estimation immobilière |287| [auto-ka.com](https://www.auto-ka.com) | véhicules |288| [fabri-ka.com](https://www.fabri-ka.com) | produits québécois |289| [food-ka.com](https://www.food-ka.com) | épicerie et alimentation |290| [resto-ka.com](https://www.resto-ka.com) | restaurants |291| [sorti-ka.com](https://www.sorti-ka.com) | sorties et événements |292| [job-ka.com](https://www.job-ka.com) | emplois |293| [crea-ka.com](https://www.crea-ka.com) | créateurs de contenu |294| [trouve-ka.com](https://www.trouve-ka.com) | petites annonces |295| [house-ka.com](https://www.house-ka.com) | maisons à vendre (Canada hors Québec) |296| [rent-ka.com](https://www.rent-ka.com) | loyers (Canada hors Québec) |297| [api-ka.com](https://www.api-ka.com) | API de données *(ce repo)* |298299## Contact300301**Simon-Pierre Boucher** — fondateur, Groupe KA302📧 [contact@spboucher.ai](mailto:contact@spboucher.ai)303304---305306© Groupe KA — Simon-Pierre Boucher · contact@spboucher.ai307Ce repo vit sur **spbgit** ([git.spboucher.ai](https://git.spboucher.ai)).308