{"openapi":"3.1.0","info":{"title":"Venkai API","description":"Persistent context layer for AI agents — decisions, state and operational knowledge preserved across sessions, models and workflows.","version":"0.1.0"},"paths":{"/api/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"me_api_auth_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Request a password reset link. Always returns the same response to\nprevent email enumeration.","operationId":"forgot_password_api_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"}}}}}}},"/api/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Reset password using a valid token.","operationId":"reset_password_api_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"}}}}}}},"/api/auth/reset-password/verify":{"get":{"tags":["auth"],"summary":"Verify Reset Token","description":"Verify a reset token is valid (used by the frontend to show/hide the form).","operationId":"verify_reset_token_api_auth_reset_password_verify_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/oauth/providers":{"get":{"tags":["auth"],"summary":"List Oauth Providers","description":"List which OAuth providers are configured. Changes whenever env vars\nchange (deploys), so browsers must never cache this — no explicit\nCache-Control here left a stale copy in at least one browser's disk\ncache showing providers removed hours earlier.","operationId":"list_oauth_providers_api_auth_oauth_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/oauth/{provider}":{"get":{"tags":["auth"],"summary":"Oauth Initiate","description":"Initiate OAuth flow. Returns the authorization URL.","operationId":"oauth_initiate_api_auth_oauth__provider__get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"redirect_to","in":"query","required":false,"schema":{"type":"string","default":"/","title":"Redirect To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/oauth/{provider}/callback":{"get":{"tags":["auth"],"summary":"Oauth Callback","description":"Handle OAuth callback via GET redirect. For PKCE flows, the frontend\nshould use the POST endpoint instead (it can pass code_verifier).","operationId":"oauth_callback_api_auth_oauth__provider__callback_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["auth"],"summary":"Oauth Callback Post","description":"POST endpoint for OAuth callback from the SPA. The frontend sends\ncode, state, and code_verifier (stored during initiation).","operationId":"oauth_callback_post_api_auth_oauth__provider__callback_post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthCallbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user/preferences":{"get":{"tags":["auth"],"summary":"Get Preferences","description":"`telemetry_opt_in` is null until the user has answered — \"not asked\"\nis not \"refused\".","operationId":"get_preferences_api_user_preferences_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["auth"],"summary":"Put Preferences","operationId":"put_preferences_api_user_preferences_put","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPreferencesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/api-keys":{"post":{"tags":["auth"],"summary":"Create Api Key Endpoint","description":"Mint an API key for the caller's own organization — used by the MCP\nserver and the Agent SDK. Raw key is returned once; only its hash is\nstored, so it cannot be retrieved again after this response.","operationId":"create_api_key_endpoint_api_auth_api_keys_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["auth"],"summary":"List Api Keys","description":"List API keys for the caller's org. Never returns the raw key.","operationId":"list_api_keys_api_auth_api_keys_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/api-keys/{key_id}":{"delete":{"tags":["auth"],"summary":"Revoke Api Key","description":"Revoke (delete) an API key belonging to the caller's org.","operationId":"revoke_api_key_api_auth_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/api-keys/{key_id}/rotate":{"post":{"tags":["auth"],"summary":"Rotate Api Key","description":"Rotate an API key: revoke the old one and mint a new one.","operationId":"rotate_api_key_api_auth_api_keys__key_id__rotate_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context":{"post":{"tags":["context"],"summary":"Create Context","operationId":"create_context_api_context_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memory":{"post":{"tags":["context"],"summary":"Store Memory","operationId":"store_memory_api_memory_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context/{project_id}":{"get":{"tags":["context"],"summary":"Get Project Context","operationId":"get_project_context_api_context__project_id__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"created_desc","title":"Order"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context/{project_id}/relevant":{"get":{"tags":["context"],"summary":"Get Relevant Context","description":"Memory Engine V2 + vector search: rank this project's memories by\nsemantic relevance + recency + importance + access frequency, return\nonly the useful ones (see MemoryRetriever, memory_retriever.py).","operationId":"get_relevant_context_api_context__project_id__relevant_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"query","in":"query","required":false,"schema":{"type":"string","default":"","title":"Query"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context/{context_id}":{"patch":{"tags":["context"],"summary":"Patch Context","operationId":"patch_context_api_context__context_id__patch","parameters":[{"name":"context_id","in":"path","required":true,"schema":{"type":"string","title":"Context Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context/{context_id}/versions":{"get":{"tags":["context"],"summary":"Get Context Versions","description":"List all saved versions for a context, ordered by version number.","operationId":"get_context_versions_api_context__context_id__versions_get","parameters":[{"name":"context_id","in":"path","required":true,"schema":{"type":"string","title":"Context Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context/{context_id}/restore":{"post":{"tags":["context"],"summary":"Restore Context Version","description":"Restore a context to a previous version.  Creates a new version entry\nfor the current state before overwriting, so history is never lost.","operationId":"restore_context_version_api_context__context_id__restore_post","parameters":[{"name":"context_id","in":"path","required":true,"schema":{"type":"string","title":"Context Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContextRestoreRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/timeline/{project_id}":{"get":{"tags":["timeline"],"summary":"Get Timeline","operationId":"get_timeline_api_timeline__project_id__get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/security/analyze":{"post":{"tags":["security"],"summary":"Security Analyze","operationId":"security_analyze_api_security_analyze_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecurityAnalyzeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/summary":{"get":{"tags":["dashboard"],"summary":"Dashboard Summary","operationId":"dashboard_summary_api_dashboard_summary_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects":{"get":{"tags":["dashboard"],"summary":"Get Projects","operationId":"get_projects_api_projects_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dashboard"],"summary":"Create Project Endpoint","description":"Explicit project creation — the onboarding calls this. Until now projects\nonly ever appeared as a side effect of `get_or_create_project`.","operationId":"create_project_endpoint_api_projects_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}":{"patch":{"tags":["dashboard"],"summary":"Update Project Endpoint","description":"Rename / describe / archive. `project_id` (la clé) reste immuable : les\nagents déployés la portent dans leur configuration.","operationId":"update_project_endpoint_api_projects__project_id__patch","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/agents":{"get":{"tags":["dashboard"],"summary":"Get Project Agents","operationId":"get_project_agents_api_projects__project_id__agents_get","parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organization":{"get":{"tags":["dashboard"],"summary":"Get Organization","description":"Organization-level view: projects, total memories, and every agent\nactive across the org with the project it's active in — for the\n'organization page' (projects count / memories count / agent activity).","operationId":"get_organization_api_organization_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["organization"],"summary":"Delete Organization","description":"Cascade-delete all data belonging to the caller's organization.","operationId":"delete_organization_api_organization_delete","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/impact":{"get":{"tags":["dashboard"],"summary":"Get Impact","description":"Real impact metrics: token savings, memory reuse, agent coordination.\nThis is what makes Venkai's value visible to the client.","operationId":"get_impact_api_impact_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health":{"get":{"tags":["meta"],"summary":"Health","description":"Readiness, not liveness.\n\nThe previous version returned a constant. A container whose Postgres is\ngone is still perfectly alive and answers 500 on every real route, so a\nconstant `{\"status\": \"ok\"}` reports the deployment as healthy at exactly\nthe moment it is not — and that is the signal the runbook, the compose\nhealthcheck and the uptime check all read. One round trip makes the answer\nmean something.\n\n`/health` is an alias because every piece of documentation written before\nthis file says `api.venkai.fr/health`. A redirect would be one more hop to\nget wrong in a proxy config.","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/export":{"get":{"tags":["organization"],"summary":"Export Data","description":"Export all data for the caller's organization.","operationId":"export_data_api_export_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feedback":{"post":{"tags":["feedback"],"summary":"Submit Feedback","description":"Record user feedback (positive/negative) on a context.","operationId":"submit_feedback_api_feedback_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/telemetry":{"post":{"tags":["telemetry"],"summary":"Record Telemetry","description":"Record a telemetry event.","operationId":"record_telemetry_api_telemetry_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryEventRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/onboarding":{"get":{"tags":["onboarding"],"summary":"Get Onboarding","description":"Checklist dérivée de l'état réel, pas d'un drapeau stocké : une étape\ncochée l'est parce que la chose existe, donc elle ne peut pas mentir.","operationId":"get_onboarding_api_onboarding_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activity":{"get":{"tags":["activity"],"summary":"Get Activity","description":"Flux d'activité de l'organisation. Seuls des événements réellement\nenregistrés sont renvoyés — rien n'est synthétisé pour remplir la page.","operationId":"get_activity_api_activity_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"}},{"name":"agent","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Since"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/usage":{"get":{"tags":["usage"],"summary":"Get Usage","description":"`measuring_since` est renvoyé exprès : le comptage démarre au\ndéploiement de la table, pas à la création de l'organisation. Une page qui\ntait ça laisse croire à un historique qui n'existe pas.","operationId":"get_usage_api_usage_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/handoffs":{"get":{"tags":["handoffs"],"summary":"Get Handoffs","operationId":"get_handoffs_api_handoffs_get","parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["handoffs"],"summary":"Create Handoff Endpoint","description":"Un handoff est déclaré, jamais deviné : c'est l'agent sortant qui dit à\nqui il passe la main et quelles mémoires il laisse.","operationId":"create_handoff_endpoint_api_handoffs_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HandoffCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/members":{"get":{"tags":["team"],"summary":"Get Members","operationId":"get_members_api_members_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/members/{member_id}":{"delete":{"tags":["team"],"summary":"Delete Member","operationId":"delete_member_api_members__member_id__delete","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","title":"Member Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/invitations":{"get":{"tags":["team"],"summary":"Get Invitations","operationId":"get_invitations_api_invitations_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["team"],"summary":"Create Invitation Endpoint","description":"Renvoie `invite_token` UNE seule fois. Venkai n'envoie pas d'email à ce\nstade : c'est l'inviteur qui transmet le lien. Le dire est plus honnête que\nlaisser croire à un email qui ne partira jamais.","operationId":"create_invitation_endpoint_api_invitations_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/invitations/{invite_id}":{"delete":{"tags":["team"],"summary":"Delete Invitation","operationId":"delete_invitation_api_invitations__invite_id__delete","parameters":[{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/invitations/preview":{"get":{"tags":["team"],"summary":"Preview Invitation","description":"Non authentifié : la personne invitée n'a pas encore de compte et doit\npouvoir lire « X vous invite chez Y » avant d'en créer un. Ne rend que le\nnom de l'organisation et le rôle — jamais la liste des membres, jamais une\ndonnée du tenant.","operationId":"preview_invitation_api_invitations_preview_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"}}}}}}},"/api/invitations/accept":{"post":{"tags":["team"],"summary":"Accept Invitation Endpoint","description":"L'utilisateur doit déjà être connecté : accepter une invitation rattache\nun compte existant, ça n'en crée pas un.","operationId":"accept_invitation_endpoint_api_invitations_accept_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationAcceptRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing":{"get":{"tags":["billing"],"summary":"Get Billing","description":"Facturation manuelle assumée : pas de Stripe, pas de compteur de\ndépense. On dit le plan, on dit comment on facture, on donne un contact.","operationId":"get_billing_api_billing_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"venkai_session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venkai Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ApiKeyCreateRequest":{"properties":{"label":{"type":"string","maxLength":100,"title":"Label","default":"default"},"environment":{"type":"string","pattern":"^(production|development)$","title":"Environment","default":"production"}},"type":"object","title":"ApiKeyCreateRequest"},"ContextCreateRequest":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"Client-chosen project key, e.g. 'demo_project'"},"agent_id":{"type":"string","title":"Agent Id","description":"Agent identifier, e.g. 'claude_agent'"},"content":{"type":"string","maxLength":8000,"minLength":1,"title":"Content"},"type":{"type":"string","title":"Type","default":"fact"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","default":0.8},"importance":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Importance","default":0.5}},"type":"object","required":["project_id","agent_id","content"],"title":"ContextCreateRequest"},"ContextRestoreRequest":{"properties":{"version":{"type":"integer","minimum":1.0,"title":"Version","description":"Version number to restore"}},"type":"object","required":["version"],"title":"ContextRestoreRequest"},"ContextUpdateRequest":{"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","title":"ContextUpdateRequest"},"FeedbackRequest":{"properties":{"project_id":{"type":"string","title":"Project Id"},"context_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context Id"},"rating":{"type":"string","pattern":"^(positive|negative)$","title":"Rating"}},"type":"object","required":["project_id","rating"],"title":"FeedbackRequest"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HandoffCreateRequest":{"properties":{"project_id":{"type":"string","title":"Project Id","description":"Client-chosen project key"},"from_agent":{"type":"string","maxLength":200,"minLength":1,"title":"From Agent"},"to_agent":{"type":"string","maxLength":200,"minLength":1,"title":"To Agent"},"context_ids":{"items":{"type":"string"},"type":"array","maxItems":200,"title":"Context Ids"},"note":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Note"},"status":{"type":"string","pattern":"^(pending|completed)$","title":"Status","default":"completed"}},"type":"object","required":["project_id","from_agent","to_agent"],"title":"HandoffCreateRequest"},"InvitationAcceptRequest":{"properties":{"token":{"type":"string","maxLength":200,"minLength":8,"title":"Token"}},"type":"object","required":["token"],"title":"InvitationAcceptRequest"},"InvitationCreateRequest":{"properties":{"email":{"type":"string","maxLength":200,"minLength":3,"title":"Email"},"role":{"type":"string","pattern":"^(owner|admin|member)$","title":"Role","default":"member"}},"type":"object","required":["email"],"title":"InvitationCreateRequest"},"LoginRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"MemoryCreateRequest":{"properties":{"project_id":{"type":"string","title":"Project Id"},"agent_id":{"type":"string","title":"Agent Id"},"content":{"type":"string","maxLength":8000,"minLength":1,"title":"Content"},"type":{"type":"string","title":"Type","default":"fact"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","default":0.8},"importance":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Importance","default":0.5}},"type":"object","required":["project_id","agent_id","content"],"title":"MemoryCreateRequest"},"OAuthCallbackRequest":{"properties":{"code":{"type":"string","title":"Code"},"state":{"type":"string","title":"State"},"code_verifier":{"type":"string","title":"Code Verifier","default":""}},"type":"object","required":["code","state"],"title":"OAuthCallbackRequest"},"ProjectCreateRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"project_id":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Project Id","description":"Client-chosen project key. Derived from `name` when omitted."}},"type":"object","required":["name"],"title":"ProjectCreateRequest"},"ProjectUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"type":"string","pattern":"^(active|archived)$"},{"type":"null"}],"title":"Status"}},"type":"object","title":"ProjectUpdateRequest","description":"`project_key` est absent volontairement : c'est la clé que les agents\ndéployés portent en dur, la renommer casserait leurs appels."},"RegisterRequest":{"properties":{"email":{"type":"string","maxLength":200,"minLength":3,"title":"Email"},"password":{"type":"string","maxLength":200,"minLength":6,"title":"Password"},"organization":{"type":"string","maxLength":200,"minLength":2,"title":"Organization"}},"type":"object","required":["email","password","organization"],"title":"RegisterRequest"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","minLength":8,"title":"Token"},"password":{"type":"string","maxLength":200,"minLength":8,"title":"Password"}},"type":"object","required":["token","password"],"title":"ResetPasswordRequest"},"SecurityAnalyzeRequest":{"properties":{"code":{"type":"string","maxLength":20000,"minLength":1,"title":"Code"},"language":{"type":"string","title":"Language","default":"python"},"framework":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework"}},"type":"object","required":["code"],"title":"SecurityAnalyzeRequest"},"TelemetryEventRequest":{"properties":{"event_type":{"type":"string","maxLength":100,"title":"Event Type"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"}},"type":"object","required":["event_type"],"title":"TelemetryEventRequest"},"UserPreferencesRequest":{"properties":{"telemetry_opt_in":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Telemetry Opt In"},"locale":{"anyOf":[{"type":"string","pattern":"^(en|fr)$"},{"type":"null"}],"title":"Locale"}},"type":"object","title":"UserPreferencesRequest"},"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"}}}}