{"openapi":"3.1.0","info":{"title":"synergieloc — API immobilière pour les IA","version":"1.0.0","description":"Calculs immobiliers français réglementaires exacts (loi 89-462, décret 87-713) : révision IRL, régularisation de charges, quittances et courriers conformes. Clé API : https://synergieloc.fr/api-ia — Serveur MCP : https://synergieloc.fr/mcp","contact":{"email":"contact@synergieloc.fr","url":"https://synergieloc.fr/api-ia"}},"servers":[{"url":"https://synergieloc.fr"}],"paths":{"/api/v1/signup":{"post":{"tags":["api-ia"],"summary":"Api V1 Signup","description":"Auto-provisionnement d'une clé API GRATUITE — AUCUN email requis, aucune\nattente. Pensé pour qu'une IA/agent qui découvre le serveur MCP ou l'API\nreparte avec une clé fonctionnelle dans le même échange (voir aussi l'outil\nMCP `obtenir_cle_api`, identique). Body : {name, [email]} — `name` identifie\nl'appelant (ex. « Claude », « MonAgent »), `email` est facultatif (double de\nla clé envoyé si fourni, jamais utilisé à autre chose).\n30 jours d'accès illimité à compter de MAINTENANT, puis EVAL_DAILY_MINUTES\nminutes/jour, sans\ndate limite. Limité par IP pour éviter l'abus (contact@synergieloc.fr en cas\nde besoin légitime au-delà).","operationId":"api_v1_signup_api_v1_signup_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me":{"get":{"tags":["api-ia"],"summary":"Api V1 Me","description":"Infos de la clé : plan, quota, unités consommées ce mois.","operationId":"api_v1_me_api_v1_me_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tarifs":{"get":{"tags":["api-ia"],"summary":"Api V1 Tarifs","description":"TARIFS lisibles par une machine — GRATUIT, sans clé.\n\nUn agent ne lit pas une page HTML avant d'intégrer : il doit pouvoir\napprendre où passe la frontière gratuit/payant, ce que coûte chaque appel et\nà quelle date la promotion s'arrête. Cet endpoint est cette réponse, et il\nest cité par le descripteur MCP et par /usage.","operationId":"api_v1_tarifs_api_v1_tarifs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/usage":{"get":{"tags":["api-ia"],"summary":"Api V1 Usage","description":"Consommation réelle : minutes (plan eval) et/ou unités + journal récent.\n0 unité — pour suivre le quota avant d'enchaîner des appels métier.","operationId":"api_v1_usage_api_v1_usage_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback":{"post":{"tags":["api-ia"],"summary":"Api V1 Feedback","description":"Canal de retour des IA (0 unité, toujours accessible). L'IA envoie ses\nremarques pour améliorer l'app. Body : {message, [context]}.","operationId":"api_v1_feedback_api_v1_feedback_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/irl/revision":{"post":{"tags":["api-ia"],"summary":"Api V1 Irl Revision","description":"Révision annuelle de loyer indexée IRL (art. 17-1 loi 89-462).\nBody : {loyer_actuel, irl_reference, irl_nouveau, [charges_actuelles]}.\nL'appelant fournit les indices INSEE (T de référence du bail et nouveau T).","operationId":"api_v1_irl_revision_api_v1_irl_revision_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/regularisation/charges":{"post":{"tags":["api-ia"],"summary":"Api V1 Regul Charges","description":"Régularisation annuelle des charges locatives (décret 87-713).\nBody : {provisions_encaissees, tantiemes_locataire, tantiemes_total,\n        charges: [{libelle, montant, recuperable(bool, def=true)}],\n        [jours_occupation, jours_periode=365]}.","operationId":"api_v1_regul_charges_api_v1_regularisation_charges_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/quittance":{"post":{"tags":["api-ia"],"summary":"Api V1 Quittance","description":"Quittance de loyer conforme (art. 21 loi 89-462), PDF (défaut) ou HTML.\nBody : {bailleur_nom, bailleur_adresse, locataire_nom, logement_adresse,\n        [locataire_adresse], periode, loyer, charges, date_paiement,\n        [lieu, date_emission, format:'pdf'|'html']}.\nMise en page enveloppe à fenêtre : destinataire à DROITE. Préférer\nlocataire_adresse (postale) distincte de logement_adresse (bien loué).","operationId":"api_v1_quittance_api_v1_documents_quittance_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/dxf":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Dxf","description":"CAO pour agents IA : décrivez une scène en JSON, recevez un fichier DXF\nouvrable dans AutoCAD. Coordonnées plan XY en millimètres, hauteurs en Z.\nBody : {murs:[{x1,y1,x2,y2,hauteur,epaisseur}], boites:[{x,y,l,p,h,z,rotation}],\n        plan:[{x1,y1,x2,y2}], cercles:[{x,y,r}], [format:'json']}.\nSchéma complet + exemples : GET /api/v1/cao/schema.","operationId":"api_v1_cao_dxf_api_v1_cao_dxf_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/metres":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Metres","description":"Métrés chiffrés d'une scène CAO : linéaire et surface de murs, surface et\nvolume des boîtes (mobilier, cloisons, dalles…), emprise au sol — de quoi\nalimenter directement un devis. Même format de scène que /cao/dxf.\nSchéma complet + exemples : GET /api/v1/cao/schema. Alias : /cao/quantites.","operationId":"api_v1_cao_metres_api_v1_cao_metres_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/quantites":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Quantites","description":"Alias de /cao/metres (nom alternatif fréquent : « quantitatif de devis »).","operationId":"api_v1_cao_quantites_api_v1_cao_quantites_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/render":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Render","description":"Aperçu visuel d'une scène CAO en vue de dessus (plan XY) — utile pour\nqu'un agent IA vérifie visuellement ce qu'il vient de générer avant de le\nlivrer. Body : mêmes champs que /cao/dxf, plus [format:'svg'|'png']\n(défaut svg, vectoriel). Schéma complet + exemples : GET /api/v1/cao/schema.","operationId":"api_v1_cao_render_api_v1_cao_render_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/pdf":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Pdf","description":"PLANCHE TECHNIQUE haute qualité d'une scène CAO, en PDF (défaut) ou HTML :\nvue de dessus (plan), élévation de face, élévation de côté ET vue\naxonométrique ombrée (pseudo-3D, pas un simple plan filaire), avec cotes\n(largeur/profondeur/hauteur) et métrés — en un seul document présentable.\nPortes/fenêtres (body.ouvertures) incrustées sur leur mur. Toiture : sans\nbody.toitures, un toit plat est auto-généré sur l'emprise de tous les murs\n(sans quoi le bâtiment resterait ouvert vu de dessus/en axo) ; avec\nbody.toitures, composez librement plat/deux_pans/quatre_pans/conique/\ndome/chien_assis/personnalise, chaque entrée pouvant viser un\nsous-ensemble de murs (bâtiment en L, lucarne en plus du toit principal…).\nBody : mêmes champs que /cao/dxf, plus [ouvertures, toitures, titre,\nauteur, format:'pdf'|'html']. Schéma complet + exemples : GET\n/api/v1/cao/schema.","operationId":"api_v1_cao_pdf_api_v1_cao_pdf_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/verifier":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Verifier Aide","description":"Le navigateur ouvre GET ; l'audit est un POST JSON. Sans cette aide,\nl'URL documentée renvoie 405 Method Not Allowed — un agent (ou un humain)\ncroit l'outil cassé.","operationId":"api_v1_cao_verifier_aide_api_v1_cao_verifier_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Verifier","description":"Audit géométrique d'une scène CAO — GRATUIT, sans clé API.\n\nDétecte les erreurs fréquentes des agents (allège d'ouverture en altitude\nabsolue, lucarne chien_assis flottante, étage sans fenêtres, garde-corps\nhors emprise…) AVANT dxf/pdf/rendu. Inclut le contrôle d'intégrité (clos\net couvert, `integrite`) ET la complétude documentaire (`documents` : un\nplan complet par niveau, chaque étage desservi par un escalier qui y\nARRIVE ou un ascenseur, trémies protégées NF P01-012).\nRetourne alertes + conseils de correction.\nOptions : `appliquer:true` applique TOUS les correctifs proposés\n(intégrité + liasse) à une copie de la scène (`scene_corrigee` + `diff`),\net `revalider:true` (défaut) rejoue l'audit complet dessus\n(`apres_correction.ok`).\nWorkflow : GET /cao/schema → composer → POST /cao/verifier → corriger\n(ou appliquer:true) → metres/rendu/pdf/dxf.","operationId":"api_v1_cao_verifier_api_v1_cao_verifier_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/schema":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Schema","description":"Schéma documenté de la scène CAO (format commun à /cao/dxf, /cao/metres,\n/cao/render) avec exemples prêts à copier. Pas de clé API requise — pour\nlaisser un agent IA découvrir le format avant de commander une clé.","operationId":"api_v1_cao_schema_api_v1_cao_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/cao/savoir":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Savoir","description":"Ce que le vérificateur sait, et ce qu'il ne sait pas encore. Sans clé.\n\nGratuit et sans authentification, au même titre que /cao/schema : un agent\ndoit pouvoir apprendre CE QUI EST VÉRIFIÉ avant d'intégrer, et surtout ce\nqui ne l'est pas — un contrôle absent annoncé vaut mieux qu'un faux\nsentiment de sécurité.","operationId":"api_v1_cao_savoir_api_v1_cao_savoir_get","parameters":[{"name":"metier","in":"query","required":false,"schema":{"type":"string","default":"","title":"Metier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/normes":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Normes","description":"Les normes que le vérificateur applique, pays par pays. Sans clé.\n\nLa scène choisit son pays par `juridiction` (GET /cao/schema) ; cette\nréponse dit, pour chacun, ce qui est vérifié et d'après quel texte — un\nagent qui dessine pour Shanghai doit savoir AVANT de composer qu'une\nchambre y demande 2,60 m sous plafond.","operationId":"api_v1_cao_normes_api_v1_cao_normes_get","parameters":[{"name":"juridiction","in":"query","required":false,"schema":{"type":"string","default":"","title":"Juridiction"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/suggerer":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Suggerer","description":"L'agent relit la scène en homme de l'art — architecte, agenceur,\ndécorateur, paysagiste — et signale ce que les contrôles déterministes ne\nsavent pas encore voir.\n\n⚠️ CE N'EST PAS UN VERDICT. Toutes les sorties portent `severite:\n\"suggestion\"` et ne bloquent aucune production. Le champ\n`severite_si_confirmee` dit ce que vaudrait le manquement une fois vérifié\npar un contrôle déterministe. Pour un verdict, utilisez POST /cao/verifier.\n\n`disponible: false` signifie que le modèle n'a pas répondu — ce n'est PAS\n« la scène est correcte ».\n\nBody : {scene: {...}, [metiers: [\"ameublement\",\"paysage\"]]}.","operationId":"api_v1_cao_suggerer_api_v1_cao_suggerer_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent-playbook":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Agent Playbook","description":"Playbook versionné pour agents IA — GRATUIT, sans clé.\n\nQuery ?domaine=cao|documents|irl|securite|workflow (optionnel).\nÉquivalent MCP : outil bonnes_pratiques.","operationId":"api_v1_agent_playbook_api_v1_agent_playbook_get","parameters":[{"name":"domaine","in":"query","required":false,"schema":{"type":"string","default":"","title":"Domaine"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bonnes-pratiques":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Bonnes Pratiques","description":"Même contenu que GET /agent-playbook — body JSON {domaine?} pour MCP.","operationId":"api_v1_bonnes_pratiques_api_v1_bonnes_pratiques_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/decide":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Agent Decide","description":"Décision commerciale pour Make AI Agent (infos in → actions out).\n\nMake collecte ; Synergieloc décide démarchage / campagne / infos manquantes.\nAuth obligatoire + rate-limit IP.","operationId":"api_v1_agent_decide_api_v1_agent_decide_post","parameters":[{"name":"X-Make-Secret","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Make-Secret"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/demarchage":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Agent Demarchage","description":"Envoie l'offre commerciale Synergieloc au prospect (SMTP).\n\nAuth : header ``X-Make-Secret`` (= MAKE_DEMARCHAGE_SECRET) **ou** clé API\n``X-API-Key``. Body : prospect_email, prospect_nom?, prospect_entreprise?,\ncontexte?, cible? (persona), produit?, agent_nom? (ignoré — marque fixe).","operationId":"api_v1_agent_demarchage_api_v1_agent_demarchage_post","parameters":[{"name":"X-Make-Secret","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Make-Secret"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/visite/objectifs":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Visite Objectifs","description":"Catalogue des OBJECTIFS de la visite 4K — GRATUIT, sans clé API.\n\nFocales exprimées en équivalent plein format 24×36, comme en photographie\nd'architecture, avec le champ de vision correspondant en 16:9. À passer à\nPOST /cao/visite/plan (objectif.focale_interieur_mm, focale_exterieur_mm…).","operationId":"api_v1_cao_visite_objectifs_api_v1_cao_visite_objectifs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/cao/visite/plan":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Visite Plan","description":"PLAN DE TOURNAGE de la visite 4K : objectif + chemin de caméra.\n\nBody = scène CAO (GET /cao/schema) + réglages de mise en scène :\n  - duree_s (8–900 s, défaut 60 ; 480–600 pour une visite d'agence), fps (24|30|60), resolution ('4k'|'1440p'|'1080p')\n  - mode : 'deco' (bien meublé) | 'nu' (coque plâtre)\n  - objectif : {focale_interieur_mm, focale_exterieur_mm, focale_entree_mm,\n                focale_escalier_mm, focale_cloture_mm, focale_min_mm,\n                focale_max_mm, adaptatif}\n  - cadence  : {hauteur_oeil_mm, vitesse_int_mm_s, vitesse_ext_mm_s,\n                vitesse_transition_mm_s, pose_piece_s}\n    `pose_piece_s` (défaut 9 s) = durée du BEAT D'INSPECTION joué au centre de\n    chaque pièce : tour complet à 360° sur place, regard vers le sol, regard\n    vers le plafond, puis recul avec ouverture de l'objectif jusqu'à\n    `focale_min_mm` pour la vue d'ensemble. Sous 6 s ces mouvements ne se\n    lisent plus (alerte `pose_trop_courte`).\n  - chemin   : OPTIONNEL — vos propres points [{position:{x,y,z}, vise:{x,y,z},\n               focale_mm, pose_s, plan}] ; ils remplacent le chemin calculé et\n               sont vérifiés (hors emprise, dans un mur, focale extrême…).\n\nRetourne le plan JSON à donner tel quel au moteur 4K :\n`CAD_startCinematicTour({plan})` dans l'éditeur CAO (ou collé dans le champ\n« Plan de caméra piloté » du dialogue Visite 4K). Le rendu vidéo lui-même est\nfait par le GPU du navigateur — il n'y a plus de rendu vidéo côté serveur.\n\nUne OPÉRATION de plusieurs bâtiments : la visite de chacun, calculée sur\nsa propre scène, puis enchaînées (cao_visite_operation).","operationId":"api_v1_cao_visite_plan_api_v1_cao_visite_plan_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/visite/studio":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Visite Studio","description":"Ouvre un STUDIO DE RENDU public pour la Visite 4K — sans compte, sans connexion.\n\nBody = scène CAO (GET /cao/schema) + les mêmes réglages que\nPOST /cao/visite/plan (duree_s, fps, resolution, mode, objectif{}, cadence{},\nchemin[] optionnel). Vous pouvez aussi fournir `plan_camera` : un plan de\ntournage déjà obtenu de /cao/visite/plan, repris tel quel. (Ne l'appelez pas\n`plan` : ce nom est déjà pris par le champ « lignes de référence 2D » de la\nscène — un dict y est toutefois toléré et interprété comme le plan caméra.)\n\nRetourne une URL à ouvrir dans N'IMPORTE QUEL navigateur (ou un navigateur\npiloté) : la page charge le moteur de visite, rejoue le plan et télécharge le\nMP4 en 3840×2160. Le rendu se fait sur le GPU du poste qui ouvre la page —\nil n'y a pas de rendu vidéo côté serveur.\n\nLe jeton est l'identifiant : imprévisible, valable 7 jours, et il ne donne\naccès qu'à la scène que vous venez de poster. Rien n'est conservé au-delà\n(purge par âge puis par budget disque si /tmp est sous pression).","operationId":"api_v1_cao_visite_studio_api_v1_cao_visite_studio_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/visite/studio/{jeton}":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Visite Studio Charge","description":"Charge utile d'un studio (objets + plan de tournage). Le JETON fait office\nd'identifiant : pas de clé API ici, c'est la page publique qui appelle.","operationId":"api_v1_cao_visite_studio_charge_api_v1_cao_visite_studio__jeton__get","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/integrite":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Integrite","description":"CONTRÔLE D'INTÉGRITÉ de la construction — GRATUIT, sans clé API.\n\nRépond à une seule question : le bâtiment est-il réellement **clos et\ncouvert** ? Ce sont les défauts qu'on ne voit qu'en confrontant les éléments\nentre eux, et qui ne se remarquent sinon qu'une fois la vidéo rendue :\n\n  · `enveloppe_percee` — une extrémité de mur ne rejoint rien. Les jonctions\n    en T et les jambages de porte sont reconnus : pas de fausse alerte.\n  · `bande_ouverte_entre_niveaux` / `niveaux_qui_se_recouvrent`\n  · `mur_etage_sans_appui` — un mur d'étage qui flotte\n  · `toit_ouvert` — des murs du dernier niveau sous aucune toiture\n  · `toiture_sous_les_murs` — le toit tranche le bâtiment\n  · `ouvertures_chevauchantes`\n  · `murs_composantes_isolees` — îlots de murs jointifs mais détachés de la\n    maison (piliers, murets, « murs en vrac ») : l'enveloppe principale est\n    close, pourtant l'extérieur est un chantier. `propose: null` = retirer.\n  · `murs_hors_racine` — des murs égarés sous une autre clé (`niveaux[]`…) :\n    rien ne serait contrôlé, la scène passerait pour valide à tort\n\nEt surtout, il AIDE À CORRIGER : `correctifs[]` désigne le champ exact et la\nvaleur à y écrire — `{\"cible\":\"murs[3].x2\",\"actuel\":10400,\"propose\":11000,\n\"raison\":\"souder sur murs[4].x1 (écart 600 mm)\"}`, ou\n`{\"cible\":\"murs[12]\",\"propose\":null}` pour retirer un mur en vrac. Quand deux\nextrémités sont libres l'une en face de l'autre, la soudure est proposée au\nMILIEU, pour que les correctifs restent applicables ensemble.\n\nBody : la scène CAO (GET /cao/schema), plus deux options :\n  - `appliquer: true`  → renvoie aussi `scene_corrigee` (scène patchée) et\n    `diff` (liste `{cible, actuel, propose, raison}` — un par correctif\n    réellement appliqué, pour savoir CE QUI a bougé sans comparer\n    manuellement `scene_corrigee` au JSON envoyé, ex. reprendre le\n    mobilier autour d'un escalier déplacé) ;\n  - `revalider: true`  → et le contrôle rejoué dessus, pour vérifier d'un\n    seul appel que la correction ferme bien le bâtiment.\n\nConçu pour être appelé souvent : indexation spatiale, quelques millisecondes\nsur des scènes de plusieurs centaines de murs (`duree_ms` dans la réponse).","operationId":"api_v1_cao_integrite_api_v1_cao_integrite_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/documents":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Documents","description":"CONTRÔLE DE COMPLÉTUDE DOCUMENTAIRE — GRATUIT, sans clé API.\n\nLa planche PDF (/cao/pdf) livre un plan complet PAR NIVEAU + fiches\ntechniques. Ce contrôle dit si la liasse sera défendable devant un\nprofessionnel — 4 étages exigent 4 plans complets ET desservis :\n\n  · `element_hors_plan` — escalier/garde-corps dont le z ne se rattache\n    à aucun niveau : il disparaîtrait de TOUS les plans ;\n  · `niveau_non_desservi` (critique) — aucun escalier n'ARRIVE à cet étage\n    et aucun ascenseur ne le couvre : étage inaccessible sur les plans ;\n  · `arrivee_sans_protection` — trémie sans garde-corps ni cage murée\n    (NF P01-012) ;\n  · `hauteur_niveau_insuffisante` — moins de 2 200 mm entre deux niveaux.\n\n`couverture` = le sommaire annoncé de la liasse : chaque plan de niveau\navec son contenu (murs, ouvertures, escaliers, garde-corps), plans\ntechniques, élévations, axonométrie, métrés.\n\nBody : la scène CAO (GET /cao/schema), plus deux options :\n  - `appliquer: true` → `scene_corrigee`, la scène patchée (correctifs z) ;\n  - `revalider: true` → `apres_correction`, le contrôle rejoué dessus.\n\nWorkflow : cao_verifier (qui inclut CE contrôle) → corriger → cao_pdf.","operationId":"api_v1_cao_documents_api_v1_cao_documents_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/visite/commandes":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Visite Commandes","description":"Catalogue du PILOTAGE CAMÉRA — GRATUIT, sans clé API.\n\nLes mêmes actions sont disponibles de trois façons : au clavier dans le studio\nde rendu, par `POST /api/v1/cao/visite/camera`, et par l'outil MCP\n`cao_visite_camera`. Ce catalogue est la source unique — si une touche change,\nelle change ici.","operationId":"api_v1_cao_visite_commandes_api_v1_cao_visite_commandes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/cao/visite/camera":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Visite Camera","description":"PILOTER la caméra : une séquence d'actions → un nouveau point de vue.\n\nLa visite calculée est une chorégraphie complète ; cet endpoint sert à\nREPRENDRE LA MAIN sur une vue précise — recadrer une façade, monter voir le\nfaîtage, entrer dans la pièce d'à côté — sans réécrire un chemin à la main.\n\nBody :\n  - la scène CAO (`murs`, …, cf. GET /cao/schema) — OPTIONNELLE mais vivement\n    conseillée : c'est elle qui apporte la détection de murs (un pas qui\n    entrerait dans une cloison est refusé et signalé) et les repères de pièces ;\n  - `depuis` : {position, vise, focale_mm} — le point de vue de départ, tel\n    qu'il sort de `chemin` dans /cao/visite/plan. Absent : vue d'ensemble du\n    bâtiment (ou hauteur d'œil à l'origine si la scène manque) ;\n  - `actions` : la séquence, en codes (`avancer`) ou en touches (`ctrl+8`),\n    avec répétitions (`\"avancer x3\"` ou `{code:\"avancer\", repetitions:3}`) ;\n  - `reglages` : pas_mm, pas_altitude_mm, pas_rotation_deg, facteur_zoom,\n    focale_min_mm, focale_max_mm, grand_pas.\n\nRetourne l'état final, l'état après CHAQUE action (avec le motif des pas\nrefusés), et un `chemin` prêt à être rendu en 4K par /cao/visite/studio.\nCatalogue des actions (gratuit) : GET /api/v1/cao/visite/commandes.","operationId":"api_v1_cao_visite_camera_api_v1_cao_visite_camera_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/mobilier":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Mobilier","description":"CATALOGUE DE MOBILIER ET DE DÉCORATION — GRATUIT, sans clé API.\n\nUn agent qui « meuble » une maison avec des `boites[]` produit des cubes\ngris : c'est ce que donnait l'API jusqu'ici, faute de vocabulaire. Ce\ncatalogue est ce vocabulaire — de vrais objets, modélisés en volumes, qui\napparaissent dans la Visite 4K comme sur la planche PDF.\n\nÀ lire AVANT de composer une scène meublée, en même temps que /cao/schema.","operationId":"api_v1_cao_mobilier_api_v1_cao_mobilier_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/cao/familles":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Familles","description":"FAMILLES PARAMÉTRIQUES DE MENUISERIES — gratuit, sans clé : portes\n(battante, deux vantaux, coulissante, galandage, entrée, porte-fenêtre,\nbaie coulissante) et fenêtres (un ou deux vantaux, oscillo-battant, fixe),\nleurs paramètres bornés et les cotes de baie qu'ils donnent. Une baie de\n`ouvertures[]` qui déclare `famille` + `parametres` devient en IFC un\nIfcDoorType / IfcWindowType à géométrie partagée, dormant et vantaux décrits.","operationId":"api_v1_cao_familles_api_v1_cao_familles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/cao/demo":{"get":{"tags":["api-ia"],"summary":"Api V1 Cao Demo","description":"Une scène CAO complète et vérifiée, prête à enchaîner. GRATUIT, sans clé.\n\n⚠️ LE PREMIER APPEL DOIT RÉUSSIR. Composer une scène depuis le schéma\ndemande plusieurs allers-retours, et un agent qui échoue au premier essai ne\nrevient pas. Ici la scène arrive faite : elle passe le vérificateur à zéro\nalerte, et `suite` donne les appels suivants dans l'ordre, avec leur coût.","operationId":"api_v1_cao_demo_api_v1_cao_demo_get","parameters":[{"name":"exemple","in":"query","required":false,"schema":{"type":"string","description":"maison | appartement | extension","default":"maison","title":"Exemple"},"description":"maison | appartement | extension"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/ifc":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Ifc","description":"CAO pour agents IA : décrivez une scène en JSON (même format que\n/cao/dxf), recevez un fichier IFC4 — le format d'échange BIM standard,\nouvrable dans Revit/ArchiCAD/Solibri, en millimètres. GlobalId STABLES :\nla même maquette garde ses identifiants d'un export à l'autre (espace de\nnoms = `projet_id`, sinon le titre ; un élément qui porte `ifc_guid` — posé\npar l'import — le garde, même réordonné) ; pièces IfcSpace nommées avec surfaces habitable et Carrez ;\nplanchers (IfcSlab) percés de leurs trémies, toiture IfcRoof, escaliers\nIfcStair ; Pset/Qto standard (murs, baies, dalles, pièces, étages) ;\ncouches de matériaux (IfcMaterialLayerSetUsage) avec masse volumique et\nconductivité thermique. Les ouvertures percent réellement leur mur :\nIfcOpeningElement (IfcRelVoidsElement) + IfcDoor/IfcWindow en remplissage\n(IfcRelFillsElement). Types (IfcWallType, IfcSlabType, IfcDoorType,\nIfcWindowType), limites d'espaces (IfcRelSpaceBoundary2ndLevel),\ngéoréférencement Lambert-93 (IfcMapConversion, Scale 0,001). Validé\nschéma + règles EXPRESS IFC4. Compositions déclarées : `compositions{}`\n/ `murs[].composition` / `murs[].couches`.\nArmatures sur demande (`armatures: true`) : IfcReinforcingBar des semelles et\nlinteaux, à la géométrie exacte, agrégées à leur élément ; IfcReinforcingMesh\npar dalle (cao_ifc_armatures, aciers de /cao/ferraillage).\nBody : identique à /cao/dxf. [format:'json'] renvoie {ifc, elements, unites}\nau lieu d'un fichier téléchargeable. Schéma complet : GET /api/v1/cao/schema.\nCoordination : POST /cao/ifc/valider, /cao/ifc/conflits, /cao/ifc/bcf.","operationId":"api_v1_cao_ifc_api_v1_cao_ifc_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/ifc/valider":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Ifc Valider","description":"Validation IFC4 locale (schéma, EXPRESS, unités mm, couches, pièces\nnommées, conductivité, hiérarchie) — sans compte buildingSMART.\nMême scène que /cao/ifc.","operationId":"api_v1_cao_ifc_valider_api_v1_cao_ifc_valider_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/bim/manifest":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Bim Manifest","description":"Contrat BIM leger avant export ou rendu.\n\nRetourne le projet canonique multi-niveaux, les alertes bloquantes, les\nquantites par categorie et le manifeste de rendu. Il ne modifie jamais la\nscene et n'appelle pas le renderer : l'IFC et les rendus existants gardent\ndonc exactement leur comportement.","operationId":"api_v1_cao_bim_manifest_api_v1_cao_bim_manifest_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/bim/transaction":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Bim Transaction","description":"Simule ou applique une modification paramétrique au modèle canonique.\n\nLe client renvoie le projet retourné au prochain appel : le modèle reste\nunique côté client, tandis que ``history`` fournit l'annulation exacte.\n``commit`` est volontairement explicite et vaut false par défaut.","operationId":"api_v1_cao_bim_transaction_api_v1_cao_bim_transaction_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/ifc/conflits":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Ifc Conflits","description":"Détection de conflits PAR VOLUMES (tranches horizontales des\nmaillages) : interpénétration de plus de 10 mm et 0,1 L. Contacts, appuis\ndalle-mur, jonctions de murs, objets posés sur un tapis ou un platelage,\nmenuiseries dans leur mur ne sont pas des conflits (comptés dans\n`ignores`). Body : la scène (comme /cao/ifc) OU `ifc` : le texte d'un IFC\n— celui d'un architecte, dont les GlobalId sont gardés.","operationId":"api_v1_cao_ifc_conflits_api_v1_cao_ifc_conflits_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/ifc/bcf":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Ifc Bcf","description":"Export BCF 2.1 (zip, sans dépendance), lisible dans Solibri, BIMcollab,\nRevit (BCF Manager), Archicad : un sujet « Clash » par conflit, un sujet\n« Issue » par alerte de nos contrôles (critique ou avertissement), chacun\navec ses objets (GlobalId) et sa caméra. Body : la scène OU `ifc` (texte\nd'un IFC). format=json → {topics, conflits, alertes, ignores, bcf_base64}.","operationId":"api_v1_cao_ifc_bcf_api_v1_cao_ifc_bcf_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/ifc/importer":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Ifc Importer","description":"COORDINATION : l'IFC d'un architecte (Revit, Archicad… IFC2X3 ou IFC4)\nconverti en scène CAO, pour lui appliquer NOS contrôles, métrés, Visite 4K\net visite VR. Murs, portes et fenêtres sur leur mur, volées d'escalier,\ngarde-corps, pièces nommées, mobilier, toiture ; chaque élément garde son\nGlobalId (`ifc_guid`). Body : {ifc: texte STEP, controler?: true,\nmetres?: true, conflits?: false, studio?: false}. Retourne {scene, rapport,\ncontroles, metres[, conflits][, studio]} — `scene` se réutilise telle\nquelle avec /cao/verifier, /cao/metres, /cao/pdf, /cao/visite/studio et\n/cao/ifc/bcf ; `studio:true` ouvre directement la Visite 4K et la visite\nVR du modèle importé.","operationId":"api_v1_cao_ifc_importer_api_v1_cao_ifc_importer_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/regles":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Regles","description":"STRUCTURE ET RÉSEAUX GÉNÉRÉS PAR RÈGLES — la scène complétée, jamais\namputée : linteaux au-dessus des baies des murs porteurs, semelles\nfilantes, contrôle des portées de dalle (prédimensionnement indicatif, à\nfaire valider par un bureau d'études) ; électricité NF C 15-100 (socles,\nRJ45, points lumineux et commandes, détecteur par niveau, tableau et\ndifférentiel, bilan des circuits) ; VMC simple flux (arrêté du\n24/03/1982 : bouches, entrées d'air, caisson, débits) ; évacuations en\npente (NF DTU 60.11 : diamètres, pentes, chute, dénivelés) ; alimentation\nen eau (NF DTU 60.11 : arrivée d'eau et chauffe-eau posés s'ils manquent) ;\nchauffage (NF EN 12831 : déperditions par pièce, radiateurs dimensionnés au\nrégime 55/45 °C).\nBody : la scène + options booléennes `structure`, `electricite_regles`,\n`vmc`, `evacuations`, `alimentation`, `chauffage` (toutes vraies par défaut)\net `sol{contrainte_mpa, hors_gel_mm}`. Retourne {scene, rapport, controles}.","operationId":"api_v1_cao_regles_api_v1_cao_regles_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/copilote":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Copilote Catalogue","description":"CATALOGUE DU COPILOTE D'ÉDITION — gratuit, sans clé : les opérations\nque POST /cao/copilote sait appliquer, leurs paramètres, des exemples\n(`?langue=en` : les exemples en anglais, pour l'éditeur anglais).","operationId":"api_v1_cao_copilote_catalogue_api_v1_cao_copilote_get","parameters":[{"name":"langue","in":"query","required":false,"schema":{"type":"string","default":"","title":"Langue"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Copilote","description":"COPILOTE D'ÉDITION — une demande en français (« agrandis la cuisine d'un\nmètre », « réduis la chambre 2 de 50 cm côté nord ») appliquée à la\nscène. Le modèle de langage choisit des OPÉRATIONS typées (catalogue :\nGET /cao/copilote) ; le moteur les exécute au millimètre — murs raccrochés\nprolongés, meubles poussés ou suivant le mur, appareils recalés hors des\nbaies — et nos contrôles rejugent le résultat. Une paroi qui créerait un\ndéfaut n'est pas retenue ; aucune ne passe → refus motivé. Un porteur\nsuperposé ou une façade (sauf côté demandé) ne bougent pas.\nBody : {scene, instruction, operations? (liste typée, sans modèle),\nmodele? (défaut vrai)}. Retourne {compris, source, operations, journal,\nerreurs, nouvelles_alertes, valide, scene, difference}.","operationId":"api_v1_cao_copilote_api_v1_cao_copilote_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/copilote/exemple":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Copilote Exemple","description":"SCÈNE D'EXEMPLE de l'éditeur (/cao/editeur) — la maison R+3 de\nréférence, meublée, gratuite et sans clé : de quoi essayer le copilote\nsans rien fournir.","operationId":"api_v1_cao_copilote_exemple_api_v1_cao_copilote_exemple_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/cao/ifc/ids/logement-fr":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Ifc Ids Logement Fr","description":"NOTRE IDS « LOGEMENT FR » — gratuit, sans clé : le cahier des charges\nd'information que notre export IFC garantit (pièces nommées avec surfaces\nnette, habitable et Carrez ; portes et fenêtres typées par famille,\naccessibilité déclarée ; murs et planchers porteurs ou non, avec leur\nmatière ; éléments rangés dans un étage ; marches de 13 à 20 cm ;\nLambert-93), en IDS 1.0. Rejouable dans tout outil IDS, ou via POST\n/cao/ifc/ids sur n'importe quelle maquette. format=json → {ids}.","operationId":"api_v1_cao_ifc_ids_logement_fr_api_v1_cao_ifc_ids_logement_fr_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/ifc/ids":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Ifc Ids","description":"VÉRIFIER UN IFC CONTRE UN IDS 1.0 (buildingSMART) — le cahier des\ncharges d'information d'un BIM manager : six facettes (entity, attribute,\nproperty en unités SI, classification, material, partOf), restrictions\nXSD, cardinalités required/optional/prohibited, version IFC visée.\nBody : la scène (comme /cao/ifc) OU `ifc` (texte STEP d'un IFC, qui garde\nses GlobalId) ; `ids` : le XML d'un IDS (défaut : notre « logement FR »,\nGET /cao/ifc/ids/logement-fr) ; `bcf` : vrai pour joindre les échecs en\nBCF 2.1 (bcf_base64). Retourne {titre, schema_ifc, conforme, resume,\nspecifications[{nom, statut, applicables, reussis, echecs[{guid, classe,\nnom, raisons}]}]}.","operationId":"api_v1_cao_ifc_ids_api_v1_cao_ifc_ids_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/rendu-photo":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Rendu Photo Aide","description":"GET n'ouvre pas de studio : il explique POST. Sans ça, 405 au navigateur.","operationId":"api_v1_cao_rendu_photo_aide_api_v1_cao_rendu_photo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Rendu Photo","description":"Ouvre le studio PHOTO path-tracé 4K (pipeline séparé du rastériseur).\n\nMême scène / jeton que POST /cao/visite/studio. url_photo → /cao/visite-photo\n(Three r163 + three-gpu-pathtracer). url_photo_raster garde le fallback SSAO.","operationId":"api_v1_cao_rendu_photo_api_v1_cao_rendu_photo_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/rendu-photo/cadrage":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Rendu Photo Cadrage","description":"Recadrage 16:9 + relight. Gratuit, sans clé. Ne remplace PAS /cao/verifier.","operationId":"api_v1_cao_rendu_photo_cadrage_api_v1_cao_rendu_photo_cadrage_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/permis":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Permis","description":"DOSSIER DE PERMIS DE CONSTRUIRE d'une maison individuelle (Cerfa 13406),\nen BROUILLON : surface de plancher (R111-22), emprise au sol (R420-1),\nhauteurs à l'égout et au faîtage, niveaux ; PCMI2 plan de masse, PCMI3\ncoupe, PCMI4 notice, PCMI5 façades produits ; PCMI1, PCMI6, PCMI7 et PCMI8\ndits « à fournir » (lien Géoportail si la scène est géoréférencée). Pour\nune extension, les murs `existant: true` séparent l'existant du créé, et\nle dossier dit quand une déclaration préalable suffit. Le règlement du PLU\nest contrôlé si `regles_urbanisme` le donne (reculs, prospect, emprise,\nhauteurs, pentes, stationnement, espaces libres) : chaque manquement\ndevient une alerte du dossier. Aucune valeur de PLU n'est devinée.\nBody : la scène (GET /cao/schema) + [format: 'json' (défaut) | 'html' |\n'pdf', titre, auteur, coupe: [x1, y1, x2, y2] (mm, trait de coupe AA),\nregles_urbanisme: {...} (GET /api/v1/cao/urbanisme les décrit)].","operationId":"api_v1_cao_permis_api_v1_cao_permis_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/programme":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Programme Aide","description":"Ce que POST /cao/programme attend — libre, sans clé.","operationId":"api_v1_cao_programme_aide_api_v1_cao_programme_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Programme","description":"DU PROGRAMME AU PLAN : « 3 chambres, cuisine ouverte, 90 m² » → une\nmaison de plain-pied complète aux cotes françaises, qui passe le\nvérificateur à zéro alerte, et l'autre typologie en variante.\nBody : {chambres, cuisine, salles_de_bain, bureau, cellier, surface_m2,\ntoiture, typologie} — GET /api/v1/cao/programme les décrit.","operationId":"api_v1_cao_programme_api_v1_cao_programme_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/re2020":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Re2020 Aide","description":"Ce que POST /cao/re2020 attend — libre, sans clé.","operationId":"api_v1_cao_re2020_aide_api_v1_cao_re2020_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Re2020","description":"PRÉ-ÉTUDE RE 2020 : les ordres de grandeur thermiques d'une scène —\nH_T, U moyen, compacité, ventilation, vitrages orientés, déperditions —\net les leviers qui en découlent ; les seuils RE 2020 rappelés, jamais\ncomparés à un Bbio inventé. Body : la scène + [nord_deg].","operationId":"api_v1_cao_re2020_api_v1_cao_re2020_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/nomenclatures":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Nomenclatures Aide","description":"Ce que POST /cao/nomenclatures attend — libre, sans clé.","operationId":"api_v1_cao_nomenclatures_aide_api_v1_cao_nomenclatures_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Nomenclatures","description":"NOMENCLATURES d'une scène : menuiseries (par type avec repères P1/F1 et\nquantités par niveau, puis baie par baie avec les pièces desservies),\npièces et surfaces habitable/Carrez avec totaux, équipements par niveau.\nBody : la scène + [format:'json'|'csv'|'html'|'pdf', titre].","operationId":"api_v1_cao_nomenclatures_api_v1_cao_nomenclatures_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/carnet":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Carnet Aide","description":"Ce que POST /cao/carnet attend — libre, sans clé.","operationId":"api_v1_cao_carnet_aide_api_v1_cao_carnet_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Carnet","description":"CARNET DE PLANS d'une scène : feuilles numérotées (garde, plan de masse,\nplans par niveau, façades, coupe, réseaux, nomenclatures) à l'échelle\nvraie, avec cartouche, indice et tableau des révisions. Body : la scène +\n[projet:{titre, maitre_ouvrage, auteur, adresse, phase, format_feuille,\nrevisions}, format:'pdf'|'html'|'json'].","operationId":"api_v1_cao_carnet_api_v1_cao_carnet_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/versions/comparer":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Versions Aide","description":"Ce que POST /cao/versions/comparer attend — libre, sans clé.","operationId":"api_v1_cao_versions_aide_api_v1_cao_versions_comparer_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Versions Comparer","description":"DIFFÉRENCES entre deux versions d'une scène : éléments ajoutés,\nsupprimés, modifiés (champ par champ), et l'écart du quantitatif ouvrage\npar ouvrage — de quoi rédiger un avenant. Body : {avant, apres, [quantites]}.","operationId":"api_v1_cao_versions_comparer_api_v1_cao_versions_comparer_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/versions/fusionner":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Versions Fusionner Aide","description":"Ce que POST /cao/versions/fusionner attend — libre, sans clé.","operationId":"api_v1_cao_versions_fusionner_aide_api_v1_cao_versions_fusionner_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Versions Fusionner","description":"FUSION À TROIS VOIES de deux modifications parallèles d'une maquette\n(le « synchroniser avec le fichier central » de Revit) : ce qui n'a\nchangé que d'un côté passe, ce qui se contredit est rendu en conflit —\njamais écrasé. Body : {base, central, locale, [resolutions]}.","operationId":"api_v1_cao_versions_fusionner_api_v1_cao_versions_fusionner_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/versions/identifier":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Versions Identifier","description":"IDENTITÉ PERSISTANTE : pose sur chaque élément son `ifc_guid` — le\nGlobalId que l'export IFC lui donne déjà. Les exports ne changent pas ;\nsupprimer ou insérer un élément ne renumérote plus les autres, et les\nversions se comparent et se fusionnent par identité. Body : la scène.","operationId":"api_v1_cao_versions_identifier_api_v1_cao_versions_identifier_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/livraison":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Livraison Aide","description":"Ce que POST /cao/livraison attend — libre, sans clé.","operationId":"api_v1_cao_livraison_aide_api_v1_cao_livraison_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Livraison","description":"LIVRAISON CONTRÔLÉE — contrôles (audit, intégrité, liasse), puis, si\nrien n'est critique, les livrables (IFC validé, DXF, planche, métrés,\nnomenclatures) et leur manifeste. Une alerte critique : aucun livrable.\nBody : la scène + [livrables, warnings_expliques, ids, version, auteur].","operationId":"api_v1_cao_livraison_api_v1_cao_livraison_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/revue":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Revue","description":"REVUE PAR LOTS — gratuite, sans clé, comme /cao/verifier : les alertes\ndes contrôles rangées par lot (enveloppe, ouvertures, planchers et\ntoitures, escaliers, électricité, plomberie, ventilation, mobilier), avec\nles éléments concernés (external_id, sinon ifc_guid, sinon repère), les\ncorrectifs, ce qui manque et la revue professionnelle requise\n(cao_revue_lots). Jamais une déclaration de conformité. Body : la scène.","operationId":"api_v1_cao_revue_api_v1_cao_revue_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/ferraillage":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Ferraillage Aide","description":"Ce que POST /cao/ferraillage attend — libre, sans clé.","operationId":"api_v1_cao_ferraillage_aide_api_v1_cao_ferraillage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Ferraillage","description":"DESCENTE DE CHARGES ET FERRAILLAGE SIMPLIFIÉ d'une scène : G et Q par mur\nporteur, ELS/ELU, contrainte au sol ; aciers des semelles (bielles), des\nlinteaux et des dalles (Eurocode 2) en barres et en kilos — un\nprédimensionnement à faire valider par un bureau d'études.","operationId":"api_v1_cao_ferraillage_api_v1_cao_ferraillage_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/familles/essayer":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Familles Aide","description":"Le format d'une famille et un exemple complet — libre, sans clé.","operationId":"api_v1_cao_familles_aide_api_v1_cao_familles_essayer_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Familles Essayer","description":"ESSAYER UNE FAMILLE PARAMÉTRIQUE : la définition et des paramètres →\nvaleurs (paramètres et formules), constats des contraintes, solides en mm.\nBody : {famille, [parametres]}.","operationId":"api_v1_cao_familles_essayer_api_v1_cao_familles_essayer_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/familles/bibliotheque":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Familles Bibliotheque","description":"BIBLIOTHÈQUE DE FAMILLES : les familles du compte, puis les familles\npubliques des autres (code d'auteur anonyme), en dernière version.","operationId":"api_v1_cao_familles_bibliotheque_api_v1_cao_familles_bibliotheque_get","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Familles Bibliotheque Enregistrer","description":"ENREGISTRER une famille dans la bibliothèque du compte : une nouvelle\nversion si la définition a changé (sinon rien). Body : {nom, famille,\npublique?} — publique : visible de tous, sous un code d'auteur anonyme.","operationId":"api_v1_cao_familles_bibliotheque_enregistrer_api_v1_cao_familles_bibliotheque_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/familles/bibliotheque/{nom}":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Familles Bibliotheque Lire","description":"UNE FAMILLE de la bibliothèque, prête à poser dans `scene.familles`\n(avec son `origine` : nom, version, auteur).","operationId":"api_v1_cao_familles_bibliotheque_lire_api_v1_cao_familles_bibliotheque__nom__get","parameters":[{"name":"nom","in":"path","required":true,"schema":{"type":"string","title":"Nom"}},{"name":"version","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Version"}},{"name":"auteur","in":"query","required":false,"schema":{"type":"string","default":"","title":"Auteur"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/familles/recharger":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Familles Recharger","description":"RECHARGER les familles d'une scène depuis la bibliothèque (le\n« Recharger la famille » de Revit) : chaque famille posée avec son\n`origine` passe à la dernière version, sauf si celle-ci refuse des\ninstances déjà posées (signalé). Body : {scene}.","operationId":"api_v1_cao_familles_recharger_api_v1_cao_familles_recharger_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/4d":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao 4D Aide","description":"Ce que POST /cao/4d attend — libre, sans clé.","operationId":"api_v1_cao_4d_aide_api_v1_cao_4d_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao 4D","description":"VUE 4D : la maquette telle qu'elle est construite à la fin de chaque lot\ndu planning (axonométrie et plan du niveau bas), et l'état à une date.\nBody : la scène + [debut, date, cadences, images].","operationId":"api_v1_cao_4d_api_v1_cao_4d_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/energie":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Energie Aide","description":"Ce que POST /cao/energie attend, et d'où viennent les données — libre, sans clé.","operationId":"api_v1_cao_energie_aide_api_v1_cao_energie_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Energie","description":"ÉNERGIE, CARBONE ET CONFORT D'ÉTÉ : le besoin de chauffage par les\ndegrés-jours (apports solaires corrigés des masques mesurés sur la scène),\nl'eau chaude, la consommation selon le générateur, l'Ic construction estimé\navec VOS facteurs, et l'été comparé à ce qu'une nuit de ventilation évacue.\nBody : {scene, climat, systeme?, options?, facteurs_carbone?}.","operationId":"api_v1_cao_energie_api_v1_cao_energie_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/urbanisme":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Urbanisme Aide","description":"Les règles que cet endpoint sait juger — libre, sans clé.","operationId":"api_v1_cao_urbanisme_aide_api_v1_cao_urbanisme_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Urbanisme","description":"RÈGLEMENT D'URBANISME : la scène mesurée (emprise, hauteurs, reculs par\nlimite, prospect, pentes, stationnement, espaces libres) et comparée aux\nrègles que vous donnez. Body : {scene, regles}.","operationId":"api_v1_cao_urbanisme_api_v1_cao_urbanisme_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/plan/partager":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Plan Partager Aide","description":"Ce que fait le partage de plan — libre, sans clé.","operationId":"api_v1_cao_plan_partager_aide_api_v1_cao_plan_partager_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Plan Partager","description":"PARTAGER LE PLAN : fige la scène et rend un lien public que le client\nouvre sans compte, pour poser ses remarques sur le plan. Body : {scene,\ntitre?, auteur?, duree_jours?}.","operationId":"api_v1_cao_plan_partager_api_v1_cao_plan_partager_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/plan/{jeton}":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Plan Partage Lire","description":"LIBRE, sans clé : le plan figé et ses remarques — ce que lit la page du\nclient.","operationId":"api_v1_cao_plan_partage_lire_api_v1_cao_plan__jeton__get","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Plan Retirer","description":"Retire le partage : le lien tombe, la scène figée et les remarques sont\neffacées.","operationId":"api_v1_cao_plan_retirer_api_v1_cao_plan__jeton__delete","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/plan/{jeton}/remarque":{"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Plan Remarque","description":"LIBRE, sans clé : le client punaise une remarque sur le plan.\nBody : {x, y, z?, texte, auteur?}.","operationId":"api_v1_cao_plan_remarque_api_v1_cao_plan__jeton__remarque_post","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/plan/{jeton}/remarque/{remarque_id}":{"patch":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Plan Remarque Traitee","description":"Marque une remarque traitée (ou la rouvre) : rien n'est effacé.","operationId":"api_v1_cao_plan_remarque_traitee_api_v1_cao_plan__jeton__remarque__remarque_id__patch","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}},{"name":"remarque_id","in":"path","required":true,"schema":{"type":"integer","title":"Remarque Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/plan/{jeton}/bcf":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Plan Bcf","description":"Les remarques du client en sujets BCF — à ouvrir dans Revit, Archicad\nou un CDE, sans ressaisie.","operationId":"api_v1_cao_plan_bcf_api_v1_cao_plan__jeton__bcf_get","parameters":[{"name":"jeton","in":"path","required":true,"schema":{"type":"string","title":"Jeton"}},{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/soleil":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Soleil Aide","description":"Ce que POST /cao/soleil attend — libre, sans clé.","operationId":"api_v1_cao_soleil_aide_api_v1_cao_soleil_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Soleil","description":"ENSOLEILLEMENT ET OMBRES PORTÉES : la course du soleil sur le terrain,\nl'ombre du bâtiment à midi aux trois dates types, et les heures de soleil\nreçues par chaque baie — masques du bâtiment lui-même et masques déclarés\npris en compte. Body : la scène + [nord_deg, annee, pas_minutes].","operationId":"api_v1_cao_soleil_api_v1_cao_soleil_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cao/devis":{"get":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Devis Aide","description":"Ce que POST /cao/devis attend — libre, sans clé.","operationId":"api_v1_cao_devis_aide_api_v1_cao_devis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia","api-ia"],"summary":"Api V1 Cao Devis","description":"QUANTITATIF PAR LOTS : gros œuvre, couverture, menuiseries, plâtrerie,\nélectricité, plomberie, chauffage-ventilation, sols, peinture — chaque\nouvrage avec son code, son unité et sa quantité mesurée sur la scène ;\nchiffré avec `prix` {code: prix unitaire HT} si on les donne, jamais avec\ndes prix inventés. Body : la scène + [prix, tva_pct].","operationId":"api_v1_cao_devis_api_v1_cao_devis_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/avenant-irl":{"post":{"tags":["api-ia"],"summary":"Api V1 Avenant Irl","description":"Courrier de révision de loyer IRL prêt à envoyer (PDF, ou format:'html').\nBody : {bailleur_nom, locataire_nom, logement_adresse, [locataire_adresse],\n        loyer_actuel, irl_reference, irl_nouveau, date_effet,\n        [bailleur_adresse, trimestre_reference, trimestre_nouveau, lieu, date_emission]}.\nMise en page enveloppe à fenêtre : destinataire à DROITE.","operationId":"api_v1_avenant_irl_api_v1_documents_avenant_irl_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/avis-echeance":{"post":{"tags":["api-ia"],"summary":"Api V1 Avis Echeance","description":"Avis d'échéance / appel de loyer (PDF ou HTML) — service agents IA.\nBody : bailleur_*, locataire_*, logement_adresse, periode, date_echeance,\nloyer/charges ou lignes[], [iban, bic, reference, lieu, format].","operationId":"api_v1_avis_echeance_api_v1_documents_avis_echeance_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/relance":{"post":{"tags":["api-ia"],"summary":"Api V1 Relance","description":"Relance impayé niveaux 1–5 (PDF/HTML) — service agents IA.\nBody : niveau, bailleur_*, locataire_*, montant_du, [detail[], logement_adresse, lieu, format].","operationId":"api_v1_relance_api_v1_documents_relance_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/crg":{"post":{"tags":["api-ia"],"summary":"Api V1 Crg","description":"Compte rendu de gestion simplifié (PDF/HTML) — service agents IA.\nDestinataire = propriétaire (proprietaire_adresse). Body : agence_*/bailleur_*,\nproprietaire_*, periode, recettes[], depenses[], [honoraires, solde, biens_adresses].","operationId":"api_v1_crg_api_v1_documents_crg_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fiscal/synthese":{"post":{"tags":["api-ia"],"summary":"Api V1 Fiscal Synthese","description":"Synthèse fiscale revenus fonciers (micro vs réel) — service agents IA.\nBody : recettes_brutes, charges_deductibles, [annee, proprietaire_nom,\nproprietaire_adresse, format=json|html|pdf]. Stateless — pas d'accès compta.\nGarde-fou : résultat à titre indicatif, dans la limite des documents fournis ;\npour toute décision, contacter un professionnel.","operationId":"api_v1_fiscal_synthese_api_v1_fiscal_synthese_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gerance/declaration-paiement":{"post":{"tags":["api-ia"],"summary":"Api V1 Declaration Paiement","description":"Déclaration de paiement (le client confirme : payé ? date ? montant ?) →\nproposition d'écriture comptable + prochaine action (quittance ou reçu).\n1 unité (irl). Stateless — pas d'accès banque.","operationId":"api_v1_declaration_paiement_api_v1_gerance_declaration_paiement_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/mandat-gerance":{"post":{"tags":["api-ia"],"summary":"Api V1 Mandat Gerance","description":"Mandat de gestion (loi Hoguet) PDF/HTML — service agents. Dossier local client.","operationId":"api_v1_mandat_gerance_api_v1_documents_mandat_gerance_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/candidature":{"post":{"tags":["api-ia"],"summary":"Api V1 Candidature","description":"Dossier de candidature locataire PDF/HTML — service agents.","operationId":"api_v1_candidature_api_v1_documents_candidature_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gerance/annonce-location":{"post":{"tags":["api-ia"],"summary":"Api V1 Annonce Location","description":"BROUILLON d'annonce de location uniquement (texte + HTML).\nAucune publication sur synergieloc.fr — validation opérateur exclusive.\nToute tentative publier=true est refusée (400). 1 unité.","operationId":"api_v1_annonce_location_api_v1_gerance_annonce_location_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/mouvement-locataire":{"post":{"tags":["api-ia"],"summary":"Api V1 Mouvement Locataire","description":"Entrée ou sortie locataire (checklist + solde de tout compte) PDF/HTML.\nBody : type=entree|sortie, bailleur_*, locataire_*, logement_adresse,\n[date_effet, checklist[], solde_lignes[], depot_garantie, retenues, format].","operationId":"api_v1_mouvement_locataire_api_v1_documents_mouvement_locataire_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/edl":{"post":{"tags":["api-ia"],"summary":"Api V1 Edl","description":"État des lieux d'entrée ou de sortie (PDF/HTML) — décret 2016-382.\nBody : type=entree|sortie, bailleur_*, locataire_*, logement_adresse,\n[pieces[]/rooms[], compteurs[], cles[], etat_general, proprete, format].","operationId":"api_v1_edl_api_v1_documents_edl_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/bon-intervention":{"post":{"tags":["api-ia"],"summary":"Api V1 Bon Intervention","description":"Bon / demande d'intervention (PDF/HTML) — service agents IA.\nBody : titre, description, [adresse_intervention, urgence, echeance,\ncout_estime, prestataire_*, agence_*, format].","operationId":"api_v1_bon_intervention_api_v1_documents_bon_intervention_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/partenaire/pack":{"get":{"tags":["api-ia"],"summary":"Api V1 Pack Partenaire","description":"Catalogue gratuit : apps Espace Partenaire → outils MCP (0 unité, sans clé).","operationId":"api_v1_pack_partenaire_api_v1_partenaire_pack_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["api-ia"],"summary":"Api V1 Pack Partenaire Post","description":"Même contenu que GET — body ignoré (compat MCP).","operationId":"api_v1_pack_partenaire_post_api_v1_partenaire_pack_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/fiche-mission":{"post":{"tags":["api-ia"],"summary":"Api V1 Fiche Mission","description":"Fiche mission / chantier (PDF/HTML) — app Missions du portail partenaire.","operationId":"api_v1_fiche_mission_api_v1_documents_fiche_mission_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/devis-travaux":{"post":{"tags":["api-ia"],"summary":"Api V1 Devis Travaux","description":"Devis travaux (PDF/HTML) — app Factures du portail partenaire.","operationId":"api_v1_devis_travaux_api_v1_documents_devis_travaux_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/liste-materiaux":{"post":{"tags":["api-ia"],"summary":"Api V1 Liste Materiaux","description":"Liste matériaux / panier (PDF/HTML) — app Panier du portail partenaire.","operationId":"api_v1_liste_materiaux_api_v1_documents_liste_materiaux_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/confirmation-rdv":{"post":{"tags":["api-ia"],"summary":"Api V1 Confirmation Rdv","description":"Confirmation de rendez-vous (PDF/HTML) — app Agenda.","operationId":"api_v1_confirmation_rdv_api_v1_documents_confirmation_rdv_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/note-frais":{"post":{"tags":["api-ia"],"summary":"Api V1 Note Frais","description":"Note de frais (PDF/HTML) — app Frais.","operationId":"api_v1_note_frais_api_v1_documents_note_frais_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/journal-kilometrique":{"post":{"tags":["api-ia"],"summary":"Api V1 Journal Kilometrique","description":"Journal kilométrique + IK (PDF/HTML) — app Kilométrique.","operationId":"api_v1_journal_kilometrique_api_v1_documents_journal_kilometrique_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/compte-rendu-chantier":{"post":{"tags":["api-ia"],"summary":"Api V1 Compte Rendu Chantier","description":"Compte-rendu d'avancement chantier (PDF/HTML) — app Chantier IA.","operationId":"api_v1_compte_rendu_chantier_api_v1_documents_compte_rendu_chantier_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/relance-facture-client":{"post":{"tags":["api-ia"],"summary":"Api V1 Relance Facture Client","description":"Relance facture client BTP (PDF/HTML) — app Factures en retard.","operationId":"api_v1_relance_facture_client_api_v1_documents_relance_facture_client_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/conformite-artisan":{"post":{"tags":["api-ia"],"summary":"Api V1 Conformite Artisan","description":"Checklist conformité artisan RC Pro / décennale / URSSAF / KBIS — app Conformité.","operationId":"api_v1_conformite_artisan_api_v1_documents_conformite_artisan_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/facturx":{"post":{"tags":["api-ia"],"summary":"Api V1 Facturx","description":"Facture Factur-X (PDF/A-3 + XML EN 16931 CII) — service agents IA.\nBody : invoice_number, invoice_date, seller{}, buyer{}, lines[]\n(description, quantity, unit_price HT, vat_rate). Optionnel : due_date, notes.\nformat=preview → PDF simple sans XML ; défaut = Factur-X complet.","operationId":"api_v1_facturx_api_v1_documents_facturx_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/acquisition/whatsapp/webhook":{"get":{"tags":["acquisition"],"summary":"Whatsapp Verify","operationId":"whatsapp_verify_api_v1_acquisition_whatsapp_webhook_get","parameters":[{"name":"hub.mode","in":"query","required":false,"schema":{"type":"string","default":"","title":"Hub.Mode"}},{"name":"hub.verify_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Hub.Verify Token"}},{"name":"hub.challenge","in":"query","required":false,"schema":{"type":"string","default":"","title":"Hub.Challenge"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["acquisition"],"summary":"Whatsapp Inbound","operationId":"whatsapp_inbound_api_v1_acquisition_whatsapp_webhook_post","parameters":[{"name":"X-Hub-Signature-256","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Hub-Signature-256"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/acquisition/meta-lead":{"post":{"tags":["acquisition"],"summary":"Meta Lead Normalize","description":"Endpoint optionnel si Meta envoie vers Synergieloc au lieu de Make.\n\nBody attendu (souple) : email / prospect_email, name, company, marque|campaign,\nwebsite, custom fields…\n\n⚠️ IL N'Y AVAIT AUCUNE VÉRIFICATION ICI, et la route est publique\n(`^/api/v1/` dans lib/api_public_rules.py). Elle ne se contente pas de\nrépondre : elle RETRANSMET vers Make (`_post_make`), qui déclenche la chaîne\nde démarchage. N'importe qui pouvait donc y injecter des prospects choisis\npar lui et faire partir des messages en notre nom — la réputation\nd'expéditeur est le seul actif qu'on ne rachète pas (cf. la salve du 22/08).\n\nÉCHEC FERMÉ, comme `lib/demarchage_meta_leads` qui a tranché le même cas :\n« sans moyen de vérifier, accepter reviendrait à laisser n'importe qui\nremplir le CRM ». Cette route-ci n'est annoncée NULLE PART (ni Santé, ni\ndocs, ni descripteur MCP) et double ce module : refuser ne débranche donc\nrien. Le secret peut venir de l'un ou l'autre nom — c'est la même valeur\nchez Meta, et la faire poser deux fois serait un piège de plus.\n\n⚠️ `_verify_signature` n'est PAS durcie : le webhook WhatsApp, lui, est en\nservice sur un vrai numéro, et le fermer à l'aveugle ferait taire le\nrépondeur. `etat()[\"whatsapp\"][\"signature\"]` expose son état pour qu'on\ndécide en le voyant, au lieu de le découvrir.","operationId":"meta_lead_normalize_api_v1_acquisition_meta_lead_post","parameters":[{"name":"X-Hub-Signature-256","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Hub-Signature-256"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/acquisition/voix/webhook":{"get":{"tags":["acquisition"],"summary":"Voix Webhook","operationId":"voix_webhook_api_v1_acquisition_voix_webhook_get","parameters":[{"name":"X-Twilio-Signature","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Twilio-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["acquisition"],"summary":"Voix Webhook","operationId":"voix_webhook_api_v1_acquisition_voix_webhook_get","parameters":[{"name":"X-Twilio-Signature","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Twilio-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/acquisition/voix/asterisk":{"post":{"tags":["acquisition"],"summary":"Voix Asterisk","description":"JSON pour un PBX distant. Le secret est EXIGÉ, et jamais renvoyé.","operationId":"voix_asterisk_api_v1_acquisition_voix_asterisk_post","parameters":[{"name":"X-Voix-Secret","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Voix-Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"}}},"security":[{"ApiKeyAuth":[]}]}