{"openapi":"3.1.0","info":{"title":"MemoraEU API","description":"Universal, sovereign, zero-knowledge memory layer for AI assistants.\n\n- **MCP transports**: Legacy SSE (`GET /mcp/sse`) + HTTP Streamable (`POST /mcp/sse`)\n- **Auth**: Bearer token (`meu-sk-...`) via `Authorization` header or `?token=` query param\n- **Zero-knowledge**: content encrypted client-side with AES-256-GCM — server never sees plaintext\n\nSource: [github.com/pquattro/memoraeu-server](https://github.com/pquattro/memoraeu-server) · Cloud: [memoraeu.com](https://memoraeu.com)","contact":{"name":"MemoraEU","url":"https://memoraeu.com/"},"license":{"name":"AGPL v3","url":"https://www.gnu.org/licenses/agpl-3.0.html"},"version":"1.3.0"},"paths":{"/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRegister"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Authentifie un utilisateur et retourne un JWT.","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLogin"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TokenResponse"},{"$ref":"#/components/schemas/MfaChallengeResponse"}],"title":"Response Login Auth Login Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh Token","description":"Échange le refresh token cookie contre un nouveau access token + refresh token (rotation).","operationId":"refresh_token_auth_refresh_post","parameters":[{"name":"memoraeu_refresh","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Efface les cookies d'authentification et révoque le refresh token.","operationId":"logout_auth_logout_post","parameters":[{"name":"memoraeu_refresh","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["auth"],"summary":"Me","description":"Retourne les infos de l'utilisateur connecté + kdf_salt pour dérivation côté client.","operationId":"me_auth_me_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["auth"],"summary":"Update Profile","description":"Met à jour le nom et/ou l'email de l'utilisateur connecté.","operationId":"update_profile_auth_me_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["auth"],"summary":"Delete Account","description":"Supprime le compte (soft-delete). Requiert la confirmation par l'email.\nBody: { \"confirm_email\": \"...\" }","operationId":"delete_account_auth_me_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me/password":{"patch":{"tags":["auth"],"summary":"Change Password","description":"Change le mot de passe — vérifie l'ancien avant d'accepter le nouveau.","operationId":"change_password_auth_me_password_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/verify-email":{"post":{"tags":["auth"],"summary":"Verify Email","description":"Valide le token de confirmation email.\nBody: { \"token\": \"...\" }","operationId":"verify_email_auth_verify_email_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/invite-info":{"get":{"tags":["auth"],"summary":"Get Invite Info","description":"Retourne les infos de l'invitation (org name, email) sans l'accepter.","operationId":"get_invite_info_auth_invite_info_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/accept-invite":{"post":{"tags":["auth"],"summary":"Accept Invite","description":"Accepte une invitation et crée le compte.\nBody: { \"token\": \"...\", \"name\": \"...\", \"password\": \"...\" }","operationId":"accept_invite_auth_accept_invite_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/mfa/status":{"get":{"tags":["auth"],"summary":"Mfa Status","description":"Retourne si le MFA est activé pour l'utilisateur connecté.","operationId":"mfa_status_auth_mfa_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/mfa/setup":{"post":{"tags":["auth"],"summary":"Mfa Setup","description":"Génère un secret TOTP et retourne l'URI + QR code en base64 (rendu serveur).\nbug_005 : rejet si MFA déjà activé.\nbug_002 : QR rendu côté serveur, le secret ne transite jamais vers un tiers.","operationId":"mfa_setup_auth_mfa_setup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/mfa/enable":{"post":{"tags":["auth"],"summary":"Mfa Enable","description":"Vérifie le code TOTP fourni et active le MFA.\nBody: { \"code\": \"123456\" }","operationId":"mfa_enable_auth_mfa_enable_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/mfa/disable":{"post":{"tags":["auth"],"summary":"Mfa Disable","description":"Désactive le MFA après vérification du code TOTP.\nBody: { \"code\": \"123456\" }","operationId":"mfa_disable_auth_mfa_disable_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/mfa/verify":{"post":{"tags":["auth"],"summary":"Mfa Verify","description":"2e étape du login : vérifie le code TOTP et retourne le JWT final.\nBody: { \"mfa_token\": \"...\", \"code\": \"123456\" }","operationId":"mfa_verify_auth_mfa_verify_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/reencrypt-vault":{"post":{"tags":["auth"],"summary":"Reencrypt Vault","description":"C2 — Reçoit les mémoires re-chiffrées côté client (ancienne clé → nouvelle clé).\nMet à jour le contenu, marque l'org comme migrée, efface enc_secret.","operationId":"reencrypt_vault_auth_reencrypt_vault_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ReencryptVaultRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/legacy-plaintext":{"get":{"tags":["auth"],"summary":"Legacy Plaintext","description":"Migration C2 terminée — endpoint désactivé.","operationId":"legacy_plaintext_auth_legacy_plaintext_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Envoie un email de reset de mot de passe si l'adresse existe.\nToujours retourne 200 (pas d'énumération d'emails).","operationId":"forgot_password_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Valide le token de reset et met à jour le mot de passe.\nLe token est à usage unique et expire après 1h.","operationId":"reset_password_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/memories":{"post":{"tags":["memories"],"summary":"Create Memory","description":"Crée une nouvelle mémoire et l'indexe dans Qdrant.","operationId":"create_memory_memories_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Memory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["memories"],"summary":"List Memories","description":"Liste les mémoires avec filtres optionnels.","operationId":"list_memories_memories_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"query","required":false,"schema":{"type":"string","enum":["private","org"],"default":"private","title":"Scope"}},{"name":"category","in":"query","required":false,"schema":{"type":"string","title":"Category"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Memory"},"title":"Response List Memories Memories Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/memories/search":{"post":{"tags":["memories"],"summary":"Search Memories","description":"Recherche sémantique dans les mémoires.","operationId":"search_memories_memories_search_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/memories/search-by-vector":{"post":{"tags":["memories"],"summary":"Search By Vector","description":"Recherche par vecteur pré-calculé (zero-knowledge).\nLe MCP génère l'embedding côté client et l'envoie directement —\naucun plaintext ne transite vers le serveur.","operationId":"search_by_vector_memories_search_by_vector_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VectorSearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/memories/categories":{"get":{"tags":["memories"],"summary":"Get Categories","description":"Retourne les catégories existantes triées par usage (pour suggestions).","operationId":"get_categories_memories_categories_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoriesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/memories/categories/{name}":{"delete":{"tags":["memories"],"summary":"Delete Category","description":"Supprime une catégorie si aucune mémoire active ne l'utilise.","operationId":"delete_category_memories_categories__name__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/memories/merge":{"post":{"tags":["memories"],"summary":"Merge Duplicate Memories","description":"Fusionne deux contenus déchiffrés via LLM (Mistral ou Ollama).\nLe client chiffre le résultat et crée la nouvelle mémoire lui-même.","operationId":"merge_duplicate_memories_memories_merge_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Merge Duplicate Memories Memories Merge Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/memories/duplicates":{"get":{"tags":["memories"],"summary":"Find Duplicates","description":"Trouve les paires de mémoires similaires (doublons potentiels).\nPour chaque mémoire, recherche son voisin le plus proche dans Qdrant\nsans recalculer d'embedding — utilise les vecteurs déjà stockés.","operationId":"find_duplicates_memories_duplicates_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"threshold","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.5,"default":0.94,"title":"Threshold"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"},"title":"Response Find Duplicates Memories Duplicates Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/memories/{memory_id}":{"get":{"tags":["memories"],"summary":"Get Memory","description":"Récupère une mémoire par son ID.","operationId":"get_memory_memories__memory_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"string","title":"Memory Id"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Memory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["memories"],"summary":"Delete Memory","description":"Supprime une mémoire (soft delete SQLite + suppression Qdrant).","operationId":"delete_memory_memories__memory_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"string","title":"Memory Id"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/me":{"get":{"tags":["users"],"summary":"Get Current User","description":"MVP : retourne l'utilisateur par défaut. JWT en phase 2.","operationId":"get_current_user_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api-keys":{"post":{"tags":["api-keys"],"summary":"Create Api Key","description":"Crée une nouvelle clé API. La clé complète est retournée une seule fois.","operationId":"create_api_key_api_keys_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["api-keys"],"summary":"List Api Keys","description":"Liste les clés API de l'organisation (sans les clés en clair).","operationId":"list_api_keys_api_keys_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyResponse"},"title":"Response List Api Keys Api Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api-keys/{key_id}":{"delete":{"tags":["api-keys"],"summary":"Revoke Api Key","description":"Révoque une clé API (désactivation irréversible).","operationId":"revoke_api_key_api_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/usage":{"get":{"tags":["usage"],"summary":"Get Usage","description":"Retourne l'usage courant de l'organisation + limites du plan.","operationId":"get_usage_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/usage/history":{"get":{"tags":["usage"],"summary":"Get Usage History","description":"Retourne l'historique d'usage jour par jour (N derniers jours).","operationId":"get_usage_history_usage_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/facts":{"post":{"tags":["facts"],"summary":"Create Fact","description":"Crée un fait. Invalide automatiquement le précédent sur même (subject, predicate, scope).","operationId":"create_fact_facts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fact"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["facts"],"summary":"List Facts","description":"Liste les faits actifs (valid_to IS NULL) ou l'historique complet.","operationId":"list_facts_facts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subject","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"}},{"name":"predicate","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Predicate"}},{"name":"scope","in":"query","required":false,"schema":{"enum":["private","org"],"type":"string","default":"private","title":"Scope"}},{"name":"history","in":"query","required":false,"schema":{"type":"boolean","description":"Inclure les faits expirés","default":false,"title":"History"},"description":"Inclure les faits expirés"},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Fact"},"title":"Response List Facts Facts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/facts/contradictions":{"get":{"tags":["facts"],"summary":"Get Contradictions","description":"Détecte les (subject, predicate) avec plusieurs faits actifs simultanément.","operationId":"get_contradictions_facts_contradictions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"query","required":false,"schema":{"enum":["private","org"],"type":"string","default":"private","title":"Scope"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/facts/history":{"get":{"tags":["facts"],"summary":"Get Fact History","description":"Historique temporel complet d'un fait (subject + predicate).","operationId":"get_fact_history_facts_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subject","in":"query","required":true,"schema":{"type":"string","title":"Subject"}},{"name":"predicate","in":"query","required":true,"schema":{"type":"string","title":"Predicate"}},{"name":"scope","in":"query","required":false,"schema":{"enum":["private","org"],"type":"string","default":"private","title":"Scope"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/facts/{fact_id}":{"get":{"tags":["facts"],"summary":"Get Fact","operationId":"get_fact_facts__fact_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fact_id","in":"path","required":true,"schema":{"type":"string","title":"Fact Id"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fact"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/facts/{fact_id}/invalidate":{"put":{"tags":["facts"],"summary":"Invalidate Fact","description":"Marque un fait comme expiré (valid_to = aujourd'hui ou date fournie).","operationId":"invalidate_fact_facts__fact_id__invalidate_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fact_id","in":"path","required":true,"schema":{"type":"string","title":"Fact Id"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactInvalidate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Invalidate Fact Facts  Fact Id  Invalidate Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/skills":{"post":{"tags":["skills"],"summary":"Create Skill","operationId":"create_skill_v1_skills_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Skill"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["skills"],"summary":"List Skills","operationId":"list_skills_v1_skills_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Skill"},"title":"Response List Skills V1 Skills Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/skills/search":{"post":{"tags":["skills"],"summary":"Search Skills","operationId":"search_skills_v1_skills_search_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillSearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/skills/{skill_id}":{"patch":{"tags":["skills"],"summary":"Update Skill","operationId":"update_skill_v1_skills__skill_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Skill"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["skills"],"summary":"Delete Skill","operationId":"delete_skill_v1_skills__skill_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","title":"Skill Id"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/sse":{"get":{"tags":["mcp"],"summary":"Mcp Sse Get","description":"GET /mcp/sse — Legacy SSE stream (Cursor, curl).","operationId":"mcp_sse_get_mcp_sse_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Sse Post","description":"POST /mcp/sse — HTTP Streamable transport (spec MCP 2025, claude.ai web).","operationId":"mcp_sse_post_mcp_sse_post","security":[{"HTTPBearer":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/messages":{"post":{"tags":["mcp"],"summary":"Mcp Messages","description":"POST /mcp/messages — messages client→server pour transport SSE legacy.","operationId":"mcp_messages_mcp_messages_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/agent/jobs":{"post":{"tags":["agent"],"summary":"Create Job","operationId":"create_job_v1_agent_jobs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentJobCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentJob"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["agent"],"summary":"List Jobs","operationId":"list_jobs_v1_agent_jobs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AgentJob"},"title":"Response List Jobs V1 Agent Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agent/jobs/{job_id}":{"patch":{"tags":["agent"],"summary":"Update Job","operationId":"update_job_v1_agent_jobs__job_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentJobUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentJob"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["agent"],"summary":"Delete Job","operationId":"delete_job_v1_agent_jobs__job_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agent/jobs/{job_id}/run":{"post":{"tags":["agent"],"summary":"Run Job Now","operationId":"run_job_now_v1_agent_jobs__job_id__run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/gateway/configs":{"post":{"tags":["gateway"],"summary":"Create Config","operationId":"create_config_v1_gateway_configs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayConfigCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayConfigPublic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["gateway"],"summary":"List Configs","operationId":"list_configs_v1_gateway_configs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GatewayConfigPublic"},"title":"Response List Configs V1 Gateway Configs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/gateway/configs/{config_id}":{"delete":{"tags":["gateway"],"summary":"Delete Config","operationId":"delete_config_v1_gateway_configs__config_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/gateway/telegram/chats":{"get":{"tags":["gateway"],"summary":"Telegram Get Chats","description":"Proxy getUpdates Telegram → retourne les chats distincts trouvés.","operationId":"telegram_get_chats_v1_gateway_telegram_chats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}},{"name":"memoraeu_token","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Memoraeu Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/gateway/slack/events":{"post":{"tags":["gateway"],"summary":"Slack Events","operationId":"slack_events_v1_gateway_slack_events_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/gateway/discord/events":{"post":{"tags":["gateway"],"summary":"Discord Events","operationId":"discord_events_v1_gateway_discord_events_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/gateway/whatsapp/events":{"get":{"tags":["gateway"],"summary":"Whatsapp Verify","operationId":"whatsapp_verify_v1_gateway_whatsapp_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["gateway"],"summary":"Whatsapp Events","operationId":"whatsapp_events_v1_gateway_whatsapp_events_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AgentJob":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Nom lisible du job (ex: 'daily_brief')"},"task_description":{"type":"string","minLength":1,"title":"Task Description","description":"Ce que l'agent doit faire, en langage naturel"},"cron_expression":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cron Expression","description":"Expression cron (ex: '0 8 * * *' = tous les jours à 8h). Prioritaire sur interval_seconds."},"interval_seconds":{"anyOf":[{"type":"integer","minimum":60.0},{"type":"null"}],"title":"Interval Seconds","description":"Intervalle en secondes si pas de cron (min 60s)"},"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"user_id":{"type":"string","title":"User Id"},"status":{"type":"string","enum":["active","paused","disabled"],"title":"Status","default":"active"},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At"},"next_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Run At"},"last_result_memory_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Result Memory Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","task_description","org_id","user_id"],"title":"AgentJob"},"AgentJobCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Nom lisible du job (ex: 'daily_brief')"},"task_description":{"type":"string","minLength":1,"title":"Task Description","description":"Ce que l'agent doit faire, en langage naturel"},"cron_expression":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cron Expression","description":"Expression cron (ex: '0 8 * * *' = tous les jours à 8h). Prioritaire sur interval_seconds."},"interval_seconds":{"anyOf":[{"type":"integer","minimum":60.0},{"type":"null"}],"title":"Interval Seconds","description":"Intervalle en secondes si pas de cron (min 60s)"}},"type":"object","required":["name","task_description"],"title":"AgentJobCreate"},"AgentJobUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"task_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Description"},"cron_expression":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cron Expression"},"interval_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval Seconds"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"AgentJobUpdate"},"ApiKeyCreate":{"properties":{"name":{"type":"string","maxLength":64,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"ApiKeyCreate"},"ApiKeyCreated":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"created_at":{"type":"string","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"is_active":{"type":"boolean","title":"Is Active"},"key":{"type":"string","title":"Key"}},"type":"object","required":["id","name","prefix","created_at","is_active","key"],"title":"ApiKeyCreated","description":"Retourné une seule fois à la création — contient la clé complète."},"ApiKeyResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"created_at":{"type":"string","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["id","name","prefix","created_at","is_active"],"title":"ApiKeyResponse"},"CategoriesResponse":{"properties":{"categories":{"items":{"$ref":"#/components/schemas/CategorySuggestion"},"type":"array","title":"Categories"}},"type":"object","required":["categories"],"title":"CategoriesResponse"},"CategorySuggestion":{"properties":{"name":{"type":"string","title":"Name"},"usage_count":{"type":"integer","title":"Usage Count"},"memory_count":{"type":"integer","title":"Memory Count","default":0}},"type":"object","required":["name","usage_count"],"title":"CategorySuggestion"},"Fact":{"properties":{"subject":{"type":"string","minLength":1,"title":"Subject","description":"Sujet du fait (ex: 'scanner_iot')"},"predicate":{"type":"string","minLength":1,"title":"Predicate","description":"Prédicat (ex: 'utilise_hardware')"},"object":{"type":"string","minLength":1,"title":"Object","description":"Valeur chiffrée côté MCP"},"valid_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid From","description":"Date de validité (YYYY-MM-DD), défaut: aujourd'hui"},"scope":{"type":"string","enum":["private","org"],"title":"Scope","default":"private"},"org_id":{"type":"string","title":"Org Id"},"user_id":{"type":"string","title":"User Id"},"id":{"type":"string","title":"Id"},"valid_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid To"},"supersedes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Supersedes"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["subject","predicate","object","org_id","user_id"],"title":"Fact"},"FactCreate":{"properties":{"subject":{"type":"string","minLength":1,"title":"Subject","description":"Sujet du fait (ex: 'scanner_iot')"},"predicate":{"type":"string","minLength":1,"title":"Predicate","description":"Prédicat (ex: 'utilise_hardware')"},"object":{"type":"string","minLength":1,"title":"Object","description":"Valeur chiffrée côté MCP"},"valid_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid From","description":"Date de validité (YYYY-MM-DD), défaut: aujourd'hui"},"scope":{"type":"string","enum":["private","org"],"title":"Scope","default":"private"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["subject","predicate","object"],"title":"FactCreate"},"FactInvalidate":{"properties":{"valid_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid To","description":"Date de fin (YYYY-MM-DD), défaut: aujourd'hui"}},"type":"object","title":"FactInvalidate","description":"Corps optionnel pour PUT /facts/{id}/invalidate"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"GatewayConfigCreate":{"properties":{"platform":{"type":"string","enum":["telegram","slack","discord","whatsapp"],"title":"Platform"},"bot_token":{"type":"string","minLength":1,"title":"Bot Token","description":"Token du bot (chiffré au stockage)"},"channel_id":{"type":"string","minLength":1,"title":"Channel Id","description":"Chat ID, Channel ID, ou numéro WhatsApp"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Nom lisible (ex: '#general', 'Mon groupe Telegram')"}},"type":"object","required":["platform","bot_token","channel_id"],"title":"GatewayConfigCreate"},"GatewayConfigPublic":{"properties":{"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"user_id":{"type":"string","title":"User Id"},"platform":{"type":"string","title":"Platform"},"channel_id":{"type":"string","title":"Channel Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","org_id","user_id","platform","channel_id","is_active","created_at"],"title":"GatewayConfigPublic","description":"Version sans token pour les réponses API."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Memory":{"properties":{"content":{"type":"string","minLength":1,"title":"Content","description":"Texte brut de la mémoire"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Catégorie libre (suggérée auto)"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"source":{"type":"string","enum":["claude_desktop","api","manual","sdk","mcp_sse","agent"],"title":"Source","default":"api"},"scope":{"type":"string","enum":["private","org"],"title":"Scope","default":"private"},"pre_processed":{"type":"boolean","title":"Pre Processed","description":"Si True, skip compression et catégorisation (contenu déjà traité/chiffré côté client)","default":false},"embedding":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Embedding","description":"Embedding pré-calculé côté client (zero-knowledge)"},"org_id":{"type":"string","title":"Org Id"},"user_id":{"type":"string","title":"User Id"},"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["content","org_id","user_id"],"title":"Memory"},"MemoryCreate":{"properties":{"content":{"type":"string","minLength":1,"title":"Content","description":"Texte brut de la mémoire"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Catégorie libre (suggérée auto)"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"source":{"type":"string","enum":["claude_desktop","api","manual","sdk","mcp_sse","agent"],"title":"Source","default":"api"},"scope":{"type":"string","enum":["private","org"],"title":"Scope","default":"private"},"pre_processed":{"type":"boolean","title":"Pre Processed","description":"Si True, skip compression et catégorisation (contenu déjà traité/chiffré côté client)","default":false},"embedding":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Embedding","description":"Embedding pré-calculé côté client (zero-knowledge)"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["content"],"title":"MemoryCreate"},"MergeRequest":{"properties":{"content_a":{"type":"string","maxLength":10000,"minLength":1,"title":"Content A"},"content_b":{"type":"string","maxLength":10000,"minLength":1,"title":"Content B"}},"type":"object","required":["content_a","content_b"],"title":"MergeRequest"},"MfaChallengeResponse":{"properties":{"mfa_required":{"type":"boolean","const":true,"title":"Mfa Required","default":true},"mfa_token":{"type":"string","title":"Mfa Token"}},"type":"object","required":["mfa_token"],"title":"MfaChallengeResponse"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordRequest"},"SearchRequest":{"properties":{"query":{"type":"string","minLength":1,"title":"Query"},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","default":10},"scope":{"type":"string","enum":["private","org","all"],"title":"Scope","default":"private"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["query"],"title":"SearchRequest"},"SearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/SearchResult"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"},"query":{"type":"string","title":"Query"}},"type":"object","required":["results","total","query"],"title":"SearchResponse"},"SearchResult":{"properties":{"memory":{"$ref":"#/components/schemas/Memory"},"score":{"type":"number","title":"Score","description":"Score de similarité cosinus [0-1]"}},"type":"object","required":["memory","score"],"title":"SearchResult"},"Skill":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Identifiant lisible (ex: 'send_slack_message')"},"description":{"type":"string","minLength":1,"title":"Description","description":"Ce que fait ce skill"},"content":{"type":"string","minLength":1,"title":"Content","description":"Instructions détaillées / procédure"},"trigger":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger","description":"Mot-clé ou regex qui déclenche le skill automatiquement"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"source":{"type":"string","enum":["api","mcp","agent"],"title":"Source","default":"api"},"id":{"type":"string","title":"Id"},"org_id":{"type":"string","title":"Org Id"},"user_id":{"type":"string","title":"User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","description","content","org_id","user_id"],"title":"Skill"},"SkillCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Identifiant lisible (ex: 'send_slack_message')"},"description":{"type":"string","minLength":1,"title":"Description","description":"Ce que fait ce skill"},"content":{"type":"string","minLength":1,"title":"Content","description":"Instructions détaillées / procédure"},"trigger":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger","description":"Mot-clé ou regex qui déclenche le skill automatiquement"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"source":{"type":"string","enum":["api","mcp","agent"],"title":"Source","default":"api"}},"type":"object","required":["name","description","content"],"title":"SkillCreate"},"SkillSearchRequest":{"properties":{"query":{"type":"string","minLength":1,"title":"Query"},"limit":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Limit","default":5}},"type":"object","required":["query"],"title":"SkillSearchRequest"},"SkillSearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/SkillSearchResult"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"},"query":{"type":"string","title":"Query"}},"type":"object","required":["results","total","query"],"title":"SkillSearchResponse"},"SkillSearchResult":{"properties":{"skill":{"$ref":"#/components/schemas/Skill"},"score":{"type":"number","title":"Score","description":"Score de similarité cosinus [0-1]"}},"type":"object","required":["skill","score"],"title":"SkillSearchResult"},"SkillUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"trigger":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","title":"SkillUpdate"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user_id":{"type":"string","title":"User Id"},"org_id":{"type":"string","title":"Org Id"},"name":{"type":"string","title":"Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"plan":{"type":"string","title":"Plan","default":"free"},"role":{"type":"string","title":"Role","default":"member"},"is_admin":{"type":"boolean","title":"Is Admin","default":false},"kdf_salt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kdf Salt"},"needs_reencryption":{"type":"boolean","title":"Needs Reencryption","default":false},"enc_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enc Secret"},"enc_salt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enc Salt"}},"type":"object","required":["access_token","user_id","org_id","name"],"title":"TokenResponse"},"UserLogin":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"UserLogin"},"UserRegister":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"lang":{"type":"string","title":"Lang","default":"fr"}},"type":"object","required":["name","email","password"],"title":"UserRegister"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VectorSearchRequest":{"properties":{"vector":{"items":{"type":"number"},"type":"array","title":"Vector"},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":1},"scope":{"type":"string","enum":["private","org","all"],"title":"Scope","default":"private"},"threshold":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Threshold","default":0.0}},"type":"object","required":["vector"],"title":"VectorSearchRequest"},"_ReencryptMemory":{"properties":{"id":{"type":"string","title":"Id"},"content":{"type":"string","title":"Content"}},"type":"object","required":["id","content"],"title":"_ReencryptMemory"},"_ReencryptVaultRequest":{"properties":{"memories":{"items":{"$ref":"#/components/schemas/_ReencryptMemory"},"type":"array","title":"Memories"}},"type":"object","required":["memories"],"title":"_ReencryptVaultRequest"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}