Qu'est-ce qui a changé
Nouveautés et améliorations visibles côté clients. Les changements purement techniques (performance interne, refactorisations, optimisations serveur) ne sont pas listés ici.
PermisAPI installable comme application mobile + couleur de marque dans la barre d'adresse
PWA manifest.json publié : PermisAPI est désormais installable comme une vraie application mobile depuis Android Chrome (menu "Ajouter à l'écran d'accueil"), iOS Safari (icône partage > sur l'écran d'accueil) et Edge Windows (barre d'adresse > installer l'application). Une fois installée, l'app s'ouvre en mode standalone (sans barre URL navigateur), affiche un splash screen en navy avec le logo PermisAPI au démarrage, et obtient sa propre icône sur l'écran d'accueil. Manifest exposé sur /manifest.webmanifest avec nom, description, 3 icônes (192 px standard Android + 180 px Apple Touch + 512 px splash), catégories business + productivity + utilities, langue fr, display standalone, theme + background color navy.
Couleur de marque navy #0b1220 ajoutée à la barre d'adresse mobile via la balise theme-color exposée dans le viewport Next.js 14. Sur Chrome Android, la barre d'URL prend la couleur navy de la charte PermisAPI quand on visite le site (au lieu du gris par défaut). Sur Safari macOS en plein écran, la barre de menu prend également cette couleur. Sur le splash screen PWA, le fond est en navy cohérent. Renforce la perception de marque et l'immersion visuelle, sans toucher au DOM visible.
Audit HTTP/2 + HTTP/3 réalisé sur les 3 services en production : HTTP/2 confirmé partout (Vercel landing + Railway API + Railway MCP, négocié via ALPN). HTTP/3 absent partout (pas d'en-tête Alt-Svc dans les réponses). Pour la landing Vercel, le support HTTP/3 est annoncé par défaut depuis juin 2023 mais nécessite probablement un toggle côté dashboard Vercel pour les domaines custom (action user-side). Pour l'API et le MCP sur Railway, l'edge railway-edge ne supporte pas HTTP/3 nativement : un proxy Cloudflare CDN serait nécessaire (chantier sprint 26 dédié, environ 1-2 jours setup + Cache Rules BYPASS /v1/* + IP allowlist origin + tests).
Cartes Open Graph dynamiques personnalisées par profil + 5 nouveaux types Schema.org + perf réseau
9 nouvelles cartes Open Graph dynamiques 1200x630 générées via next/og pour les 6 pages personas (marchand de biens, architecte, PropTech, fournisseur BTP, banque, étudiant chercheur) et les 3 pages mentions légales (SLA, DPA, Garantie stabilité API). Chaque carte est composée à la volée par Vercel Edge avec un titre + sous-titre + badge spécifiques au profil, dans la charte graphique brutalist noir + ambre cohérente avec la home. Quand vous partagez un lien profil sur LinkedIn, X, Slack ou Discord, l'aperçu affiche désormais une carte visuelle dédiée et accrocheuse, pas un logo générique.
5 nouveaux types Schema.org sur la page d'accueil dans le @graph existant : @SoftwareApplication (signal SaaS développeur immobilier, image, catégorie), @Service avec @hasOfferCatalog (les 5 plans tarifaires Free/Explorer/Pro/Business/Enterprise avec prix, currency EUR, availability InStock), @Person (Evan Caroux founder, sameAs GitHub, lien worksFor Organization), @WebSite (publisher, inLanguage fr-FR), et un node Organization renforcé. Google peut désormais comprendre PermisAPI comme un produit SaaS complet avec offres tarifaires structurées, et afficher dans les SERP une rich card avec les prix directement visibles.
Schema.org @SoftwareSourceCode (CodeSnippet) sur les 11 tutoriels du blog : un parser automatique extrait les blocs de code (Bash, Python, JavaScript, TypeScript, JSON, HTTP, SQL, YAML, TOML, TSX, JSX) du markdown de chaque tutoriel et les expose en @ItemList structurée. Signal sémantique pour les crawlers techniques Google et les crawlers IA (Claude, ChatGPT, Perplexity) qui peuvent désormais comprendre que cette page contient du code exécutable dans tel langage. Améliore la qualité des réponses des LLM à des questions du type 'comment faire X avec PermisAPI en Python'.
Article @TechArticle enrichi sur les 11 tutoriels : ajout de wordCount (calcul automatique depuis le markdown), dateModified (mise à jour à chaque build pour signaler à Google la fraîcheur du contenu), et lien image pointant désormais vers la carte Open Graph dynamique 1200x630 du tutoriel (au lieu du logo statique 512x512 carré). Plus joli dans Google Discover et le SERP rich card.
Performance réseau améliorée : ajout de balises preconnect et dns-prefetch dans le <head> pour les 5 domaines externes critiques (api.permisapi.fr, mcp.permisapi.fr, eu.i.posthog.com, www.clarity.ms, client.crisp.chat). Le navigateur résout les DNS et établit la connexion TLS en parallèle du parsing du HTML, ce qui économise 50 à 200 ms sur la première requête vers chacun de ces services. Améliore le Largest Contentful Paint sans toucher au DOM visible.
Fil d'Ariane + cartes carrousel tutoriels step-by-step + images partages sociaux + perf images (Schema.org BreadcrumbList + HowTo + OG)
Schema.org @BreadcrumbList ajouté sur 11 pages hiérarchisées (les 6 pages personas, les 4 pages mentions légales, /privacy, et le template des 11 tutoriels blog). Google affichera désormais dans les SERP un fil d'Ariane (par exemple permisapi.fr > Mentions légales > Engagement de service (SLA)) juste sous le titre, à la place de l'URL brute. Améliore le taux de clic (l'utilisateur voit la hiérarchie de navigation avant de cliquer) et renforce le signal d'autorité topique pour Google.
Schema.org @HowTo ajouté sur les tutoriels step-by-step via un parser automatique du markdown : si un tutoriel contient au moins 3 sections H2 commençant par Etape N. ou Step N., un schéma HowTo avec la liste numérotée des étapes est généré. Google peut afficher ces tutoriels sous forme de carrousel rich card dans les SERP avec les étapes numérotées visibles directement, avant le résultat texte classique. Format le plus visuel disponible. Audit automatique : 5 tutoriels sur 11 sont marqués HowTo (marchand de biens Paris 4 étapes, agent immo Zapier 6 étapes, contractant BTP zone, PropTech startup, Sitadel 311k analyse). Les 6 autres restent en TechArticle narratif.
Open Graph + Twitter Cards complétés sur les 10 pages publiques avec metadata custom (les 6 personas, /partners, /blog hub, et les 3 mentions légales SLA + DPA + Garantie stabilité). Les partages LinkedIn, X, Slack, Discord affichent désormais une carte visuelle avec le logo PermisAPI sur toutes les pages stratégiques, au lieu d'un lien nu sans aperçu. Image Open Graph par défaut ajoutée au layout racine. Les pages avec opengraph-image.tsx co-located (home, /mcp, /blog/[slug]) gardent leurs vraies images riches 1200x630 dynamiques générées par next/og : pas de régression.
Performance images améliorée : ajout de loading="lazy" et decoding="async" sur les 5 images below-the-fold du site (logo client branding dans le footer, badges PyPI sur /docs, badges UptimeRobot sur /docs et /status). Les images chargent désormais au scroll plutôt qu'à l'ouverture de la page, ce qui améliore les Core Web Vitals (Largest Contentful Paint, Total Blocking Time) et la perception de rapidité au-dessus de la ligne de flottaison. Audit alt-text validé : 100 % des images ont une description d'accessibilité.
Rich snippets Google : 38 questions structurées + cartes auteur/date sur tous les tutoriels (Schema.org FAQPage + TechArticle)
Schema.org @FAQPage publié sur 9 pages (la page d'accueil, /docs, et les 6 pages dédiées à chaque profil utilisateur : marchand de biens, architecte, PropTech, fournisseur BTP, banque ou foncière, étudiant ou chercheur). Au total 38 questions et réponses structurées, rédigées spécifiquement pour chaque profil. Google peut désormais afficher ces Q&R sous forme de cartes dépliables "People also ask" directement dans les résultats de recherche, ce qui augmente le taux de clic et capture les requêtes long-tail très précises ("Comment trouver des projets clients architecte", "L'API permis France est-elle conforme RGPD pour les banques", "Comment intégrer PermisAPI dans Claude Desktop").
Schema.org @TechArticle ajouté sur les 11 tutoriels du blog via le template /blog/[slug]. Google peut désormais afficher dans les SERP : nom de l'auteur (Evan Caroux), organisation éditrice (PermisAPI), date de publication, image de couverture, sous forme de rich card cliquable distincte d'un résultat texte classique. Améliore la perception d'autorité éditoriale sur les requêtes techniques ("marchand de biens API Paris", "agent immobilier Zapier permis construire", "MCP Claude permis France", "DVF cross-référence valeur foncière", "Score MDB v0.1 opportunité", etc.).
Description du hub /blog corrigée : annonçait encore "4 tutoriels" alors que 11 sont publiés (marchand de biens Paris, agent immobilier Zapier, contractant BTP par zone, startup PropTech, analyse Sitadel 311 K permis, DVF cross-référence valeur foncière, Score d'opportunité MDB v0.1, zonage PLU urbanisme, Géorisques BRGM, MCP Claude ChatGPT, chantiers à venir prospection B2B). Description openGraph mise à jour pour refléter le catalogue réel.
Fondations SEO : robots.txt strict + Schema.org Dataset sur les pages hub + canonical sur 100 % des pages publiques
Schema.org @Dataset publié sur la page d'accueil : Google Dataset Search, data.europa.eu et les portails open data peuvent désormais indexer PermisAPI comme un jeu de données structuré (1 235 804 permis 2014-2026 + 94,6 millions de parcelles cadastrales + 4,9 millions de transactions DVF + SIRENE BTP), avec licence Etalab déclarée et liens sameAs vers les sources officielles (data.gouv.fr Sitadel + statistiques.developpement-durable.gouv.fr). Audience cible : chercheurs, journalistes data, étudiants en aménagement urbain, foncières publiques.
Schema.org @DataCatalog sur le hub `/stats/communes` qui expose les 34 870 datasets-pages communaux comme une collection unifiée. Schema.org @WebAPI sur /docs qui lie la documentation au schéma OpenAPI officiel (/.well-known/openapi publié sprint 23 j1). Permet aux crawlers d'API (Postman API Network, RapidAPI, ProgrammableWeb, APIs.guru) de comprendre la surface de l'API automatiquement.
robots.txt renforcé (norme Ward 2017) : ajout du Disallow sur les variantes polluées par les paramètres de tracking marketing (?utm_*, ?gclid, ?fbclid, ?msclkid, ?mc_eid, ?ref) pour éviter que les mêmes pages soient indexées en N versions distinctes par Google. Ajout d'un Crawl-delay de 10 secondes sur 6 bots SEO agressifs (Ahrefs, Semrush, MJ12, DotBot, BLEXBot, DataForSeoBot) pour préserver les ressources Railway sans les bloquer complètement.
Balise `<link rel="canonical">` ajoutée sur 100 % des pages publiques indexables (la page d'accueil, /docs, /mcp, /blog, /blog/[article], /changelog, /pricing, /status, /partners, les 6 pages personas, les 5 pages légales, /stats/communes et les 34 870 pages communes, /privacy). Empêche Google de considérer comme contenus distincts les URLs partagées avec paramètres de tracking (ex : /?utm_source=linkedin&utm_medium=post).
Découvrabilité standard de l'API via /.well-known/openapi + canal de signalement sécurité (RFC 9116)
Nouvelle URL standard https://api.permisapi.fr/.well-known/openapi qui retourne le schéma complet de l'API au format OpenAPI 3. Les outils Postman, Insomnia, Swagger UI et les crawlers d'API peuvent désormais découvrir automatiquement la surface de PermisAPI en interrogeant cet URL bien-connu (norme IETF RFC 8615), sans configuration manuelle. C'est le même schéma que /openapi.json mais à un emplacement standard que les outils savent chercher par défaut. Cache HTTP 1 heure pour absorber les rejoues des outils. Aucune authentification requise : le schéma est public par design.
Nouveau fichier https://api.permisapi.fr/.well-known/security.txt (norme IETF RFC 9116) qui indique aux chercheurs en sécurité, aux scanners automatiques et aux programmes bug bounty comment signaler une vulnérabilité de manière responsable. Champs présents : Contact (mailto:evan@permisapi.fr) + Expires + Canonical + Preferred-Languages (fr, en). C'est un signal de maturité attendu par les directions sécurité des banques et des foncières institutionnelles dans le cadre de leurs audits fournisseurs.
Cache HTTP intelligent sur la recherche et le détail des permis : réponses jusqu'à 10 fois plus rapides (sprint 22)
Tes requêtes les plus fréquentes répondent désormais en 20 ms au lieu de 250 ms. Un cache HTTP Redis a été ajouté en amont du moteur de recherche : quand tu rejoues la même requête GET /v1/permits (mêmes filtres, même page) dans les 5 minutes, la réponse est servie depuis le cache au lieu de relancer la requête SQL. La fraîcheur est garantie : la base Sitadel publie une mise à jour mensuelle, donc 5 minutes de cache n'introduisent aucun retard perceptible. Les nouveaux scores MDB matérialisés par le cron quotidien apparaissent au plus tard 5 minutes après leur calcul.
Le détail d'un permis est mis en cache 1 heure sur l'endpoint GET /v1/permits/{num_pa}. Un permis Sitadel publié ne change plus une fois entré dans la base (les corrections post-publication sont extrêmement rares), donc on peut le servir depuis le cache pendant 1 heure sans perte de fraîcheur. Quand tu cliques sur un permis dans ton tableau de bord et que tu y reviens 10 minutes plus tard pour comparer, la deuxième lecture est instantanée.
Deux nouveaux en-têtes HTTP de diagnostic : X-Cache: HIT ou X-Cache: MISS indique si ta réponse vient du cache ou d'un calcul frais, et Cache-Control informe ton navigateur, ton CDN et tes proxies intermédiaires qu'ils peuvent eux aussi mettre en cache (max-age 300 s pour la recherche avec stale-while-revalidate 600 s, max-age 3600 s pour le détail). Si tu intègres PermisAPI derrière Cloudflare ou Vercel, cette information est utilisée nativement pour réduire encore plus la charge.
Isolation stricte entre plans et entre périmètres géographiques. Le cache est segmenté par plan (Free / Explorer / Pro / Business / Enterprise) pour ne jamais exposer les 8 champs Pro+ à un compte Free, et par hash des départements autorisés du compte pour ne jamais montrer un permis hors de ton scope à cause d'une mise en cache cross-utilisateur. Le contrôle anti-abus (un appel composite consomme N unités de quota) est intégralement préservé sur les lectures depuis le cache : la valeur cachée embarque le coût exact pour que le décompte reste identique entre MISS et HIT.
Entreprises BTP locales par lot (/contractors) + 18e outil MCP get_contractors + ingest SIRENE BTP 1,087 M entreprises (sprint 16)
Nouveau endpoint `GET /v1/permits/{num_pa}/contractors` (plans Pro et supérieurs) : entreprises BTP locales autour d'un permit, filtrables par métier (codes NAF SIRENE 41/42/43), rayon configurable (500 m à 50 km), effectif salarié minimum, statut actif. Pont natif avec le breakdown_by_lot de /economics : pour chaque lot du chantier (gros oeuvre 38 %, plomberie 11 %, électricité 9 %, etc.), itérez les codes NAF et appelez /contractors pour identifier les entreprises locales qualifiées. Retourne pour chaque entreprise : SIREN / SIRET / raison sociale / enseigne / code NAF + libellé / siège oui-non / tranche d'effectif INSEE + bornes salariés / ancienneté en années / adresse complète / commune / distance en mètres. Tri par distance croissante, pagination via has_more. Use case Marchand de Biens / PropTech / Promoteur : 'qui sont les électriciens NAF 43.21A à moins de 5 km de ce chantier, avec au moins 10 salariés ?'. Quota composite : 5 unités.
Ingest de la base SIRENE BTP (table sirene_btp_actors) : le script scripts/ingest_sirene_btp.py télécharge mensuellement le snapshot StockEtablissement_utf8.zip (2,8 Go) publié sur data.gouv.fr, filtre les NAF 41/42/43 (construction de bâtiments + génie civil + travaux spécialisés), convertit les coordonnées Lambert93 EPSG:2154 vers WGS84 via pyproj, et upsert dans la base. 1 086 952 établissements actifs en France au snapshot d'ingest sprint 16 j2, dont 830 860 géolocalisés WGS84 (76,4 %) exploitables PostGIS ST_DWithin (le reste sans coordonnées renseignées dans la source SIRENE). Top 5 départements en base : 75 Paris (50 163), 93 Seine-Saint-Denis (43 520), 13 Bouches-du-Rhône (39 253), 06 Alpes-Maritimes (35 130), 33 Gironde (31 794). Cron mensuel automatique le 1er du mois 03:00 UTC. Idempotent via ON CONFLICT siret DO UPDATE.
18e outil MCP `get_contractors` publié sur PyPI dans permisapi-mcp version 0.5.8 : permet à Claude Desktop, Claude.ai web hosted, Cursor, Windsurf et tout client MCP-compatible de demander 'trouve-moi les plombiers actifs à moins de 3 km de ce chantier avec au moins 5 salariés' en langage naturel et de recevoir la liste géolocalisée triée par distance. Workflow recommandé combiné : get_economics pour obtenir le breakdown par lot, puis get_contractors lot par lot avec les codes NAF du lot.
Hub "Audit projet" dans le dashboard explorer : l'onglet economics agrège budget chantier + décomposition par lot + entreprises locales par lot en une seule page. Sous chaque ligne du tableau breakdown_by_lot, accordéon "Voir les entreprises locales pour ce lot" qui appelle /contractors filtré par les codes NAF du lot. Slider rayon de recherche configurable (500 m à 50 km), bouton recharger, indicateur de pagination. Table résultat : raison sociale (+ chip siège), code NAF, effectif (bornes salariés), ancienneté en années, commune, distance en mètres. Empty state si zéro entreprise (suggère d'augmenter le rayon). Coût mentionné explicitement : 5 unités de quota par appel.
Workflow GitHub Actions `ingest-sirene-btp.yml` : ingestion mensuelle automatisée le 1er du mois 03:00 UTC, ~30 min wall clock par run, timeout 60 min. Re-run safe via ON CONFLICT siret DO UPDATE. Trigger manuel possible avec input limit pour debug (vide = full France). Couvre l'actualisation continue de la base SIRENE BTP au fil des créations / fermetures d'établissements.
Budget chantier estimé (/economics) + 17e outil MCP get_economics + ingest 12 nouveaux champs Sitadel + indice INSEE ICP-BT (sprint 15)
Nouveau endpoint `GET /v1/permits/{num_pa}/economics` (plans Pro et supérieurs) : estimation chiffrée du budget total du chantier pour un permis. Retourne une fourchette basse / médiane / haute en EUR + détail au m² + scénario détecté automatiquement (construction neuve / rénovation lourde / rénovation légère / démolition / aménagement) + niveau de confiance 0-100 % + transparence des modulateurs appliqués + sources data utilisées. Combine 3 sources : (1) les surfaces déclarées par le constructeur dans le permit Sitadel (SURF_HAB_CREEE + SURF_LOC_CREEE + transformations), (2) un barème statique calibré sur la littérature publique Capeb / FFB / Anjou Construction 2024 modulé par département (Paris +25 %, Côte d'Azur +20 %, métropoles régionales +5 %) et par taille (effet d'échelle inverse), (3) le modulateur officiel INSEE ICP-BT (Indice du Coût de Production des Bâtiments) qui actualise l'inflation cumulative depuis 2015. Use case typique : un Marchand de Biens calibre une offre d'achat, une PropTech répond à un appel d'offres, une banque audite un dossier de prêt. Quota composite : 3 unités.
17e outil MCP `get_economics` publié sur PyPI dans permisapi-mcp version 0.5.7 : permet à Claude Desktop, Claude.ai web hosted, Cursor, Windsurf et tout client MCP-compatible de demander "combien va coûter ce chantier" en langage naturel et de recevoir une fourchette EUR avec décomposition complète, scénario détecté, et transparence des modulateurs. Pas de boîte noire : chaque chiffre est justifié.
Nouvel onglet "Budget chantier" dans le dashboard explorer (plans Pro+) : interface visuelle avec budget total estimé en gros (médiane + fourchette basse/haute), badge scénario coloré, jauge de confiance, card coût au m² détaillée, liste transparente des modulateurs appliqués (coût base 2015, dep_factor, size_factor, INSEE ICP-BT), notes contextuelles en français qui expliquent les choix de calcul, et accordéon "Inputs concrets utilisés" pour audit complet.
Ingest de 12 nouveaux champs Sitadel sur les 1,2 million de permis en base : surface habitable créée (SURF_HAB_CREEE), surface locaux créée (SURF_LOC_CREEE), surfaces transformées et démolies, nombre total de logements créés, individuels purs vs collectifs, flags annexes (piscine, extension, surélévation), nombre maximum d'étages prévu, nature du projet déclarée. 571 692 permis (logement + locaux récents) ont été enrichis via re-parse des fichiers Sitadel locaux. Bonus : nouveaux filtres potentiels ?min_surf_hab=X et ?nb_lgt_min=X débloqués sur /v1/permits (à activer en sprint 16). Et le parser Sitadel ingère désormais ces champs automatiquement à chaque MAJ mensuelle SDES.
Nouvelle source de données externe : Indices INSEE de coût de production de la construction (table insee_construction_indices). Le script scripts/ingest_insee_construction.py télécharge mensuellement depuis bdm.insee.fr en SDMX XML l'indice ICP-BT (IDBANK 011800504, base 2015), parse les observations historiques (336 observations couvrant 1998-2025), et upsert dans la base. Cron mensuel automatique le 5 du mois 04:00 UTC. Sert de modulateur officiel d'inflation appliqué au barème de coût construction.
Prix au m² médian des ventes voisines (DVF) exposé en clair dans /dvf, /360 et /score/explain + carte visible dans le dashboard explorer (sprint 15 Prio 1)
Prix au m² médian (EUR/m²) désormais exposé en clair dans la réponse des endpoints `/v1/permits/{num_pa}/dvf` et `/360` (sub-section dvf). Nouveaux champs dvf_median_price_per_m2 (valeur médiane en euros par mètre carré, arrondie au centime) et dvf_median_sample_size (nombre de transactions retenues, peut être plus petit que len(matches) si certaines ventes sont des terrains nus ou ont une surface manquante). Permet à un marchand de biens, agent immobilier ou banquier d'afficher le prix du quartier sans recalculer côté client. Avant ce sprint, la médiane était calculée en interne pour dériver le signal dvf_value 0-100 du Score MDB (16 % du poids) puis jetée.
Même information exposée dans `inputs` de `/v1/permits/{num_pa}/score/explain` (champs dvf_median_price_per_m2 et dvf_median_sample_size). Et l'interprétation FR du signal `dvf_value` mentionne maintenant le prix au m² en clair avec une mise en contexte : 'Médiane 5 250 EUR/m² sur 3 vente(s) voisine(s) : marché actif (métropole régionale ou périphérie tendue)' au lieu de l'ancien 'Médiane prix au m² calculée sur 3 vente(s) voisine(s) (score 53/100)'. 5 niveaux de qualification : peu valorisé, modéré, actif, tendu, premium (Paris intra, hyper-centres).
Card visible dans le dashboard explorer : l'onglet 'Prix des ventes voisines' et la vue 360° affichent désormais le prix au m² médian dans un encart proéminent en tête de tableau (taille 2xl, bordure accent, libellé clair 'Prix au m² médian (quartier)' + rappel 'signal dvf_value du Score MDB, 16 % du poids'). Avant ce sprint, la médiane était calculée côté client mais affichée en petits caractères, facilement manquée. La section 'Inputs concrets utilisés' de l'onglet 'Explication du score MDB' montre aussi désormais la médiane en clair.
Explication transparente du Score MDB v0.3 (les 11 signaux décryptés avec interprétation FR) + 16e outil MCP `get_score_explanation` + différenciation USP transparence Pro
Nouveau endpoint `GET /v1/permits/{num_pa}/score/explain` (plans Pro et supérieurs) : explication transparente du Score Marchand de Biens v0.3 pour un permis. Retourne le score 0-100 + tier qualitatif (faible / moyen / élevé / premium) + les 11 signaux pondérés avec pour chacun : son libellé en français clair (type de permis, surface du terrain, prix au m² des ventes voisines, profil du demandeur, constructibilité PLU, risques naturels, etc.), sa doctrine (comment il est calculé en général), son poids dans le score final (en pourcentage), sa valeur calculée 0-100 pour CE permis précis, sa contribution finale (valeur × poids) et une interprétation FR contextualisée ('Démolition pure (PD) : top signal MDB', '850 m² dans le sweet spot 200-2000 m²', 'Risque critique : rédhibitoire pour la plupart des MDB', etc.). Inclut aussi top 3 drivers (signaux qui tirent le score vers le haut vs un baseline neutre 50) et top 3 drags (signaux qui le tirent vers le bas) avec leur écart précis. Ainsi que tous les inputs concrets utilisés (transparence totale). Quota composite : 2 unités (calcul du score + génération des interprétations).
16e outil MCP `get_score_explanation` publié sur PyPI dans permisapi-mcp version 0.5.6 : permet à Claude Desktop, Claude.ai web hosted, Cursor, Windsurf et tout client MCP-compatible de demander "explique-moi pourquoi ce permis est noté 87" et de recevoir le breakdown complet en français avec les interprétations. Use case typique : audit du score, justification de décision marchand de biens à un client ou banquier, due-diligence transparente avant investissement. Pas de boîte noire.
Nouvel onglet "Explication du score MDB" dans le dashboard explorer : interface visuelle complète avec score géant + tier coloré (vert premium / lime élevé / ambre moyen / rouge faible), cards séparées "top 3 signaux positifs" et "top 3 signaux négatifs" avec leurs deltas vs baseline neutre, accordéon par signal avec barre de progression 0-100 + interprétation FR contextualisée + doctrine complète au clic, et section "inputs concrets utilisés" pour totale transparence (type permis, surface, département, demandeur, PLU, risques, SIRENE NAF, bâtiments parcelle, etc.). Aucun jargon technique non expliqué.
Cohérence du Score MDB v0.3 live entre `/score` et `/score/explain` : le endpoint live /v1/permits/{num_pa}/score recalculait le score sans passer les signaux PLU / risques / SIRENE matérialisés sur le permit (ils tombaient à 50 neutre par défaut), divergeant du score correctement matérialisé via le cron quotidien. Le nouveau /score/explain aligne les inputs en lisant les colonnes plu_zone_type, plu_constructible, risk_tier, risk_score + le match SIRENE associé pour produire une explication fidèle au vrai score. Bug latent identifié sans modification du endpoint legacy /score (rétrocompatibilité préservée, le cache matérialisé reste la source de vérité pour la majorité des permits).
Garantie de stabilité de l'API publiée (engagement contractuel Enterprise) + flux RSS du changelog + préférences email RGPD self-service dans le dashboard + transparence PLM Paris/Lyon/Marseille
Nouvelle page légale [`/legal/garantie-stabilite-api`](/legal/garantie-stabilite-api) : engagement public sur le cycle de vie de l'API. Cinq niveaux de stabilité explicites (Expérimental / Bêta / Stable / Déprécié / Retiré), politique de retrait avec préavis minimum 12 mois avant tout retrait d'un endpoint stable, compatibilité ascendante garantie (les ajouts ne sont jamais des breaking changes), 4 canaux de notification (changelog, email, header HTTP Sunset RFC 7231, header Link RFC 8288). Pour les clients du plan Enterprise, ces engagements sont contractuels et opposables : crédits jusqu'à 3 mois d'abonnement par an en cas de non-respect (mécanisme similaire au SLA).
Flux RSS du changelog disponible sur [`/changelog/feed.xml`](/changelog/feed.xml) (RSS 2.0 standard, compatible Feedly, Inoreader, NetNewsWire, NewsBlur, Slack bot RSS, etc.). Permet aux développeurs intégrant PermisAPI de s'abonner aux annonces de nouveaux endpoints, dépréciations et fixes sans avoir à visiter le site manuellement. C'est aussi un canal officiel pour les notifications de dépréciation (cf garantie de stabilité).
Préférences email RGPD self-service dans le dashboard : nouvelle section « Préférences email » avec 3 toggles (newsletter et annonces produit / récap hebdo d'usage / emails transactionnels verrouillés car légalement requis). Conforme RGPD Article 21 (droit d'opposition). Tu peux désormais ajuster tes préférences sans contacter le support, le changement est effectif immédiatement. L'endpoint backend GET/PUT /v1/me/email-preferences existait depuis la version v0.20.0 (sprint 9 du 16 mai), cette release ajoute l'interface graphique.
Transparence Sitadel sur les pages SEO Paris / Lyon / Marseille : les permis Sitadel SDES sont centralisés sur le code INSEE de la ville-mère (75056 pour Paris, 69123 pour Lyon, 13055 pour Marseille), pas par arrondissement. Auparavant, sur la page d'un arrondissement (par exemple /stats/communes/75104-paris-04), le total de permis affichait 4 479 ce qui correspondait en réalité à Paris entier, induisant le visiteur en erreur. Désormais un bandeau explicatif clarifie cette limitation et redirige vers la page consolidée ville-mère. Réciproquement, la page ville-mère (/stats/communes/75056-paris) affiche un accordéon avec les 20 liens vers chaque arrondissement pour la navigation cadastre.
Top 100 communes du hub `/stats/communes` dédupliqué : retrait des 45 arrondissements PLM (20 Paris + 9 Lyon + 16 Marseille) du classement car ils partageaient artificiellement le même total de permis que leur ville-mère. Toulouse, Bordeaux, Nice, Nantes, Strasbourg, Montpellier et les autres grandes communes uniques apparaissent désormais dans le top, au lieu d'être noyées sous 20 entrées Paris identiques.
Cron quotidien de recalcul du Score MDB v0.3 stabilisé : le workflow materialize-scores.yml était en timeout systématique à 90 min depuis le sprint 8 car il essayait de faire la jointure spatiale ST_Contains (25 millions de bâtiments × 700 000 permis) et le scoring 11 signaux en un seul run. Désormais split en deux crons indépendants : Phase 1 scoring 11 signaux quotidien à 04h00 UTC (~10-15 min, garantit que le Score MDB intègre quotidiennement les nouveaux signaux SIRENE / PLU / Risks) et Phase 0 jointure spatiale hebdomadaire le samedi à 02h00 UTC (timeout 120 min, recalcule la densité bâtiments). Bug latéral corrigé : la boucle de scoring avec --force re-fetchait les 5 000 mêmes permis à chaque batch (manque de cursor WHERE id > last_id), provoquant des runs infinis jusqu'au timeout.
Performance build Vercel divisée par 50 : le déploiement de la landing passait de 25 minutes (1 000 pages communes pré-générées au build) à environ 30 secondes en passant en mode ISR complet (Incremental Static Regeneration). Les 35 000 pages communes restent toutes accessibles et indexables (sitemap.xml complet préservé), elles sont juste générées à la demande au premier hit puis cachées 24 h. Aucun impact SEO car le HTML rendu est identique. Résout le pattern récurrent de builds bloqués qui empêchait de livrer des fixes rapidement.
Parcelles voisines d'un permis (killer feature marchand de biens) + 35 000 pages SEO communes France entière + lookup parcelle, recherche périmètre custom, statistiques densité commune
Nouveau endpoint `GET /v1/permits/{num_pa}/parcelles-voisines` (plans Pro et supérieurs) : retourne les parcelles cadastrales voisines d'un permis dans un rayon configurable (10 à 2000 mètres, défaut 200 m) avec leur historique permits associés (max 5 par parcelle). Killer feature pour le marchand de biens : pattern d'activité local autour d'un permis identifié. Permet de détecter zones en mutation (plusieurs permis récents sur les parcelles voisines), opportunités adjacentes (parcelles voisines sans activité récente), densification (parcelles voisines déjà bâties vs libres). Recherche PostGIS ST_DWithin sur 35 millions de parcelles France entière (cadastre.data.gouv.fr Etalab DGFiP). Centre de recherche : centroïde géocodé BAN du permis ou ST_Centroid du polygon cadastre si dispo. Coût quota composite : 1 + nombre de voisins retournés. Aussi disponible comme outil MCP get_neighbor_parcels (version PyPI 0.5.5).
35 000 pages SEO publiques `/stats/communes/{slug}` pour toutes les communes de France : chaque commune (et arrondissement Paris/Lyon/Marseille + 3 villes-mères PLM) dispose d'une page statistiques publique sans authentification avec graphiques permits par année, distribution Score MDB v0.3, densité urbaine bâtiments par km², communes voisines du département et liens vers Wikipedia + cadastre.data.gouv.fr. Schemas Schema.org JSON-LD (Place + Dataset + BreadcrumbList + FAQPage) pour rich snippets Google. Sitemap exposant les 34 870 URLs au crawl. Source : cache commune_density_stats recalculé mensuellement (cron 1er du mois 03h UTC, matrix parallèle 101 départements).
Nouveau endpoint `GET /v1/parcelles/{id_parcelle}` (plans Pro et supérieurs) : lookup direct cadastre DGFiP par identifiant Etalab de 14 caractères (ex 75104000AA0123 = Paris 4e, section AA, parcelle 0123). Retourne en 1 appel : centroïde, contenance officielle DGFiP en m², commune et département, polygon GeoJSON si dispo, compteur bâtiments existants si polygon dispo, flag terrain libre booléen, et tous les permis historiques associés (jusqu'à 50, triés par année). Use case complémentaire de /v1/permits/{num_pa}/parcelle : lookup inverse (parcelle → permits) au lieu de (permit → parcelle). Outil MCP : get_parcelle_by_id.
Nouveau endpoint `POST /v1/permits/inside-polygon` (plans Business et supérieurs) : recherche les permits dont le point géocodé est à l'intérieur d'un polygon GeoJSON custom fourni dans la requête. Killer feature foncière pour les ZAC (Zone d'Aménagement Concerté), périmètres d'opération propTech, zones de chasse marchand de biens au-delà des limites administratives commune / département. Limite surface 1 000 km² (anti-abus). Filtres additionnels combinables : dep_code (pré-filtre index), permit_type, min_an_depot / max_an_depot, min_score MDB. Validation Pydantic stricte RFC 7946 (polygon fermé, minimum 4 points, coordonnées WGS84). Coût quota composite : max(2, len(permits)). Outil MCP : search_permits_in_polygon.
Nouveau endpoint `GET /v1/stats/commune/{code}/density` (plans Business et supérieurs) : statistiques macro de densité urbaine pour une commune en 1 seul appel. Retourne nombre de parcelles cadastrales + surface totale, nombre de bâtiments cadastraux ventilé par type (bâti dur / léger / autre), nombre de permits historiques 2014-2026 ventilés par année + par type + par distribution Score MDB v0.3, et indicateur de densité (bâtiments par km² + tier tres_dense / dense / moyen / faible). Mapping PLM automatique pour les arrondissements de Paris, Lyon et Marseille. Coût quota composite : 3 unités. Outil MCP : get_commune_density_stats.
Filtre département du dashboard explorer corrigé : sur les comptes Free avec un département choisi autre que Paris (75), le menu déroulant affichait bien la sélection mais la requête envoyait dep_code=75 par défaut et renvoyait un 403. Désormais la sélection est synchronisée correctement lors du chargement initial. Affecte les comptes Free sur tous les départements (78 Yvelines, 24 Dordogne, 74 Haute-Savoie, 25 Doubs, etc.). Aucun impact sur les plans Explorer et supérieurs qui ont un périmètre élargi.
MCP officiel Anthropic en mode hébergé pour Claude.ai web (zéro installation) + nouveau quota par ligne retournée + préférences email en self-service RGPD
MCP hébergé sur `mcp.permisapi.fr/mcp/` avec OAuth officiel Anthropic : PermisAPI est le premier MCP français disponible en mode hébergé compatible Claude.ai web sans installation locale. Trois modes d'authentification supportés : OAuth 2.0 + Dynamic Client Registration (RFC 7591) + PKCE pour Claude.ai web, Bearer direct pour Cursor / Windsurf / ChatGPT custom GPT / MCP Inspector, et fallback ?key= query param. Le mode local stdio via pip install permisapi-mcp reste disponible. Version 0.5.1 publiée sur PyPI avec descriptions d'outils enrichies pour de meilleures réponses LLM. 11 outils exposés (search_permits, get_permit_full_view, get_mdb_score, bulk_enrich_list, etc.). Doc : https://permisapi.fr/mcp.
Préférences email en self-service RGPD : nouveau endpoint GET /v1/me/email-preferences et PUT /v1/me/email-preferences qui permet à chaque utilisateur de toggler indépendamment 3 catégories d'envois : marketing (newsletter, annonces produit), digest (recap d'usage, alertes), transactional (factures, webhooks, légalement requis et donc non modifiable). Conforme RGPD Article 21 (droit d'opposition) sans contacter le support. Rétrocompatible avec les anciens opt-out globaux. Audit log EMAIL_PREFERENCES_CHANGED tracé côté Business+ pour traçabilité.
Quota recalculé par ligne retournée pour `/v1/permits`, `/v1/search`, `/v1/permits/near` et `/v1/permits/by-cadastre` : 1 ligne retournée consomme désormais 1 unité de quota (au lieu de 1 unité par appel quel que soit le volume retourné). Cohérent avec le comportement déjà en place sur bulk_enrich_list (1 ligne soumise = 1 unité) et /v1/permits/{num_pa}/360 (6 unités composite). En pratique le plan Pro 50 000 unités/mois couvre largement les usages MDB et monitoring quotidiens. L'en-tête X-Ratelimit-Cost retourné à chaque appel donne le coût exact.
Cohérence du gating des champs Pro+ entre tiers : les champs score_mdb, score_mdb_tier, risk_score, risk_tier, plu_zone_type, plu_constructible, cadastre_id, cadastre_surface retournés dans /v1/permits et /v1/permits/{num_pa} sont désormais explicitement réservés aux plans Pro / Business / Enterprise. Sur les plans Free et Explorer, ces champs apparaissent comme null au lieu d'être parfois exposés. Aucun impact pour les clients Pro et plus.
Tri `sort=-date_depot` sur `/v1/permits` : ne renvoie plus d'erreur 500. La base Sitadel SDES publie la granularité année de dépôt (champ an_depot), pas la date complète. Le paramètre sort=date_depot ou sort=-date_depot est désormais reconnu et redirigé automatiquement vers an_depot pour préserver le contrat externe.
Latence du MCP hébergé réduite (-1 RTT par appel) : remplacement du Mount Starlette par 2 routes explicites pour éviter une redirection 307 sur /mcp (sans slash final). Gain mesuré : 50 à 200 ms par appel selon la région du client. Sur une session Claude.ai avec 15 appels d'outils MCP, c'est environ 1 à 3 secondes de latence cumulée évitée.
Bâtiments existants sur la parcelle (terrain libre ou déjà bâti) + assistant IA mis à jour (11 outils) + plus de parcelles dessinées sur la carte
Nouveau service GET /v1/permits/{num_pa}/batiments-existants (plan Pro et plus) : pour chaque permis, dit en une demande si le terrain est libre (vraie construction neuve, fort potentiel pour un marchand de biens) ou s'il y a déjà des bâtiments dessus (cas extension ou rénovation, marge plus limitée). Compte chaque bâtiment et donne sa date d'inscription au cadastre (maison en dur, hangar léger, autre). Source officielle cadastre.data.gouv.fr (DGFiP, 55 millions de bâtiments France entière).
Serveur MCP officiel permisapi-mcp v0.5.0 publié : votre assistant IA (Claude Desktop, Cursor, Windsurf, ChatGPT) a désormais 11 outils à disposition pour vous répondre en langage naturel. Nouvel outil get_existing_buildings accessible aux plans Pro et plus. Pour mettre à jour : pip install --upgrade permisapi-mcp. Pour Python ancien : uvx --python 3.11 permisapi-mcp. Voir https://permisapi.fr/mcp.
Plus de parcelles dessinées disponibles sur la carte : on est passé de 26 % à 69 % de couverture France (857 000 permis ont maintenant leur forme exacte). Permet d'afficher la vraie parcelle sur une carte au lieu d'un simple point pour 850 000 permis supplémentaires. Bénéficie automatiquement aux services « Forme exacte de la parcelle » et « Bâtiments existants ». Paris, Lyon et Marseille ont aussi été corrigés (les permis utilisent le code INSEE de la ville-mère alors que le cadastre est organisé par arrondissement). Couverture finale Paris 90 %, Lyon 94 %, Marseille 93 %.
Historique étendu à 12 ans : permis depuis 2014 + transactions immobilières voisines depuis 2014
Extension historique permis de 5 ans à 12 ans : la base couvre désormais 2014 à 2026 (auparavant 2022 à 2026). Environ 1,4 million de permis additionnels ont été ingérés depuis la source officielle Sitadel SDES. Tous les endpoints retournent automatiquement plus de résultats sans aucun changement de schéma : /v1/permits avec filtres dates et géographiques, /v1/permits/{num_pa} détail, /v1/permits/{num_pa}/360 vue complète, /v1/search recherche libre, /v1/permits/near recherche par rayon, alertes, exports CSV, statistiques par commune/département/région. Aucune action requise côté client : un appel existant qui recevait 50 résultats sur 2022-2026 peut désormais en recevoir jusqu'à 150 sur 2014-2026.
Extension historique des « Prix au m² des ventes voisines » (DVF) de 5 ans à 12 ans : pour chaque permis, l'endpoint /v1/permits/{num_pa}/dvf retourne maintenant des transactions immobilières voisines depuis 2014 (au lieu de 2021). Deux sources fusionnées dans le même top-5 par permis : Geo-DVF Etalab pour 2021-2025 et Cerema DVF+ open-data pour 2014-2020. Le scoring de pertinence (distance + date + type) sélectionne automatiquement les 5 transactions les plus pertinentes parmi 12 ans. Argument concret pour les marchands de biens : visibilité sur l'évolution du prix au m² d'un quartier sur plus d'une décennie.
Cadastre DGFiP France entière intégré : nouvelle table interne couvrant 35 millions de parcelles cadastrales (centroïdes lat/lng + code commune + département + contenance), source officielle Etalab (cadastre.data.gouv.fr/data/etalab-cadastre/latest/). Auparavant nous ne stockions que les ~511 000 parcelles correspondant à des permis. Cette base élargie alimente le nouveau pipeline DVF historique (jointure parcelle pour géolocaliser les transactions Cerema DVF+) et servira pour des fonctionnalités à venir comme la recherche par parcelle ou le voisinage parcellaire.
Plan Enterprise (sur demande) : possibilité d'élargir l'historique permis au-delà de 12 ans, jusqu'à 2005 (soit 20 ans). Utile pour les études long-terme des banques, urbanistes, chercheurs. Sur simple demande à evan@permisapi.fr, ingestion en environ 30 minutes côté équipe PermisAPI, +600 000 permis 2005-2013 supplémentaires.
Dashboard brandé Enterprise complet (V0.4 backend + V0.5 frontend) et polish UX
« Dashboard brandé Enterprise » V0.4 backend + V0.5 frontend : un client Enterprise peut maintenant configurer 3 nouveaux éléments visuels (logo, couleur primaire au format hex, texte de footer) qui s'appliquent automatiquement quand un visiteur arrive via son sous-domaine personnalisé. Endpoints PUT /v1/me/preferences/branding-config (Enterprise uniquement) + GET /v1/public/branding-by-domain?host=X (public, sans authentification, résout le branding pour un domaine donné). Côté frontend : nouveau composant BrandingProvider qui fetch au boot, applique la couleur via une variable CSS dynamique, remplace le logo PermisAPI dans la barre de navigation et le texte du footer. Items 1+2+3 du backlog Enterprise (sender email + sous-domaine + dashboard brandé) = 100 % livrés. Doc complète : docs/ENTERPRISE_BRANDING_V03_SETUP.md.
Tooltips explicites sur tous les chips de l'API Explorer : chaque badge d'état d'un permis (Tacite, Accordé, Refusé, Achevé, Retrait, Irrecevable), de score d'opportunité, de niveau de risque (Faible/Modéré/Élevé/Critique) et de zonage urbanisme (Urbain/À urbaniser/Agricole/Naturel) affiche maintenant au survol une explication détaillée légale ou technique. Plus de chip opaque sans contexte.
Fix accessibilité dropdown : les options des <select> HTML étaient invisibles en mode sombre (texte noir sur fond noir hérité du parent) sur tous les navigateurs Chromium et Firefox. 2 sélecteurs CSS globaux forcent désormais un fond bleu marine + texte clair + survol ambre pour toutes les options. Visible sur le dashboard explorer.
Fix libellés dropdowns en français : le sélecteur « Niveau de risque max » affichait Low/Moderate/High/Critical en anglais, et le sélecteur « Zonage urbanisme » contenait OTHER en anglais. Tous traduits en Faible/Modéré/Élevé/Critique et Autre. L'admin panel (visible plan Enterprise uniquement) a aussi ses segments traduits.
Fix onglet « Prix des ventes voisines » : aucun résultat ne s'affichait après avoir saisi un identifiant Sitadel et lancé la requête. Le formulaire appelait bien l'API mais ne gardait pas le résultat ni ne rendait le composant de présentation. Désormais le rendu inclut le tableau des ventes voisines avec médiane prix au m², date, type, surface, distance, classement de pertinence.
Sprint UX non-dev : visite guidée, refonte dashboard et explorateur, Score MDB v0.2, white-label V0.3, cache stats
Refonte complète du tableau de bord pour les non-développeurs : 7 sections claires hiérarchisées par intention (Mon compte / Que voulez-vous faire ? / Configuration / Tes capacités / Pour les développeurs / Usage détaillé / Administration), banner d'accueil avec 3 cartes persona (Marchand de biens / Architecte / PropTech) pour les nouveaux membres, tooltips d'aide inline sur les termes techniques (Plan, requêtes, clé API), visite guidée 6 étapes auto-ouverte à la première connexion.
Refonte complète de l'API Explorer : 14 onglets renommés en français clair (Score MDB → Note d'opportunité, DVF cross-ref → Prix au m² des ventes voisines, Géorisques → Risques, etc.), liste des permis affichée en cartes lisibles au lieu d'une table brute (avec chips d'état coloré + chips score/risque/PLU pour les utilisateurs Pro+), polygon de la parcelle cadastre dessiné directement sur la carte interactive, vue complète d'un permis avec 6 sections (détail + SIRENE + ventes voisines + score + zonage + risques), stats département avec 4 cartes (Total / Accordés / Refusés / Évolution annuelle).
Section « Premiers pas selon votre profil » dans /docs : 3 cartes avec parcours en 4 étapes pour démarrer sans coder, avec Claude/ChatGPT/Cursor, ou avec du code (SDK Python). Plus besoin de plonger directement dans la référence technique des endpoints.
Score MDB v0.2 : passe de 7 à 10 signaux pondérés en intégrant la constructibilité (PLU), le niveau de risque (inondation, sismique, ICPE) et la qualité de la fiche entreprise (SIRENE NAF + date de création). Recalcul automatique chaque nuit (cron 04:00 UTC) pour intégrer les nouveaux signaux pré-cachés au fil de l'eau.
« Aux couleurs de votre entreprise » V0.3 (Enterprise) : ajoute 2 nouveaux points de contact en plus du branding V0.2 (filename CSV, entêtes HTTP, User-Agent webhook). Expéditeur email sur mesure (alerts@acmefonciere.com au lieu de no-reply@permisapi.fr sur les notifications) et sous-domaine API sur mesure (api.acmefonciere.com au lieu de api.permisapi.fr). Setup client documenté (DKIM/SPF/Return-Path pour le sender, CNAME pour le sous-domaine). Endpoints PUT/GET /v1/me/preferences/{sender-email,custom-subdomain}.
Pré-calcul daily des statistiques agrégées : les endpoints /v1/stats/{commune,département,région,latest-day} lisent désormais un snapshot pré-calculé (latence ~50ms au lieu de 2-5s pour les agrégations live sur 706k permis). 2120 snapshots actifs (1 latest_day + 18 régions + 101 départements + 2000 top communes). Fallback live si pas de snapshot récent (< 7 jours).
Audit jargon complet sur toute la landing (FAQ, features, MCP, blog, pages persona, articles tutoriels). 28 fichiers patchés, plus aucun anglicisme ni acronyme nu (DVF, PLU, BRGM, SIRENE, MDB sont systématiquement explicités à leur première occurrence). Audit accents FR systématique sur 28 fichiers supplémentaires (déjà, très, après, géocodage, sécurité, etc.).
Health check daily des crons : surveille les 6 crons critiques (cold_email, cron nuit, sitadel-freshness, snapshot-stats, materialize-scores, dvf-link) et envoie un mail récap consolidé à evan@permisapi.fr chaque matin à 10:00 UTC. Remplace les notifications GitHub par défaut (1 mail par échec) par un seul résumé quotidien.
Plans Business et Enterprise enrichis : compte d'équipe, enrichissement en masse, aux couleurs de votre entreprise
Compte d'équipe (Business et plus) : invitez jusqu'à 5 collègues (Business) ou 20 (Enterprise) avec leur propre clé d'API. Quota partagé avec votre compte principal, suivi d'usage individuel par membre. Fini la clé partagée entre développeurs : chacun a la sienne, chaque appel est tracé séparément. 3 URLs API : POST/GET/DELETE /v1/me/members. Le membre hérite automatiquement du plan et des fonctionnalités du compte parent.
Enrichissement en masse depuis votre liste (Business et plus) : envoyez jusqu'à 1000 lignes (adresses, coordonnées GPS ou références cadastre) et recevez en 1 appel les permis correspondants + score d'opportunité + risques + zonage + cadastre. Cas d'usage : enrichir une liste de prospects CRM ou un patrimoine immobilier. 3 formats d'entrée par ligne détectés automatiquement. Coût : 1 unité de quota par ligne. Géocodage BAN groupé (1 appel pour toute la liste, au lieu d'un par adresse). Disponible via POST /v1/permits/bulk-enrich, dans le SDK Python et le connecteur MCP (10 outils désormais).
« Aux couleurs de votre entreprise » V0.2 (Enterprise) : étend la personnalisation à 3 nouveaux points de contact en plus du nom de fichier CSV (V0.1). Signature des notifications webhook sortantes : 'AcmeFonciere-Webhook/0.2' au lieu de 'PermisAPI-Webhook/0.1'. Entête X-Powered-By sur les exports CSV. Entête X-Webhook-Source dans le contenu des alertes. Vos utilisateurs finaux ne voient plus jamais le nom PermisAPI dans les artefacts techniques. V0.3 (sur demande) : expéditeur email sur mesure et sous-domaine personnalisé.
Recalibrage v0.2.1 du score de risques Géorisques : la version V0.2.0 classait 73 % des permis en niveau 'critique' (faux signal). Ajustement des poids selon la fréquence réelle en France (inondation 25 -> 10, sismique 20 -> 8, radon 5 -> 3 car très fréquents partout) et des seuils de classement (15/40/70 -> 20/45/70). Nouvelle distribution : 12 % critique, 25 % élevé, 46 % modéré, 18 % faible. Le filtre ?max_risk=moderate retourne désormais 65 % du corpus, une vraie pré-sélection actionnable.
Pricing card revu : retiré 'Tableau de bord analytique (engagement, conversions)' du plan Enterprise (était trompeur, pointait vers les endpoints d'admin internes). Remplacé par 3 vraies features livrables sans code : garantie de disponibilité 99,5 %, session d'accompagnement initial avec Evan, priorité sur les futures fonctionnalités. Reformulation du jargon technique (DVF cross-ref → prix au m² des ventes voisines, Score Opportunité MDB v0.1 → score d'opportunité par permis, Cadastre + DVF + Score MDB + PLU + Géorisques → tous les enrichissements du plan Pro, etc.).
Nettoyage technique interne : suppression d'une colonne inutilisée dans la base de données (gain de stockage et simplification du pipeline d'import).
Données pré-calculées : risques (Géorisques), cadastre (DGFiP), zonage urbanisme (PLU) et recherche tolérante par adresse
Pré-calcul des risques Géorisques sur les 706 000 permis : 32 000 communes analysées, 706 000 permis classés (73 % en risque modéré, 27 % en risque faible). Le temps de réponse de l'endpoint risques passe de 5-7 secondes à 50 ms. Nouveau filtre ?max_risk=low/moderate/high/critical sur /v1/permits (Pro et plus, coût égal au nombre de résultats demandés). Permet de pré-sélectionner en 1 appel les permis hors zones sensibles (plan PPR inondation, ICPE Seveso, sismique).
Cadastre DGFiP via Etalab : nouveau endpoint /v1/permits/{num_pa}/parcelle (Pro+) qui retourne le polygon GeoJSON precis de la parcelle + contenance officielle DGFiP en m2 + identifiant Etalab. Permet de visualiser la parcelle exacte sur une carte (vs juste un point lat/lng adresse), comparer la surface DGFiP avec celle declaree par Sitadel, ou cross-ref avec DVF en parcelle precise. Source : cadastre.data.gouv.fr.
Pre-cache zonage PLU sur les permis geocodes : latence /v1/permits/{num_pa}/plu 200-500ms -> 50ms. Nouveaux filtres ?plu_zone_type=U/AU/A/N/OTHER et ?plu_constructible=true/false sur /v1/permits (Pro+, cout = limit). Combine avec ?min_score, le filtre permet la requete 'top 50 opportunites premium constructibles dans le 33 sans risque élevé' en 1 appel. Source : Géoportail de l'Urbanisme via apicarto.ign.fr.
Nouvel endpoint GET /v1/search?q=text (tous plans, périmètre géographique respecté) : recherche tolérante par texte libre sur les adresses des permis. Insensible aux accents, à la casse et aux fautes de frappe courantes. Temps de réponse environ 50 à 200 ms. Cas d'usage : trouver un permis par adresse approximative ('rue victor hugo bordeaux') sans connaître le code postal exact. Coût : 1 unité de quota par recherche.
PermitResponse + PermitSummary exposent désormais score_mdb, score_mdb_tier, risk_score, risk_tier, plu_zone_type, plu_constructible, cadastre_id, cadastre_surface en list/detail. Permet aux clients SDK de detecter rapidement si une feature materialisee est disponible sans appeler /score, /risks, /plu, /parcelle separement.
SDK Python permisapi-client v0.8.0 : nouvelle methode client.permits.parcelle(num_pa) sync + async pour recuperer la géométrie cadastre. Docstring permits.list mentionne max_risk, plu_zone_type, plu_constructible. Nouvelle methode client.search(q, dep_code, limit) sync + async pour le full-text. MCP server permisapi-mcp v0.3.0 : 9 tools désormais (avec get_parcelle_geometry et fuzzy_search_addresses), search_permits accepte les filtres metier max_risk, plu_zone_type, plu_constructible.
Dashboard /dashboard/explore : nouveau tab Parcelle (affichage GeoJSON + lien geojson.io pour visualisation rapide), filtres PLU (select zone_type + checkbox constructible only) et max_risk dans ListForm.
Le corpus a doublé : +386 000 permis résidentiels (logements)
Import du jeu de données Sitadel des autorisations créant des logements (permis de construire et déclarations préalables sur le résidentiel). Le corpus passe de 311 000 à 706 000 permis, dont 398 000 PC_LOGEMENT et 27 000 DP_LOGEMENT désormais filtrables explicitement via ?permit_type=PC_LOGEMENT (ou DP_LOGEMENT). Avant, ce jeu de données était absent de la base, tous les permis étaient classés en catégories génériques sans distinguer LOGEMENT vs LOCAUX.
Type de permis ré-attribué sur les permis historiques : 547 000 PC_UNKNOWN sont devenus PC_LOGEMENT (398 000) ou PC_LOCAUX (148 000) selon le fichier CSV source. 93 000 DP_UNKNOWN sont devenus DP_LOGEMENT (27 000) ou DP_LOCAUX (65 000). Plus aucun permis non-classé dans la distribution.
Correction du classement automatique du type de permis : l'import cherchait les mots-clés 'logement' / 'locaux' dans le nom de fichier mais utilisait des noms génériques 'sitadel_permits_N.csv'. Fichiers renommés pour inclure le type explicite (sitadel_permits_3_locaux.csv, sitadel_permits_4_logement.csv). Les futurs imports auront le bon classement automatiquement.
Géocodage groupé : le code traite désormais 2000 permis en une seule opération base de données au lieu de 2000 opérations séquentielles. Gain de performance considérable. Les 386 000 nouveaux permis sont géocodés en 30 minutes au lieu de plusieurs semaines.
Défense en profondeur sur le géocodage : le code rejette désormais les coordonnées BAN qui pointent hors de la commune déclarée. Garantit zéro erreur au niveau de la commune. Les permis non résolus dans leur commune restent non-géocodés plutôt que mal géocodés sur une commune voisine.
Tri explicite sur /v1/permits (sort=)
Nouveau parametre sort= sur GET /v1/permits, avec whitelist explicite des champs autorises (date_reelle_autorisation, date_depot, an_depot, superficie_terrain). Prefixer par '-' pour ordre descendant. Tout autre nom de champ retourne 422 avec la liste des choix valides au lieu d'etre ignore silencieusement.
Avant ce fix, un parametre sort= avec un champ non reconnu etait accepte par FastAPI sans rien trier, donnant l'illusion d'un tri qui ne se faisait pas. Detecte sur la 1ere session du 1er paying customer.
SDK Python permisapi-client 0.7.1 : docstring de permits.list() mise a jour pour documenter le sort=. MCP server permisapi-mcp 0.2.1 : tool search_permits accepte maintenant l'argument sort.
Vue 360 : detail + sirene + dvf + score + plu + risks en 1 appel
Nouvel endpoint GET /v1/permits/{num_pa}/360 : combine 6 sous-features (detail, sirene, dvf, score MDB, zonage PLU, risques BRGM) en un seul appel HTTP. Parallelisation cote serveur des sub-fetches lents (PLU + Risks live), latence typique 5-7 secondes au lieu de 12 secondes en sequentiel cote client. Best-effort : si une sous-feature echoue (timeout API tierce), son champ vaut null et l'erreur est listee dans fetch_errors. Le header X-RateLimit-Cost confirme le cout decompte.
Cout quota transparent : Pro+ = 6 unités par appel /360 (1 par sous-feature, identique a 6 calls separes), Free / Explorer = 1 unité (detail seul, autres champs null avec plan_required_for_full=pro). Pas de free lunch, le compteur reflete le travail reel.
SDK Python permisapi-client 0.7.0 : nouvelle methode client.permits.full_view(num_pa) sync + async. Une ligne au lieu de six. Disponible via pip install --upgrade permisapi-client.
MCP server permisapi-mcp 0.2.0 : nouveau tool get_permit_full_view. Claude / ChatGPT / Cursor peuvent maintenant analyser un permis en un seul tool call au lieu d'enchainer six requetes.
MCP server : PermisAPI dans Claude / ChatGPT / Cursor
Nouveau serveur MCP officiel : permisapi-mcp sur PyPI. Branche PermisAPI sur Claude Desktop, Cursor, Windsurf ou tout client Model Context Protocol-compatible. 6 tools exposés en langage naturel : search_permits, get_permit_details, find_dvf_neighbors, get_mdb_score, get_plu_zoning, get_risks. Installation en 2 minutes : pip install permisapi-mcp + config JSON dans ton client. Gratuit pour tous les plans (limité uniquement par ton quota PermisAPI).
Nouvelle page produit /mcp : guide setup complet, tools list, exemples de prompts, configurations Claude Desktop / Cursor / Windsurf. Lien direct depuis nav, footer, dashboard et docs.
Nouveau guide docs/MCP_SETUP.md avec configurations détaillées par client, exemples concrets, troubleshooting et FAQ sécurité.
Géorisques BRGM : inondation, séisme, ICPE, argile (plans Pro et +)
Nouveau endpoint GET /v1/permits/{num_pa}/risks : pour chaque permis, retourne les risques naturels et technologiques connus sur sa commune (inondation, mouvement de terrain, séisme, retrait-gonflement argile, feu de forêt, etc) avec PPR associé éventuel (PPRn / PPRi / PPRT). Inclut aussi les ICPE (installations classées) dans 1 km. Score agrégé 0-100 + tier qualitatif (low/moderate/high/critical). Source live API Géorisques (BRGM + Ministère Transition Écologique). Plans Pro et supérieurs.
Tab « Géorisques » ajouté à l'API Explorer (/dashboard/explore) avec affichage gros score + breakdown des risques + ICPE proches. Inclus aussi dans la Vue 360° (6 fetches en parallèle : detail + sirene + dvf + score + plu + risks).
SDK Python permisapi-client 0.6.0 : nouvelle méthode client.permits.risks(num_pa) sync + async.
Zonage PLU : chaque permis devient pré-faisabilité (plans Pro et +)
Nouveau endpoint GET /v1/permits/{num_pa}/plu : pour chaque permis géocodé, retourne le zonage urbanisme officiel (UA/UB urbain, AU à urbaniser, A agricole, N naturelle) avec verdict de constructibilité explicite et raison juridique. Source Géoportail de l'Urbanisme via apicarto.ign.fr (gratuit, officiel). Plans Pro et supérieurs.
Tab « Zonage PLU » ajouté à l'API Explorer (/dashboard/explore) avec affichage badge code zone + verdict constructible/non + raison + date de révision PLU. Inclus aussi dans la Vue 360° (5 fetches en parallèle : detail + sirene + dvf + score + plu).
SDK Python permisapi-client 0.5.0 : nouvelle méthode client.permits.plu(num_pa) sync + async.
Feedback Score MDB : aide-nous à entraîner le modèle V1.0
Nouveau endpoint POST /v1/score/feedback : tu peux envoyer ton avis sur le Score MDB que tu as reçu (utile / pas utile, score juste / trop haut / trop bas / mauvais signaux, commentaire libre 2000 chars + recommandation optionnelle). Stocké en DB pour le training V1.0 ML, et un email m'est envoyé immédiatement avec ton retour pour que je puisse répondre. Plans Pro et supérieurs uniquement.
Bouton « Donner mon avis » ajouté dans l'API Explorer (tab Score MDB et Vue 360°) : un mini-formulaire inline permet d'envoyer le feedback en 30 secondes sans coder.
SDK Python permisapi-client 0.4.1 : nouvelle méthode client.permits.score_feedback(...) sync + async.
Score Opportunité MDB v0.1 : note 0-100 par permis (plans Pro et +)
Nouveau endpoint GET /v1/permits/{num_pa}/score : pour chaque permis, retourne une note 0-100 + tier qualitatif (low/medium/high/premium) qui prédit si c'est une opportunité Marchand de Biens. Heuristique pondérée v0.1 sur 7 signaux : type permis (20%), surface terrain (15%), DVF voisin €/m² (25%), activité département (10%), demandeur SCI/promoteur (15%), cohérence DVF/permis (10%), densité INSEE (5%). Réservé aux plans Pro et supérieurs.
Tab 'Score MDB' ajouté à l'API Explorer interactif (/dashboard/explore) avec affichage gros score + breakdown des 7 composants en bar chart. Le score est aussi inclus dans la Vue 360° (auto) qui combine désormais 4 endpoints en parallèle : detail + sirene + dvf + score.
SDK Python permisapi-client 0.4.0 : nouvelle méthode client.permits.score_mdb(num_pa). Auto-publish PyPI au tag sdk-v0.4.0.
DVF cross-ref : valeur foncière estimée par permis (plans Pro et +)
Nouveau endpoint GET /v1/permits/{num_pa}/dvf : pour chaque permis, retourne les transactions immobilières DVF (Demandes de Valeurs Foncières) les plus pertinentes à proximité. Cross-référence Geo-DVF Etalab (5 ans glissants 2021-2025) avec les permis géocodés. Score combiné distance + proximité temporelle + match type de bien. Filtres par type_local, année, distance max. Réservé aux plans Pro et supérieurs.
Rayon de matching adaptatif selon la densité communale INSEE 2025 : 50m en urbain dense, 150m en intermédiaire, 400m en rural. Garantit la pertinence des matches indépendamment de la densité immobilière locale.
SDK Python officiel disponible
Client Python officiel publié sur PyPI (permisapi-client). Installation en une commande : pip install permisapi-client. Supporte l'appel synchrone et asynchrone, la pagination automatique, les alertes webhook, la gestion typée des erreurs (rate limit, quota, unauthorized).
Documentation interactive et sécurité
Documentation API (/docs) restylée aux couleurs PermisAPI : navy + amber, typographie monospace, try-it-out interactif directement depuis la page.
Nouveau endpoint public /v1/public/latest-day : consulte le nombre de permis autorisés sur la dernière journée sans authentification (aggregats only).
Performance carte hero : rendu fluide à 60 fps en pan/zoom même avec 500 permis affichés.
Pages dédiées par métier + SEO
3 nouvelles pages dédiées par profil : /for-marchand-biens, /for-architecte, /for-proptech. Cas d'usage, exemples de code et plans recommandés.
Blog technique avec 4 tutoriels : comment alerter sur les permis près de Paris, intégrer PermisAPI à Zapier, exporter vers Google Sheet, intégrer dans Next.js.
Bandeau statistiques en hero : 311k+ permis couverts, 97% géocodés, 101 départements, 28 952 communes.
Flux RSS du blog disponible (/blog/rss.xml) pour les clients qui veulent suivre les nouveautés.
Qualité compte et billing
Les appels à /v1/me et /v1/billing/* ne consomment plus le quota mensuel. Consulter son profil ou gérer son abonnement reste gratuit.
L'email de bienvenue avec la clé API est envoyé uniquement après confirmation du paiement Stripe (évite les cas où le paiement échoue mais la clé est déjà reçue).
Opérations d'alerting webhook (/v1/alerts/*) ne consomment plus le quota : créer ou lister ses alertes reste gratuit, seule la livraison de valeur (requêtes permis et stats) compte.
Mise en production initiale
Lancement public de l'API avec 311 000+ permis de construire géocodés (base Sitadel depuis 2022).
Page de statut publique /status avec latences P50/P95/P99 et temps de réponse en temps réel.
Endpoint de démo /v1/public/try-it : 5 permis récents par département sans inscription.
Tarification claire : Free (500 req/mois), Explorer (49€), Pro (199€), Business (499€), Enterprise (1 999€+ sur mesure).
Sous-domaine api.permisapi.fr dédié à l'API REST, avec documentation OpenAPI interactive.